Подтвердить что ты не робот

Spring URL-адреса запроса MVC в JSP

Я пишу веб-приложение с помощью 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. Я использую стандартный диспетчерский сервлет с разрешением вида и т.д.

4b9b3361

Ответ 1

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

// 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>

Ответ 2

Тег 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"> будет возвращено на страницу списка

Ответ 3

Я предпочитаю использовать тег 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

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

Это можно сделать теперь, используя MvcUriComponentsBuilder

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

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

Необходимый метод - изMappingName

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

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

Это предназначено в первую очередь для использования в представлении технологий рендеринга и EL-выражений. Библиотека тегов 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>

Ответ 5

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

Ответ 6

Вы можете использовать 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.");
        }
    }
}

Ответ 7

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

@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(view) вы добавляете эту директиву

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

и просто использовать

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

где

value должно соответствовать аргументу @RequestMapping в действии контроллера и

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

Е.И.В.