Struts 2 使用Action的動態方法調用

jopen 8年前發布 | 10K 次閱讀 Struts2 Web框架

             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整合開發》

 

來自: http://blog.csdn.net/chenssy/article/details/7271991

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!