使用了struts和spring一段时间.但是对其中他们的整合也用了好几次.就这次机会总结下经验并整理下思绪.
整合方式1:
最原始而易懂的方式:
Action继承spring提供的类org.springframework.web.struts.MappingDispatchActionSupport
Action中的代码:
public class UserAction extends MappingDispatchActionSupport {
public ActionForward login(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String uname = request.getParameter("uname");
String upass = request.getParameter("upass");
//使用其自带的一个方法实例化ApplicationContext对象
ApplicationContext context = this.getWebApplicationContext();
userService=(UserService)context.getBean("userService");
User user = userService.findByName(uname, upass);
if (user==null) {
request.setAttribute("error", "对不起,您输入的用户名或者密码错误!");
return mapping.findForward("failure");
} else {
request.getSession().setAttribute("user", user);
return mapping.findForward("success");
}
}
}
struts-config.xml代码:
<action path="/login" parameter="login"
type="com.addresslist.action.UserAction" scope="request">
<forward name="success" path="/page/index.htm"></forward>
</action>
你会发现使用这种方法的话.直接可以保持你原先struts的配置.只需要改变一下你相应的Action类继承MappingDispatchActionSupport.
其中缺点就是:你的Action将会和Spring耦合在一起.当你有多个Action类都继承MappingDispatchActionSupport的话你将会每次都需要调用getWebApplicationContext()获取ApplicationContext的实例.这样如果你想放弃使用spring的话.所要修改的代码量将非常大
整合方式2:
启动Spring再在相应的Action类中实例化ApplicationContext
spring有三种启动方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn.
我的测试使用的ContextLoaderListener
web.xml的配置:
<!--
//可以选择使用ContextLoaderServle
<servlet>
<servlet-name>springInitServlet</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
// 如果使用要注意这里设置开启的优先级要比Struts的ActionServlet高
<load-on-startup>2</load-on-startup>
</servlet>
-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<!-- 使用ContextLoaderListener -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
与整合1主要的变化是使用了
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
形成spring的环境
struts-config.xml代码:
<action path="/login" parameter="login"
type="com.addresslist.action.UserAction" scope="request">
<forward name="success" path="/page/index.htm"></forward>
</action>
<!--
可以选择使用
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml" />
</plug-in>
-->
Action的代码:
public class UserAction extends MappingDispatchAction {
public UserService getFileService(){
//这里使用了WebApplicationContextUtils工具类实例化ApplicationContext
ApplicationContext ac=WebApplicationContextUtils.getWebApplicationContext(this.getServlet().getServletContext());
return (UserService) ac.getBean("userService");
}
public ActionForward login(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String uname = request.getParameter("uname");
String upass = request.getParameter("upass");
User user = getFileService().findByName(uname, upass);
if (user==null) {
request.setAttribute("error", "对不起,您输入的用户名或者密码错误!");
return mapping.findForward("failure");
} else {
request.getSession().setAttribute("user", user);
return mapping.findForward("success");
}
}
}
WebApplicationContextUtils(参考于http://tech.ddvip.com/2007-08/118764954132510_8.html)
当 Web 应用集成 Spring 容器后,代表 Spring 容器的EebApplicationContext 对象将以
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 为键存放在 ServletContext 属性列表中。您当然可以直接通过以下语句获取 WebApplicationContext:
WebApplicationContext wac = (WebApplicationContext)servletContext.
getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
但通过位于 org.springframework.web.context.support 包中的WebApplicationContextUtils 工具类获取 WebApplicationContext 更方便:
WebApplicationContext wac =WebApplicationContextUtils.
getWebApplicationContext(servletContext);
当 ServletContext 属性列表中不存在 WebApplicationContext 时,getWebApplicationContext() 方法不会抛出异常,它简单地返回 null。如果后续代码直接访问返回的结果将引发一个 NullPointerException 异常,而 WebApplicationContextUtils 另一个 getRequiredWebApplicationContext(ServletContext sc) 方法要求 ServletContext 属性列表中一定要包含一个有效的 WebApplicationContext 对象,否则马上抛出一个 IllegalStateException 异常。我们推荐使用后者,因为它能提前发现错误的时间,强制开发者搭建好必备的基础设施。
通过该方式整合我们只需要进行启动Spring和在相应的Action类获取WebApplicationContext .这样子对Spring的耦合降低
整合方式3:将动作管理委托给 Spring
将Struts的动作管理委托给Spring.使用Struts-config.xml的动态映射中注册一个代理.
代理负责在Spring中找到Struts的动作.由于动作在Spring的控制之下.所以Spring可以对Action进行javaBean的注入和Spring的一些Aop使用
需要发生改变的配置有:
Struts-config.xml:
<struts-config>
<data-sources />
<form-beans />
<global-exceptions />
<global-forwards />
<action-mappings>
<!--这里使用了org.springframework.web.struts.DelegatingAction-->
<action path="/login" parameter="login" type="org.springframework.web.struts.DelegatingActionProxy">
<forward name="success" path="/page/index.htm"/>
<forward name="failure" path="/page/fail.htm"/>
</action>
</action-mappings>
<message-resources
parameter="com.addresslist.properties.ApplicationResources" />
<!--这里使用ContextLoaderPlugIn建立Spring的环境-->
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml" />
</plug-in>
Action中的代码:
public class UserAction extends MappingDispatchAction {
//使用普遍依赖注入方式
UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public ActionForward login(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String uname = request.getParameter("uname");
String upass = request.getParameter("upass");
//直接使用userService
User user = userService.findByName(uname, upass);
if (user==null) {
request.setAttribute("error", "对不起,您输入的用户名或者密码错误!");
return mapping.findForward("failure");
} else {
request.getSession().setAttribute("user", user);
return mapping.findForward("success");
}
}
}
这个配置只于传统的struts-config的配置.这里使用的是Spring的注册代理.而不是直接使用相应Action类的完整类名.
这里使用的ContextLoaderPlugIn.声明的环境。通过DelegatingActionProxy使用动作映射名/login在Spring环境中找到相应的Action.所以我们需要在Spring环境中注册一个Struts的动作:
<bean name="/login" class="com.addresslist.action">
<property name="userService" ref="userService"></property>
</bean>
这个方法可以说是多数人认可最好的方法:
这个方法的使用只在配置文件中着手不需要对源码进行修改.将struts动作放置到Spring中使得其享受了Spring提供的各种好处.一旦让 Spring 控制您的 Struts 动作,您就可以使用 Spring 给动作补充更强的活力。例如,没有 Spring 的话,所有的 Struts 动作都必须是线程安全的。如果您设置 <bean> 标记的 singleton 属性为“false”,那么不管用何种方法,您的应用程序都将在每一个请求上有一个新生成的动作对象。您也可以利用 Spring 的生命周期方法。例如,当实例化 Struts 动作时,<bean> 标记的 init-method 属性被用于运行一个方法。类似地,在从容器中删除 bean 之前,destroy-method 属性执行一个方法.
整合方式4:
使用 org.springframework.web.struts.DelegatingRequestProcessor 类来覆盖 Struts 的 RequestProcessor 处理程序
只需要在struts-config.xml中配置:
<action-mappings>
<action path="/login" parameter="login" type="com.addresslist.action.UserAction">
<forward name="success" path="/page/index.htm"/>
<forward name="failure" path="/page/fail.htm"/>
</action>
<!--下面controller配置是核心-->
<controller processorClass="org.springframework.web.struts.
DelegatingRequestProcessor"/>
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml" />
</plug-in>
Struts中的action配置则无需配置type属性(即使配置了type属性也不起任何作用,除非在spring的配置文件里找不到对应的name属性值)
其他的配置和类使用和整合方式3一样.
这个设计方式是使用Spring提供的一个RequestProcessor来进行工作.这里如果对struts工作流程比较熟悉的话就指定struts1.2真正工作的核心是RequestProecssor和Action.
这里使用Spring的DelegatingRequestProcessor替换了struts的RequestProcessor.可以使得struts享受到Spring的控制容器.网上人都不建议使用这种方法.因为考虑到效率和方法使用寿命的问题.所以我也比较少用.
总结语:
通过以上的总结。大概了解了struts和Spring整合的几种方式.
分享到:
相关推荐
这是一个struts 1.2 + spring 2.5 + hibernate 3.2框架demo, 运行环境为eclipse 3.2 + tomcat 5.5 + oracle 11g
Struts1.2+Spring2.0+Hibernate3.1Struts1.2+Spring2.0+Hibernate3.1Struts1.2+Spring2.0+Hibernate3.1Struts1.2+Spring2.0+Hibernate3.1
struts1.2+spring2.0 登录 例子
Ibatis Struts1.2 Spring 2.0 整合终极版,Ibatis Struts1.2 Spring 2.0 整合终极版,Ibatis Struts1.2 Spring 2.0 整合终极版
struts1.2+spring2.0+hibernate3.0所需要的包 struts1.2+spring2.0+hibernate3.0所需要的包 struts1.2+spring2.0+hibernate3.0所需要的包 struts1.2+spring2.0+hibernate3.0所需要的包
一个使用Struts1.2+Spring1.2+Hibernate3.0框架开发的JavaEE人力资源管理系统,很有参考价值。Jar包由于太大没有上传,只要自己用MyEclipse导入就可以了。
采用在web.xml中加载spring配置文件的方法降低struts和spring的耦合度,使用自定义的MyDelegatingRequestProcessor类来代替spring的DelegatingRequestProcessor类来解决spring中action的bean的重复配置问题。...
本例详细是一个struts1.2+spring2.3+hibernate3.0的例子
Struts1.2+Spring1.2+HIbernate3.1整合一个用户登录的例子,原以为这个很简单没有必要上传上去,但问我的人太多了,所以就发布上来了,我随后会在博客里做详细的介绍,请大家继续关注我的博客.
JavaEE SSH框架整合小例子 开发框架 Hibernate3.1+Struts1.2+Spring2.5 表单验证 JQuey框架
我觉得struts1.2是一个比较稳定的框架,就连网上有名的教授都推荐用struts1.2,所以没有驱动的友友赶紧下载吧!
Struts1.2+Spring 3.0 案例,java代码,个人心血,只有代码
Struts 1.2+Hibernate3.3+Spring3.0整合详细步骤+源码
struts1.2+spring+ibatis.rar
eclipse整合Struts1.2 + hibernate3.1 + spring2.0 相关链接:http://blog.csdn.net/shellwin/archive/2010/07/02/5708865.aspx
hibernate3.2+struts1.2+spring2.5整合 手动搭建源码 实现登录 带数据库表结构 导入MyEclipse即可运行
struts1.2源码.rar 核心源码 struts-1.2.4-lib Struts1.2API chm格式
struts1.2,spring2,hibernate3整合实例代码 改进 改用struts插件的形式,提高系统性能。
里面为struts1.2+spring+hibernate 编写的简单的单表和多表维护,多表带个简单的excel报表生成,忙活了一阵的成果吧 进入地址为工程名/main.jsp