`
Supanccy2013
  • 浏览: 231592 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Struts2.2.1整合Spring3.0的两种方法

    博客分类:
  • SSH
阅读更多
首先让spring加入到web应用中,在web应用中一般是启动的时候初始化sping容器。我们知道servletContextListener可以做到这一点,该监听器在web应用启动时回调自定义方法--该方法就可以启动web容器。Sping提供了一个ContextLoaderListener该监听器实现了ServletContextListener接口,该类可以作为监听器使用。它在创建使自动查找web-inf下的applicationContext.xml配置文件。;

第一中整合方法:让Spring接管struts的业务控制器(也就是Action),换句话说就是让struts的action纳入spring的管理中。
  我们知道Struts2的主要流程:先是请求到达Filter(也就是中央控制器),中央控制器通过解析struts.xml文件获取该请求是到哪一个业务控制器(也就是业务action),再通过反射创建这个业务控制器,我们这种整合就是让action的创建工作不再让struts的中央控制器去创建,而是用spring去创建,struts的中央控制器直接到spring的工厂中取Action即可。下面是具体的实例:


注意:此种方法需要引进spring的插件:struts2-spring-plugin-2.2.1.jar,Spring管理Action时一定要改变Action bean的scope不能将action的bean的scope设置为单例模式,需要改为:prototype 和 request两种。

此方法的缺点:
1,Spring管理Action,必须将每一个需要被管理的Action配置在applicationContext.xml文件中,而Struts的配置文件中也要配置每一个伪Action,配置两边未免冗余。
2,Action的业务逻辑租价接受容器注入,将导致代码的可读性降低。

1,Actin类:
    package com.dd.action;
    import com.dd.service.StrutsSpringLoginService;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    public class StrutsSpringLogin extends ActionSupport {
	private String username;
	private String password;
	private String tip;
	private StrutsSpringLoginService sss;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getTip() {
		return tip;
	}
	public void setTip(String tip) {
		this.tip = tip;
	}
	public StrutsSpringLoginService getSss() {
		return sss;
	}
	public void setSss(StrutsSpringLoginService sss) {
		this.sss = sss;
	}
	public String execute() throws Exception {
		if(sss.validateLogin(getUsername(),  
                    getPassword()).equals("success")){
			setTip("服务器提示:登录成功");
			ActionContext.getContext().getSession().put("username", 
               getUsername());
			return SUCCESS;
		}else{
			setTip("服务器提示:登录失败");
			return ERROR;
		}
	}
     }


2,service类:
   package com.dd.service;
   public class StrutsSpringLoginService {
	public String  validateLogin(String username,String password){
		if(username.equals("chenchaoyang") ||                  
                          password.equals("chenchaoyang")){
			return "success";
		}else{
			return "error";
		}
	}
   } 


3,配置文件strut-spring.xml(注:该文件应该用incluce标签包含到struts.xml文件中去)
   <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts> 
    <!-- 配置的package的name不能和主文件struts中的package名称相同 -->
	<package name="struts-spring" extends="struts-default">
	   <!-- 注意该Action的class属性值并不是一个具体的类,而是一个伪类,它表示的是spring配置文件中id为strutsSpringLogin的配置bean
	                      这就是struts2与Spring第一种配置的关键配置点
	    -->
	   <action name="strutsSpringLogin" class="strutsSpringLogin">
	      <result name="success">/strutsSpringLoginSuccess.jsp</result>
	      <result name="error">/strutsSpringLoginError.jsp</result>
	   </action>
	</package>
</struts>    


4,applicationContext.xml配置文件:
    <bean id="strutsSpringLogin" class="com.dd.action.StrutsSpringLogin">
        <property name="sss" ref="strutsSpringLoginService"></property>
    </bean>
    <bean id="strutsSpringLoginService"         
           class="com.dd.service.StrutsSpringLoginService">
    </bean>

5,登录页面:
   <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body><%--struts标签key对应的是国际化资源文件中的key --%>
    <s:form action="strutsSpringLogin">
       <s:textfield name="username" key="user"></s:textfield>
       <s:textfield name="password" key="pass"></s:textfield>
       <s:submit key="login"></s:submit>
    </s:form>
  </body>
</html>


6,登录成功页面:
   <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body>
    strutsSpring登录成功
    <s:property value="tip"/>
      </body>
</html>


7,登录失败页面
   <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s"  uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body>
    strutsSpring登录失败
    <s:property value="tip"/>
  </body>
</html>




二:struts,spring的第二种整合方法:spring的自动装配。
     所谓自动装配就是让spring插件自动将业务逻辑组建注入struts2的Action中,而无需使用ref显示指定以来Bean,spring容器会自动检查xml配置文件内容,为主调bean注入依赖bean,自动装配可以减少配置文件的工作量,但会减低依赖关系的透明性和清晰性。通过使用自动装配,可以让spring插件自动将业务逻辑组建注入struts2的action中。

下面是实例:
1,Action类;
package com.dd.action;
import com.dd.service.StrutsSpringAutoWireLoginService;
import com.dd.service.StrutsSpringLoginService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class StrutsSpringAutoWireLogin extends ActionSupport {
	private String username;
	private String password;
	private String tip;
	private StrutsSpringAutoWireLoginService sss;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getTip() {
		return tip;
	}
	public void setTip(String tip) {
		this.tip = tip;
	}
	public StrutsSpringAutoWireLoginService getSss() {
		return sss;
	}
	public void setSss(StrutsSpringAutoWireLoginService sss) {
		this.sss = sss;
	}
	public String execute() throws Exception {
		if(sss.validateLogin(getUsername(), getPassword()).equals("success")){
			setTip("服务器提示:登录成功");
			ActionContext.getContext().getSession().put("username", getUsername());
			return SUCCESS;
		}else{
			setTip("服务器提示:登录失败");
			return ERROR;
		}
	}
}


2,service
package com.dd.service;
public class StrutsSpringAutoWireLoginService {
	public String  validateLogin(String username,String password){
		if(username.equals("chenchaoyang") || password.equals("chenchaoyang")){
			return "success";
		}else{
			return "error";
		}
	}
}




3,struts的配置文件
    <!-- 配置的package的name不能和主文件struts中的package名称相同 -->
	<package name="struts-spring" extends="struts-default">
	   <!-- 注意该Action的class属性值并不是一个具体的类,而是一个伪类,它表示的是spring配置文件中id为strutsSpringLogin的配置bean
	                      这就是struts2与Spring第一种配置的关键配置点
	    -->
	   <action name="strutsSpringLogin" class="strutsSpringLogin">
	      <result name="success">/strutsSpringLoginSuccess.jsp</result>
	      <result name="error">/strutsSpringLoginError.jsp</result>
	   </action>
	   <!-- 下面的Action是采用自动装配的struts和spring整合,注意自动装配的方式配置action的class是真实的类,而不是伪类,切这个action依旧是spring来创建的。 -->
	   <action name="strutsSpringAutoWireLogin" class="com.dd.action.StrutsSpringAutoWireLogin">
	             <result name="success">/strutsSpringAutoWireLoginSuccess.jsp</result>
	   </action>
	</package>


4,spring的配置文件
<!-- 注意下面的这个bean是采用自动装配至action中的配置方式。它的id必须是action中的属性的名字 -->
    <bean id="sss" class="com.dd.service.StrutsSpringAutoWireLoginService"></bean>


5,用户入口页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body><%--struts标签key对应的是国际化资源文件中的key --%>
     这个实例是:struts spring已自动装配的方式整合
    <s:form action="strutsSpringAutoWireLogin">
       <s:textfield name="username" key="user"></s:textfield>
       <s:textfield name="password" key="pass"></s:textfield>
       <s:submit key="login"></s:submit>
    </s:form>
  </body>
</html>


6,登录成功页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body>
    strutsSpring自动装配登录成功
    <s:property value="tip"/>
      </body>
</html>



分享到:
评论

相关推荐

    Struts2整合Spring3.0

    总的来说,Struts2整合Spring3.0可以带来诸多好处,如简化MVC配置,利用Spring的IoC和AOP特性,以及提高代码的可测试性和可维护性。通过上述配置和编程实践,开发者可以构建出高效且灵活的Java EE应用程序。

    Spring攻略(第二版 中文高清版).part1

    6.3 将Spring与Struts 1.x集成 220 6.3.1 问题 220 6.3.2 解决方案 220 6.3.3 工作原理 220 6.4 将Spring与JSF集成 226 6.4.1 问题 226 6.4.2 解决方案 226 6.4.3 工作原理 227 6.5 将Spring与DWR...

    Spring攻略(第二版 中文高清版).part2

    6.3 将Spring与Struts 1.x集成 220 6.3.1 问题 220 6.3.2 解决方案 220 6.3.3 工作原理 220 6.4 将Spring与JSF集成 226 6.4.1 问题 226 6.4.2 解决方案 226 6.4.3 工作原理 227 6.5 将Spring与DWR...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    下面就以两种不同的用户来分析博客网站的需求。 4.2.1注册博友 首先必须在博客首页中登录填写用户名和密码,这样才能执行一些相关操作,不然就是普通用户只能查看一些信息,而不能发表博文。可以在管理页面上添加...

    组态王仿真学习案例:石灰石断烧系统详解,实时历史曲线记录、报表分析与报警管理一网打尽,入门到进阶全功能展示

    内容概要:本文详细介绍了利用组态王进行石灰石煅烧系统的仿真开发,涵盖实时曲线绘制、报警系统配置、报表生成功能等多个方面。文章从实际案例出发,通过具体的代码片段和操作步骤,讲解了如何实现温度PID控制、设备联锁、能源统计等功能。同时,作者分享了许多实践经验,如解决曲线不刷新问题、优化报警逻辑、提高报表生成效率等,帮助读者快速掌握组态王的核心技术和应用场景。 适合人群:对工业自动化感兴趣的初学者以及希望深入了解组态王使用的工程师。 使用场景及目标:适用于需要构建工业控制系统仿真模型的学习者或开发者,旨在通过实例演练提升对组态王的理解和运用能力,最终能够独立完成类似项目的开发。 其他说明:文中提供了丰富的代码示例和技术细节,有助于读者更好地理解和实践。此外,还特别强调了一些常见的错误和注意事项,如控件命名规范、数据源绑定规则等,确保项目顺利实施。

    CAD绘制圆形洞室展示图的初步实现.docx

    CAD绘制圆形洞室展示图的初步实现.docx

    基于下垂虚拟同步机的三电平双机离网并联仿真模型:C语言算法,性能优越,适用于储能逆变器和UPS产品,环流小,动态响应良好。

    内容概要:本文详细介绍了基于C语言实现的三电平双机离网并联虚拟同步机控制算法。该算法主要用于解决储能逆变器和UPS系统中双机并联运行时遇到的问题,如功率分配不均、环流超标和动态响应不佳。文中展示了具体的下垂控制、环流抑制、动态响应优化以及中点电位平衡等核心技术的实现方式。此外,还讨论了如何通过自适应虚拟阻抗、状态观测器和查表法等手段提高系统的稳定性和效率。最终,该算法在实际项目中表现出色,实现了高效的功率分配和稳定的动态响应。 适合人群:从事电力电子、储能系统和UPS系统开发的技术人员,尤其是对C语言编程和控制算法有一定了解的研发人员。 使用场景及目标:适用于需要高效、稳定双机并联运行的储能逆变器和UPS系统的设计与开发。主要目标是解决双机并联时的功率分配不均、环流超标和动态响应慢等问题,确保系统在各种工况下的稳定性和可靠性。 其他说明:本文不仅提供了详细的代码实现,还分享了许多实用的调试技巧和实践经验,有助于读者更好地理解和应用这些技术。

    方波信号发生器电路仿真

    方波信号发生器电路仿真,基于LM741运算放大器的方波信号发生器电路仿真设计及实现

    2025年电子商务四级培训计划.doc

    2025年电子商务四级培训计划.doc

    2023年高中信息技术Excel知识点整理.docx

    2023年高中信息技术Excel知识点整理.docx

    FX5UPLC以太网通讯实例:SOCKET通讯、SLMP协议通讯、JE-C伺服电机控制及Modbus通讯等真实验证程序套

    内容概要:本文详细介绍了三菱FX5U PLC在工业自动化领域的以太网通讯实战经验,涵盖多种常见通讯方式的具体实现方法。主要内容包括:两台PLC之间的Socket通讯,通过C#上位机使用SLMP协议读取PLC寄存器,JE-C伺服电机的以太网控制,以及Modbus RTU和TCP的应用。每种通讯方式均提供了具体的代码示例和调试技巧,确保读者能够快速理解和应用。此外,还特别强调了常见的避坑指南,帮助解决实际操作中可能出现的问题。 适合人群:从事工业自动化、PLC编程及相关领域的工程师和技术人员,特别是那些希望深入了解三菱FX5U PLC以太网通讯机制的人群。 使用场景及目标:适用于需要进行PLC间通讯、PLC与上位机通讯、伺服电机控制以及Modbus协议应用的实际工程项目。目标是提高通讯效率,减少调试时间和错误发生率。 其他说明:文中提供的代码均为经过产线验证的真实程序,可以直接应用于实际项目中。同时,作者分享了许多宝贵的实践经验,有助于读者更好地掌握相关技能并避免常见错误。

    r_code_and_sample_data_for_drawing_apa_diagram.zip

    计算融合图像(IDL 和 Python 代码)全方位性能评估(APA)指标及绘制 APA 图表的 R 代码

    2023年软考信息处理技术员考试历年模拟真题三.docx

    2023年软考信息处理技术员考试历年模拟真题三.docx

    社交聊天即时通讯App开发:双端原生、朋友圈、三方通讯云对接及支付功能集成

    内容概要:本文详细介绍了社交聊天即时通讯App的开发要点,涵盖Android和iOS双端原生开发、朋友圈功能、三方云通讯以及支付功能对接。重点讨论了消息系统的优化、朋友圈图片九宫格布局、支付接口的安全性和性能优化等方面的内容。通过具体代码示例展示了如何处理消息发送、接收、状态管理、图片加载、支付回调等问题,并分享了一些实用的经验和技巧。 适合人群:具备一定移动开发经验的开发者,尤其是正在从事或计划从事社交类App开发的技术人员。 使用场景及目标:帮助开发者理解和掌握社交App开发的关键技术和最佳实践,确保消息传输稳定、朋友圈功能流畅、支付安全可靠。适用于希望提高社交App用户体验和技术架构稳健性的开发团队。 其他说明:文中提供了大量实战经验和代码片段,强调了跨平台一致性、性能优化和用户体验的重要性。同时提醒开发者关注平台特异性问题,如iOS和Android之间的差异,以及支付接口的安全校验等。

    信捷原创程序:4个伺服轴的PLC与HMI控制方案

    内容概要:本文详细介绍了信捷XC5-48T PLC和TG765 HMI在三号车间设备改造项目中的应用。重点讨论了四轴伺服控制系统的编程架构、状态机设计、HMI界面设计以及调试工具的使用。文章强调了多轴联动时序控制的重要性,展示了如何通过状态机和互锁机制确保系统的稳定性和可靠性。同时,HMI设计采用了分层式布局和防呆设计,提高了操作的安全性和便捷性。此外,文中还提到了一些实用的调试技巧和注释规范,为后续维护提供了便利。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和HMI设计有一定基础的人群。 使用场景及目标:适用于需要进行多轴伺服控制系统设计和调试的工程项目。目标是帮助工程师理解和掌握信捷XC5-48T PLC和TG765 HMI的应用方法,提高系统的可靠性和易用性。 其他说明:文章不仅提供了具体的编程示例,还分享了许多实践经验,如状态机设计、互锁机制、防呆设计等,有助于读者更好地理解和应用相关技术。

    自定义扩展,简化策略类,方便使用

    自定义扩展,简化策略类,方便使用

    2025年全国计算机软件专业高级程序员级试题.docx

    2025年全国计算机软件专业高级程序员级试题.docx

    V公司汽车零部件开发工具:全套bootloader中UDS协议栈源代码,含底层外设驱动开发集成服务

    内容概要:本文详细介绍了V公司提供的UDS协议栈源代码及其在汽车电子开发中的应用。该协议栈以其精简高效的代码结构、良好的底层外设驱动集成以及强大的状态机设计而著称。文中展示了典型的服务路由器函数、Flash驱动接口、CAN通信接口等关键部分的代码片段,并讨论了其在实际项目中的表现和优化技巧。此外,还提到了一些潜在的问题和解决方案,如内存管理和多线程处理等。 适合人群:从事汽车电子开发的技术人员,尤其是对UDS协议栈感兴趣的开发者。 使用场景及目标:适用于需要快速集成UDS协议栈并进行定制化开发的项目。主要目标是在保证稳定性和性能的前提下,减少开发时间和复杂度。 其他说明:文中提供了丰富的实例和实践经验,帮助读者更好地理解和应用V公司的UDS协议栈。同时提醒读者注意特定平台下的兼容性和优化问题。

    黄河流域78地市用水效率与调水工程效用空间格局数据集(2013-2020)

    作者以黄河流域78个地级行政单元为研究区,基于各省水资源公报、社会经济等数据,计算得到黄河流域78地市用水效率与调水工程效用空间格局数据集(2013-2020)。该数据集内容包括以下数据:(1)研究区范围数据;(2)历年各地市用水效率数据;(3)历年各地市水资源压力数据;(4)南水北调效用数据。数据集存储为.shp和.xlsx格式。由9个数据文件组成,数据量为4.41 MB(压缩为1个文件,2.80 MB)Ma, L., Wang, Q. Do water transfer projects promote water use efficiency? Case study of South-to North Water Transfer Project in Yellow River Basin of China. Water 2024, 16: 1367. https://doi.org/10.3390/w16101367.

    「热电偶测温方案」实现多种类型热电偶与Pt100的测温及冷端补偿,附驱动源码和工程解析(包括STM32)

    内容概要:本文详细介绍了利用AD7124实现热电偶和Pt100测温的高精度方案,涵盖硬件设计、冷端补偿算法以及完整的源码实现。首先解释了Pt100的工作原理及其三线制和四线制连接方法,提供了具体的C语言代码示例用于计算Pt100电阻并转化为温度。接着讨论了热电偶的不同类型及其处理方法,展示了如何根据热电偶类型和测量电压计算温度。此外,深入探讨了NTC热敏电阻在冷端补偿中的应用,给出了相应的代码实现。最后,分享了整个方案的硬件设计要点,如AD7124的配置、滤波电路的设计等,并强调了源码的可移植性和优化技巧。 适合人群:从事温度测量领域的工程师和技术人员,尤其是对热电偶和Pt100传感器有一定了解的人群。 使用场景及目标:适用于需要高精度温度测量的应用场合,如工业自动化、实验室设备等。目标是帮助读者掌握基于AD7124的热电偶和Pt100测温系统的实现方法,包括硬件搭建、软件编程和冷端补偿等方面的知识。 其他说明:文中提供的源码和硬件设计方案可以直接应用于STM32平台,同时也适合作为其他MCU平台的参考。对于希望深入了解温度测量技术和提高测量精度的技术人员来说,本文是一份非常有价值的参考资料。

Global site tag (gtag.js) - Google Analytics