7.6日总结
一、事务
事务:通俗理解,事务其实就是一系列指令的集合。
事务的四个特性:
- 原子性:操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。
- 一致性:事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。
- 隔离性:在该事务执行的过程中,无论发生的任何数据的改变都应该只存在于该事务之中,对外界不存在任何影响。只有在事务确定正确提交之后,才会显示该事务对数据的改变。其他事务才能获取到这些改变后的数据。
- 持久性:当事务正确完成后,它对于数据的改变是永久性的。
事务的实现模式:
1、代码嵌入式
2、事务声明式
spring提供了aop对业务层的事务实现(声明式事务处理),aop的整个过程:
transactionManager对象(表示的是jdbc的事务处理)=通用方法,service层的业务方法=业务方法。
事务配置:
1 <!-- 首先告诉spring,所有的的对于数据库的操作都有事务开始管理 --> 2 <!-- 配置spring的声明式事务 --> 3 <!-- 事务管理的bean --> 4 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 5 <property name="dataSource" ref="dataSource" /> 6 </bean> 7 <!-- 声明式事务的配置 --> 8 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 9 <!-- 事务的定义 --> 10 <tx:attributes> 11 <!-- propagation称之为事务的传播性 --> 12 <tx:method name="*" rollback-for="EXCEPTION" propagation="REQUIRED"/><!-- 所有的方法全部加入到事务中 --> 13 <tx:method name="get*" propagation="NEVER"/><!-- 不执行事务操作 --> 14 <tx:method name="set*" propagation="NEVER"/><!-- 不执行事务操作 --> 15 </tx:attributes> 16 </tx:advice> 17 <!-- AOP编程实现 --> 18 <aop:config> 19 <!-- 切入点的配置,哪些类或者哪些方法进入到切面中 --> 20 <aop:pointcut expression="execution(* com.jinglin.hotelsup.service..*(..))" id="allMethods"/> 21 <!-- 把切入点同事务整合在一起 --> 22 <aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods"/> 23 </aop:config> 24 <!-- 使用annotation定义事务 --> 25 <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /> 26 27 28 <!-- 通过spring的包的扫描的方式将这些包里的类扫描到spring的容器里 --> 29 <!-- 开启注解配置--> 30 <context:annotation-config/> 31 <!-- 对dao层的扫描,实际就是批量生成dao层的bean对象 32 生成的规则:bean的id名实际就是dao层类或接口的首字母小写 33 比如,UserInfoMapper->userInfoMapper 34 GoodsInfoMapper->goodsInfoMapper 35 --> 36 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 37 <!-- 配置扫描的包名 --> 38 <property name="basePackage" value="com.jinglin.hotelsup.dao.imp"></property> 39 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> 40 </bean> 41 <!-- 将service层全部扫描到spring容器里 --> 42 <context:component-scan base-package="com.jinglin.hotelsup.service"/>
将三层架构中的dao层(mapper接口)以及业务层加入到spring中。(开启包的扫描,就是直接将一个包里所有的类扫描到spring中),首先扫描mapper代理对象(就是dao层),然后扫描service层(里面会用到自动装配)
1 <!-- 通过spring的包的扫描的方式将这些包里的类扫描到spring的容器里 --> 2 <!-- 开启注解配置--> 3 <context:annotation-config/> 4 <!-- 对dao层的扫描,实际就是批量生成dao层的bean对象 5 生成的规则:bean的id名实际就是dao层类或接口的首字母小写 6 比如,UserInfoMapper->userInfoMapper 7 GoodsInfoMapper->goodsInfoMapper 8 --> 9 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 10 <!-- 配置扫描的包名 --> 11 <property name="basePackage" value="com.jinglin.hotelsup.dao.imp"></property> 12 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> 13 </bean> 14 <!-- 将service层全部扫描到spring容器里 --> 15 <context:component-scan base-package="com.jinglin.hotelsup.service"/>
service层的配置:
1 @Transactional//注解类 2 @Service//注解声明是service层 3 public class UserInfoService { 4 //注入的dao层 5 @Autowired 6 private UserInfoMapper userInfoMapper; 7 private GoodsInfoMapper goodsInfoMapper; 8 public List<UserInfo> getallusers(){ 9 return userInfoMapper.getlist(); 10 } 11 12 public int adduser(UserInfo u){ 13 return userInfoMapper.additem(u); 14 } 15 16 @Transactional(propagation=Propagation.NOT_SUPPORTED)//不加入事务控制 17 public List<UserInfo> allusers(){ 18 return userInfoMapper.getlist(); 19 } 20 21 }
二、spring Mvc
Spring Mvc开发步骤:
1、引入java包
2、根据springmvc的执行流程,首先需要配置前端控制器,前端控制器配置在web.xm中。前端控制器就是一个servlet
1 <!-- 配置sringmvc的前端控制器 --> 2 <servlet> 3 <servlet-name>springmvc2</servlet-name> 4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 5 <init-param> 6 <param-name>contextConfigLocation</param-name> 7 <param-value>classpath:springmvc.xml</param-value> 8 </init-param> 9 <load-on-startup>1</load-on-startup> 10 </servlet> 11 <servlet-mapping> 12 <servlet-name>springmvc2</servlet-name> 13 <url-pattern>*.action</url-pattern><!--配置的访问路径,一定是按照这种格式写 --> 14 </servlet-mapping>
注意:1)关于前端控制器中的url路径的匹配为什么会采用*.action.
如果是采用/*,那么会将由控制器转发的jsp页面也会进入到前端控制器的拦截中,然后会映射相应的控制器,
这样就会导致找不到相应的控制器出错。
3、开发springmvc.xml的配置文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation=" 6 http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context.xsd 10 http://www.springframework.org/schema/mvc 11 http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd" 12 default-autowire="byName">
4、SSM框架整合的时候,需要在web启动的时候就需要加载applicationContext.xml,也是在web.xml里配置监听器。
1 <listener> 2 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 3 </listener> 4 <context-param> 5 <param-name>contextConfigLocation</param-name> 6 <param-value>classpath:applicationContext.xml</param-value> 7 </context-param>
5、编写controller(控制器需要继承自Controller接口)
1 public class UserInfoController implements Controller{//继承控制器接口 2 private UserInfoService userInfoService; 3 4 public UserInfoService getUserInfoService() { 5 return userInfoService; 6 } 7 8 public void setUserInfoService(UserInfoService userInfoService) { 9 this.userInfoService = userInfoService; 10 } 11 12 @Override 13 public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception { 14 List<UserInfo>list=userInfoService.allusers();//调用业务层的方法 15 ModelAndView modelAndView=new ModelAndView();// 16 modelAndView.addObject("list",list);//给视图传递的模型数据 17 modelAndView.setViewName("/users.jsp");//把数据响应给页面,所以modelandview存储了model的数据还有页面转发的地址。 18 return modelAndView; 19 } 20 21 }
6、编写bean对象:
1 <bean name="/userlist.action" class="com.jinglin.hotelsup.controller.UserInfoController"> 2 </bean> 3 <!-- 配置handllerMapping --> 4 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> 5 <!-- 视图解析的bean对象 --> 6 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>