1. 程式人生 > >struts2集合spring開發--陳濤

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...{
       
returnnull;
}

要呼叫預設的方法action 需要繼承 ActionSupport 才可.也就是下面這樣.

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


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