Spring 映射
在配置文件定义URL的映射方式(HandlerMapping)。Spring提供了几种常用的HandlerMapping。
1.使用SimpleUrlHandlerMapping
SimpleUrlHandlerMapping提供了最简单的URL映射,通过Properties将URL和Controller对应起来,配置示例如下。
这种方式和Struts的配置类似。当用户请求一个URL时,Spring就在SimpleUrl HandlerMapping注入的Properties中查找对应的Controller。
2.使用BeanNameUrlHandlerMapping
BeanNameUrlHandlerMapping的实现更为简单,每个Controller的URL与其name属性对应,因此,只需要对每个Controller以URL作为name,就可以实现URL映射。配置示例如下。
(今天写demo 的时候就是少了一句BeanNameUrlHandlerMapping,特此纪念)
之所以用Bean的name作为URL而不是id,是因为XML规范不允许在id标识中使用特殊字符“/”。当用户请求一个URL时,Spring将直接查找name为URL的Controller。
使用SimpleUrlHandlerMapping的麻烦之处在于,添加或删除Controller时必须要对SimpleUrlHandlerMapping做相应的修改,而BeanNameUrlHandlerMapping则无需手工编写映射,只需要在每个Controller中仔细定义name属性。如果使用XDoclet自动生成配置文件,则可以将name在Controller的注释中定义,维护起来更加方便。因此,我们推荐首先考虑使用BeanNameUrlHandlerMapping。事实上,如果没有在XML配置文件中定义任何UrlHandlerMapping,则Spring MVC默认使用BeanNameUrlHandlerMapping。
Spring还提供了一个ControllerClassNameHandlerMapping,它和BeanName UrlHandlerMapping类似,不过是将Controller的ClassName和对应的URL关联起来,由于这种方式灵活性欠佳,实际使用较少。
也可以混合使用多种UrlHandlerMapping,但是必须为每个UrlHandlerMapping指定order属性来表示优先级,order值越小优先级越高,Spring会先查询优先级高的UrlHandlerMapping。若找到了对应的Controller,就不再继续查询,否则,按照优先级依次查询,直到找到为止。若所有的UrlHandlerMapping都无法返回一个合适的Controller,并且没有设置默认的Controller时,就会返回给客户端一个“404 Not Found”错误,表示不存在这个URL。
3、CommonsPathMapHandlerMapping
------------------------------------
HandlerMapping
AbstractHandlerMapping
AbstractUrlHandlerMapping
AbstractDetectingUrlHandlerMapping
AbstractControllerUrlHandlerMapping
ControllerBeanNameHandlerMapping
ControllerClassNameHandlerMapping
BeanNameUrlHandlerMapping
DefaultAnnotationHandlerMapping
SimpleUrlHandlerMapping
下划线为接口,斜体为抽象类。
HandlerMapping 的作用是把请求与处理器(如Controller)做一个映射,以便于dispatcherServlet进行请求分发。
AbstractHandlerMapping实现了Order接口,顾名思义,它是有顺序的。
AbstractUrlHandlerMapping支持Ant风格(Ant-Style)的路径映射。
AbstractDetectingUrlHandlerMapping主动检查applicationContext中定义的URL映射。
AbstractControllerUrlHandlerMapping根据约定(官方文档15.10)为特定的Controller获取URL映射。
ControllerBeanNameHandlerMapping 、ControllerClassNameHandlerMapping 比较相似,前者根据applicationContext中controller的bean名称做映射,后者直接根据controller的类名做映射。
BeanNameUrlHandlerMapping根据applicationContext中定义的bean名称决定映射,这些bean不一定是controller,dispatcherServlet默认使用的HandlerMapping之一。
DefaultAnnotationHandlerMapping在JDK5.0以上是dispatcherSevlet默认使用的HandlerMapping之一,自动扫描@Controller标记的类并且做映射,极大地减少配置文件的重要工具。
SimpleUrlHandlerMapping直接在配置文件中定义URL映射。