spring2.5 学习笔记 第41页 共46页
第十一课:Spring整合-SSH
Struts2.1.6 + Spring2.5.6 + Hibernate3.3.2
一、 第一步:加入jar包(需要的jar包列表)
jar包名称 antlr-2.7.6.jar aspectjrt aspectjweaver cglib-nodep-2.1_3.jar common-annotations.jar commons-collections-3.1.jar commons-fileupload-1.2.1.jar commons-io-1.3.2 commons-logging-1.1.1 dom4j-1.6.1.jar ejb3-persistence freemarker-2.3.13 hibernate3.jar hibernate-annotations hibernate-common-annotations javassist-3.9.0.GA.jar jta-1.1.jar junit4.5 mysql- ognl-2.6.11.jar slf4j-api-1.5.8.jar slf4j-nop-1.5.8.jar spring.jar struts2-core-2.1.6.jar xwork-2.1.2.jar commons-dbcp commons-pool.jar struts2-spring-plugin-2.1.6.jar 建议:
将这些所有的jar包保存到一个位置,使用的时候直接copy
所在位置 hibernate/lib/required spring/lib/aspectj .. spring/lib/cglib spring/lib/j2ee hibernate/lib/required struts/lib struts/lib 单独下载,删除1.0.4(struts/lib) hibernate/required hibernate-annotation/lib struts/lib hibernate hibernate-annotation/ hibernate-annotation/lib hiberante/lib/required .. struts/lib hibernate/lib/required hibernate/lib/required spring/dist struts/lib struts/lib spring/lib/jarkata-commons .. struts/lib 说明 解析HQL AOP AOP 代理,二进制增强 @Resource 集合框架 struts struts struts spring 解析xml @Entity struts hibernate hibernate transaction hibernate-log struts2 spring2.5 学习笔记 第42页 共46页
二、 第二步: 首先整合Spring + Hibernate
具体的方法,请见第十课
三、 第三步:再来整合Struts2
因为SSH时,是Struts2为主导,Struts2向Spring索要Action,Action是由Spring产生的。 因为Spring作为Struts2的一个插件加入到Struts2里的。
具体步骤: 1. 2. 3.
加入Struts2的配置文件:struts2.xml 修改web.xml加入 struts的filter
因为webapp启动时Spring并不会自动启动,那当然就不能初始化bean了,因为需要在webapp启动就自动启动Spring容器,这样可以将bean交给Spring来管理。我们可以利用listener来完成
这就是需要使用Struts2 for spring的插件了,那当然就需要引入struts2 for spring plugin的jar包了
struts2-spring-plugin-2.1.8.1.jar
并加入Struts2-spring-plugin的配置文件,来告诉webapp启动来初始化spring容器
需要在web.xml加入监听器 am-value>
4. 5.
规划struts的action和jsp展现 建立好action和jsp spring2.5 学习笔记 第43页 共46页
修改配置,由spring替代struts产生Action对象 注意:现在SSH整合后,action将不再是Spring管理,而是Struts-spring-plugin来管理。或是说Struts2来管理了。 因此:Action上不需要注解任务的,Struts启动后,将Action其初始化后放心Struts2的一个容器里,而其它的还是Spring来管理。Struts2初始化时,会自动根据Action中的setXXX方法全部自动注入,注入的bean是从Spring容器中提取的。
在Action中不管你有没有注解,Struts2都会自动帮你注入,并且使用名称的方式注入,如果您想指定注入名称,则可以在成员属性前面进行注解。 而Action这个bean的ID就是在Struts2.xml的配置文件中配置Action的name属性值就是了。注意了。 Struts2:Action Spring管理:dao/servce 6. 修改action配置 注意了:Actionr配置的name不能与Action中的成员属性名称发生冲突,因为Struts2自动注入成员属性的bean,而且是根据name来注入的。 四、 struts的读常量: 1. 2. 3. 4. 5.
struts-default.xml struts-plugin.xml struts.xml struts.properties web.xml
第十二课:DTO、VO
一、 DTO
Data Transfer Object 负责运送数据的(传输数据)
二、 VO
Value Object 值对象
可用于,from里与数据库不一致时。就可以使用了。然后再构建实体类
注意:实体对象是反映到数据库中,而值对象只是在使用数据时才用到。
spring2.5 学习笔记 第44页 共46页
第十二课:SSH整合存在的问题
一、 Jsp中访问Session时,Session已经关闭
由于hibernate的load的方法是返回一个代理,而这个代理只有在实际使用时,才会发出SQL语句(才会访问数据库),当对象在JSP中使用时,load方法的事务已经关闭,也就是说session已经关闭,这时jsp才开始使用这个代理对象,才开始正直访问数据库发出SQL语句,发现session已经关闭,所以访问不了。
解决法办:就是让session在JSP使用后,才关闭,
具体:添加一个过滤器,在访问前经过过滤器,这时开启事务opsession。然后等方法结束时(JSP已经处理完数据了),还是要经过滤过器,才时我们才关闭session,这样就OK了。
Spring已经帮我处理好了:我们只需要配置这个过滤器就可以了,需要在web.xml中配置这个过滤器: org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
如果在web.xml文件中配置了。openSessionInView选项,而在beans.xml没有配置事务。这样在对数据库进行写操作时,会提示错误,原因:
因为:如果spring没有配置事务,则openSessionInview会默认设置,事务为只读事务。不能进行写操作。 配置事务了。openSessionInView认为是读写。
spring2.5 学习笔记 第45页 共46页
三、 中文乱码问题:
1、 如果是Struts2.1.6或是之前的,则使用Strunts2的i18n设置是无效,因为我们需要通过过虑器来进行,我们可以自己定义一个过虑器,但Spring已经帮我定义好了这个过虑器了。我们直接取来使用就可以了。
需要为这个filter的encoding属性指定一个参数值(就是中文编码)
2、 如果是Struts2.1.8这个Bug已经修正,我们只需要在Struts.xml文件中配置一个属性就可以了:如下:
LazyInitializationException OpenSessionInViewFilter 需要严格顺序问题
需要加到struts2的filter前面 知识点名称 IOC XML IOC Annotation IOC 注入方式(两种) 简单属性 集合注入 自动装配 生命周期 AOP概念 AOP配置 事务管理AOP(xml annotation) hibernateTemplate 架构 OpenSessionInView CharacterEncodingFilter TestContext SpringJDBCTemplate 介绍 工作重要程度 *** *** *** * * * * * *** *** *** *** *** * 面试重要程度 * * * *** ** *** ** 方法建议 练 练 练+背 查 查 查 练+背 练+理解+说 用到现学