DefaultAnnotationHandlerMapping的工作原理

时间:2011-04-21 07:32:31

标签: spring spring-mvc

我对DefaultAnnotationHandlerMapping的工作方式感到困惑。

在我的web.xml中我有

 <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/somePath/someWork</url-pattern>

    <url-pattern>/users</url-pattern>
    <url-pattern>/user/*</url-pattern>
  </servlet-mapping>  

我有这样的控制器,

   @RequestMapping(value="/user/adduser", method={RequestMethod.POST})
    public void addAdmin(@ModelAttribute("myData") myData data) {

        System.out.println("We reached adduser controller");

    }

在jsp文件中我有

<form:form id="adduser" method="post" action="/user/adduser" commandName="myData">

这不起作用。我得到错误没有为“/ adduser”找到处理程序映射,404为页面“/ user / adduser”

但在.xml文件中,如果我提到

  <url-pattern>/user/adduser</url-pattern>

它可以工作,或者如果我使控制器像,

  @RequestMapping(value="/adduser", method={RequestMethod.POST})

也有效。提交页面时,它会到达正确的控制器。

我现在对@ReuqestMapping的工作方式很困惑。当请求来自“/ user / adduser”时,它将从何处开始寻找合适的类和正确的方法?

1 个答案:

答案 0 :(得分:9)

Spring将与pathInfo的{​​{1}}属性匹配。

如果您的HttpServletRequest指定web.xml,那么<url-pattern>/user/*</url-pattern>将成为删除pathInfo前缀的路径,因此/user必须为{{} 1}}。

如果@RequestMapping指定/adduser,那么web.xml将是完整的<url-pattern>/user/adduser</url-pattern>路径,因此pathInfo必须与之匹配。

这不是由Spring完成的,而是由servlet容器完成的,有时会让人感到有些困惑。

您可以通过在/user/adduser中使用通配符来缓解此问题,例如

@RequestMapping