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的模块。

        附件:示例代码


0 0