struts2_Action的基本使用

Actions是Struts2框架的核心,因爲它們適用於任何MVC(Model View Controller)框架。 每個URL映射到特定的action,其提供處理來自用戶的請求所需的處理邏輯。

Struts2框架是類級別的攔截,每次來了請求就創建一個Action,然後調用get和set方法把request中的數據注入。

創建Action類

實現Action接口

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.opensymphony.xwork2;

public interface Action {
    String SUCCESS = "success";
    String NONE = "none";
    String ERROR = "error";
    String INPUT = "input";
    String LOGIN = "login";

    String execute() throws Exception;
}

只需要實現該接口,並在struts.xml中進行配置。

繼承Actionsupport類

public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable

ActionSupport類本身實現了Action接口,所以繼承ActionSupport類就相當於實現了Action接口。除此之外,ActionSupport類還實現了其它幾個接口,來爲程序員提供更多使用的功能,這些接口和Struts2的一些其他特性相結合,可以實現基本的數據驗證功能和國際化。接口如下所示:

com.opensymphony.xwork2.Validateable;  //提供validate()方法來爲Action增加驗證的功能
com.opensymphony.xwork2.Validateaware; //提供方法來保存和恢復action或field級的錯誤信息
com.opensymphony.xwork2.TextProvider;  //提供獲取本地信息文本的功能
com.opensymphony.xwork2.LocaleProvider;//提供getLocale()方法來獲取本地消息

(1) 基本的數據驗證功能

只需要重寫validate()方法

public void validate() {}
package com.org.action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.org.bean.User;


public class LoginAction extends ActionSupport{
    //通過領域對象獲取,客戶端對應user.username
    private User user;
    private String securityCode;

    public String getSecurityCode() {
        return securityCode;
    }

    public void setSecurityCode(String securityCode) {
        this.securityCode = securityCode;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
    @Override
    public String execute() throws Exception {
        try{
            Thread.sleep(6000);
            if (user.getUsername().equals("admin") && user.getPassword().equals("123")) {
                System.out.println(user.getBirthday());
                return SUCCESS;
            } else {
                return LOGIN;
            }
        }catch (InterruptedException e){
            e.printStackTrace();
            return INPUT;
        }
    }
    //普通校驗,在execute之間會調用validate()或validateXXX()
    public void validate(){
        if(user.getUsername() == null || user.getUsername().trim().length() == 0){
            addActionError("用戶名不能爲空");
        }
        else if(user.getPassword() == null || user.getPassword().trim().length() == 0){
            addActionError("密碼不能爲空");
        }
    }
}

以上的validate()中實現了登錄過程中判斷用戶名和密碼否爲空,調用了ActionSupport中的

public void addActionError(String anErrorMessage) {
    this.validationAware.addActionError(anErrorMessage);
}

可在前端使用

<s:actionerror/>

獲得錯誤信息。

此外在ActionSupport中還有兩個方法

public void addActionMessage(String aMessage) {
    this.validationAware.addActionMessage(aMessage);
}

public void addFieldError(String fieldName, String errorMessage) {
    this.validationAware.addFieldError(fieldName, errorMessage);
}

對應在前端可以用以下兩個方法獲得相應的信息。

<s:actionmessage/>
<s:fielderror/>
注意引入標籤庫
<%@taglib prefix="s" uri="/struts-tags" %>

我們發現validate方法是沒有返回值的,那麼當驗證後,如果有數據沒有通過驗證會自動跳轉回到該action中名稱爲input的result所配置的頁面。示例如下:

        <action name="Login" class="com.org.action.LoginAction">
            <result name="success">/success.jsp</result>
            <result name="login">/index.jsp</result>
            <result name="input">/error.jsp</result>
            <result name="wait">/wait.jsp</result>
            <result name="invalid.token">/error.jsp</result>
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <interceptor-ref name="token"></interceptor-ref>
            <interceptor-ref name="execAndWait">
                <param name="delay">1500</param>
            </interceptor-ref>
            <!--<interceptor-ref name="timer"></interceptor-ref>-->
        </action>

 

(2)訪問本地信息

在上面的示例中,你會發現在validate方法中,添加驗證錯誤消息的時候,是採用的硬編碼方式,也就是直接寫死的字符串,這是很不好的:

  ① 不容易修改,比如要改變消息的內容,還得重新修改和編譯類;

  ② 不利於國際化,如果要把中文的信息變換成英文的呢,同樣要重新修改和編譯類。

  可以通過訪問本地信息的方式,把這些錯誤消息放置到Action類外部的配置文件中,在Action類內部只需要按照這些消息的key值去獲取消息即可。這樣一來,當消息發生變化的時候,只需要修改這個消息的配置文件即可。  

先來建立消息的配置文件,在Action類的路徑下建立一個同名的properties文件,也就是文件名爲HelloWorldAction.properties,然後在裏面按照key=value的格式,添加要使用的錯誤消息。

userNameIsNull = \u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a
passwordIsNull = \u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a

 

    //普通校驗,在execute之間會調用validate()或validateXXX()
    public void validate(){
        if(user.getUsername() == null || user.getUsername().trim().length() == 0){
            addActionError(this.getText("userNameIsNull"));
        }
        else if(user.getPassword() == null || user.getPassword().trim().length() == 0){
            addActionError(this.getText("passwordIsNull"));
        }
    }

配置struts.xml文件,註冊action

配置舉例:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    <!--國際化-->
    <constant name="struts.custom.i18n.resources" value="message"/>
    <!--<constant name="struts.i18n.encoding" value="UTF-8" />-->

    <package name="default" namespace="/" extends="struts-default">
        <!--<interceptors>-->
            <!--<interceptor name="timer" class="com.org.interceptor.TimerInterceptor">-->
            <!--</interceptor>-->
        <!--</interceptors>-->

        <action name="Login" class="com.org.action.LoginAction">
            <result name="success">/success.jsp</result>
            <result name="login">/index.jsp</result>
            <result name="input">/error.jsp</result>
            <result name="wait">/wait.jsp</result>
            <result name="invalid.token">/error.jsp</result>
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <interceptor-ref name="token"></interceptor-ref>
            <interceptor-ref name="execAndWait">
                <param name="delay">1500</param>
            </interceptor-ref>
            <!--<interceptor-ref name="timer"></interceptor-ref>-->
        </action>
        <action name="check" class="com.org.action.CheckAction">
            <result>/index.jsp</result>
        </action>
        <action name="SecurityCodeImageAction"
                class="com.org.action.SecurityCodeImageAction">
            <result name="success" type="stream">
                <param name="contentType">image/jpeg</param>
                <param name="inputName">imageStream</param>
                <param name="bufferSize">2048</param>
            </result>
        </action>
    </package>
</struts>

GitHub鏈接:https://github.com/CzcOnion/struts_test

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章