web.xml
配置springMVC的前端控制器
<!-- 配置springMVC的前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 设置spring MVC的配置文件的名称及路径 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/Spring.xml</param-value>
</init-param>
<!-- 配置启动加载,会随着项目启动就加载,值越小优先级越高(值为正整数才有效) -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!-- 没有设置contextConfigLocation参数的话,会在WEB-INF下找springmvc-servlet.xml文件 -->
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
配置请求过滤器,编码格式设为UTF-8,避免中文乱码
<!-- 配置请求过滤器,编码格式设为UTF-8,避免中文乱码 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class> org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
配置Listener自动加载spring的配置文件以及设置spring加载文件的名称及路径,默认情况是加载WEB-INF下的ApplicationContext.xml
<!-- 配置spring的加载文件名称及路径 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath: spring.xml</param-value>
</context-param>
配置HiddenHttpMethodFilter,处理从客户端发送的PUT、DELETE请求
<!-- 配置HiddenHttpMethodFilter,处理从客户端发送的PUT、DELETE请求 -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
<!-- 引入p名称就可以在bean元素中使用属性来描述property的值,简化xml配置 -->
xmlns:p="http://www.springframework.org/schema/p"
<!-- 让Spring自己去加载Bean -->
xmlns:context="http://www.springframework.org/schema/context"
<!-- util名称空间提供了集合相关的配置,包括List、Map、Set.. -->
xmlns:util="http://www.springframework.org/schema/util"
<!-- 引入TX事务名称空间 -->
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
<!-- 使用p名称空间示例 -->
<bean id="userP" class="com.pojo.User" p:uName="TOM" p:uAge="18"></bean>
<!-- 使用util名称空间,配置一个Map集合示例 -->
<util:map id="userMap">
<entry key="user1" value-ref="user" />
<entry key="user2">
<!-- 配置一个内部Bean -->
<bean class="com.pojo.User">
<property name="uAge" value="12" />
<property name="uName" value="小张" />
</bean>
</entry>
</util:map>
<!-- 指定装配规则(属性名称(byName)或者属性类型(byType)),Spring自动将匹配的属性值进行注入 -->
<bean id="user" class="com.pojo.User" autowire="byName"></bean>
<!-- 开启注解扫描,use-default-filters="false" 表示现在不使用默认filter自己配置filter -->
<context:component-scan base-package="com.pojo.User" use-default-filters="false">
<!-- context:include-filter,设置扫描哪些内容 -->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<!-- context:exclude-filter,设置不扫描哪些内容 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 配置druid链接池(JDBC) -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:8080/项目名"></property>
<property name="username" value="账号"></property>
<property name="password" value="密码"></property>
</bean>
<!-- 配置JdbcTemplate对象,注入DataSource
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 创建事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 开启事务注解 -->
<tx:annotation-driven transactionmanager="transactionManager">
</tx:annotation-driven>
<!-- 整合mybatis,创建出sqlSessionFactoryBean对象 -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 指定mybatis全局配置文件位置 -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- 指定mapper文件的位置 -->
<property name="mapperLocations" value="classpath:com/ssm/mapper/*.xml"/>
</bean>
<!-- 扫描指定的mapper接口包名,让这些mapper能够自动注入 -->
<-- <mybatis-spring:scan base-package="com.ssm.mapper"/> -->
<!-- 扫描指定的mapper接口包名,第二种方式 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ssm.mapper"/>
</bean>
</beans>
bean中的属性scope用于设置单实例还是多实例。singleton(默认值),表示是单实例对象;prototype,表示是多实例对象。
区别:
- 设置scope值是singleton时候,加载spring配置文件时候就会创建单实例对象
- 设置scope值是 prototype 时候,不是在加载spring配置文件时候创建对象,是在调用getBean方法时候创建多实例对象
<bean id="user" class="com.pojo.User" scope="prototype"></bean>
基于xml配置方式实现AOP操作
<!-- 创建对象 -->
<bean id="book" class="com.spring.Book"></bean>
<bean id="bookProxy" class="com.spring.BookProxy"></bean>
<!-- 配置aop增强 -->
<aop:config>
<!-- 切入点 -->
<aop:pointcut id="p" expression="execution(* com.spring.Book.buy(..))"/>
<!-- 配置切面 -->
<aop:aspect ref="bookProxy">
<!-- 增强作用在具体的方法上 -->
<aop:before method="before" pointcut-ref="p"/>
</aop:aspect>
</aop:config>
<!-- 配置切入点和切面 -->
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut id="pt" expression="execution(* com.spring.UserService.*(..))" />
<!-- 配置切面 -->
<aop:advisor advice-ref="txadvice" pointcut-ref="pt" />
</aop:config>
基于xml声明事务管理
<! -- 创建事务管理器 -- >
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<! -- 注入数据源(JDBC) -- >
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置通知 -->
<tx:advice id="txadvice">
<!-- 配置事务参数 -->
<tx:attributes>
<!-- 指定哪种规则的方法上面添加事务 -->
<tx:method name="accountMoney" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
springMVC.xml
<!-- 开启注解扫描,use-default-filters="false" 表示现在不使用默认filter自己配置filter -->
<context:component-scan base-package="com.pojo.User" use-default-filters="false">
<!-- context:include-filter,设置扫描哪些内容 -->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<!-- context:exclude-filter,设置不扫描哪些内容 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 视图解析 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--
配置Tomact中默认的servlet(DefaultServlet)
注意:当DefaultServlet所设置的<url-pattern>的值和开发人员所配置的servlet的<url-pattern>相同,以开发人员所配置的servlet优先
-->
<mvc:default-servlet-handler/>
<!-- mvc注解驱动 -->
<mvc:annotation-driven/>
<!-- 配置异常处理 -->
<bean class="org.springframework.web.servLet.handler.simpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- key表示异常所属的类的全路径,值为要跳转的页面名称 -->
<prop key="java.Lang.NulLPointerException">error</prop>
</props>
</property>
</bean>
自定义拦截器,使用拦截器需要拦截器类实现HandlerInterceptor接口,或继承HandlerInterceptorAdapter类,有3个方法
- preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request 进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
- postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回响应前被调用,在该方法中对用户请求request进行处理。
- afterCompletion():这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
当有多个拦截器时:
preHandle:按照拦截器数组的正向顺序执行
postHandle:按照拦截器数组的反向顺序执行
afterCompletion:按照拦截器数组的反向顺序执行
当多个拦截器(两个为例)的preHandle有不同的值时:
第一个返回false,第二个返回false:只有第一个preHandle会执行
第一个返回true,第二个返回false:两个(全部〉拦截器的preHandle都会执行
但是(全部) postHandle都不会执行,而afterCompletion只有第一个执行(返回false的拦截器之前的所有afterCompletion)
第一个返回false,第二个返回true:只有第一个的preHandle会执行
<!-- 配置拦截器,默认拦截所有请求,拦截器类需实现HandlerInterceptor接口,或继承HandlerInterceptorAdapter类 -->
<mvc:interceptors>
<!-- 第一种方式 -->
<!-- <bean class="com.FirstInterceptor"</bean> -->
<!-- 第二种方式,使用这个方式需在拦截器类上要加@Component注解 -->
<!-- <ref bean="firstInterceptor" /> -->
<!-- 第三种方式,设置自定义拦截方式 -->
<mvc:interceptor>
<!-- 定义拦截器类 -->
<bean></bean>
<!-- 设置所需要拦截的请求 -->
<mvc:mapping path=""/>
<!-- 设置排除那些请求 -->
<mvc:exclude-mapping path=""/>
</mvc:interceptor>
</mvc:interceptors>