一、<context:annotation-config> 和 <context:component-scan>
<context:annotation-config>的作用:将已经在spring容器中注册的bean激活。实际含义是,使注解能使用已经在spring容器中注册的过的bean,不论是通过xml配置和通过包扫描注册的bean,都包含在内。
<context:component-scan>的作用:在<context:annotation-config>的基础上,可以扫描指定包,将包含注解的类注册到spring容器中。如:<context:component-scan base-package="ki"/>。
二、<mvc:annotation-driven>
<mvc:annotation-driven>会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,这是Spring MVC为@Controller分发请求所必需的,并且提供了数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持读写XML的支持(JAXB)和读写JSON的支持(默认Jackson)等功能。
我们找到对应的实现类是:
org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser.
通过阅读类注释文档,我们发现这个类主要是用来向工厂中注册了
RequestMappingHandlerMapping
BeanNameUrlHandlerMapping
RequestMappingHandlerAdapter
HttpRequestHandlerAdapter
SimpleControllerHandlerAdapter
ExceptionHandlerExceptionResolver
ResponseStatusExceptionResolver
DefaultHandlerExceptionResolver
上面几个Bean实例.这几个类都是用来做什么的呢?
前两个是HandlerMapping接口的实现类,用来处理请求映射的.
- 其中第一个是处理
@RequestMapping
注解的. - 第二个会将controller类的名字映射为请求url.
中间三个是用来处理请求的.具体点说就是确定调用哪个controller的哪个方法来处理当前请求.
- 第一个处
理@Controller
注解的处理器,支持自定义方法参数和返回值(很酷). - 第二个是处理继承HttpRequestHandler的处理器.
- 第三个处理继承自Controller接口的处理器.
后面三个是用来处理异常的解析器.
另外还将提供以下支持:
① 支持使用ConversionService实例对表单参数进行类型转换;
② 支持使用@NumberFormatannotation,@DateTimeFormat注解完成数据类型的格式化;
③ 支持使用@Valid注解对Java bean实例进行JSR 303验证;
④ 支持使用@RequestBody和@ResponseBody注解
三、<mvc:default-servlet-handler />和<mvc:resources />
这两个注解都是用来处理静态资源的,其实不使用它们也可以访问静态资源,那么使用这两个注解的意义是什么。
这其实是书写规范的问题,其强调HTTP应当以资源为中心,并且规范了URI的风格,这种书写规范不希望待.html或.do等后缀,但是早期的Spring MVC不能很好的处理静态资源,所以在请求映射里,不会使用/,而通常使用*.do等的方式。
所以为了,规范,为了使用/的请求映射,新加了这两个功能。
当使用*.do的后缀时,spring在找不到相应的映射处理时,会按照请求路径查找静态资源路径。但是,在使用/的映射处理时,spring容器会将所有的请求当成映射路径,不回去查找资源文件,处理这种情况,就用到了这两个注解。
1、<mvc:default-servlet-handler />
在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。
一般Web应用服务器默认的Servlet名称是"default",因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web应用服务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定:
<mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" />
2、<mvc:resources />
<mvc:default-servlet-handler />将静态资源的处理经由Spring MVC框架交回Web应用服务器处理。而<mvc:resources />更进一步,由Spring MVC框架自己处理静态资源,并添加一些有用的附加值功能。
<mvc:resources />通过location和mapping参数,可以访问项目中的任何一处静态资源。
<mvc:resources location="/,/css/,/WEB-INF/classes/,/WEB-INF/classes/,classpath:/" mapping="/resources/**/"/>
location属性:项目内的文件路径(部署后的路径),其中classpath:/等同于/WEB-INF/classes/。
mapping属性:将项目内的实际路径,映射到的一个虚拟的用于请求静态资源的路径。
注意:每个location路径只能报该文件夹下的资源文件映射到mapping,如:/只能映射项目根目录下的资源文件,而不能映射跟目录下的css文件夹下的目录,必须新加一个/css/的配置。
配置完成后,当要请求静态资源路径时:
例如 ,在跟目录径下的css文件夹下有个style.css,那么请求路径就是:http://localhost:8080/ssm-login/resources/style.css
即使是WEB-INF下的文件,也可以得到,WEB-INF下的login.jsp的请求路径:http://localhost:8080/ssm-login/resources/login.jsp
四、 <tx:annotation-driven transaction-manager="" />
含义为:支持使用注解来进行实物管理,并指定一个事务管理器。
<util:properties id="cfg" location="classpath:config.properties"/> <!--配置DruidDataSource连接池 --> <bean id="ds" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" init-method="init" lazy-init="true"> <property name="driverClassName" value="#{cfg.driver}" /> <property name="url" value="#{cfg.url}" /> <property name="username" value="#{cfg.username}" /> <property name="password" value="#{cfg.password}" /> <!-- 初始化连接大小 --> <property name="initialSize" value="#{cfg.initialSize}" /> <!-- 连接池最大数量 --> <property name="maxActive" value="#{cfg.maxActive}" /> <!-- 连接池最小空闲 --> <property name="minIdle" value="#{cfg.minIdle}" /> <!-- 获取连接最大等待时间 --> <property name="maxWait" value="#{cfg.maxWait}" /> </bean> <!-- 事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="ds" /> </bean> <!-- 支持使用注解来进行事务管理 --> <tx:annotation-driven transaction-manager="transactionManager" />