spring结合struts的代码详解

发布时间 - 2026-01-11 03:15:30    点击率:

Struts调用流程如下图所示。

         看到这幅图一下子就能了解了struts的原理。Spring的核心就是IOC容器和AOP,所以我们用spring主要是管理业务对象和事务的管理,所以主要是Model层来让spring管理,这是我们的一种方案。

第一种集成方案在Action中取得beanFactory

         还记的在上篇文章中,测试的时候是在单元测试中拿到的BeanFactory,与struts结合就是在Action中取得beanFactory。步骤如下。

1、          建立一个web项目。

2、          建立相关页面,代码如下所示。

      Login.jsp代码入下所示。

<%@ pagelanguage="Java" contentType="text/html; charset=GB18030"
  pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type" content="text/html;charset=GB18030">
<title>Insert titlehere</title>
</head>
<body>
    <formaction="login.do" method="post">
       用户:<input type="text"name="username"><br>
       密码:<input type="password"name="password"><br>
       <inputtype="submit" value="登录">
    </form>
</body>
</html>

Login_success.jsp 

<%@ pagelanguage="java" contentType="text/html; charset=GB18030"
  pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type" content="text/html;charset=GB18030">
<title>Insert titlehere</title>
</head>
<body>
    xx,用户登录成功!
 
</body>
</html>

3、 配置struts环境,关于struts的配置,拷贝struts和jstl的依赖包;在web.xml中配置ActionServlet,提供struts-config.xml文件。前篇文中有说明,在此就不赘述了。

struts-config.xml代码如下所示。

<struts-config>
    <form-beans>
        <form-beanname="loginForm"type="com.bjpowernode.usermgr.web.forms.LoginActionForm"></form-bean>
    </form-beans>
    <action-mappings>
        <actionpath="/login"
        type="com.bjpowernode.usermgr.web.actions.LoginAction"
        name="loginForm"
        scope="request"
        >
        <forwardname="success" path="/login_success.jsp"/>
        </action>
    </action-mappings>
     <message-resourcesparameter="resources.MessageResources" />
</struts-config>

4、 配置spring环境,拷贝spring相关jar包,建立spring配置文件applicationContext-beans.xml。

applicationContext-beans.xml代码如下所示。

<beansxmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xmlns:tx="http://www.springframework.org/schema/tx"
      xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd
     http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.0.xsd
     http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
    <beanid="userManager"class="com.bjpowernode.usermgr.manager.UserManagerImpl"/>
</beans>

5、 建立相关的Action和ActionForm。代码如下所示。

      LoginAction.java代码如下所示。

public class LoginAction extendsAction {
    @Override
    publicActionForward execute(ActionMapping mapping, ActionForm form,
           HttpServletRequestrequest, HttpServletResponse response)
           throwsException {
       LoginActionFormlaf = (LoginActionForm)form;
       Stringusername = laf.getUsername();
       Stringpassword = laf.getPassword();
        //但是我们每次都要去调用,去创建太麻烦了.
       //我们在这里只需要去配置Listener就可以了,spring给实现好了.
       BeanFactoryfactory = newClassPathXmlApplicationContext("applicationContext.xml");
       UserManageruserManager = (UserManager)factory.getBean("userManager");
       userManager.login(username,password);
    }
}

      LoginActionForm.java代码如下所示。

public class LoginActionFormextends ActionForm {
    //表单上有什么提供什么属性.
    //名字一定要与表单中的一样.
    privateString username;
    publicString getUsername() {
       returnusername;
    }
    publicvoid setUsername(String username) {
       this.username= username;
    }
    privateString password;
    publicString getPassword() {
       returnpassword;
    }
    publicvoid setPassword(String password) {
       this.password= password;
    }
}

 6、 建立业务逻辑层,代码如下所示。

      UserManager代码如下所示。

public interface UserManager {
    publicvoid login(String username, String password);
}

      UserManagerImpl.java代码如下所示。

