首页 > 代码库 > 7.6日总结

7.6日总结

一、事务

事务:通俗理解,事务其实就是一系列指令的集合。

事务的四个特性:

  1. 原子性:操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。
  2. 一致性:事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。
  3. 隔离性:在该事务执行的过程中,无论发生的任何数据的改变都应该只存在于该事务之中,对外界不存在任何影响。只有在事务确定正确提交之后,才会显示该事务对数据的改变。其他事务才能获取到这些改变后的数据。
  4. 持久性:当事务正确完成后,它对于数据的改变是永久性的。

事务的实现模式:

       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="http://www.mamicode.com/com.jinglin.hotelsup.dao.imp"></property>
39         <property name="sqlSessionFactoryBeanName" value="http://www.mamicode.com/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="http://www.mamicode.com/com.jinglin.hotelsup.dao.imp"></property>
12         <property name="sqlSessionFactoryBeanName" value="http://www.mamicode.com/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>

 

7.6日总结