Spring和Struct整合的三个方法

方法:

1.使用 Spring 的 ActionSupport 类整合 Structs

2.使用 Spring 的 DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor

3.将 Struts Action 管理委托给 Spring 框架

无论您使用哪种技术,都需要使用Spring的ContextLoaderPlugin为 Struts 的 ActionServlet 装载 Spring 应用程序环境。就像添加任何其他插件一样,简单地向您的 struts-config.xml 文件添加该插件,如下所示:

Java代码

<plug-in className=  "org.springframework.web.struts.ContextLoaderPlugIn">       
<set-property property="contextConfigLocation" value="/WEB-INF/beans.xml"/>   
</plug-in>

<plug-in className= "org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/beans.xml"/></plug-in>

也可以通过web.xml中配置web应用在加载的时候添加ContextListener来实现上面插件的功能

Spring框架提供了这样的类,配置信息如下:

Java代码

<listener>   
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
  </listener>   
     
  <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> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>

方法1.

使用 Spring 的 ActionSupport

手动创建一个 Spring 环境是一种整合 Struts 和 Spring 的最直观的方式。

为了使它变得更简单,Spring 提供了一些帮助。

为了方便地获得 Spring 环境,org.springframework.web.struts.ActionSupport

类提供了一个 getWebApplicationContext() 方法。

您所做的只是从 Spring 的 ActionSupport 而不是 Struts Action 类扩展您的动作

struts-config.xml文件配置:

Java代码

<?xml version="1.0" encoding="UTF-8"?>   
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">   
  
<struts-config>   
  <data-sources />   
  <form-beans >   
    <form-bean name="testForm"    
    type="com.yourcompany.struts.form.TestForm" />   
  </form-beans>   
  <global-exceptions />   
  <global-forwards />   
  <action-mappings >   
    <action   
      attribute="testForm"  
      input="/form/test.jsp"  
      name="testForm"  
      path="/test"  
      scope="request"  
      type="com.yourcompany.struts.action.TestAction">   
      <forward name="success" path="/result.jsp" />   
    </action>   
  </action-mappings>   
  <message-resources parameter="com.yourcompany.struts.ApplicationResources" />   
  <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">   
      <set-property property="contextConfigLocation" value="classpath:applicationContext.xml" />   
   </plug-in>   
</struts-config>

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"><struts-config> <data-sources /> <form-beans > <form-bean name="testForm" type="com.yourcompany.struts.form.TestForm" /> </form-beans> <global-exceptions /> <global-forwards /> <action-mappings > <action attribute="testForm" input="/form/test.jsp" name="testForm" path="/test" scope="request" type="com.yourcompany.struts.action.TestAction"> <forward name="success" path="/result.jsp" /> </action> </action-mappings> <message-resources parameter="com.yourcompany.struts.ApplicationResources" /> <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="classpath:applicationContext.xml" /> </plug-in></struts-config>

applicationContext.xml的配置

Java代码

<?xml version="1.0" encoding="UTF-8"?>   
<beans   
    xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd">   
       
    <bean id="springTest" class="com.spring.SpringIOC">   
        <property name="message">   
            <value>SpringIOC Message</value>   
        </property>   
    </bean>   
  
</beans>

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="springTest" class="com.spring.SpringIOC"> <property name="message"> <value>SpringIOC Message</value> </property> </bean></beans>

Action类:

Java代码

package com.yourcompany.struts.action;   
  
import javax.servlet.http.HttpServletRequest;   
import javax.servlet.http.HttpServletResponse;   
  
import org.apache.struts.action.ActionForm;   
import org.apache.struts.action.ActionForward;   
import org.apache.struts.action.ActionMapping;   
import org.springframework.web.struts.ActionSupport;   
  
import com.spring.SpringIOC;   
  
public class TestAction extends ActionSupport {   
       
    public ActionForward execute(ActionMapping mapping, ActionForm form,   
            HttpServletRequest request, HttpServletResponse response) {   
        SpringIOC sIoc=(SpringIOC)this.getWebApplicationContext().getBean("springTest");   
        sIoc.displayMessage();   
        return mapping.findForward("success");   
    }   
}

