热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

spring结合struts的代码详解

这篇文章主要介绍了spring结合struts的代码详解,需要的朋友可以参考下

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"%>







    
       用户:
密码:

Login_success.jsp 

<%@ pagelanguage="java" cOntentType="text/html; charset=GB18030"
  pageEncoding="GB18030"%>







    xx,用户登录成功!
 


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

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


    
        
    
    
        
        
        
    
     

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

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


    

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配置文件代码如下所示。


  action
  org.apache.struts.action.ActionServlet
  
   config
   /WEB-INF/struts-config.xml
  
  
   debug
   2
  
  
   detail
   2
  
  2
 

      就这样我们在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代码如下所示。


    contextConfigLocation
    classpath:applicationContext-*.xml
 
  
    org.springframework.web.context.ContextLoaderListener
 

这种方案缺点:

     我们在在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配置文件代码如下所示。

<&#63;xml version="1.0" encoding="UTF-8"&#63;> 
 
  
  index.jsp 
  
  
  
  action 
  org.apache.struts.action.ActionServlet 
   
   config 
   /WEB-INF/struts-config.xml 
   
   
   debug 
   2 
   
   
   detail 
   2 
   
  2 
  

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

<&#63;xml version="1.0" encoding="ISO-8859-1" &#63;> 
 
 
   
     
   
   
     
     
     
   
    
 

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

<&#63;xml version="1.0" encoding="UTF-8"&#63;> 
 
   
     
   
 

在这里配置对应的本系统实际的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 Boot 和 Groovy 构建一个灵活且可扩展的动态计算引擎,以满足钱包应用中类似余额宝功能的推广需求。我们将探讨不同的设计方案,并最终选择最适合的技术栈来实现这一目标。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • ArcXML:互联网空间数据交换的专用语言
    ArcXML是一种专为ArcIMS平台设计的数据交换协议,基于XML标准,用于在不同组件之间传输和描述地理空间数据。本文将详细介绍ArcXML的背景、用途及其与XML的关系。 ... [详细]
  • 搭建Jenkins、Ant与TestNG集成环境
    本文详细介绍了如何在Ubuntu 16.04系统上配置Jenkins、Ant和TestNG的集成开发环境,涵盖从安装到配置的具体步骤,并提供了创建Windows Slave节点及项目构建的指南。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
  • Windows 7 64位系统下Redis的安装与PHP Redis扩展配置
    本文详细介绍了在Windows 7 64位操作系统中安装Redis以及配置PHP Redis扩展的方法,包括下载、安装和基本使用步骤。适合对Redis和PHP集成感兴趣的开发人员参考。 ... [详细]
  • ABBYY FineReader:高效PDF转换、精准OCR识别与文档对比工具
    在处理PDF转换和OCR识别时,您是否遇到过格式混乱、识别率低或图表无法正常识别的问题?ABBYY FineReader以其强大的功能和高精度的识别技术,完美解决这些问题,帮助您轻松找到最终版文档。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • HTML基础入门指南
    本文将深入浅出地介绍HTML的基础知识,包括其定义、开发工具、制定机构、特性、基本标签及更多实用内容。 ... [详细]
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • SpringMVC RestTemplate的几种请求调用(转)
    SpringMVCRestTemplate的几种请求调用(转),Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文将详细介绍通过CAS(Central Authentication Service)实现单点登录的原理和步骤。CAS由耶鲁大学开发,旨在为多应用系统提供统一的身份认证服务。文中不仅涵盖了CAS的基本架构,还提供了具体的配置实例,帮助读者更好地理解和应用这一技术。 ... [详细]
author-avatar
小张
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有