Struts2-服務端驗證

一、使用ActionSupport編碼實現驗證

1、在Action類的業務方法中直接驗證

示例代碼(JavaBean方式獲取數據)

  • 用戶提交數據頁面
<s:form action="error01" method="post">

    <s:textfield name="user.uname" id="uname">用戶名:</s:textfield>
    <p/>
    <s:password name="user.pwd" id="pwd">密碼:</s:password>
    <br/>
    <s:submit value="提交"></s:submit>

</s:form>
  • action配置
<action name="error01" class="com.pb08.demo01.UserAction">
    <result>/jsp/08_使用ActionSupport編碼實現驗證/01_在Action類的業務方法中直接驗證01.jsp</result>
    <result name="input">/jsp/08_使用ActionSupport編碼實現驗證/01_在Action類的業務方法中直接驗證02.jsp</result>
</action>
  • action類代碼(關鍵)
1、JavaBean代碼略

2、action類代碼

public class UserAction extends ActionSupport {

    private User user;

    @Override
    public String execute() throws Exception {
        System.out.println("進入execute方法");
        /*驗證用戶名*/
        if(null == user.getUname() || "".equals(user.getUname())) {
            System.out.println("用戶名不能爲空");
            this.addFieldError("user.uname", "用戶名不能爲空(業務方法)");
        }

        /*驗證密碼*/
        if(null == user.getPwd() || "".equals(user.getPwd())) {
            System.out.println("密碼不能爲空");
            this.addFieldError("user.pwd", "密碼不能爲空(業務方法)");
        }

        /*完成註冊的業務*/
        if(!(user.getUname().equals(user.getPwd()))) {
            System.out.println("用戶名或密碼錯誤");
            this.addActionError("用戶名或密碼錯誤!");
        }

        if(this.hasErrors()) {
            System.out.println("有hasFieldErrors錯誤!!!!!");
            return INPUT;
        }
        System.out.println("沒錯誤!!!!!!");
        return SUCCESS;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

}
  • 錯誤頁面代碼
<body>
    用戶名錯誤顯示:<s:fielderror fieldName="user.uname"></s:fielderror>

    <hr/>

    用戶密碼錯誤顯示:<s:fielderror fieldName="user.pwd"></s:fielderror>

    <hr/>

    action錯誤顯示:<s:actionerror/>
</body>
  • 總結
    關鍵代碼是addFieldError()方法和addActionError()方法,這倆個方法是用來添加錯誤信息。其中,addFieldError()用來添加與字段相關的錯誤信息,如用戶名錯誤,addActionError()用來添加於Action所處理的業務相關的錯誤信息。在頁面上,用<s:fielderror/>標籤輸出addFieldError()方法添加的錯誤信息,用<s:actionerror/>標籤輸出addActionError()方法添加的錯誤信息。

2、重寫validate()方法實現驗證

  • 用戶輸入信息頁面
<body>
<s:form action="error02" method="post">

    <s:textfield name="userInfo.username" id="uname">用戶名:</s:textfield>
    <s:password name="userInfo.userpwd" id="pwd">密碼:</s:password>

    <s:submit value="提交"></s:submit>

</s:form>
</body>
  • action配置
<action name="error02" class="com.pb08.demo02.UserAction">
    <result>/jsp/08_使用ActionSupport編碼實現驗證/02_重寫validate()方法實現驗證01.jsp</result>
    <!--使用validate驗證必須配置此result-->
    <result name="input">/jsp/08_使用ActionSupport編碼實現驗證/02_重寫validate()方法實現驗證02.jsp</result>
</action>
  • action類代碼
1、JavaBean代碼略

2、action類

public class UserAction extends ActionSupport {

    private UserInfo userInfo;

    @Override
    public String execute() throws Exception {
        System.out.println("進入execute方法");
        /*完成註冊的業務*/
        if(!(userInfo.getUsername().equals(userInfo.getUserpwd()))) {
            this.addActionError("用戶名或密碼錯誤!");
        }
        System.out.println("完成註冊的業務...");
        if(this.hasErrors()) {
            return INPUT;
        }
        System.out.println("登陸成功");
        return SUCCESS;
    }

    @Override
    public void validate() {
        System.out.println("進入validate方法");
        /*驗證用戶名*/
        if(null == userInfo.getUsername() || "".equals(userInfo.getUsername())) {
            System.out.println("用戶名不能爲空");
            this.addFieldError("user.uname", "用戶名不能爲空!");
        }

        /*驗證密碼*/
        if(null == userInfo.getUserpwd() || "".equals(userInfo.getUserpwd())) {
            System.out.println("密碼不能爲空");
            this.addFieldError("user.pwd", "密碼不能爲空");
        }

    }

    public UserInfo getUserInfo() {
        return userInfo;
    }

