spring的路径匹配问题

今天下午没课,细学了有关于spring的配置。刚开始比较顺利,试的几个项目都通过了,但没多久就碰到难题,结果被困惑了整整一个晚上。

在spring官方文档中,它提供了给我们关于spring在web.xml中的一个实例

 1 <web-app>
 2     <servlet>
 3         <servlet-name>golfing</servlet-name>
 4         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 5         <load-on-startup>1</load-on-startup>
 6     </servlet>
 7 
 8     <servlet-mapping>
 9         <servlet-name>golfing</servlet-name>
10         <url-pattern>/golfing/*</url-pattern>
11     </servlet-mapping>
12 </web-app>

通过测试,这个例子本身是正确无误的。任何路径形式为:<项目名>/goifing/*的请求均能够被正确拦截并处理。这里可能有人会有迷惑,说明一下,这里它查找RequestMapping时匹配的只有*部分的内容,而不包括/golfing部分。

举个例子,比如你输入了<项目名>/gofing/hello这样请求。那么spring将会处理你的请求,查找@RequestMapping("hello")的方法进行处理,而不是@RequestMapping("gofing/hello")。

接下来讲解第二个问题。其实我们一般是不喜欢再多加/golfing这样的一个前缀。因此我们会很自然的想处理成下面这样的形式

<web-app>

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

    <servlet-mapping>
        <servlet-name>golfing</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

也就是只剩下了/*这样的匹配,去掉了/gofing部分。很多人应该会认为这样应该是没什么问题,不过,结果出乎我们的意料。但我们输入<项目名>/*这样请求后,返回均为404,究竟是什么消失了?
对于这个问题我目前也还没能解答,不过我找到解决这个问题的方法,将上面的代码在修改一小点

 1 <web-app>
 2 
 3     <servlet>
 4         <servlet-name>golfing</servlet-name>
 5         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 6         <load-on-startup>1</load-on-startup>
 7     </servlet>
 8 
 9     <servlet-mapping>
10         <servlet-name>golfing</servlet-name>
11         <url-pattern>/</url-pattern>
12     </servlet-mapping>
13 
14 </web-app>

可以看到,我这次连*也删除了,只剩下/。进测试,采用这种方法请求恢复正常!

原文地址:https://www.cnblogs.com/YESheng/p/2935787.html