strut2提供了一种非常简单的方式来实现与spring的整合,记得以前用struts1还要改配置文件,struts通过一种“可插拨式”的插件,实现了与Spring框架的整合。在实现应用中,只需要把struts2-spring-plugin-x.x.x.x.jar(其中的xxxx为版本号)文件拷到应用的lib下即可。

       Struts2提供了两种基本的整合策略:

1.         Action实例交给Spring容器来负责生成,管理,通过这种方式,可以充分利用Spring容器的IOC特性,提供最好的解耦;

2.         利用Spring插件的自动装配方式,当Spring插件创建Action实例之后,立即将Spring窗口中对应的业务逻辑组件注入Action实例。

下面看看两个实例:

 首先:把spring.jar commons-logging.jarstruts2-spring-plugin-x.x.x.x.jar等相关的包拷到lib下,修改web.xml:添加linstener

<listener>

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

</listener>

这样配置之后,Spring自动查找WEB-INF路径下的applicationContext.xml配置文件。当然也可以自己指定配置文件,则需要在web.xml<context-param>元素,如下:

<context-param>

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

       <param-value>/WEB-INF/my.xml</param-value>

</context-param>

 

1.用第一方式实现struts2spring的整合

           (1) 一个简单的用户登录页面login.jsp:
         
<% @ page language="java" contentType="text/html; charset=gb2312" %>
<% @ taglib prefix="s" uri="/struts-tags" %>
< html >
< head >
< meta  http-equiv ="Content-Type"  content ="text/html; charset=gb2312"   />
< title > 用户登录 </ title >
</ head >
< body >
< s:form  action ="Login" >
    
< s:textfield  name ="username"  label ="用户信息" />
< s:textfield  name ="password"  label ="用户信息" />
    
< s:submit  value ="登录" />
</ s:form >
</ body >
</ html >
      (2)实现控制器逻辑(LoginAction.java):
package  my;
import  org.apache.log4j.Logger;
import  com.opensymphony.xwork2.Action;
public   class  LoginAction  implements  Action
{
    
private static final Logger log = Logger.getLogger(LoginAction.class);
    
private MyService ms;
    
private String tip;
    
private String username;
    
private String password;
    
public void setMs(MyService ms)
    
{
        
this.ms = ms;
    }

    
public void setPassword(String password)
    
{
        
this.password = password;
    }

    
public String getPassword()
    
{
        
return this.password;
    }

    
public void setUsername(String username)
    
{
        
this.username = username;
    }

    
public String getUsername()
    
{
        
return this.username;
    }


    
public void setTip(String tip)
    
{
        
this.tip=tip;
    }

    
public String getTip()
    
{
        
return this.tip;
    }

    
public String execute()throws Exception
    
{    
            
if (ms.valid(getUsername(),getPassword()))
            
{
                setTip(
"呵,整合成功!");
                
return SUCCESS;
            }

            
else
                
return ERROR;
        
    }

}
(3)struts2的配置文件(struts.xml):注意class属性不是指向一个action,而是指向spring 的一个bean
<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
>
< struts >
    
< package  name ="strutsqs"  extends ="struts-default" >
        
< action  name ="Login"  class ="loginAction" >
            
< result  name ="error" > /login.jsp </ result >
            
< result  name ="success" > /success.jsp </ result >
        
</ action >
    
</ package >
</ struts >

(4)业务逻辑接口(MyService.java):
package  my;
public   interface  MyService
{
    
public boolean valid(String username , String password);
}
(5)实现业务逻辑(MySeviceImpl.java):
package  my;
public   class  MyServiceImpl  implements  MyService
{
    
public boolean valid(String username , String password)
    
{
        
if (username.equals("hello"&& password.equals("world"))
        
{
            
return true;
        }

        
else
            
return false;
    }

}
(6)Spring的配置文件my.xml:
<? xml version="1.0" encoding="GBK" ?>
<!--  指定Spring配置文件的Schema信息  -->
< beans  xmlns ="http://www.springframework.org/schema/beans"
       xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" >
    
< bean  id ="myservice"  class ="my.MyServiceImpl" />
    
< bean  id ="loginAction"  class = "my.LoginAction"  scope ="prototype" >
        
< property  name ="ms"  ref ="myservice" />
    
</ bean >
</ beans >
ok.整合完毕。
2.使用自动装配方式整合
    (1)指定自动装配的策略,让Spring 自动管理Bean与Bean之间的依赖有关系,无需使用ref显式指定依赖Bean ,Spring容器会自动检查XML配置文件内容,为主调Bean 注入依赖Bean。Spring 提供了3种装配策略,通过修改struts.objectFactory.spring.autoWire常量指定,可接受的3个值:
     1.name:根据属性名自动装配,这个是默认值。
     2.type根据属性类型自动装配
     3.auto自动检测需要使用哪种自动装配方式
  在上面的简单应用中,只需要修改配置文件即可:
    1.修改struts.xml配置文件:class属性与没有整合时一样的。。
<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
>

< struts >
    
    
< package  name ="strutsqs"  extends ="struts-default" >

        
< action  name ="Login"  class ="my.LoginAction" >

            
< result  name ="error" > /login.jsp </ result >
            
< result  name ="success" > /success.jsp </ result >
        
        
</ action >
        
    
</ package >

</ struts >
2.修改spring的配置文件my.xml,因为action中需要业务逻辑组件名为ms,所以必须在配置业务逻辑组件时,指定其id属性为ms
 
<? xml version="1.0" encoding="GBK" ?>
<!--  指定Spring配置文件的Schema信息  -->
< beans  xmlns ="http://www.springframework.org/schema/beans"
       xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" >
    
< bean  id ="ms"  class ="my.MyServiceImpl" />

</ beans >
ok,完成。。