`

struts1.2和spring的整合几种方式

阅读更多
  使用了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整合的几种方式.
分享到:
评论

相关推荐

    struts2和struts1.2学习课件

    7. **Struts 2与Spring的整合**:展示如何将Struts 2与Spring框架集成,利用Spring的IoC和AOP特性。 8. **异常处理**:学习如何定制错误页面,处理程序运行时的异常。 9. **最佳实践**:分享Struts 2开发中的最佳...

    struts1.2_hibernate3.2+spring2.5

    Struts1.2、Hibernate3.2和Spring2.5是Java Web开发中经典的MVC(Model-View-Controller)架构的三个核心组件,它们在2000年代中期到后期广泛使用,为构建企业级应用程序提供了强大的支持。这个压缩包文件显然包含了...

    struts 1.2 jar

    Struts 1.2 是 Apache 软件基金会下的一个开源框架,主要用于构建基于 Java 的 Web 应用...随着对 Struts 1.2 的深入学习,你还可以探索其与其他技术(如 Spring、Hibernate)的整合,进一步提升你的 Web 开发技能。

    hibernate4struts2spring3整合案例

    这个"struts-2.3.1.2+Spring3.3.1+hibernate4.1.1 整合案例"的项目可能包含了具体的配置文件、Action类、实体类、DAO和Service接口及其实现、以及相关的JSP页面。通过分析和运行这个案例,开发者可以深入理解这些...

    struts2+spring+hibernate整合步骤

    Spring支持XML和注解两种配置方式,可以选择适合项目的方式。例如,配置数据源、事务管理器以及需要管理的Service和DAO对象。 4. **集成Hibernate**:在Spring配置文件中,配置Hibernate的SessionFactory,包括...

    Struts+Spring+Hibernate 整合教程

    以下是几种常见的整合技巧: - **2.1 窍门1:使用Spring的ActionSupport**:通过将Struts Action继承自Spring的ActionSupport类,可以利用Spring的依赖注入功能来管理Action中的Bean。 - **优势**: - 自动管理...

    struts2,spring,mybatis集成jar包以及相关jar

    SSM框架,即Struts2、Spring和Mybatis的集成,是Java开发中常见的Web应用程序架构。这四个文件名——ojdbc6.jar、mysql-connector-java-5.1.28-bin.jar、servlet-api.jar、commons-logging-1.2.jar——与SSM框架集成...

    Spring+Struts+Hibernate比较详细的整合配置方案.pdf

    虽然题目中的部分内容未提及Hibernate的具体配置细节,但考虑到Spring、Struts与Hibernate三个框架的整合通常涉及到以下几个关键步骤: 1. **添加Hibernate支持:** - 通过MyEclipse的插件或手动添加Hibernate相关...

    jsp+struts小项目-3

    【描述】提到的"jsp+struts小项目-1"是该项目的初始部分,它展示了如何通过Struts1.2框架整合JSP来设计和实现一个功能性的Web应用。在这个项目中,我们首先会接触到Struts的核心概念,如Action类、配置文件(struts-...

    struts2.3.1的一些必要jar包

    这个框架基于Model-View-Controller(MVC)设计模式,提供了一种结构化和可扩展的方式来开发复杂的Web应用。Struts2.3.1是该框架的一个特定版本,包含了对之前版本的改进和新功能的添加。 在Struts2.3.1中,一些...

    jsp源码博客系统(struts+hibernate+spring)130225

    根据提供的文件信息,本文将对“jsp源码博客...通过学习这套系统的设计思想和技术实现,不仅可以加深对JSP、Struts、Hibernate和Spring等技术的理解,还能掌握如何构建高质量的Web应用。希望以上内容能对你有所帮助!

    Struts+Spring+Hibernate补充内容

    ### Struts+Spring+Hibernate框架整合相关知识点 #### 一、环境配置与依赖管理 **1.1 解决类冲突问题** 在使用Struts+Spring+Hibernate(简称SSH)进行项目开发时,可能会遇到类冲突的情况。特别是当涉及到Tomcat...

    ssh框架整合搭建[整理].pdf

    - **版本兼容性**:确保所选框架版本之间的兼容性,如Struts1.2、Spring2.5和Hibernate3.2。 - **异常处理**:合理处理可能出现的异常,提高应用的健壮性。 - **性能优化**:考虑缓存、连接池等技术,提升应用性能。...

    SSH整合_学习蓝本

    SSH整合是Java Web开发中的一种常见模式,它指的是将Struts、Spring和Hibernate这三大框架进行集成,以构建高效、灵活的企业级应用。这个“SSH整合_学习蓝本”资源显然是为初学者提供了一个理解并实践SSH整合的教程...

    spring ioc入门

    3. **声明式事务管理**:Spring 提供了一种声明式事务处理方式,开发人员无需手动管理事务,提高了开发效率和代码质量。 4. **测试友好**:Spring 支持非容器依赖的测试,如使用 JUnit 进行单元测试,使测试变得...

Global site tag (gtag.js) - Google Analytics