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進行訪問時通過package
的namespace
和action
的name
屬性決定的,然后通過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的動態方法訪問。