Struts2 与 Spring 的集成

原创 2012年03月29日 08:29:27

Struts 2 Spring Integration

In this simple hello world example you will see how to integrate Spring and Struts 2 using the struts2-spring-plugin. By doing this you can utilize the Spring's powerful Dependency Injection feature. To learn more about Dependency Injection refer this example.

First add the org.springframework.web.context.ContextLoaderListener to the web.xml file.

01.<?xml version="1.0" encoding="UTF-8"?>

02.<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

03.  <display-name>Struts2Example14</display-name>

04.    <filter>

05.        <filter-name>struts2</filter-name>

06.        <filter-class>org.apache.struts2.dispatcher.ng.filter. StrutsPrepareAndExecuteFilter</filter-class>

07.    </filter>

08.    <listener>

09.        <listener-class>org.springframework.web.context. ContextLoaderListener</listener-class>

10.    </listener>

11.    <filter-mapping>

12.        <filter-name>struts2</filter-name>

13.        <url-pattern>/*</url-pattern>

14.    </filter-mapping>

15.    <welcome-file-list>

16.        <welcome-file>index.jsp</welcome-file>

17.    </welcome-file-list>

18.</web-app>

By default the applicationContext.xml file will be used for doing the Spring bean configuration.

1.<?xml version="1.0" encoding="UTF-8"?>

2.<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

3.<beans>

4.    <bean id="helloWorldClass" class="com.vaannila.HelloWorld" >

5.        <property name="message" value="Hello World!" />

6.    </bean>

7.</beans>

As you can see we have registered the HelloWorld class and injected the "Hello World!" message to the message attribute using the setter injection method.

All the Struts 2 action configuration goes in the struts.xml file.

01.<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

02.  

03.<struts>

04.    <package name="default" extends="struts-default">

05.        <action name="helloWorld" class="helloWorldClass">

06.            <result name="SUCCESS">/success.jsp</result>

07.        </action>

08.    </package>

09.</struts>

The only change here is instead of referring the com.vaannila.HelloWorld class directly, we relate it using the bean name given in the spring bean configuration file.

The HelloWorld class is shown below. In the execute() method we simply return "SUCCESS" and the message attribute is set using setter injection.

01.package com.vaannila;

02.  

03.public class HelloWorld {

04.  

05.    private String message;

06.  

07.    public String getMessage() {

08.        return message;

09.    }

10.  

11.    public void setMessage(String message) {

12.        this.message = message;

13.    }

14.      

15.    public String execute() {

16.        return "SUCCESS";

17.    }

18.}

In the index.jsp page we forward the request to the helloWorld action.

1.<META HTTP-EQUIV="Refresh" CONTENT="0;URL=helloWorld.action">

After invoking the execute() method the user will be directed to the success.jsp page. In this page we dispaly the message value.

You need to have the following jar files in the WEB-INF/lib directory.

01.commons-fileupload-1.2.1

02.commons-io-1.3.2

03.commons-logging-1.1

04.freemarker-2.3.13

05.junit-3.8.1

06.ognl-2.6.11

07.struts2-convention-plugin-2.1.6

08.struts2-core-2.1.6

09.xwork-2.1.2

10.  

11.struts2-spring-plugin-2.1.6

12.  

13.antlr-runtime-3.0

14.org.springframework.asm-3.0.0.M3

15.org.springframework.beans-3.0.0.M3

16.org.springframework.context-3.0.0.M3

17.org.springframework.core-3.0.0.M3

18.org.springframework.expression-3.0.0.M3

19.org.springframework.web-3.0.0.M3

20.org.springframework.web.servlet-3.0.0.M3

The directory structure of the example is shown below.

You can download and try the example here.

Source :Download

Source + Lib :Download

 

本文引自:http://www.vaannila.com/struts-2/struts-2-example/struts-2-spring-plugin-integration-1.html

简单但足以说明问题。

 

Struts2与Spring的集成要用到Spring插件包,这个包是同Struts2一起发布的。Spring插件是通过覆盖(override)Struts2的ObjectFactory来增强核心框架对象的创建。当创建一个对象的时候,它会用Struts2配置文件中的class属性去和Spring配置文件中的id属性进行关联,如果能找到则由Spring创建,否则由Struts2框架自身创建,然后由Spring来装配。Spring插件具体有如下几个作用:

1. 允许spring来创建Action、Interceptror和Result

2. 由Struts创建的对象能够被Spring装配

3. 提供了2个拦截器来自动装配action,如果没有使用Spring ObjectFactory的话

这里要注意的是,我们不必在Spring中去注册action,尽管我们可以这么去做,通常Struts框架会自动的从action mapping中创建action对象。

要实现与Struts与Spring的集成有如下几步

1.将struts2-spring-plugin-2.0.8.jar文件包含到我们的应用中,放到WEB-INF/lib目录下面即可。在这个插件包中有个struts-plugin.xml文件,它的内容如下:

<struts>

    <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" 

         class="org.apache.struts2.spring.StrutsSpringObjectFactory" />

    <constant name="struts.objectFactory" value="spring" />

    <package name="spring-default">

        <interceptors>

            <interceptor name="autowiring" 

class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>

            <interceptor name="sessionAutowiring"

class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>

        </interceptors>

    </package>    

</struts>

这里它将框架常量struts.objectFactory覆盖了,设置为”spring”,其实这里是使用了缩写,我们可以写全称:org.apache.struts2.spring.StrutsSpringObjectFactory。这个缩写的”spring”是和bean配置中的name属性相对应的。默认情况下所有由框架创建的对象都是由ObjectFactory实例化的,ObjectFactory提供了与其它IoC容器如Spring、Pico等集成的方法。覆盖这个ObjectFactory的类必须继承ObjectFactory类或者它的任何子类,并且要带有一个不带参数的构造方法。在这里我们用org.apache.struts2.spring.StrutsSpringObjectFactory代替了默认的ObjectFactory。

此外,上面我们说了,如果action不是使用Spring ObjectFactory创建的话,插件提供了两个拦截器来自动装配action,默认情况下框架使用的自动装配策略是name,也就是说框架会去Spring中寻找与action属性名字相同的bean,可选的装配策略还有:type、auto、constructor,我们可以通过常量struts.objectFactory.spring.autoWire来进行设置。

2.配置Spring监听器,将Spring.jar包包含到应用中

将下面一段话插入到web.xml文件中,同时将spring.jar文件放到WEB-INF/lib目录下面。

<listener>

    <listener-class>

        org.springframework.web.context.ContextLoaderListener

    </listener-class>

</listener>

3.利用Spring配置文件来注册对象

这之后的步骤就和我们使用单独使用Spring一样了,现在我们就已经完成了Struts与Spring的集成了。这里有一点要注意的是,我们还要指定Spring配置文件的地点,默认情况下,容器会到WEB-INF目录下面去寻找applicationContext.xml文件。如果我们想指定别的地方的配置文件或者指定多个配置文件,可以通过在web.xml文件中定义context-param元素来指定,如下所示:

<context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>

        /WEB-INF/applicationContext.xml,classpath:applicationContext-*.xml

    </param-value>

</context-param>

上面一段话表示WEB-INF下面的applicationContext.xml文件以及classpath下面的所有匹配applicationContext-*.xml模式的文件都会作为Spring配置文件被装载。

 

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

spring+hibernate+Struts2集成

  • 2015年08月29日 00:35
  • 19.39MB
  • 下载

struts2 与 spring集成原因 详解

1.  Struts2与Spring进行整合的根本目的就是要让 Spring为Struts2的Action注入所需的资源对象,它们整合的原理则是只要导入了struts2的spring插件包,不需要...

集成 Struts2/Spring/Hibernate

  • 2011年08月02日 21:48
  • 1.16MB
  • 下载

在Web层集成Struts2与Spring

最近学习传智播客的巴巴运动网教程,在集成Struts与Spring时,遇到很多麻烦,在此记录,希望对以后遇到同样问题的人有所帮助。教程中集成的是Struts1,我选择的是Struts2。两者还是有所不...
  • csc0211
  • csc0211
  • 2011年08月01日 18:33
  • 1472

struts2 hibernate3.2 spring2.5集成步骤

  • 2012年02月29日 11:44
  • 382KB
  • 下载

采用共享jar包部署struts2+spring集成项目会遇到的问题

比如tomcat下边有个lib,放着我们需要的struts2 + spring 集成jar包(一定要struts2和spring集成),即共享给所有webapp使用,如图: 此时tomcat启动时...

struts2+spring+ibatis集成实现赠删改查

  • 2013年04月16日 16:12
  • 12.92MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Struts2 与 Spring 的集成
举报原因:
原因补充:

(最多只允许输入30个字)