我定义了这个RequestMapping /方法:
@RequestMapping( value={"/ViewReport/json", "/ViewReport/*/json"} , method = RequestMethod.GET)
public ModelAndView TestJson(final Model model, HttpServletRequest request){
JSONObject json = new JSONObject();
json.put("Hello", "Goodbye");
json.put("request", request.getRequestURL());
model.addAttribute("fnord", json.toJSONString());
return new ModelAndView("reportViewJson");
}
在我的web.xml
文件中,我有以下内容:
<servlet-mapping>
<servlet-name>autoreport</servlet-name>
<url-pattern>/ViewReport/*/json</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>autoreport</servlet-name>
<url-pattern>/ViewReport/json</url-pattern>
</servlet-mapping>
现在,当我导航到/ViewReport/json
时,我得到了预期的JSON。但是,当我导航到/ViewReport/42/json
时,我得到了404。
我的服务器启动时有以下日志:
[ INFO] 23:51(AbstractUrlHandlerMapping.java:registerHandler:315)
Mapped URL path [/ViewReport/] onto handler 'reportViewController'
[DEBUG] 23:51(AbstractBeanFactory.java:doGetBean:246)
Returning cached instance of singleton bean 'reportViewController'
[ INFO] 23:51(AbstractUrlHandlerMapping.java:registerHandler:315)
Mapped URL path [/ViewReport/json] onto handler 'reportViewController'
[DEBUG] 23:51(AbstractBeanFactory.java:doGetBean:246)
Returning cached instance of singleton bean 'reportViewController'
[ INFO] 23:51(AbstractUrlHandlerMapping.java:registerHandler:315)
Mapped URL path [/ViewReport/json.*] onto handler 'reportViewController'
[DEBUG] 23:51(AbstractBeanFactory.java:doGetBean:246)
Returning cached instance of singleton bean 'reportViewController'
[ INFO] 23:51(AbstractUrlHandlerMapping.java:registerHandler:315)
Mapped URL path [/ViewReport/json/] onto handler 'reportViewController'
[DEBUG] 23:51(AbstractBeanFactory.java:doGetBean:246)
Returning cached instance of singleton bean 'reportViewController'
[ INFO] 23:51(AbstractUrlHandlerMapping.java:registerHandler:315)
Mapped URL path [/ViewReport/*/json] onto handler 'reportViewController'
[DEBUG] 23:51(AbstractBeanFactory.java:doGetBean:246)
Returning cached instance of singleton bean 'reportViewController'
[ INFO] 23:51(AbstractUrlHandlerMapping.java:registerHandler:315)
Mapped URL path [/ViewReport/*/json.*] onto handler 'reportViewController'
[DEBUG] 23:51(AbstractBeanFactory.java:doGetBean:246)
Returning cached instance of singleton bean 'reportViewController'
[ INFO] 23:51(AbstractUrlHandlerMapping.java:registerHandler:315)
Mapped URL path [/ViewReport/*/json/] onto handler 'reportViewController'
在我autoreport-servlet.xml
我得到了这个:
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property
name="webBindingInitializer">
<!-- Configures Spring MVC DataBinder instances -->
<bean
class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="validator" ref="validator" />
</bean>
</property>
</bean>
答案 0 :(得分:2)
由于Servlet Specification (Section 11):
,以下映射无效<servlet-mapping>
<servlet-name>autoreport</servlet-name>
<url-pattern>/ViewReport/*/json</url-pattern>
</servlet-mapping>
路径映射之间不允许*
。对于路径映射,最后只允许使用/*
。 (好吧,当挑剔它实际上是有效的并且被允许但是它不被视为预期的通配符。)
引自Servlet规范:
在Web应用程序部署描述符中,使用以下语法 用于定义映射:
- 以“/”字符开头并以“/ *”后缀结尾的字符串用于路径映射。
- 以'*。'前缀开头的字符串用作扩展名映射。
- 仅包含'/'字符的字符串表示应用程序的“默认”servlet。在这种情况下,servlet路径是请求URI减去上下文路径,路径信息为null。
- 所有其他字符串仅用于完全匹配。
因此,您的模式/ViewReport/*/json
是完全匹配模式,没有通配符。
这就是/ViewReport/42/json
给出HTTP 404
的原因,因为它与任何模式都不匹配。
答案 1 :(得分:0)
因为在使用spring MVC时,您没有为每个控制器方法配置web.xml
中的映射,这就是@RequestMapping
注释的用途。
您为弹簧调度程序servlet配置一次所有URL,然后@RequestMapping
注释处理映射,相对于spring调度程序servlet URL。
例如,spring dispatcher servlet映射到/mvc/*
,并且您使用@RequestMapping("/xyz")
声明了一个方法,此方法的URL将为<contextPath>/mvc/xyz
。如果您将spring dispatcher servlet配置为/*
,则URL将为<contextPath>/xyz
。