Spring 映射

在配置文件定义URL的映射方式(HandlerMapping)。Spring提供了几种常用的HandlerMapping。

1.使用SimpleUrlHandlerMapping
SimpleUrlHandlerMapping提供了最简单的URL映射,通过Properties将URL和Controller对应起来,配置示例如下。

<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet. handler.SimpleUrlHandlerMapping">

 <!-- 为映射处理器引入拦截器bean        <property name="interceptors">  
                <list>  
                    <ref bean="workTimeInterceptor" />  
                </list>  
            </property>  
 -->  
    <property name="mappings">
        <props>
            <prop key="/a.html">controllerA</prop>
            <prop key="/b.html">controllerB</prop>
        </props>
    </property>
</bean>
这种方式和Struts的配置类似。当用户请求一个URL时,Spring就在SimpleUrl HandlerMapping注入的Properties中查找对应的Controller。


2.使用BeanNameUrlHandlerMapping

BeanNameUrlHandlerMapping的实现更为简单,每个Controller的URL与其name属性对应,因此,只需要对每个Controller以URL作为name,就可以实现URL映射。配置示例如下。

<bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet. handler.BeanNameURLHandlerMapping" />

<bean name="/a.html" class="example.chapter7.ControllerA" />
<bean name="/a.html" class="example.chapter7.ControllerB" />




(今天写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映射。


你可能感兴趣的:(spring,xml,bean,mvc,struts)