Handler的作用:通过HandlerMapping把不同的url映射到各自对应的Handler,Handler处理请求并响应内容给客户端。
Spring MVC 在 Spring 2.5 发布中新添加了一种基于注解的 Controller 形式。借助于与 Spring 2.5 一同发布的容器内 <context:component-scan> 功能支持,基于注解的 Controller 几乎可以达到 XML 零配置,进而极大地提高我们的开发效率。
和其它 Controller 一样,基于注解的 Controller 同样有相应的 HandlerMapping,那就是 DefaultAnnotationHandlerMapping。同样,也有相应的 HandlerAdapter,那就是 AnnotationMethodHandlerAdapter。我们也可以自己不把 Controller 注册到容器里,需要web.xml配置 <context:component-scan>完成。开发基于注解的 Controller,我们需要做以下准备工作:
● <context:compnent-scan>
<!-- 切记,这不是必需的!除非你把注解的 Controller 一个个的注册到容器中。相信大家还是喜欢用
context:compnent-scan 吧。不要认为在 Spring MVC 中才提到 context:component-scan,
就认为它只能扫描 @Controller。component-scan 默认扫描的注解类型是 @Component,不过,在
@Component 语义基础上细化后的 @Repository, @Service 和 @Controller 也同样可以获得
component-scan 的青睐 -->
<context:component-scan base-package="org.zachary.spring3.anno.web" />
● HandlerMapping
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<description>
这点是必需的还是非必需的呢?如果定义了 DefaultAnnotationHandlerMapping,它就可以将请求来的 url 和被
注解了 @RequesMapping 的指进行匹配。当然,说这句话的前提是定义 DefaultAnnotationHandlerMapping 的
优先级比定义了其它的 HandlerMapping 的优先级要高(如果定义了其它的话)。如果没有定义
DefaultAnnotationHandlerMapping,并不代表不能映射到相应的 handler 上。因为如果你定义了其它的
HandlerMapping,请求过来的 url 和注解了的 @RequestMapping 里的值正好能匹配上,那么没有
DefaultAnnotationHandlerMapping,@Controller 一样可以如鱼得水的被捕获到。当然,如果你要使用基于注解的
@Controller,最好还是老老实实地注册 DefaultAnnotationHandlerMapping。
</description>
</bean>
● HandlerAdaptor
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<description>
和上面的 HandlerMapping 一样,是必需的还是非必需的呢?
Spring MVC 中,如果我们没有注册任何 HandlerAdaptor 到容器中,注意,我说的是任何。那么 DispatcherServlet
将启用后备的几个默认使用的 HandlerAdaptor 实现,包括:
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
org.springframework.web.servlet.mvc.AnnotationMethodHandlerAdaptor
看见没,如果我们没有注册任何的 HandlerAdaptor,框架会准备 AnnotationMethodHandlerAdaptor 的。可是
由于某些原因,我们需要为某些 HandlerAdaptoer 进行一些定制化,即在容器中注册了某个 HandlerAdaptor,
那么很抱歉,框架只会启用你注册的那个,而框架本身准备的不会被启用。所以,你一旦为某个 HandlerMapping 进行
了定制化,请别忘了把其它的 HandlerAdaptor 也注册进来,即便这些不需要定制化。否则的话,后果你是可以想象的。
当然,除非你确保你真的只需要那一个你注册进容器的 HandlerAdaptor,否则,我再啰嗦一遍,别忘了把其它的
HandlerAdaptor 也注册进来。
</description>
</bean>