Spring学习_08_Spring整合Hibernate+Struts
来源:互联网 发布:sqlalchemy 执行sql 编辑:程序博客网 时间:2024/06/06 08:29
有很长一段时间没有写博客,今天写一个SSH小小的Demo作为自己SSH学习的一个阶段总结。
本文给出写这个demo的一些小知识点和一些要注意的事项,记录在此,作为自己的备忘。
1:我们在开发项目的时候,针对功能做Junit测试的时候,一定不可以破坏数据现场,所以做Junit测试的时候,插入到数据库的数据一定要记得删除。当然,我们可以借助于Spring自动化测试框架TestContext来做测试,这样我们就可以不用自己每次自己去恢复数据现场,因为spring提供了的测试时基于事务的,所以默认支持回滚。
2:spring结合struts的时候是借助于struts提供的一个插件“struts-spring-plugin”来完成的,这样我们就可以让spring来帮助我们管理Action,可以实现Action中属性的依赖注入。关于这个,必须要注意区别以下两种情况。
第一种,就是我们的Action中我们什么注释也不写,包括@Resource,@Component, @Scope等。这个时候的情况就是存在两个容器,一个Struts的,一个Spring的,Struts容器负责初始化Action(由插件来完成),然后根据ByName去Spring容器中找相应属性来填充。这个时候我们的Struts.xml配置文件如下所示:注意看Action的Class属性。
<struts><constant name="struts.i18n.encoding" value="UTF-8"></constant><constant name="struts.enable.DynamicMethodInvocation" value="true" /> <package name="registration" extends="struts-default" namespace="/"><action name="user" class="com.zxb.registration.action.UserAction"><result name="success">/registrationSuccess.jsp</result><result name="input">/registration.jsp</result><result name="listAllUsers">/listAllUsers.jsp</result><result name="userDetail">/userDetail.jsp</result></action></package></struts>第二种,就是我们不使用Struts的容器,所有的实例bean都由spring来帮助我们产生。这个时候,我们就需要在Action中配置各种注解了。然后在Struts.xml文件中,我们的class不在是指向一个Action类的全路径,而是指向的一个我们spring容器中的一个bean,代码如下所示:
<struts><constant name="struts.i18n.encoding" value="UTF-8"></constant><constant name="struts.enable.DynamicMethodInvocation" value="true" /> <package name="registration" extends="struts-default" namespace="/"><!-- 次数的Action的class属性我们设置为Spring容器中的一个Bean引用,这样就放置出现Struts荣琼自己去实例化Action,然后在去spring容器中找属性填充,这样设置,也就是说将Action产生也交由Spring容易来管理。 --><action name="user" class="userAction"><result name="success">/registrationSuccess.jsp</result><result name="input">/registration.jsp</result><result name="listAllUsers">/listAllUsers.jsp</result><result name="userDetail">/userDetail.jsp</result></action></package></struts>
3:spring中事物的边界一定要做好。否则引起数据混乱。
4:Action中属性的三种注入方式(哪三种??使用Action的属性接收参数,使用DomainModel接收参数,使用ModelDriven接收参数)。
5:struts中属性的注入小心属性注入错误,默认按名字注入(autowire=byName),所以,命名约定很重要。一个原则,优秀的命名,不论是按照类型还是名字查找,找到的都是一个对象。
6:openSessionInViewFilter.和 openSessionInViewInterceptor,由于我们的事物边界设置在service层,所有一旦数据取到Action中,然后送到jsp中展现的时候,如果这个时候显示数据的时候,又要去数据库取数据,但是这个时候,Session已经关闭,那么就会失败,所有要配置这个过滤器或者是拦截器(过滤器为例),在一个请求到达struts的核心filter之前,就告诉他,如果后面开启了事物,就不要关闭了,等着我(过滤器)来关闭,这样就可以保证在Struts核心处理完jsp页面展现之后,过滤器才关闭session,从而避免出错,所以,这个过滤器也一定一定要放置在struts的核心过滤器之前类配置,否则,在struts核心处理jsp页面之前就关闭session,从而出错。代码如下:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:beans.xml</param-value></context-param><filter><filter-name>openSessionInViewFilter</filter-name><filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class><init-param><param-name>sessionFactoryBean</param-name><param-value>sessionFactory</param-value></init-param></filter><filter-mapping> <filter-name>openSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter><!-- 这个filter一定要放在StrutsPrepareAndExecuteFilter的前面,以为页面数据必须在提交到Struts之前进行编码的转换 --><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping> <filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>
7:配置openSessionInViewFilter以后,默认支持的事物是只读的!!所以必须在spring的配置文件中,必须配置事物的读写权限。而且默认的事物边界在DAO层,这个也需要我们自己配置到Service层中去。
8:乱码处理:struts.xml配置和spring的CharacterEncodingFilter的配置。
如果是要配置Struts来处理乱码,值直接配置一个常量:<constant name="struts.i18n.encoding" value="UTF-8"></constant>即可。
如果是要配置Spring插件来处理的话,我们就需要把这个过滤字符的过滤器设置到web.xml中,而且这个过滤器一定一定要放置在struts的核心Filter之前,因为过滤器是有顺序的,如果放在之后,Struts都已经把数据接收完成了。这个时候,配置的过滤器就没有效果了。必须在Struts接收数据之前就过滤。代码如上面配置openSessionInViewFilter的时候所示。
9:MVC三层架构的分层如何划分。V:指的是jsp展现层,C:在ssh之前,指的是servlet,在ssh中,指的就是我们的Action,而除去这两层之外的所有业务层,DAO层,都是我们的Model层。这个不要理解错了。
10:springJDBCTemplate同HibernateTemplate一样,不过封装的是JDBC的模块。
附件:示例代码
- Spring学习_08_Spring整合Hibernate+Struts
- 整合 struts spring hibernate
- struts+spring+hibernate整合
- struts,hibernate,spring整合
- struts+spring+hibernate整合
- struts+spring+hibernate整合
- Struts hibernate Spring 整合
- Struts hibernate Spring 整合
- 整合Spring、Struts、Hibernate
- struts+hibernate+spring整合
- 整合struts spring hibernate
- Struts+Spring+Hibernate整合
- Spring、Struts、Hibernate整合
- struts spring hibernate整合
- Struts+Spring+Hibernate整合
- Struts+Spring+Hibernate整合
- spring,hibernate,struts整合
- spring、hibernate、struts整合
- 第八周 阅读程序 (4)
- 对已提供WSDL文件的webservice服务端和客户端的整理
- linux ssh zmodem
- 去除空行
- Linux下安装selenium
- Spring学习_08_Spring整合Hibernate+Struts
- rails 中 几种动态 查询 的实现方式
- 跨数据库导入表数据
- MD5算法分析及逆向详解
- 关于BUG的那些事儿-Device or resource busy
- 实验楼的laravel 4.2 blog 教程(一)
- 规律+想法
- KMP字符串匹配算法
- Android Socket