我在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")
答案 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/*