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})