前幾天剛搞過 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文件內容如下:
<!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 方法,方法如下
return null;
}
要調用默認的方法action 需要繼承 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"即可。如下:
<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 一起討論,