成為 Action 的條件
Struts2 對成為 Action 的類的要求很寬松,通常,有下面的幾種方式可供選擇:
a. 實現 com.opensymphony.xwork2.Action 接口
b. 繼承 com.opensymphony.xwork2.ActionSupport 類
c. 一個簡單的 POJO 也能成為一個 Action,前提是,你需要給這個類編寫 public String xx ( ) { } 方法
簡單的 POJO 作為 Action
package fan.tutorial.action;
public class Domain1Action {
public String execute(){
System.out.println("Domain1Action[execute] was invoked!");
return "success";
}
public String launch(){
System.out.println("Domain1Action[launch] was invoked!");
return "success";
}
}
在這里,你所要做的僅僅是編寫 public String xx ( ) { } 方法而已。
實現 Action 接口
package fan.tutorial.action;
import com.opensymphony.xwork2.Action;
public class Domain2Action implements Action {
public String execute(){
System.out.println("Domain2Action[execute] was invoked!");
return SUCCESS;
}
public String launch(){
System.out.println("Domain2Action[launch] was invoked!");
return SUCCESS;
}
}
Action 接口非常簡單,僅是聲明了一個抽象的 execute 方法和定義了一些常量,快速看一眼 Action 的源代碼:
繼承 ActionSupport 類
package fan.tutorial.action;
import com.opensymphony.xwork2.ActionSupport;
public class Domain3Action extends ActionSupport {
private static final long serialVersionUID = 1848203007453752456L;
public String execute(){
System.out.println("Domain3Action[execute] was invoked!");
return SUCCESS;
}
public String launch(){
System.out.println("Domain3Action[launch] was invoked!");
return SUCCESS;
}
}
ActionSupport 是已經實現了 Action 接口以及其它幾個常用接口的類,例如數據驗證接口等。
這在編程開發上給我們帶來了一定的便利,下面是 ActionSupport 的部分源代碼:
Action 接收參數的方式
a. 通過 Action 類的屬性域來接收參數
b. 通過領域對象來接收參數
c. 通過 ModelDriven 來接收參數
通過 Action 類的屬性域來接收參數
package fan.tutorial.action;
import com.opensymphony.xwork2.Action;
public class FieldAction implements Action {
private String username;
public String execute() {
System.out.println("**************************");
System.out.println("[FieldAction] username : " + username);
System.out.println("**************************");
return null;
}
public void setUsername(String username) {
this.username = username;
}
}
具體的做法是:
(1) 在 Action 類中定義屬性名稱,如上例的 username
(2) 為該屬性名稱添加 setter 方法,如上例的 public void setUsername...
(3) 通過 URL 將參數傳遞到 Action,如 field.action?username=u
通過領域對象來接收參數
package fan.tutorial.model;
public class User {
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;
}
@Override
public String toString() {
return "[ username = " + username + ", password = " + password + " ]";
}
}
package fan.tutorial.action;
import com.opensymphony.xwork2.Action;
import fan.tutorial.model.User;
public class ModelAction implements Action {
private User user;
// private User user = new User();
public String execute() {
System.out.println("**************************");
System.out.println("[ModelAction] user : " + user);
System.out.println("**************************");
return null;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
具體的做法是:
(1) 在 Action 類中定義出對象,如上例的 user
(2) 為該對象添加 setter 和 getter 方法,如上例的 setUser... 和 getUser... 方法
(3) 通過 URL 將參數傳遞到 Action,如 model.action?user.username=u&user.password=p
以這種方式接收參數的特點是:
(1) Action 類中的目標對象你可以選擇自己來 new 一個,如上例注釋掉的那行。
(2) Action 類中的目標對象你也可以選擇不自己來 new,Struts2 在嘗試獲取 URL 中目標對象的引用時,當它發現目標對象 user 為 null 時,它會通過反射來調用目標類 User 的無參構造方法來創建出一個目標類的實例,然后再調用該實例的 setUsername 和 setPassword 方法來將 URL 中傳遞過來的參數填充進對象里面。因此,如果你選擇不自己 new 目標對象,那么你必須確保目標類擁有一個無參的構造法。
(3) 參數發送的方式為:對象名稱
.對象屬性名稱。如上例 model.action?user.username=u
通過 ModelDriven 來接收參數
package fan.tutorial.action;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;
import fan.tutorial.model.User;
public class ModelDrivenAction implements Action, ModelDriven<User> {
private User user = new User();
public String execute() {
System.out.println("**************************");
System.out.println("[ModelDrivenAction] user : " + user);
System.out.println("**************************");
return null;
}
public User getModel() {
return user;
}
}
具體的做法是:
(1) 在 Action 類中實現 ModelDriven 接口,并實現 getModel() 方法
(2) 在 getModel() 方法中必須手動創建對象并返回該對象的引用
(3) 通過 URL 將參數傳遞到 Action,如 model_driven.action?username=u&password=p
以這種方式接收參數的特點是:
(1) 你必須手動創建目標的對象
(2) 參數發送的時候不需要帶上對象的名稱,如上例的 model_driven.action?username=u
struts-action.zip
posted on 2014-03-13 16:49
fancydeepin 閱讀(1537)
評論(8) 編輯 收藏