package com.yourcompany.struts.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import org.springframework.web.struts.ActionSupport;import com.spring.SpringIOC;public class TestAction extends ActionSupport { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { SpringIOC sIoc=(SpringIOC)this.getWebApplicationContext().getBean("springTest"); sIoc.displayMessage(); return mapping.findForward("success"); }}

注入到Action中的使用的类SpringIOC

Java代码

package com.spring;   
  
public class SpringIOC {   
       
    private String message;   
  
    public String getMessage() {   
        return message;   
    }   
  
    public void setMessage(String message) {   
        this.message = message;   
    }   
       
    public void displayMessage(){   
        System.out.println(message);   
    }   
  
}

package com.spring;public class SpringIOC { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public void displayMessage(){ System.out.println(message); }}

这种技术很简单并且易于理解。不幸的是,它将 Struts 动作与 Spring 框架耦合在一起。

如果您想替换掉 Spring,那么您必须重写代码。并且,由于 Struts 动作不在 Spring 的控制之下,所以它不能获得 Spring AOP 的优势。

当使用多重独立的 Spring 环境时,这种技术可能有用,但是在大多数情况下,这种方法不如另外两种方法合适。

方法2:覆盖 RequestProcessor

将 Spring 从 Struts 动作中分离是一个更巧妙的设计选择。

分离的一种方法是使用 org.springframework.web.struts.DelegatingRequestProcessor 类来覆盖 Struts 的 RequestProcessor 处理程序

struts-config.xml

Java代码

<action   
      attribute="testForm"  
      input="/form/test.jsp"  
      name="testForm"  
      path="/test"  
      scope="request"  
      type="com.yourcompany.struts.action.TestAction">   
      <forward name="success" path="/result.jsp" />   
</action>   
  
 <!-- 关键点 重新使用Sping框架的DelegatingRequestProcessor 替代了Struts框架的RequestProcessor -->   
  <controller  processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />

<action attribute="testForm" input="/form/test.jsp" name="testForm" path="/test" scope="request" type="com.yourcompany.struts.action.TestAction"> <forward name="success" path="/result.jsp" /></action> <!-- 关键点 重新使用Sping框架的DelegatingRequestProcessor 替代了Struts框架的RequestProcessor --> <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />

applicationContext.xml

Java代码

<bean id="sIoc" class="com.spring.SpringIOC">   
        <property name="message">   
            <value>SpringIOC Message</value>   
        </property>   
</bean>   
       
    <bean name="/test" class="com.yourcompany.struts.action.TestAction">   
        <property name="springIoc">   
            <ref local="sIoc"/>   
        </property>   
    </bean>

<bean id="sIoc" class="com.spring.SpringIOC"> <property name="message"> <value>SpringIOC Message</value> </property></bean> <bean name="/test" class="com.yourcompany.struts.action.TestAction"> <property name="springIoc"> <ref local="sIoc"/> </property> </bean>

Action类:

Java代码

public class TestAction extends Action{   
       
    private SpringIOC springIoc;   
       
    public SpringIOC getSpringIoc() {   
        return springIoc;   
    }   
       
    public void setSpringIoc(SpringIOC springIoc) {   
        this.springIoc = springIoc;   
    }   
       
    public ActionForward execute(ActionMapping mapping, ActionForm form,   
            HttpServletRequest request, HttpServletResponse response) {   
        getSpringIoc().displayMessage();   
        return mapping.findForward("success");   
    }   
}

public class TestAction extends Action{ private SpringIOC springIoc; public SpringIOC getSpringIoc() { return springIoc; } public void setSpringIoc(SpringIOC springIoc) { this.springIoc = springIoc; } public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { getSpringIoc().displayMessage(); return mapping.findForward("success"); }}

DelegatingRequestProcessor 方法的确比第一种方法好,但是仍然存在一些问题。

