使用Struts2動作


在Struts2中,會花大部分的時間用在用動作來處理工作。動作類包含業務邏輯,獲取資源包,儲存資料,驗證,並選擇應發回給使用者的檢視的結果頁面。這是Struts2的核心,所以必須要了解動作的基本概念。

1. 動作 - Action

Struts 2動作不強迫你實現任何介面或擴充套件類,它只是需要你實現一個 execute()方法返回一個字串來表示其應該返回的結果頁面。

package com.yiibai.user.action; 
public class LoginAction{
    //business logic
    public String execute() {
        return "success";
    }
}

在struts.xml中,組態使用Action類動作(action)標記和類屬性。定義結果頁面用結果的標籤和動作名稱返回給使用者,可以用它來存取動作類的名稱屬性。

<package name="user" namespace="/User" extends="struts-default">
  <action name="validateUser" class="com.yiibai.user.action.LoginAction">
    <result name="success">pages/welcome.jsp</result>
  </action>
<package>
現在,可以通過 .action 擴充套件名字尾存取動作。
http://localhost:8080/Struts2Example/User/validateUser.action 
預設.action是可組態的,只需要設定「struts.action.extension」的值,以滿足您的需要。

2. 可選動作介面

Struts 2帶有一個可選的動作介面(com.opensymphony.xwork2.Action)。通過實現這個介面,它帶來了一些方便和好處,看下面的原始碼:

package com.opensymphony.xwork2;
public interface Action {
    public static final String SUCCESS = "success";
    public static final String NONE = "none";
    public static final String ERROR = "error";
    public static final String INPUT = "input";
    public static final String LOGIN = "login";
    public String execute() throws Exception;
}

這個介面是非常簡單的,配有5常用常數值: success, error, none, input and logic。現在的動作類可以直接使用常數。

package com.yiibai.user.action;
import com.opensymphony.xwork2.Action;
public class LoginAction{
    //business logic
    public String execute() {
        return SUCCESS;
    }
}
不明白為什麼很多Struts開發人員喜歡實現此動作介面,它更好地擴充套件了ActionSupport。

3. ActionSupport

Support 類,通常的做法是提供介面的預設實現。

 ActionSupport (com.opensymphony.xwork2.ActionSupport), 一個非常強大和方便的類,它提供了幾個重要介面的預設實現:

public class ActionSupport implements Action, Validateable, 
   ValidationAware, TextProvider, LocaleProvider, Serializable {
 ...
}

ActionSupport 類提供一些功能:

1. 驗證 – 宣告一個validate()方法,並在裡面實現驗證程式碼。

2. 文字在地化 – 使用gettext()方法來獲得資源包的訊息。

package com.yiibai.user.action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport{
    private String username;
    private String password;
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    //business logic
    public String execute() {
        return "SUCCESS";
    }
        //simple validation
    public void validate(){
        if("".equals(getUsername())){
            addFieldError("username", getText("username.required"));
        }
        if("".equals(getPassword())){
            addFieldError("password", getText("password.required"));
        }
    }
}
在大多數情況下,應該擴充套件此類妥當,方便提供功能,除非你有理由不這樣做。這也是一個很不錯的學習類,以了解如何做一些重要的Struts2介面的實現。

4. 動作注釋

Struts 2對註解有很好的支援,你可以擺脫XML檔案,並使用@action在動作類上替換。

package com.yiibai.user.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;
import com.opensymphony.xwork2.ActionSupport;
@Namespace("/User")
@ResultPath(value="/")
public class ValidateUserAction extends ActionSupport{
    @Action(value="Welcome", results={
        @Result(name="success",location="pages/welcome_user.jsp")
    })
    public String execute() {
        return SUCCESS;
    }
}

總結

擴充套件ActionSupport類,它適合在大多數情況下。