注解式控制器简介:
在spring2.5之前都是通过实现controller接口或其实现来定义处理器类。
spring2.5开始支持通过注解@controller和@requestmapping来定义处理器类,DefaultAnnotationHandlerMapping、AnnotationMethodHandlerAdapter为@controller和@requestmapping提供支持。
spring3.0引入restful架构风格支持,引入了更多的注解。
spring3.1使用新的HandlerMapping和HandlerAdapter来支持@controller、@requestmapping注解处理器类,requesthandlermappingadapter和requesthandlermapping。
spring中的[servletname]-servlet.xml配置文件分为三步:
1.配置扫描包
<context:component-scan base-package="com.tgb.web.controller.annotation"> </context:component-scan>
当spring启动的时候会自动扫描包下面含有@Component @[email protected]等这些注解的类并把它们注册为bean。也可以用传统方式直接在容器中为控制器注册,见例子。
注意:如果配置了<context:component-scan>那么<context:annotation-config/>标签就可以不用再xml中配置了,因为前者包含了后者。另外<context:annotation-config/>还提供了两个子标签如下,具体功能在此不介绍。
1). <context:include-filter>
2.) <context:exclude-filter>
且必须要在文件头声明context如下:
xmlns:context="http://www.springframework.org/schema/context"
使用<context:annotation- config/>隐式地向 Spring容器注册AutowiredAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor以及PersistenceAnnotationBeanPostProcessor这4个BeanPostProcessor使得系统能够识别@Autowired、@ Resource 、@ PostConstruct、@ PreDestroy等注解。传统的注册方式如下(比较繁琐):
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor "/>
2.配置处理器映射和处理器适配器
<!--Spring3.1开始的注解 HandlerMapping --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <!--Spring3.1开始的注解 HandlerAdapter --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <!--线程安全的访问session--> <property name="synchronizeOnSession" value="true"/> </bean>
为@controller和@requestmapping提供支持(开启该注解支持)。
3.配置视图解析器
<!-- ViewResolver --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
加上前/后缀解析视图。
一份配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="com.tgb.web.controller.annotation"> </context:component-scan> <!--Spring3.1开始的注解 HandlerMapping --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <!--Spring3.1开始的注解 HandlerAdapter --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <!--线程安全的访问session--> <property name="synchronizeOnSession" value="true"/> </bean> <!-- ViewResolver --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!--引用静态资源--> <mvc:resources location="/img/" mapping="/img/**" />
<!-- 处理器配置,也可以在此处注册控制器(其实扫描包时已经注册到容器中)-->
<bean class="com.javass.mvc.web.controller.SuccessController"/>
<bean class="com.javass.mvc.web.controller.FinshController"/>
</beans>