为什么这个Java servlet url-pattern / RequestMapping不起作用?

时间:2013-12-13 22:43:02

标签: java servlets

我定义了这个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'

更新2

在我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>

2 个答案:

答案 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