006--Struts2中Action創建及訪問方式

Struts2中Action創建

在Struts2的應用開發中,Action作為框架的核心類,負責對用戶請求的處理,也被稱為業務邏輯控制器。一個Action類代表依次請求或調用,每個請求動作都會有一個響應的Action類。

建立一個Action類主要有以下三種方式:

  • POJO(Plain Ordinary Java Object) 簡單Java對象
  • 實現Action接口
  • 集成ActionSupport類

POJO

在Struts2中,Action可以不繼承特殊的類或不實現任何接口,僅僅是一個POJO,一般來講,要有一個公共的無參構造方法和一個execute方法,如下:

public class Hello1Action {
    public String execute() {
        System.out.println("hello 1 excute");
        return "success";
    }
}

其中execute方法要求如下:

  • 權限修飾符為public
  • 返回一個字符串,指示下一個頁面的result
  • 無參方法

實現Action接口

為了讓開發人員開發的Action類更規范,Struts2提供了一個Action接口,在自定義Action類時可以實現這個接口,如下:

public class Hello2Action implements Action {
    @Override
    public String execute() throws Exception {
        System.out.println("hello 2 action");
        return SUCCESS;
    }
}

Action接口位于com.opensymphony.xwork2.Action包中,這里需要實現execute方法并返回一個字符串。除此之外,該接口還定義了5個字符串常量,用來統一execute方法的返回值。

  • SUCCESS:success,代表成功
  • NONE:none,代表頁面不跳轉
  • ERROR:error,跳轉到錯誤頁面
  • INPUT:input,數據校驗時跳轉的路徑
  • LOGIN:login,跳轉登錄頁面

繼承ActionSupport類(推薦)

在開發過程中,更推薦的做法是繼承ActionSupport類,其中ActionSupport實現了Action接口,除此之外,還實現了Validateable、ValidationAware、TextProvider、LocaleProvider和Seriable等接口,為我們提供了更多的功能,
示例如下:

public class Hello3Action extends ActionSupport {
    public String execute(){
        System.out.println("hello 3 action");
        return SUCCESS;
    }
}

ActionSupport類中提供了許多默認方法,包括獲取國際化信息、數據校驗、默認處理用戶請求的方法等,通過繼承該類能簡化我們Action的開發。

Action的訪問

之前說過,通過URL進行訪問時通過packagenamespaceactionname屬性決定的,然后通過action中的method屬性指定Action中具體執行哪個方法。
配置Action的訪問方式主要有三種:

  • 原始方式
  • 通配符方式
  • 動態方法訪問

首先附上UserAction相關代碼:

public class UserAction extends ActionSupport {
    public String add() {
        System.out.println("add");
        return NONE;
    }

    public String delete() {
        System.out.println("delete");
        return NONE;
    }

    public String update() {
        System.out.println("update");
        return NONE;
    }

    public String query() {
        System.out.println("query");
        return NONE;
    }
}

原始方式

就是之前介紹到的,配置method來決定執行Action的哪個方法。
如下:

<package name="user" namespace="/user" extends="struts-default">
        <action name="add" class="com.happ.demo.user.UserAction" method="add"> 
        </action>
  </package>

通配符方式

考慮一種情況,加入現在UserAction下分別有增刪改查四個方法,按照之前的邏輯需要配置四份Action,如下:

<package name="user" namespace="/user" extends="struts-default">
        <action name="add" class="com.happ.demo.user.UserAction" method="add">
            </action>
        <action name="delete" class="com.happ.demo.user.UserAction" method="delete">
            </action>
        <action name="update" class="com.happ.demo.user.UserAction" method="update">
           </action>
        <action name="query" class="com.happ.demo.user.UserAction" method="query">
         </action>
    </package>

顯然,這樣就顯得過于冗長和復雜,在此,我們可以使用通配符方式解決,如下:

    <package name="user" namespace="/user" extends="struts-default">
        <action name="user_*" class="com.happ.demo.user.UserAction" method="{1}"/>
    </package>

其中,action中的name屬性使用的*代表任意字符,method中的{1}代表name屬性中出現的第一個*所代替的字符串。
例如,當請求/user_add.action時,name屬性為user_add,methon屬性就為add,緊接著就會調用到Action類中的add方法。
在開發中,通配符方式是使用比較多的。

動態方法訪問

動態方法訪問在Struts2中默認是關閉的,如果需要使用,先開啟一個常量:

<constant name="struts.enable.DynamicMethodInvocation" value="true"/>

動態方法訪問主要的控制是在頁面端,編寫和配置Action比較簡單,主要是訪問路徑的編寫。
struts.xml配置如下:

<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    <package name="user" namespace="/user" extends="struts-default">
        <action name="userAction" class="com.happ.demo.user.UserAction"/>
    </package>

頁面路徑寫法為:

/user/UserAction!add.action
/user/UserAction!delete.action
/user/UserAction!update.action
/user/UserAction!query.action

這樣就完成了Action的動態方法訪問。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容