如果您使用一个不同的 RequestProcessor,则需要手动整合 Spring 的 DelegatingRequestProcessor。

添加的代码会造成维护的麻烦并且将来会降低您的应用程序的灵活性。

此外,还有过一些使用一系列命令来代替 Struts RequestProcessor 的传闻。

这种改变将会对这种解决方法的使用寿命造成负面的影响。

方法3:

将动作管理委托给 Spring, 一个更好的解决方法是将 Strut 动作管理委托给 Spring。

您可以通过在 struts-config 动作映射中注册一个代理来实现。

代理负责在 Spring 环境中查找 Struts 动作。

由于动作在 Spring 的控制之下,所以它可以填充动作的 JavaBean 属性,

并为应用诸如 Spring 的 AOP 拦截器之类的特性带来了可能。

struts-config.xml

Java代码

<!-- 方法3和方法2的区别所在 将Struts的动作委托给Spring框架的一个代理类来管理 -->   
        <action attribute="testForm"    
            name="testForm"    
            path="/test"  
            scope="request"  
            type="org.springframework.web.struts.DelegatingActionProxy"  
            validate="false">   
            <forward name="success" path="/result.jsp" />   
        </action>

<!-- 方法3和方法2的区别所在 将Struts的动作委托给Spring框架的一个代理类来管理 --> <action attribute="testForm" name="testForm" path="/test" scope="request" type="org.springframework.web.struts.DelegatingActionProxy" validate="false"> <forward name="success" path="/result.jsp" /> </action>

applicationContext.xml

Java代码

<bean id="sIoc" class="com.spring.SpringIOC">   
    <property name="message">   
        <value>SpringIOC Message</value>   
    </property>   
</bean>   
  
<bean name="/test" class="com.yourcompany.struts.action.TestAction">   
    <property name="springIoc">   
        <ref local="sIoc"/>   
    </property>   
</bean>   
  
<!--  Interceptors -->   
<bean name="logger"  
    class="com.spring.interceptors.LoggingInterceptor" />   
       
<!-- AutoProxies -->   
<bean name="loggingAutoProxy"    
    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">   
    <property name="beanNames">   
        <value>/test</value>       
    </property>   
    <property name="interceptorNames">   
        <list>   
            <value>logger</value>   
        </list>   
    </property>   
</bean>

<bean id="sIoc" class="com.spring.SpringIOC"> <property name="message"> <value>SpringIOC Message</value> </property> </bean> <bean name="/test" class="com.yourcompany.struts.action.TestAction"> <property name="springIoc"> <ref local="sIoc"/> </property> </bean> <!-- Interceptors --> <bean name="logger" class="com.spring.interceptors.LoggingInterceptor" /> <!-- AutoProxies --> <bean name="loggingAutoProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <value>/test</value> </property> <property name="interceptorNames"> <list> <value>logger</value> </list> </property> </bean>

Action同方法2

拦截器类如下:

Java代码

package com.spring.interceptors;   
  
import org.springframework.aop.MethodBeforeAdvice;   
import java.lang.reflect.Method;   
  
public class LoggingInterceptor implements MethodBeforeAdvice {   
  
    public void before(Method method, Object[] objects, Object o)   
            throws Throwable {   
  
        for(Object obj:objects){   
            System.out.println(obj.getClass());   
        }   
           
        System.out.println("target "+o.getClass());   
           
        System.out.println(method.getName());   
        System.out.println("logging before!");   
    }   
}

package com.spring.interceptors;import org.springframework.aop.MethodBeforeAdvice;import java.lang.reflect.Method;public class LoggingInterceptor implements MethodBeforeAdvice { public void before(Method method, Object[] objects, Object o) throws Throwable { for(Object obj:objects){ System.out.println(obj.getClass()); } System.out.println("target "+o.getClass()); System.out.println(method.getName()); System.out.println("logging before!"); }}

就像这个例子所展示的,将您的 Struts 动作置于 Spring 框架的控制之下,为处理您的 Struts 应用程序提供了一系列全新的选择。

