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檔案內容如下:
<!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"
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
其中action 就是指定其中某個struts2的action 屬性name是客戶端提交的地址,class 則指明當使用者提交該地址時呼叫那個 action , method是指明要呼叫action中的那個方法,可不寫,不寫預設呼叫 execute 方法,方法如下
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 一起討論,