    public void setUserInfo(UserInfo userInfo) {
        this.userInfo = userInfo;
    }

}
  • 錯誤頁面
<body>
    <s:fielderror fieldName="user.uname"></s:fielderror>
    <s:fielderror fieldName="user.pwd"></s:fielderror>
    <s:actionerror />
</body>
  • 總結
    執行以上代碼從控制檯輸出信息順序來看,當進入action類後,首先會執行validate方法,如果validate方法沒有添加錯誤,則會執行指定的action業務方法,這裏默認是execcute,否則不會執行業務方法,最後還有一點需要注意,每次執行業務方法前,都會先執行一次validate方法。

3、使用validateXxx()方法實現驗證
上面總結說了,使用validate()驗證時,每次執行業務方法前都會執行validate()方法進行驗證,如果只想對某個業務方法進行驗證,可以使用validateXxx()方法來驗證

  • 用戶輸入數據頁面
<body>
<s:form action="error03" method="post">

    <s:textfield name="userInfo.uname" id="uname">用戶名:</s:textfield>
    <s:password name="userInfo.pwd" id="pwd">密碼:</s:password>

    <s:submit value="提交"></s:submit>

</s:form>
</body>
  • action配置
<action name="error03" class="com.pb08.demo03.UserAction" method="register">
    <result>/jsp/08_使用ActionSupport編碼實現驗證/03_使用validate方法實現驗證01.jsp</result>
    <!--使用validateXxx驗證必須配置此result-->
    <result name="input">/jsp/08_使用ActionSupport編碼實現驗證/03_使用validate方法實現驗證02.jsp</result>
</action>
  • action類代碼
public class UserAction extends ActionSupport {

    private UserInfo userInfo;

    public String register() {
        /*完成註冊的業務*/
        System.out.println("完成註冊的業務");
        if(!(userInfo.getUname().equals(userInfo.getPwd()))) {
            this.addActionError("用戶名或密碼錯誤");
        }

        if(this.hasErrors()) {
            return INPUT;
        }
        return SUCCESS;
    }

    public void validateRegister() {
        System.out.println("validateRegister" + userInfo.getUname() + "|" + userInfo.getPwd());
        if(null == userInfo.getUname() || "".equals(userInfo.getUname())) {
            System.out.println("用戶名不能爲空");
            this.addFieldError("user.uname", "用戶名不能爲空");
        }

        if(null == userInfo.getPwd() || "".equals(userInfo.getPwd())) {
            System.out.println("密碼不能爲空");
            this.addFieldError("user.pwd", "密碼不能爲空");
        }
    }

    public UserInfo getUserInfo() {
        return userInfo;
    }

    public void setUserInfo(UserInfo userInfo) {
        this.userInfo = userInfo;
    }

}
  • 錯誤頁面
<body>
    <s:fielderror fieldName="user.uname"></s:fielderror>
    <s:fielderror fieldName="user.pwd"></s:fielderror>
    <s:actionerror />
</body>
  • 總結
    執行以上代碼可以看出validateXxx()方法的Xxx可以匹配業務方法名,如果業務方法名叫做abc,那麼Xxx就是Abc,首字母大寫。這樣當調用指定名稱的業務方法前只會調用與之匹配的validateXxx方法。

二、使用驗證框架實現驗證

使用驗證框架進行驗證後期維護無需修改代碼,只需要修改配置文件

步驟:
1、編寫JSP用戶數據輸入頁面
2、編寫Action類及其配置文件
3、在與Action類相同的目錄下創建驗證文件ActionName-validation.xml,其中ActionName與需要驗證的Action類名相同
4、編寫驗證規則

代碼示例:

  • action
<action name="house_*" class="com.bc.action.HouseAction" method="{1}">
    <result>/WEB-INF/jsp/house.jsp</result>
    //必須有input對應的頁面
    <result name="input">/WEB-INF/jsp/house.jsp</result>
</action>
  • action類
//House類略

public class HouseAction extends BaseAction {

    private static final long serialVersionUID = 1L;

    private House house;

    public String house() throws Exception {
        return SUCCESS;
    }

    public String check() throws Exception {
        if("".equals(house.getTitle())) {
            return INPUT;
        }
        return SUCCESS;
    }

    public House getHouse() {
        return house;
    }

    public void setHouse(House house) {
        this.house = house;
    }

}
  • 驗證框架xml代碼

xml名稱格式:action類名-要驗證的action名-validation.xml

<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
    <field name="house.title">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>標題不能爲空!</message>
        </field-validator>
        <field-validator type="stringlength">
            <param name="minLength">4</param>
            <param name="maxLength">20</param>
            <param name="trim">true</param>
            <message>標題必須爲4至20個字符</message>
        </field-validator>
    </field>
    <field name="house.content">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>內容不能爲空!</message>
        </field-validator>
    </field>
    <field name="house.address">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>地址不能爲空!</message>
        </field-validator>
    </field>
    <field name="house.telNum">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>聯繫方式不能爲空!</message>
        </field-validator>
    </field>
    <field name="house.date">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>日期不能爲空!</message>
        </field-validator>
    </field>
</validators>
  • 頁面
<s:form action="house_check" method="post" namespace="/">
    <s:textfield name="house.title" label="標題"/>
    <s:textarea name="house.content" label="內容"/>
    <s:textfield name="house.address" label="地點"/>
    <s:textfield name="house.telNum" label="聯繫電話"/>
    <s:textfield name="house.date" label="發佈時間"/>
    <s:submit value="提交"/>
</s:form>
發佈了50 篇原創文章 · 獲贊 305 · 訪問量 83萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章