先从思路开始把,当我们学一种技术的时候,首先要的是我们的思路要清晰,这才有可能把它弄明白,所以我们平时要多锻炼自己的逻辑思维能力,尽量多地想一些实际问题。Hibernate是持久层,Spring是一个装载组件提供服务的容器,Struts是一种MVC模式的框架。所以我就从Spring着想:采取了三个方式来整合。
第一种方式:
采用spring自带的一个插件:org.springframework.web.struts.ContextLoaderPlugIn
在struts-config.xml 的<message-resources parameter="struts.ApplicationResources" />后面添加
<!-- struts插件 --> <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/> </plug-in>。
但是当我们使用这种方式的时候需要注意一下:
1.我们在struts里的配置中的<action>配置中需要注意:需要用到spring中的动态struts代理:具体配置比如:
<!-- type:指的是spring中的动态struts代理,利用它可以截获对应的方法 所以此文件主要配置action中对应的方法-->
<action-mappings> <action path="/findAll" type="org.springframework.web.struts.DelegatingActionProxy" scope="request" parameter="findAll"> <forward name="ok" path="/ok.jsp"/> </action> </action-mappings>
并且这里我们还需要复制一份spring的配置文件,文件名命名为:spring-action.xml(可以自己定义),作为专门配置action中的bean比如:
<!-- 此文件是配置一些对应的action模块的具体的类。
name要与struts-config.xml的path对应 -->
<bean name="/findAll" class="actions.MappingActions"> <property name="dao" ref="UserDAO"></property> </bean>2.还要注意的是,我们在action类中继承的是MappingDispatchAction,也就是说是利用Struts里中的
第二种方式: 采用Spring的Listener来监听获取Spring中的配置。主要操作是:
首先在web.xml中配置:
<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
但是当我们使用这种方式的时候需要注意一下:
1.我们在struts里的配置<action>不需要用到spring中的动态代理,直接配置,像纯struts里一样配置。
2.还要注意的是,我们在action类中继承的是MappingDispatchActionSupport,也就是说是利用Struts里中的,这样我们就可以通过spring的这个MappingDispatchActionSupport类中的方法获得在Spring中配置的bean:比如:在这个Action中我们需要用到UserDAO,我们就可以这样获得,这样减少了spring与struts的耦合度。
ApplicationContext context=this.getWebApplicationContext();
UserDAO dao=(UserDAO) context.getBean("UserDAO");
第三种方式: 我们直接在web.xml中配置以下信息:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>springInitServlet</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet>我们同样使用的是struts的MappingDispatchAction,struts里的配置同样是纯Struts里的配置一样,不需要与spring的耦合,spring只与hibernate耦合。但是我们怎么获得spring里的bean注入呢?这就是关键了:比如我们在Action中需要调用service层的方法,则我们需要获得service的实例,但是又是事务层,我们通过了spring的事务管理机制来管理,也就是说我们需要获得这个service的在spring中的bean。注意我们通过:
WebApplicationContextUtils.getWebApplicationContext(this.getServlet().getServletContext());可以获得springContext.xml的配置文件信息,从而通过getBean("")的方法来获得这个service的实例。Ok.
public FileServiceInf getFileService(){
ApplicationContext ac=WebApplicationContextUtils.getWebApplicationContext(
this.getServlet().getServletContext());
return (FileServiceInf) ac.getBean("modelProxy");
}
有兴趣的浏览者可以试着去作一下,我已经说得很明白了,注意:做IT的,就要学会做实验,计算机就是我们很好的老师,可以证明我们的所有观点。