【Java EE 学习 54】【OA项目第一天】【SSH事务管理不能回滚问题解决】【struts2流程回顾】
2015-10-10 08:51
806 查看
一、SSH整合之后事务问题和总结
1.引入问题:DAO层测试
假设将User对象设置为懒加载模式,在dao层使用load方法。
web.xml
最后,使用OSIV模式应当注意的事项:
1.使用OSIV模式之后,sessio的打开被提前了,session的关闭被延后了,这样就解决了懒加载引起的异常的问题。
2.两个过滤器,OSIV的过滤器必须在struts2之前。
使用OSIV模式的缺点:
因为Session的关闭被延迟了,所以hibernate的一级缓存在session中,所以会导致大量的缓存数据长期保存在了内存中。
三、Struts2流程回顾
1.启动服务器的时候干了两件事情。
![](http://images2015.cnblogs.com/blog/516671/201510/516671-20151010153642768-332091604.jpg)
* dispatcher = init.initDispatcher(config);该句代码加载了各种各样的配置文件。
* init.initStaticContentLoader(config, dispatcher); 该句代码完成了静态注入。
2.当过滤器拦截到一个请求的时候做了什么事情
查看doFilter方法中的源代码。
(1)创建AciontContext对象。
创建ActionContext对象的同时会同时创建ValueStack对象,而且创建ValueStack对象在前,创建ActionContext对象在后。
![](http://images2015.cnblogs.com/blog/516671/201510/516671-20151010200846799-2013051774.jpg)
两个对象同时创建,而且两个对象维护同一个Map对象,原因是创建ActionContext的时候使用的参数是ValueStack对象的context成员变量。
![](http://images2015.cnblogs.com/blog/516671/201510/516671-20151010205241253-1168137930.jpg)
通过代码ActionContext.setContext(tx);即可以将ActionContext放置到ThreadLocal中了,这样数据就安全了,下面是代码追踪。
![](http://images2015.cnblogs.com/blog/516671/201510/516671-20151011082127753-1379285520.jpg)
(2)创建ActionProxy对象
![](http://images2015.cnblogs.com/blog/516671/201510/516671-20151010212426268-1757989267.jpg)
init方法中执行了创建了对应的Action和所有的拦截器。
![](http://images2015.cnblogs.com/blog/516671/201510/516671-20151011083113799-190771437.jpg)
最后在invocation的invoke方法中执行所有的拦截器、执行当前请求的action、执行结果集。
![](http://images2015.cnblogs.com/blog/516671/201510/516671-20151011092419878-1463142439.jpg)
四、Struts2的完整流程图
![](http://images2015.cnblogs.com/blog/516671/201510/516671-20151011095737081-1122976218.jpg)
最后附上项目源代码:https://github.com/kdyzm/day53_ssh_oa
1.引入问题:DAO层测试
假设将User对象设置为懒加载模式,在dao层使用load方法。
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <!-- 使用OSIV模式解决事务回滚问题,只需要添加一个监听器就可以了 --> <filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <filter> <filter-name>strutsFilter</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>strutsFilter</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext.xml</param-value> </context-param> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
web.xml
最后,使用OSIV模式应当注意的事项:
1.使用OSIV模式之后,sessio的打开被提前了,session的关闭被延后了,这样就解决了懒加载引起的异常的问题。
2.两个过滤器,OSIV的过滤器必须在struts2之前。
使用OSIV模式的缺点:
因为Session的关闭被延迟了,所以hibernate的一级缓存在session中,所以会导致大量的缓存数据长期保存在了内存中。
三、Struts2流程回顾
1.启动服务器的时候干了两件事情。
![](http://images2015.cnblogs.com/blog/516671/201510/516671-20151010153642768-332091604.jpg)
* dispatcher = init.initDispatcher(config);该句代码加载了各种各样的配置文件。
* init.initStaticContentLoader(config, dispatcher); 该句代码完成了静态注入。
2.当过滤器拦截到一个请求的时候做了什么事情
查看doFilter方法中的源代码。
(1)创建AciontContext对象。
创建ActionContext对象的同时会同时创建ValueStack对象,而且创建ValueStack对象在前,创建ActionContext对象在后。
![](http://images2015.cnblogs.com/blog/516671/201510/516671-20151010200846799-2013051774.jpg)
两个对象同时创建,而且两个对象维护同一个Map对象,原因是创建ActionContext的时候使用的参数是ValueStack对象的context成员变量。
![](http://images2015.cnblogs.com/blog/516671/201510/516671-20151010205241253-1168137930.jpg)
通过代码ActionContext.setContext(tx);即可以将ActionContext放置到ThreadLocal中了,这样数据就安全了,下面是代码追踪。
![](http://images2015.cnblogs.com/blog/516671/201510/516671-20151011082127753-1379285520.jpg)
(2)创建ActionProxy对象
![](http://images2015.cnblogs.com/blog/516671/201510/516671-20151010212426268-1757989267.jpg)
init方法中执行了创建了对应的Action和所有的拦截器。
![](http://images2015.cnblogs.com/blog/516671/201510/516671-20151011083113799-190771437.jpg)
最后在invocation的invoke方法中执行所有的拦截器、执行当前请求的action、执行结果集。
![](http://images2015.cnblogs.com/blog/516671/201510/516671-20151011092419878-1463142439.jpg)
四、Struts2的完整流程图
![](http://images2015.cnblogs.com/blog/516671/201510/516671-20151011095737081-1122976218.jpg)
最后附上项目源代码:https://github.com/kdyzm/day53_ssh_oa
相关文章推荐
- Java基础知识强化之集合框架笔记61:Map集合之统计字符串中每个字符出现的次数的案例
- JAVA设计模式之单例模式
- Java基础:this关键字、super关键字
- eclipse导入项目中文乱码解决
- Java基础:GC的工作原理
- java编程接口(6) ------ 图标
- Java8 Lambda表达应用 -- 单线程游戏server+异步数据库操作
- java.lang.OutOfMemoryError: PermGen space
- spring mvc拦截器和<mvc:annotation-driven />的详解
- 浅谈方法重写 super
- struts配置 WEB得拷贝要注意的事项
- Java环境配置之javac不是内部或外部命令
- 两个数组求和为一个固定数值的所有组合java实现
- Reverse Second half of LinkedList Java实现
- Valid Parentheses Java
- 大龄屌丝自学笔记--Java零基础到菜鸟--032
- <constant name="struts.devMode" value="true" />
- java动态代理(JDK和cglib)
- 设计模式——简单工厂模式
- 大龄屌丝自学笔记--Java零基础到菜鸟--031