在本例中,使用动作委托可以轻松地利用 Spring 拦截器提高 Struts 应用程序中的日志记录能力。

时间: 2024-10-13 16:31:57

Spring和Struct整合的三个方法的相关文章

spring和mybatis整合(三)

一.方法: 1.导入jar包 2.配置数据信息 1)Spring加Mybatis的第一种整合方法 <!-- 描述数据源信息 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/

009-shiro与spring web项目整合【三】验证码、记住我

一.验证码 1.自定义FormAuthenticationFilter 需要在验证账号和名称之前校验验证码 /** * * <p>Title: CustomFormAuthenticationFilter</p> * <p>Description:自定义FormAuthenticationFilter,认证之前实现 验证码校验 </p> * @version 1.0 */ public class CustomFormAuthenticationFilter

spring在xml文件中配置bean的三种方法

一.最常见,也是缺省,是调用spring的缺省工厂类 spring缺省工厂类:org.springframework.beans.factory.support.DefaultListableBeanFactory使用其静态方法preInstantiateSingletons() 配置文件中最普通最基本的定义一个普通bean<bean id="DvdTypeDAOBean" class="com.machome.dvd.impl.DvdTypeDAO" >

spring与hibernate整合(三种方式)

Spring与Hibernate整合关键点: 1) Hibernate的SessionFactory对象交给Spring创建: 2) hibernate事务交给spring的声明式事务管理. SSH整合: Spring与Struts: Spring与hibernate整合: SH整合步骤: 1)引入jar包 连接池/数据库驱动包 Hibernate相关jar Spring核心包(5个) Springaop 包(4个) spring-orm-3.2.5.RELEASE.jar           

JAP和Spring整合的三种方式

JPA是Java EE5规范之一,是一个orm规范,由厂商来实现该规范.目前有hibernate,OpenJPA,TopLink和EclipseJPA等实现 Spring提供三种方法集成JPA: 1.LocalEntityManagerFactoryBean:适用于那些仅使用JPA进行数据访问的项目.该FactoryBean根据 JPA PersistenceProvider自动检测配置文件进行工作,一般从“META-INF/persistence.xml”读取配置信息.这种方式最简单,但是不能

Spring使用jdbcJdbcTemplate和三种方法配置数据源

三种方法配置数据源 1.需要引入jar包:spring-jdbc-4.3.2.RELEASE.jar <!-- spring内置,springJdbc,配置数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"

springmvc3.2+spring+hibernate4全注解方式整合(三)

service接口 package com.fangjian.core.platform.service; import com.fangjian.core.platform.po.User; public interface UserService { void saveUser(User user); } service实现 package com.fangjian.core.platform.service.impl; import org.springframework.beans.fa

SpringMVC入门学习(三)+Spring应用(整合)

在整合之前我们再来回顾一下Spring和SpringMVC Spring: Spring框架的核心是提供了一个容器,该容器可以对Bean组件进行管理,例如创建Bean对象,销毁一个Bean对象等操作.此外该容器还具有IOC和AOP高级特性,将Bean对象调用解耦. SpringMVC: spring mvc是类似于struts的一个MVC开源框架,其实都是属于spring,spring mvc需要有spring的jar包作为支撑才能跑起来 Spring和SpringMVC整合不再需要拷jar包,

Spring框架笔记(十一)——IOC容器创建bean实例的第三种方法——FactoryBean

IOC容器创建bean实例有3类方法: 1 通过bean对应实例的全类名 2 通过工厂方法,包括静态工厂和实例工厂 3 实现 FactoryBean 接口在 Spring IOC 容器中配置 Bean 今天我们介绍这第三种方法--FactoryBean Spring 中有两种类型的 Bean, 一种是普通Bean, 另一种是工厂Bean, 即FactoryBean. 工厂 Bean 跟普通Bean不同, 其返回的对象不是指定类的一个实例, 其返回的是该工厂 Bean 的 getObject 方法