Spring MVC url模式 - 继续附加控制器

时间:2013-07-23 11:15:27

标签: java spring-mvc controller url-pattern

我有一个Spring MVC应用程序。

这是web.xml

    <xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Spring Web MVC Application</display-name>

    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>

</web-app>

我有一个示例页面Controller(TestController)。与请求映射

@RequestMapping("/Test")
class TestController{
}

使用Test

调用控制器

当我第一次点击链接时,它工作正常

http://localhost:8008/App/Test

如果我再次单击该链接,则会再次附加测试

http://localhost:8008/App/Test/Test

它不断添加。

可能是什么问题!

2 个答案:

答案 0 :(得分:2)

而不是

<a href="Test">link</a>
在JSP中

,你应该有

<a href="<c:url value='/Test'/>">link</a>

(当然,将JSTL核心taglib定义添加到JSP的头部。)

这将使用绝对URL(/App/Test)而不是相对的URL(Test),并将自动添加应用程序的上下文路径(/App在您的情况下)到URL。此链接可以在应用程序的任何位置使用,并且无论当前页面的URL是什么,它都将始终与您的控制器相关。

另一种方法是使用

<a href="${pageContext.request.contextPath}/Test">link</a>

但它更长,更不干净,并且不允许像c:url那样向URL添加参数。请注意,Spring还有一个s:url标记可以执行相同的操作,还有更多。

答案 1 :(得分:0)

@JB Nizet的答案的补充,因为您不清楚使用哪个viewResolver并且可能有其他人在寻找该问题的答案:

如果您使用freemarker作为模板引擎,则可以执行此操作:

<a href="<@spring.url '/Test' />">link</a>

在您的模板中。这将让spring为您创建正确的上下文路径。 url是此处宏的名称,spring是模板的引用名称。

注意:您必须事先导入spring.ftl-template,如此

<#import "spring.ftl" as spring/>

之前可以使用宏。