public class UserManagerImplimplements UserManager {
    publicvoid login(String username, String password) {
       System.out.println("UserManagerImpl"+"username="+ username);
    }
} 

7、 web.xml配置文件代码如下所示。

<servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
  <init-param>
   <param-name>config</param-name>
   <param-value>/WEB-INF/struts-config.xml</param-value>
  </init-param>
  <init-param>
   <param-name>debug</param-name>
   <param-value>2</param-value>
  </init-param>
  <init-param>
   <param-name>detail</param-name>
   <param-value>2</param-value>
  </init-param>
  <load-on-startup>2</load-on-startup>
 </servlet>

      就这样我们在LoginAction中,使用beanFactory读取spring配置文件,找到UserManagerImpl实例。如果每次在Action中读取application-beans.xml文件,我们是否可以在服务器启动的时候就就创建BeanFactory呢?在这里我们可以使用spirng的工具WebApplicationContextUtils.getRequiredWebApplicationContext()从  ServletContext中  取得BeanFactory,然后再web.xml中配置Spring的Listener。

修改后,LoginAction代码如下所示。

public class LoginAction extendsAction {
    @Override
    publicActionForward execute(ActionMapping mapping, ActionForm form,
           HttpServletRequestrequest, HttpServletResponse response)
           throwsException {
       LoginActionFormlaf = (LoginActionForm)form;
       Stringusername = laf.getUsername();
       Stringpassword = laf.getPassword();
       //用工具包直接拿出来就可以了。
       BeanFactoryfactory =WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());
       UserManageruserManager = (UserManager)factory.getBean("userManager");
       userManager.login(username,password);
       returnmapping.findForward("success");
    }
}   

      加入相关配置,web.xml代码如下所示。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext-*.xml</param-value>
 </context-param>
 <listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

这种方案缺点:

     我们在在Action中仍然看到Spring相关东西,看到Spring相关类,要是程序只看到的是接口,那要怎么做呢?

     第二种方案,将struts的Aciton交给Spring来创建,让代理Action负责拿到beanFactory,根据Path名称到IOC中把对应的Action取出来。

我们是在Model层应用spring,在Action中取得BeanFactory,然后通过SpringIOC来找到Model层的bean。但是这这样存在一些问题,我们在Action中使用的是Spring相关的静态类,这就说明我们依赖的是Spring的静态类,我们希望所依赖的是接口而不是类,符合设计原则,面向接口编程,这样也容易扩展和维护。于是在此基础上进行改进。

第二种方案是将Struts的Action交给Spring创建,这样业务逻辑对象将被注入,这样就避免了依赖查找,而Spring中会有一个代理Action,通过代理ActionProxy取得banFactory。方案一和方案二的对比图如下图所示。 

这样就不用Spring的Listener了,所以我们的web.xml配置文件代码如下所示。

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.4"  
  xmlns="http://java.sun.com/xml/ns/j2ee"  
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee  
  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
 <welcome-file-list> 
  <welcome-file>index.jsp</welcome-file> 
 </welcome-file-list> 
  
 <servlet> 
  <servlet-name>action</servlet-name> 
  <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> 
  <init-param> 
   <param-name>config</param-name> 
   <param-value>/WEB-INF/struts-config.xml</param-value> 
  </init-param> 
  <init-param> 
   <param-name>debug</param-name> 
   <param-value>2</param-value> 
  </init-param> 
  <init-param> 
   <param-name>detail</param-name> 
   <param-value>2</param-value> 
  </init-param> 
  <load-on-startup>2</load-on-startup> 
 </servlet> 

同时再struts的配置文件,struts-config.xml中,在<action-mappings>标签中配置Action,也不再配置我们自己建立的Action,而是配置Spring自己的代理Action。代码如下所示。

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<!DOCTYPE struts-config PUBLIC 
     "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" 
     "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"> 
