Spring、Mybatis、SpringMVC集成
(主要是自动扫描控制器,视图模式,注解的启动)
第1步、web.xml
<!-- 配置Spring和mybatis的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-dao.xml</param-value>
</context-param>
<!-- Spring监听器 也就是加载上面配置的spring-dao.xml -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置spring mvc默认编码 -->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- ************************ -->
<!-- 配置spring mvc过滤器配置 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
第2步、springmvc-servlet.xml (配置spring mvc的,没有其他的增加)
<!--配置扫描路径 spring可以自动去扫描base-pack下面或者子包下面的Java文件,如果扫描到有 -->
<!-- @Component @Controller@Service等这些注解的类,则把这些类注册为bean -->
<context:component-scan base-package="com.springmvc"></context:component-scan>
<!--启用MVC注解功能 增加了下面的<mvc:resources >必须使用,否则不能访问spring控制器(Controller) -->
<mvc:annotation-driven />
<!--能够访问静态静态,(因为spring过滤器是拦截 / 所有的要求)如果不加,所有的静态资源都会经过spring的处理,这个时候静态资源不能访问了 -->
<mvc:resources location="/images/" mapping="/images/**" />
<mvc:resources location="/css/" mapping="/css/**" />
<mvc:resources location="/style/" mapping="/style/**" />
<mvc:resources location="/script/" mapping="/script/**" />
<mvc:resources location="/js/" mapping="/js/**" />
<mvc:resources location="/fonts/" mapping="/fonts/**" />
<!-- 文件上传 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="utf-8" />
<!-- 文件大小最大值(字节) -->
<property name="maxUploadSize" value="10485760000" />
</bean>
<!-- 配置视图页面解析 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
第3步、spring 控制器
@Controller
public class UserController {
// 根据名字取service层的实例(由spring自动注入)
@Resource(name="UserServiceImp")
UserService us;
@RequestMapping("/seluser")
public String seluser(HttpServletRequest request) {
User user = us.getUser(33);
request.setAttribute("user", user);
return "user";
}
第4步、增加spring对事务的控制 (直接在spring的配置文件后面加入,对应上面的Spring-dao.xml)
Spring容器优先加载由ServletContextListener(对应applicationContext.xml)产生的父容器,而SpringMVC(对应mvc_dispatcher_servlet.xml)产生的是子容器。子容器Controller进行扫描装配时装配的@Service注解的实例是没有经过事务加强处理,即没有事务处理能力的Service,而父容器进行初始化的Service是保证事务的增强处理能力的。如果不在子容器中将Service exclude掉,此时得到的将是原样的无事务处理能力的Service,因为在多上下文的情况下,如果同一个bean被定义两次,后面一个优先。 因为事务是对service层进行处理,所以service层的扫描必须放在application.xml里面,不能在springmvc.xml里面、service层尽量用接口
►1、Annotation注解式事务
spring_dao.xml增加
<!--************************** 配置注解 开始************************* -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!--************************** 配置注解 结束************************* -->
<!--************************** 配置基于Mybatis的事务切面类 开始************************* -->
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
业务层增加
//使用@transaction 标注持久化方法,实现事务控制,此语法可以附加到类、接口、方法声明之前,注解的参数提供多种事务控制机制
@Override
@Transactional(propagation = Propagation.REQUIRED)
public int insertGoodsAndGoodsType(Goods goods, Goodstype goodsType) {
goodsMapper.insert(goods);
// int a = Integer.parseInt("a");
goodstypeMapper.insert(goodsType);
return 0;
}
►2、声明式事务XML
<!--配置基于Mybatis的事务切面类 -->
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--手动配置事务的建议 -->
<tx:advice id="tx_advice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="query*" read-only="true" />
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!--配置切入点 -->
<aop:config>
<aop:pointcut expression="execution(* *.service..*(..))"
id="pointcut" />
<aop:advisor advice-ref="tx_advice" pointcut-ref="pointcut" />
</aop:config>