DefaultAnnotationHandlerMapping如何工作


问题内容

我对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”的处理程序映射,以及针对页面“ / user / adduser”的404映射

但是如果我提到.xml文件中

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

它有效,或者如果我使控制器类似,

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

也可以。提交页面时,页面到达正确的控制器。

我现在对@ReuqestMapping的工作方式感到困惑。当一个请求像“ / user /
adduser”那样从那里开始时,它将开始寻找正确的类和正确的方法?


问题答案:

Spring将与的pathInfo属性匹配HttpServletRequest

如果您web.xml指定<url-pattern>/user/*</url- pattern>,则pathInfo将会是/user删除了前缀的路径,因此@RequestMapping必须为/adduser

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

这不是由Spring完成的,而是由servlet容器完成的,有时可能会造成一些混乱。

您可以通过在中使用通配符来缓解这种情况@RequestMapping,例如

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