<struts-config> 
  <form-beans> 
    <form-bean name="loginForm" type="com.bjpowernode.usermgr.web.forms.LoginActionForm"></form-bean> 
  </form-beans> 
  <action-mappings> 
    <action path="/login" 
    type="org.springframework.web.struts.DelegatingActionProxy" 
    name="loginForm" 
    scope="request" 
    > 
    <forward name="success" path="/login_success.jsp"/> 
    </action> 
  </action-mappings> 
   <message-resources parameter="resources.MessageResources" /> 
</struts-config> 

Spring对Aciton的配置文件如下所示。applicationContext-actions.xml.

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> 
  <bean name="/login" class="com.bjpowernode.usermgr.web.actions.LoginAction" scope="prototype"> 
    <property name="userManager" ref="userManager"/> 
  </bean> 
</beans> 

在这里配置对应的本系统实际的Action,注意名字一定要和struts中代理Action一致!并且设置每次创建一个新的Action,而不是共用一个Action,scope="prototype"。

这样在LoginAction中,我们不用再看到创建Model和工厂的细节,使用SpringIOC,创建Model,UserManager,并且配置文件中注入LoginAction,这样LoginAction代码如下所示。

public class LoginAction extends Action { 
  private UserManager userManager; 
  // 让spring注入,LoginAction让Spring管理, 不是让strus创建而是由spring创建. 
  public void setUserManager(UserManager userManager) { 
    this.userManager = userManager; 
  } 
  @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(); 
    userManager.login(username, password); 
    return mapping.findForward("success"); 
  } 
} 

小结:

Spring框架就相当于我们的工具,我们把工具挖掘和使用的淋漓尽致才好,这可能就是人和工具的区别,人利用创造和利用工具,工具被创造和被利用。这中间的过程就是磨合了。


# spring  # 结合  # struts  # 详解JAVAEE——SSH三大框架整合(spring+struts2+hibernate)  # SSH框架网上商城项目第1战之整合Struts2、Hibernate4.3和Spring4.2 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 图册素材网站设计制作软件,图册的导出方式有几种?  Laravel如何创建自定义Artisan命令?(代码示例)  香港服务器选型指南:免备案配置与高效建站方案解析  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  如何在香港免费服务器上快速搭建网站?  如何快速建站并高效导出源代码?  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  如何在腾讯云服务器上快速搭建个人网站?  非常酷的网站设计制作软件,酷培ai教育官方网站?  利用JavaScript实现拖拽改变元素大小  如何快速搭建自助建站会员专属系统?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  如何用5美元大硬盘VPS安全高效搭建个人网站?  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  Mybatis 中的insertOrUpdate操作  如何快速上传自定义模板至建站之星?  Laravel如何使用Service Container和依赖注入?(代码示例)  Windows Hello人脸识别突然无法使用  *服务器网站为何频现安全漏洞?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  利用vue写todolist单页应用  如何在建站之星网店版论坛获取技术支持?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  昵图网官方站入口 昵图网素材图库官网入口  phpredis提高消息队列的实时性方法(推荐)  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  JavaScript如何实现继承_有哪些常用方法  开心动漫网站制作软件下载,十分开心动画为何停播?  浅析上传头像示例及其注意事项  网站优化排名时,需要考虑哪些问题呢?  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  三星、SK海力士获美批准:可向中国出口芯片制造设备  如何为不同团队 ID 动态生成多个非值班状态按钮  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  黑客如何利用漏洞与弱口令入侵网站服务器?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  动图在线制作网站有哪些,滑动动图图集怎么做?  如何获取上海专业网站定制建站电话?  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  🚀拖拽式CMS建站能否实现高效与个性化并存?  如何在 Pandas 中基于一列条件计算另一列的分组均值  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  网站制作大概多少钱一个,做一个平台网站大概多少钱?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  Laravel如何发送系统通知?(Notification渠道示例)  Laravel如何使用Collections进行数据处理?(实用方法示例)