当前位置:编程学习 > JAVA >>

总结了下spring集成struts的几种方法

小弟初学,自己总结了一下spring和struts整合的几种方法,肯定有很多理解不准确的,或者是不到位的,所以把它写在这里,这样如果有不准确的,也好请大家帮忙指正指正,并提出宝贵意见。先谢谢了。


Spring 和struts 整合的几种方式
第一种:使用Spring 的ActionSupport
第二种:使用Spring的DelegatingRequestProcessor类
第三种:全权委托

无论用那种方法来整合第一步就是要为struts来装载spring的应用环境。 就是在 struts-config.xml 中加入一个插件。
Struts-config.xml:
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
  <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
</plug-in>
或者在web.xml中加入spring的易做图:
Web.xml:
<!--
如果有多个配置文件需要载入,则考虑用<context-param>元素来确定配置文件的文件名。
ContextLoadListenter加载时,会查找名为contextConfigLocation的参数。
因此,配置context-param时,参数名应该是contextConfigLocation
-->
<!-- 
如是没有通过contextConfigLocation指定配置文件,spring会自动查找applicationContext.xml文件;
如果有contextConfigLocation,则利用该参数确定的配置文件,如果无法找到合适的配置文件,spring将无易做图常初始化
-->
<context-param>
<!-- 参数名为contextConfigLocation -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-*.xml</param-value>
<!-- 或者使用如下方式: -->
<!-- 
<param-value>/WEB-INF/actionContext.xml,/WEB-INF/appContext.xml,/WEB-INF/daoContext.xml</param-value>
-->
</context-param>
<!-- 采用listener创建ApplicationContext实例 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

下面顺便解释一下Struts中plug插件:小 订阅 
•  问题:有时候你需要在应用程序启动时装载一些数据到程序上下文中或执行某些操作。     
•  解决方法: 创建一个实现了org.apache.struts.action.PlugIn接口的类文件并在struts-config.xml中设置plug-in元素。以上代码片段显示了一个plug-in生命声明和一个自定义的set-property子元素: 
•  细节讨论:Struts提供一个 PlugIn接口能使你在启动应用程序时为你提供自定义的操作。其源代码如下:
package  org.apache.struts.action; 
import javax.servlet.ServletException;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.config.ModuleConfig;

public inte易做图ce PlugIn {
void destroy();
void init(ActionServlet servlet, ModuleConfig config)
throws ServletException;
}
要实现一个plug-in,你只需要实现这个接口并在struts-config.xml文件的中声明plug-in元素。子类必须实现方法destroy()和init()。init()在ActionServlet启动时实例化plug-in过程中执行,当ActionServlet结束时执行destroy(),一般情况下是应用程序关闭。通过在plug-in元素中设置set-property元素,可以向PlugIn类传递参数。 所有set-property元素都在init()方法执行之前被执行,这样就可以在init()方法中使用这些由set-property设置的参数了。 Struts将ActionServlet的引用和ModuleConfig参数传递给init()方法。ActionServlet使的init()方法中可以将数据保存到ServletContext中。ActionServlet还可以使你能够访问更多的J2EE组件如java sources、message队列等。ModuleConfig可以让你访问当前的模块配置信息。 

明白了plug-in的原理,我们再回到主题来。
ContextLoaderPlugIn类位于org.springframework.web.struts包下,并实现了PlugIn接口,所以在Struts-config.xml中配置好了该插件后,spring 的配置文件被作为参数配置进来。这样可以省略对web.xml 文件中的配置。确保你的applicationContext.xml 在WEB-INF目录下面。

下面详细讲每一种集成方法:
第一种:使用Spring的ActionSupport
Spring 的ActionSupport 继承至 org.apache.struts.action.Action,ActionSupport的子类可以或得 WebApplicationContext类型的全局变量。通过getWebApplicationContext()可以获得这个变量。
Action中:
//获得  WebApplicationContext  对象              
WebApplicationContext factory= this.getWebApplicationContext();
LoginDao dao = (LoginDao) factory.getBean("loginDao");
//不能通过下面这种方式:
//BeanFactory factory = //WebApplicationContextUtils.getRequiredWebApplicationContext(request.get//Session().getServletContext());
applicationContext.xml中的配置:
<beans>
<bean id="loginDao" class="com.cao.dao.LoginDao"/>
</beans>

注意:Action继承自 org.springframework.web.struts.ActionSupport 使得struts和spring耦合在一起。
但实现了表示层和业务逻辑层的解耦(LoginDao dao = (LoginDao) ctx.getBean("loginDao"))。

