2011-08-07 88 views
20

我正在使用Spring MVC编写一个Web应用程序。我使用的注解控制器等一切工作正常,当涉及到应用程序中的实际链接(表单操作,<a>标签等)目前除了,我有这个(显然略):JSP中的Spring MVC请求URL

//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配置。我正在使用具有视图解析器的标准调度程序servlet等。

+1

这是可能在弹簧3.0 '">People' –

回答

43

您需要预先为链接预留上下文路径。

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

+1谢谢,我想到了这个,但我宁愿用Spring来做。 –

+2

没有这样做的“春天”方式:)只有将节点从$ {contextPath}预注到链接的选项是,您将应用程序部署为root用户,因此它的上下文路径为“/”(正如Kevin所描述的);但我不会推荐这种方法,因为它会使您的应用程序依赖于其部署。 – craftsman

+0

如果我记得正确的话,还有一个server.xml的方法。 – Kevin

0

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

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> 
+0

我建议阅读之前使用基本标记:http://stackoverflow.com/questions/1889076/is-it-recommended-to-use-the-base-html-tag –

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">会喜欢回到列表页面

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."); 
     } 
    } 
} 
4

正如我刚才一直在试图寻找这个问题的答案,这是第一个谷歌结果。

这现在可以使用MvcUriComponentsBuilder

这是4的一部分来完成。0版本的Spring MVC的

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>