Struts 2 使用Action的動態方法調用
struts 2提供了包含處理多個邏輯的Action,從而允許一個Action內包含多個控制處理邏輯。例如一個頁面中存在多個按鈕,用戶通過不同的按鈕提交同一個表單時,可以使用Action的不同的方法來處理用戶的請求。如下圖頁面
頁面中有兩個提交按鈕,但分別提交給Action的不同方法處理,“登陸”按鈕使用登陸邏輯來處理請求,而“注冊”按鈕則使用注冊邏輯來處理請求。
此時,可以采用動態方法調用來處理 這種請求。動態方法調用是指表單元素的action并不是直接等于某個Action的名字,而是以下面形式來指定表單的action屬性
action屬性為actionName!methodName形式 其中ActionName指定提交給那個Action,而methodName指定提交給該Action的某個方法
即:action = ”ActionName!methodName"
上面的注冊按鈕是一個沒有任何動作的按鈕,但單擊該按鈕時會觸發regist函數
<input type="submit" value="注冊" onclick="regist();">
regist函數:
<script type="text/javascript"> function regist(){ targetForm = document.forms[0]; targetForm.action = "login!regist"; } </script>
上面的regist方法改變表單的action屬性,修改action的屬性為“login!regist",其實質就是將該表單提交給LoginAction的regist方法處理
Login|Action類的代碼:
public class LoginAction { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } //定義處理用戶請求的login方法 public String execute(){ ActionContext ctx = ActionContext.getContext(); Integer counter = (Integer) ctx.getApplication().get("counter"); if(counter==null){ counter = 1; } else { counter = counter + 1; } ctx.getApplication().put("counter", counter); //通過ActionContext()設置session范圍的屬性 ctx.getSession().put("user", getUsername()); if(getUsername().equals("chentmt")&&getPassword().equals("chenssy")){ //通過ActionContext()設置reque范圍的屬性 ctx.put("tip","服務器提示:您已經成功登陸....."); return "success"; } else { ctx.put("tip", "服務器提示:登陸失敗"); return "error"; } } //Action包含的注冊控制邏輯 public String regist(){ ActionContext.getContext().getSession().put("user",getUsername()); setTip("恭喜你,"+getUsername()+",您已經注冊成功了...."); return "success"; } }
上面的Action代碼中定義了改Action里包含的register控制邏輯,在默認情況下,用戶請求不會提交該方法。當在單擊“登陸”按鈕時,系統將提交給LoginAction的默認方法處理。當單擊“注冊”按鈕時,該表單的action被修改為login!regist,系統將提交改LoginAction的regist方法處理。
通過這種方式,我們可以通過在一個Action中包含多個處理邏輯,并通過為該表單元素指定不同action屬性來提交給Action的不同方法。
對于使用動態方法調用的方法,該方法的方法聲明與系統默認的execute方法的方法只有方法名不同,其他部分如形參列表,返回值類型都應該完全相同。
在試用合格動態方法調用前必須設置Struts 2允許動態方法調用。開啟系統的動態方法調用時通過設置struts.enable.DynamicMethodInvocation常量完成的。設置該常量為true,將開啟動態方法調用;否則則關閉動態方法調用。
讀李剛《輕量級java EE企業應用實戰(第三版)—struts 2+Spring 3+Hibernate整合開發》