第二种:使用Spring 的 DelegatingRequestProcessor 类
DelegatingRequestProcessor  继承自 org.apache.struts.action.RequestProcessor 并覆盖了里面的方法。
sturts-config.xml  中  <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/> 通过 <controller >来替代org.apache.struts.action.RequestProcessor 的请求处理。
Struts-config.xml:
<!—-用controller-->
<controller
processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />
<message-resources parameter="MessageResources" />
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext-*.xml" />
</plug-in>
applicationContext.xml中:
<bean name="/login" class="com.longkm.usermgr.web.actions.LoginAction" scope="prototype">
<property name="userManagerMe" ref="userManager"/>
</bean>
Struts-config.xml中:
<form-beans>
<form-bean name="loginForm"
type="com.longkm.usermgr.web.forms.LoginActionForm" />
</form-beans>
<action-mappings>
<action path="/login"
type="com.longkm.usermgr.web.actions.LoginAction"
name="loginForm" scope="request">
<forward name="success" path="/login_success.jsp" />
</action>
</action-mappings>
Action中:
public class LoginAction extends Action {
//依赖注入
private UserManager userManagerMe;
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
LoginActionForm laf = (LoginActionForm)form;
String username = laf.getUsername();
String password = laf.getPassword();
userManagerMe.login(username, password);
return mapping.findForward("success");
}
public void setUserManagerMe(UserManager userManagerMe) {
this.userManagerMe = userManagerMe;
}
}

第三种:全权委托
Action 的创建和对象的依赖注入全部由IOC容器来完成。 使用Spring的DelegatingAcionProxy来帮助实现代理的工作 
org.springframework.web.struts.DelegatingActiongProxy继承于org.apache.struts.action.Action .
全权委托的配置方式同 方式 2 类似 (applicationContext.xml文件的配置和 Action类的实现方式相同)。
applicationContext.xml中的配置和方法二一样,如下
applicationContext.xml:
<bean name="/login" class="com.longkm.usermgr.web.actions.LoginAction" scope="prototype">
<property name="userManagerMe" ref="userManager"/>
</bean>
Struts.xml中,无需再加入spring的controller
Struts-config.xml:
<struts-config>
<form-beans>
<form-bean name="loginForm"
type="com.longkm.usermgr.web.forms.LoginActionForm" />
</form-beans>
<action-mappings>
<action path="/login"
<!—这里的type指向spring提供的DelegatingActionProxy -->
type="org.springframework.web.struts.DelegatingActionProxy"
name="loginForm" scope="request">
<forward name="success" path="/login_success.jsp" />
</action>
</action-mappings>
<!-- 不再用此
<controller
processorClass="org.springframework.web.struts.DelegatingRequestProcessor" /> -->
<message-resources parameter="MessageResources" />
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext-*.xml" />
</plug-in>
</struts-config>
Action中和方法二一样
Action:
public class LoginAction extends Action {
//依赖注入
private UserManager userManagerMe;
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
LoginActionForm laf = (LoginActionForm)form;
String username = laf.getUsername();
String password = laf.getPassword();
userManagerMe.login(username, password);
return mapping.findForward("success");
}
public void setUserManagerMe(UserManager userManagerMe) {
this.userManagerMe = userManagerMe;
}
}

总结方法一、二、三:
一、方法三和方法二的区别:
1, <action>中 type指向的是spring 的代理类
2, 去掉struts-config.xml中 <controller >
二、这三种方法中,前两种是运用了spring的依赖查找,而后两种因为把struts委托给了spring,所以可以用spring的依赖注入实现对象的实例化操作。



--------------------编程问答-------------------- 顶,谢谢分享心得,学习了 --------------------编程问答-------------------- 顶一个 --------------------编程问答-------------------- 不错啊,顶一下! --------------------编程问答-------------------- 高手 ,还没理解到如此深入。。。。吖我! --------------------编程问答-------------------- 善于总结是好事,

我还是比较倾向于 struts1.x/2.x hibernate3.x spring2.x 的整合,

让SPRING去统一管理sessionFactory action .

加上面向OO的实体操作,让开发脱离CRDU的束缚,专注于业务开发。 --------------------编程问答-------------------- 小伙前途无量啊 --------------------编程问答--------------------
引用 5 楼 zhuchao_ko 的回复:
善于总结是好事,

我还是比较倾向于 struts1.x/2.x hibernate3.x spring2.x 的整合,

让SPRING去统一管理sessionFactory action .

加上面向OO的实体操作,让开发脱离CRDU的束缚,专注于业务开发。

同上
--------------------编程问答-------------------- 恩,让spring统一去管理 --------------------编程问答-------------------- 谢谢各位 --------------------编程问答-------------------- 谁来结贴? --------------------编程问答--------------------
引用 10 楼 longvs 的回复:
谁来结贴?

一般都是将类交由spring容器管理.楼主当然是你结贴啦! --------------------编程问答-------------------- 顶顶!!! --------------------编程问答-------------------- --------------------编程问答-------------------- Struts中plug插件..我还第一次见,学习~ --------------------编程问答-------------------- 感觉sessionFactory——>dao--->service--->action其实挺好用的
补充:Java ,  Web 开发
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,