struts2集合spring开发--陈涛

前几天刚搞过 struts2.0 ,但该程序用的是 struts2.0 + hibernate 3.1 开发的,代码相当烦杂,所以就考滤把spring 加到项目中做个中间件,就象以前开发用 struts1.x + spring2.0 + hibernate3.x 一样,因struts 2.0 是基于webwork框架的,与struts1.x 完全是二种框架,所以在整合时也出现了一些问题,现在解决了写在上面须望能帮到需要帮助的同行

我们都知道当我们用struts2的时候需要在src 目录下建立一个struts.xml文件,这个文件在容器启动时struts2就会加载它,一个完整的struts.xml文件内容如下:

<?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="userManager" namespace="" extends="struts-default">
        
<action name="login" class="action.LoginAction" method="login">
            
<result name="success">/success.jsp</result>
            
<result name="error">/error.jsp</result>        
        
</action>
    
</package>
</struts>

其中action 就是指定其中某个struts2的action 属性name是客户端提交的地址,class 则指明当用户提交该地址时调用那个 action , method是指明要调用action中的那个方法,可不写,不写默认调用 execute 方法,方法如下

public String execute() throws Exception{
       
return null;
}

要调用默认的方法action 需要继承 ActionSupport 才可.也就是下面这样.

public class UserAction extends ActionSupport
{   
     
private String userName;
     
private String SUCCESS = "success":
     
private String ERROR = "error";
     
public String getUserName(){
             
return userName;
     }


     
public void setUserName(String userName){
           
this.userName = userName;
      }

     
public String execute() throws Exception{
          
          
if(userName.equals("chen")){
                  
return SUCCESS;
          }

           
return ERROR:
    }

}

 

我们看到在struts.xml文件中的action下有个元素result  ,其中name指定用户返回的字符串 value则是指定当返回该字符串时需转发的页面,也就是说当userName等于 chen时返回SUCCESS 则转发到 success.jsp,当返回ERROR时到error.jsp,                                 不说太多了下面讲讲与spring怎样整合吧!

当我们在struts.xml文件中加入 <constant name="struts.objectFactory" value="spring" />  指struts.objectFactory为spring,struts2框架就会将Bean转交给Spring来创建,装配,注入。但是Bean创建完成之后,其生命周期还是由struts2容器来管理。

还有一种方式就是在src下建立一个struts.properties文件,写入:    struts.objectFactory=spring  这是另一种方式,如果是这样子创建就不用在struts.xml文件中指定,struts.xml也不用更改,如常一样,如果在Action中有依赖于其它的Bean,也会被自动注入.这个时候,Action实例是以prototype方式创建的,Spring会为每个请求创建一个action的实例。

  在某些时候,你可能希望不仅仅让spring创建和装配Action对象,还希望让spring完全管理这些对象,如希望使用aop或者希望使用acegi时。这时候,只需要在spring的配置文件中定义这些action 即可。如在applicationContext.xml文件中:  <bean id="user" class="action.LoginAction"/>

  然后在struts.xml文件中的action元素,class="user"即可。如下:

<action name="login" class="user" method="login">
    
<result name="success">/success.jsp</result>
    
<result name="error">/error.jsp</result>        
</action>

需要注意的一个地方:Spring中的缺省作用域是单例。而往往Action属于有状态的Bean,应该使用prototype作用域。 < bean id="user" class="action.LoginAction" singleton="false"/>   如果忽略了这个细节,在我们实用SET,GET 方法注入关系的时候可能会有线程安全上的风险。请注意!

学习的朋友如果有好奇心可以试试,也欢迎大家加我QQ 543997732 一起讨论,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章