Spring MVC запрашивает URL в JSP - PullRequest
20 голосов
/ 07 августа 2011

Я пишу веб-приложение, используя Spring MVC. Я использую аннотации для контроллеров и т. Д. Все работает нормально, кроме случаев, когда речь идет о реальных ссылках в приложении (действия формы, <a> теги и т. Д.). Текущий, у меня есть это (очевидно, сокращенно):

//In the controller
@RequestMapping(value="/admin/listPeople", method=RequestMethod.GET)

//In the JSP
<a href="/admin/listPeople">Go to People List</a>

Когда я непосредственно ввожу URL-адрес, такой как "http://localhost:8080/MyApp/admin/listPeople",, страница загружается правильно. Однако приведенная выше ссылка не работает. Она теряет имя приложения" MyApp ".

Кто-нибудь знает, есть ли способ настроить Spring для добавления туда имени приложения?

Дайте мне знать, если вам нужно увидеть какую-либо из моих настроек Spring. Я использую стандартный диспетчерский сервлет с распознавателем представления и т. Д.

Ответы [ 7 ]

45 голосов
/ 07 августа 2011

Вам необходимо добавить контекстный путь к вашим ссылкам.

// somewhere on the top of your JSP
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>

...
<a href="${contextPath}/admin/listPeople">Go to People List</a>
13 голосов
/ 14 августа 2011

Тег c:url добавит контекстный путь к вашему URL.Например:

<c:url value="/admin/listPeople"/>

В качестве альтернативы я предпочитаю использовать относительные URL-адреса в своих приложениях Spring MVC как можно чащеПоэтому, если страница находится на /MyApp/index, ссылка <a href="admin/listPeople"> приведет меня на страницу listPeople.

Это также работает, если вы находитесь глубже в иерархии URL.Вы можете использовать .., чтобы вернуться на уровень выше.Таким образом, на странице /MyApp/admin/people/aPerson, используя <a href="../listPeople">, вы захотите вернуться на страницу списка

6 голосов
/ 08 августа 2011

Я предпочитаю использовать тег BASE:

<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/" />

Тогда все ваши ссылки могут быть такими:

<a href="admin/listPeople">Go to People List</a>
4 голосов
/ 19 июля 2016

Поскольку я только что пытался найти ответ на этот вопрос, и это первый результат Google.

Теперь это можно сделать с помощью MvcUriComponentsBuilder

Это часть версии 4.0 MVC Spring

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.html

Требуется метод fromMappingName

Из документации:

Создать URL-адрес из имени отображения запроса метода контроллера Spring MVC. Настроенный HandlerMethodMappingNamingStrategy определяет имена отображений запросов метода контроллера при запуске. По умолчанию всем сопоставлениям присваивается имя, основанное на заглавных буквах имени класса, за которым следует «#» в качестве разделителя, а затем имя метода. Например, «PC # getPerson» для класса с именем PersonController с методом getPerson. Если соглашение об именах не дает уникальных результатов, явное имя может быть назначено с помощью атрибута name аннотации @RequestMapping.

Это предназначено главным образом для использования в технологиях рендеринга представлений и выражений EL. Библиотека тегов URL Spring регистрирует этот метод как функцию с именем «mvcUrl».

Например, для данного контроллера:

@RequestMapping("/people")
 class PersonController {

   @RequestMapping("/{id}")
   public HttpEntity getPerson(@PathVariable String id) { ... }

 }

JSP может подготовить URL-адрес для метода контроллера следующим образом:

<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>

 <a href="${s:mvcUrl('PC#getPerson').arg(0,"123").build()}">Get Person</a>
0 голосов
/ 24 сентября 2018

Так как прошло несколько лет, я думал, что скину, чтобы другие искали это.Если вы используете аннотации и у вас есть действие контроллера, например:

@RequestMapping("/new")   //<--- relative url
public ModelAndView newConsultant() {
    ModelAndView mv = new ModelAndView("new_consultant");
    try {
        List<Consultant> list = ConsultantDAO.getConsultants();
        mv.addObject("consultants", list);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return mv;
}

в вашем .jsp (просмотр), вы добавляете эту директиву

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>

и просто используете

<spring:url value="/new" var="url" htmlEscape="true"/>
<a href="${url}">New consultant</a>

, где

* значение 1012 * должно соответствовать аргументу @RequestMapping в действии контроллера, а значение

var's - это имя переменной, которую вы используетедля href

HIH

0 голосов
/ 01 февраля 2014

Вы можете использовать servletRelativeAction.Я не уверен, в каких версиях это доступно (сейчас я использую 4.0.x), и я не видел много документации по этому вопросу, но если вы посмотрите на код, поддерживающий форму Spring, вы, вероятно, догадаетесь.Просто убедитесь, что путь, который вы передаете, начинается с "/".

Пример:

<form:form class="form-horizontal" name="form" servletRelativeAction="/j_spring_security_check"  method="POST">

См. Org.springframework.web.servlet.tags.form.FormTag:

protected String resolveAction() throws JspException {
    String action = getAction();
    String servletRelativeAction = getServletRelativeAction();
    if (StringUtils.hasText(action)) {
        action = getDisplayString(evaluate(ACTION_ATTRIBUTE, action));
        return processAction(action);
    }
    else if (StringUtils.hasText(servletRelativeAction)) {
        String pathToServlet = getRequestContext().getPathToServlet();
        if (servletRelativeAction.startsWith("/") && !servletRelativeAction.startsWith(getRequestContext().getContextPath())) {
            servletRelativeAction = pathToServlet + servletRelativeAction;
        }
        servletRelativeAction = getDisplayString(evaluate(ACTION_ATTRIBUTE, servletRelativeAction));
        return processAction(servletRelativeAction);
    }
    else {
        String requestUri = getRequestContext().getRequestUri();
        ServletResponse response = this.pageContext.getResponse();
        if (response instanceof HttpServletResponse) {
            requestUri = ((HttpServletResponse) response).encodeURL(requestUri);
            String queryString = getRequestContext().getQueryString();
            if (StringUtils.hasText(queryString)) {
                requestUri += "?" + HtmlUtils.htmlEscape(queryString);
            }
        }
        if (StringUtils.hasText(requestUri)) {
            return processAction(requestUri);
        }
        else {
            throw new IllegalArgumentException("Attribute 'action' is required. " +
                    "Attempted to resolve against current request URI but request URI was null.");
        }
    }
}
0 голосов
/ 07 августа 2011

Обычно я настраиваю tomcat на использование контекста root «/» или развертывание войны под именем ROOT.war. В любом случае название войны не становится частью URL.

...