Spring mvc,为什么我的控制器没有映射

时间:2016-04-06 10:10:24

标签: spring-mvc

我在web.xml中定义了我的Dispatcher servlet&url映射,如下所示:

<servlet-mapping>
 <servlet-name>dispatcher</servlet-name>
 <url-pattern>*.do</url-pattern>
 <url-pattern>/data/*</url-pattern>
</servlet-mapping>

我的控制器方法注释为:

@RequestMapping(value="/data/sys/CodeCatalogs")

当我在浏览器中请求url时,我遇到了404错误,如果我将映射更改为:

@RequestMapping(value="/sys/CodeCatalogs")

完整网址:

http://localhost:8080/cwe/data/sys/CodeCatalogs

它有效,为什么?我是初学mvc的新手,请帮忙。

我测试了不包含通配符的网址:

<servlet-mapping>
     <servlet-name>dispatcher</servlet-name>
     <url-pattern>*.do</url-pattern>
     <url-pattern>/data/*</url-pattern>
     url-pattern>/test/foo</url-pattern>
    </servlet-mapping>

然后这个请求映射将起作用:

@RequestMapping(value="/test/foo")

2 个答案:

答案 0 :(得分:1)

对于/data/sys/CodeCatalogs形式的传入请求,在将模式传递给Spring servlet之前,servlet容器将使用/data/部分。因此,控制器将收到/sys/CodeCatalogs,因此这就是您的第二个@RequestMapping正常工作而第一个不起作用的原因。

答案 1 :(得分:0)

<servlet-mapping>
     <servlet-name>dispatcher</servlet-name>
     <url-pattern>*.do</url-pattern>
     <url-pattern>/data/*</url-pattern>
</servlet-mapping>

在前面的示例中,所有以/ data开头的请求和以* .do结尾的任何内容都将由名为dispatcher的DispatcherServlet实例处理。

因此对于控制器的方法注释为:

@RequestMapping(value="/data/sys/CodeCatalogs")

http://localhost:8080/cwe/data/sys/CodeCatalogs - Does not match
http://localhost:8080/cwe/data/data/sys/CodeCatalogs - Does matches

来自浏览器的URL传递将首先与指定的URL模式匹配 然后是@RequestMapping

中指定的网址

对于控制器的方法,注释为:

@RequestMapping(value="/test/foo")

http://localhost:8080/cwe/test/foo - Matches since URL matches the exact pattern which is allowed as per Servlet Specification.
http://localhost:8080/cwe/data/test/foo  - This will also match because of pattern /data/*