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"%>
<!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框架就相当于我们的工具,我们把工具挖掘和使用的淋漓尽致才好,这可能就是人和工具的区别,人利用创造和利用工具,工具被创造和被利用。这中间的过程就是磨合了。

(0)

相关推荐

  • struts2+spring+hibernate分页代码[比较多]第1/7页

    dao层接口: Java代码 复制代码 代码如下: package com.last999.im.news.dao; import java.util.*; import com.last999.im.news.entity.KindEntity; import com.last999.im.news.web.PageTool; public interface KindEntityDao{ public KindEntity get(String uuid); public void save

  • 详解JAVAEE——SSH三大框架整合(spring+struts2+hibernate)

    一.整合原理 二.导包(41个) 1.hibernate (1)hibernate/lib/required (2)hibernate/lib/jpa | java persist api java的持久化规范(接口) (3)数据库驱动 2.struts2 (1)struts-blank.war/WEB-INF/lib/* 注意:javassist-3.18.1-GA.jar包与hibernate中的重复(只保留高版本即可) (2)struts整合spring插件包 注意:这个包一旦导入,那么s

  • Spring,hibernate,struts经典面试笔试题(含答案)

    本文讲述了Spring,hibernate,struts经典面试笔试题及其参考答案.分享给大家供大家参考,具体如下: 1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory 为什么要用: ① . 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代

  • SSH框架网上商城项目第1战之整合Struts2、Hibernate4.3和Spring4.2

    本文开始做一个网上商城的项目,首先从搭建环境开始,一步步整合S2SH.这篇博文主要总结一下如何整合Struts2.Hibernate4.3和Spring4.2. 整合三大框架得先从搭建各部分环境开始,也就是说首先得把Spring,Hibernate和Struts2的环境搭建好,确保它们没有问题了,再做整合.这篇博文遵从的顺序是:先搭建Spring环境-->然后搭建Hibernate环境--> 整合Spring和Hibernate --> 搭建Struts2环境 --> 整合Spri

  • Hibernate+Spring+Struts扩展Struts

    简介: 我看到很多项目中,开发者实现了自己的MVC框架,并不是因为他们想做同Struts根本不同的东西,而是因为他们并没有意识到如何扩展Struts.开发自己的MVC框架可以获得全部的控制权,但是这也意味着需要很多资源来实现它(人力物力),在紧张的日程安排下,有时候这是不可能的. Struts不仅仅是一个强大的框架,同时它也是可扩展的.你可以以三种方式来扩展Struts. 1.PlugIn:如果你想在application startup或shutdown的时候做一些业务逻辑的话,那就创建你自己

  • struts2 spring整合fieldError问题

    问题: 用到了校验框架,在jsp页面校验失败一次后,无论再次输入正确与否都跳转不到except page. 原因: 在spring创建action对象时,默认为单例模式(singleton) 所谓单例指spring对一个IOC容器只生成一个对象. 而在我的校验中没次请求提交,用到的是一个action对象,这样所有的错误信息存到map (fieldError信息)中,并没有清除. 解决方案: 所以为了每次请求清除map中的错误信息,我需要针对每次用到action的请求都重新创建一个对象. 在app

  • spring结合struts的代码详解

    Struts调用流程如下图所示. 看到这幅图一下子就能了解了struts的原理.Spring的核心就是IOC容器和AOP,所以我们用spring主要是管理业务对象和事务的管理,所以主要是Model层来让spring管理,这是我们的一种方案. 第一种集成方案在Action中取得beanFactory 还记的在上篇文章中,测试的时候是在单元测试中拿到的BeanFactory,与struts结合就是在Action中取得beanFactory.步骤如下. 1.          建立一个web项目. 2

  • Spring中MVC模块代码详解

    SpringMVC的Controller用于处理用户的请求.Controller相当于Struts1里的Action,他们的实现机制.运行原理都类似 Controller是个接口,一般直接继承AbstrcatController,并实现handleRequestInternal方法.handleRequestInternal方法相当于Struts1的execute方法 import org.springframework.web.servlet.ModelAndView; import org.

  • Spring之ORM模块代码详解

    Spring框架七大模块简单介绍 Spring中MVC模块代码详解 ORM模块对Hibernate.JDO.TopLinkiBatis等ORM框架提供支持 ORM模块依赖于dom4j.jar.antlr.jar等包 在Spring里,Hibernate的资源要交给Spring管理,Hibernate以及其SessionFactory等知识Spring一个特殊的Bean,有Spring负责实例化与销毁.因此DAO层只需要继承HibernateDaoSupport,而不需要与Hibernate的AP

  • Spring Aware接口示例代码详解

    若 Spring 检测到 bean 实现了 Aware 接口,则会为其注入相应的依赖.所以通过让bean 实现 Aware 接口,则能在 bean 中获得相应的 Spring 容器资源. Spring 中提供的 Aware 接口有: BeanNameAware:注入当前 bean 对应 beanName BeanClassLoaderAware:注入加载当前 bean 的 ClassLoader BeanFactoryAware:注入 当前BeanFactory容器 的引用 BeanNameAw

  • spring+shiro 整合实例代码详解

    一.添加相关依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <art

  • Spring之WEB模块配置详解

    Spring框架七大模块简单介绍 Spring中MVC模块代码详解 Spring的WEB模块用于整合Web框架,例如Struts1.Struts2.JSF等 整合Struts1 继承方式 Spring框架提供了ActionSupport类支持Struts1的Action.继承了ActionSupport后就能获取Spring的BeanFactory,从而获得各种Spring容器内的各种资源 import org.springframework.web.struts.ActionSupport;

  • spring boot application properties配置实例代码详解

    废话不多说了,直接给大家贴代码了,具体代码如下所示: # =================================================================== # COMMON SPRING BOOT PROPERTIES # # This sample file is provided as a guideline. Do NOT copy it in its # entirety to your own application. ^^^ # ========

  • Spring中利用配置文件和@value注入属性值代码详解

    1 简单属性值注入 package com.xy.test1; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service // 需要被注入属性值的类需要被Spring管理 public class PropertiesService1 { // 利用@Value注解,即使没有该属性或者属性文件也不会报错 // @Value输入

  • Spring静态代理和动态代理代码详解

    本节要点: Java静态代理 Jdk动态代理 1 面向对象设计思想遇到的问题 在传统OOP编程里以对象为核心,并通过对象之间的协作来形成一个完整的软件功能,由于对象可以继承,因此我们可以把具有相同功能或相同特征的属性抽象到一个层次分明的类结构体系中.随着软件规范的不断扩大,专业化分工越来越系列,以及OOP应用实践的不断增多,随之也暴露了一些OOP无法很好解决的问题. 现在假设系统中有三段完全相似的代码,这些代码通常会采用"复制"."粘贴"方式来完成,通过这种方式开发

  • Spring自动装配与扫描注解代码详解

    1 javabean的自动装配 自动注入,减少xml文件的配置信息. <?xml version="1.0" encoding="UTF-8"?> <!-- 到入xml文件的约束 --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p&quo

随机推荐