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 一起討論,

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