我一直在Servlet环境中使用Spring MVC开发很长一段时间,主要是在Spring 3.1.x和3.2.x上,但是最近将作业转移到使用Spring 3.0.6混合使用Portlet和Servlet的公司
Fist,似乎有两个版本的DefaultAnnotationHandlerMapping,一个用于Portlets,另一个用于Servlets。我对Portlet的了解有限,让我相信它们只是Servlet的扩展,因此我可以模糊地理解需要两个独立的HandlerMappings,一个用于处理通用Servlet,另一个用于处理Portlest的细节。抛弃我的是他们每个人对于如何处理@RequestMapping注释以及我的新雇主如何选择设置方式表现出不同的行为。
在我过去,我有一个DispatchHandler用于整个应用程序。我知道你可以拥有多个DispatchHandler,但是我从未看到过去分离子上下文XML的好处。无论如何,在过去我会将DispatchHandler映射到“/”,然后每个Controller使用@RequestMapping(“/ someUrl”)在顶部设置映射,然后在每个处理程序方法上设置另一个@RequestMapping,进一步扩展URL映射。所以,从浏览器我会得到类似的东西:
第一个“/ myWar”映射到WAR部署,下一个“/”映射到DispatchServlet,“/ myController”是Controller的映射,后面的任何内容都使用URL的组合与某些方法匹配签名,请求方法,参数等。
现在让我们评估一下我在新公司看到的内容。首先,每个Controller都有自己的DispatchServlet,因此定义了20-30个DispatchServlet,它们都映射了不同的基URI,一些具有相同的基本Application Context XML,一些具有不同的,都使用ContextLoaderListener中的相同Application Context。后续DispatchServlet的每个路径与其“映射”控制器上的@RequestMapping相同,因此在上面的示例中,DispatchServlet将具有路径“/ myController”,而Controller将具有@RequestMapping(“/ myController”)。最重要的是,在Controller的方法级别,@ RequestMapping上指定的值似乎完全忽略了应用于它的任何其他路径。
所以,例如,如果我有一个带@RequestMapping的控制器(“/ myController”),后跟一个带@RequestMapping(“/ edit”)的方法,点击URL http://somehost.com/myWar/myContoller/edit会给我一个404。但是,如果我将方法级别的@RequestMapping更改为@RequestMapping(参数=“actionMethod = edit”),并将URL更改为http://somehost.com/myWar/myController?actionMethod=edit,则它会正常映射并获取我的页面。此外,如果我将方法级别@RequestMapping更改为@RequestMapping(value =“/ edit”,params =“actionMethod = view”),则http://somehost.com/myWar/myController?actionMethod=edit和http://somehost.com/myWar/myController/edit?actionMethod=edit都不起作用。问题是,现在除了方法级别的默认映射之外,还需要我采用“?actionMethod = edit”,而不是简单地使用添加的路径扩展URI。此外,它阻止我使用RESTful方法,因为现在我无法定义类似@RequestMapping(“/ somePath / {id}”)的内容。
我脑子里有这么多的讨论,比如为什么web.xml中的DispatchServlet映射与Controllers @RequestMapping重叠,为什么当我将value属性设置为a时,Controller的方法级别的@RequestMapping不起作用有效的URI映射,但在我设置一些参数映射时工作正常吗?
哦,抱歉长篇大论。我只是想更好地了解这里发生的事情,所以我可以用智能方法处理它,或者回到我的新组并说“这应该改变,这就是为什么”。如果有帮助,我可以用一些简化的代码示例扩展这个冗长的问题。