JSP中的Spring MVC请求URL

时间:2011-08-07 01:24:40

标签: html spring spring-mvc contextpath

我正在使用Spring MVC编写Web应用程序。我正在使用控制器的注释等。一切都工作正常,除了它涉及应用程序中的实际链接(表单操作,<a>标签等)。当前,我有这个(显然缩写):< / p>

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

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

当我直接输入“http:// localhost:8080 / MyApp / admin / listPeople”这样的网址时,页面会正确加载。但是,上面的链接不起作用。它丢失了应用程序名称“MyApp”。

有没有人知道是否有办法配置Spring在那里抛出应用程序名称?

如果您需要查看我的任何Spring配置,请告诉我。我正在使用带有视图解析器等的标准调度程序servlet

7 个答案:

答案 0 :(得分:45)

您需要在链接前添加上下文路径。

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

答案 1 :(得分:13)

c:url标记会将上下文路径附加到您的网址。例如:

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

或者,我更喜欢在我的Spring MVC应用程序中尽可能多地使用相对URL。因此,如果页面位于/MyApp/index,则链接<a href="admin/listPeople">会将我带到listPeople页面。

如果您更深入了解URL层次结构,这也适用。您可以使用..遍历某个级别。因此,在/MyApp/admin/people/aPerson的页面上,使用<a href="../listPeople">将返回列表页面

答案 2 :(得分:6)

我更喜欢使用BASE标签:

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

然后,您的所有链接都可以是:

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

答案 3 :(得分:4)

我刚刚试图找到这个问题的答案,这是谷歌的第一个结果。

现在可以使用MvcUriComponentsBuilder

来完成

这是Spring MVC 4.0版本的一部分

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

所需的方法是fromMappingName

来自文档:

  

从Spring MVC控制器方法的请求映射名称创建URL。   配置的HandlerMethodMappingNamingStrategy确定启动时控制器方法请求映射的名称。默认情况下,所有映射都根据类名的大写字母分配名称,后跟“#”作为分隔符,然后是方法名称。例如,对于名为PersonController的类,使用方法getPerson的“PC#getPerson”。如果命名约定不产生唯一结果,则可以通过@RequestMapping注释的name属性指定显式名称。

     

这主要用于视图渲染技术和EL表达式。 Spring URL标记库将此方法注册为名为“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>

答案 4 :(得分:0)

我通常将tomcat配置为使用“/”的上下文根或将war作为ROOT.war部署。无论哪种方式,战争名称都不会成为URL的一部分。

答案 5 :(得分:0)

您可以使用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.");
        }
    }
}

答案 6 :(得分:-1)

因为已经有好几年了,我认为我会加入其他人来寻找这个。如果您使用的是注释,并且具有类似这样的控制器操作,则:

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

其中

value的值应与控制器动作和

中的@RequestMapping的参数匹配

var's值是您用于href的变量的名称

HIH