SSH入門Struts2篇(2)——Action的四種自定義方法
1.Action類的生命週期
框架先例項化 Action 物件,再呼叫 Action 的 set*** 函式,封裝表單資料,然後呼叫 execute 函式,進行處理。
在第二次提交時,Action 會重新例項化,每一個 Action 物件都服務一個請求,這和 Servlet 的原理是不一樣的——servlet是隻在伺服器啟動時載入一次,所有使用者共享。
2.Action的自定義方法
其實一個action中是可以提供多個方法用來處理不同的請求,也即不一定要是execute()
當Action中使用了自定義方法,則該Action就需要特定的配置,一般有四種呼叫方式:
① 在struts.xml檔案中通過method屬性指定方法名
② 使用動態方法呼叫方式(DMI)
③ 使用提交按鈕的method屬性
④ 使用萬用字元配置Action
注:我們在這裡討論的都是在同一Action下有兩種或以上方法分別處理不同請求的情況
假設我們這裡有這樣一個Action:
package cn.edu.zjut.action;
import cn.edu.zjut.bean.*;
import cn.edu.zjut.service.*;
public class UserAction {
private UserBean loginUser;
private UserBean regUser;
public UserBean getLoginUser() {
return loginUser;
}
public void setLoginUser(UserBean loginUser) {
this.loginUser = loginUser;
}
public UserBean getRegUser() {
return regUser;
}
public void setRegUser(UserBean regUser) {
this.regUser = regUser;
}
public String login() {
UserService userServ = new UserService();
if(userServ.login(loginUser) ) {
return "loginsuccess";
}
return "loginfail";
}
public String reg() {
UserService userServ = new UserService();
if(userServ.register(regUser)) {
return "regsuccess";
}
return "regfail";
}
}
2.1 在struts.xml檔案中通過method屬性指定方法名
form action="login"
以及在另一個表單 form action="register"
在Action下有幾種方法在xml檔案裡就需要寫幾個<action ...>
,class都是指定同一action,但是通過method後面的內容來指定使用該action下的什麼方法。
<action name="login" class="...UserAction" method="login"> …… </action>
<action name="register" class="...UserAction" method="reg"> …… </action>
訪問方式:以actionName.action形式訪問,如 http://localhost:8080/struts2/login.action
缺點就是要寫太多個<action ...>
了啦…(其實我覺得還好)
2.2 使用動態方法呼叫方式(DMI)
先要在struts.xml檔案中:(否則會404
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
struts.xml:
<action name="UserAction" class="...UserAction">....</action>
訪問方式:
//url方式
http://localhost:8080/struts2/UserAction!login.action
http://localhost:8080/struts2/UserAction!reg.action
//表單
<s:form action="UserAction!login" method="post">
<s:form action="UserAction!reg" method="post">
注:在這種方法時一定要注意UserAction下的login和reg方法不能有相同的result返回值,因為它們的result標籤都是寫在一個<action></action>
裡的
<action name="UserAction" class="...UserAction">
<result name="success">/loginSuccess.jsp</result>
<result name="fail">/loginFail.jsp</result>
<result name="registersuccess">
/regSuccess.jsp</result>
<result name="registerfail">/regFail.jsp</result>
</action>
2.3使用提交按鈕的method屬性——注意這種方法只能用於表單中
struts.xml和上文中沒有差別,也需要
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<action name="UserAction" class="...UserAction">
</action>
表單:
<s:form action="UserAction" method="post">
……
<s:submit value="登入" method="login"/>
<s:submit value="註冊" method="reg"/>
注意這裡的result和動態呼叫一樣,兩個方法都需要互不相同
2.4使用萬用字元配置Action——這也是相對更為普遍的方式
struts.xml檔案中這麼寫:
<action name="*Action" class="cn.edu.zjut.action.UserAction" method="{1}">
<result name="{1}success">/{1}Success.jsp</result>
<result name="{1}fail">/{1}Fail.jsp</result>
</action>
在這裡*就代表了佔位符,而method="{1}"
中的1、2、3則代表了佔位符的位置(當然這裡只有一個佔位符,所以只有1)
例如表單中寫:form action="regAction"
,則在Action類中對應的方法就應該要叫做"reg",而方法的返回值則為regsuccess和regfail
,相對跳轉到的頁面則為regSuccess.jsp
和regFail.jsp
.
3.Action處理後的結果result的型別-type屬性
使用result的type屬性來設定結果型別
1.dispatcher: 預設值,伺服器內部跳轉(跳轉到web元件),相當於javaWeb中的forward
2.redirect: 作客戶端重定向(重定向到web元件);
3.chain: 作伺服器內部跳轉(跳轉到其他Action);
4.redirectAction: 作客戶端重定向(重定向到其他Action)
5.plainText:跳轉到介面的原始碼
例如在以下程式碼中預設的是dispatcher,因此在xxSuccess.jsp頁面中是可以獲得對應Action中的屬性值的
<action name="*Action" class="cn.edu.zjut.action.UserAction" method="{1}">
<result name="{1}success">/{1}Success.jsp</result>
<result name="{1}fail">/{1}Fail.jsp</result>
</action>
例如Action中有一個屬性叫做count
那麼在跳轉到的頁面就可以使用<s:property value="count">
來把屬性值顯示出來。(此時導航欄顯示的是xxx/loginAction)
但是在使用了redirect之後這個屬性值就抓不到了.(此時導航欄顯示的是loginSuccess.jsp(以*代表login為例)