struts2:數據校驗,通過Action中的validate()方法實現校驗,圖解

原文地址:https://www.cnblogs.com/nayitian/p/3439371.html

根據輸入校驗的處理場所的不同,可以將輸入校驗分爲客戶端校驗和服務器端校驗兩種。服務器端驗證目前有兩種方式:

第一種

Struts2中提供了一個com.opensymphony.xwork2.Validateable接口,此接口只有一個方法:validate()。如果有某個類實現了Validatable接口,Struts2就可以直接調用該類中的validate()方法。ActonSupport類實現Validateable接口。本文討論此驗證格式。

本文演示了一個模擬簡單登錄的場景:用戶打開一個JSP頁面,輸入信息,提交登錄。如果用戶提交的信息格式有錯誤,則返回登錄頁面提示用戶。數據格式正確則驗證用戶名與密碼是否正確,登錄成功則轉向列表頁面,顯示當前用戶的一些信息;如果登錄錯誤則轉向錯誤頁面。

  • 將表單參數封裝進一個JavaBean(屬性驅動);
  • 如果用戶輸入信息有錯誤,直接返回提示用戶再次輸入;
  • 如果用戶名,密碼錯誤,轉向錯誤頁面;
  • 如果用戶名、密碼正確,則轉向到另一個action類(並且傳進一個id參數,用途自定),由此類處理進一步的業務邏輯,然後轉向到顯示列表的JSP頁面。

第二種

參考:struts2:數據校驗,通過XWork校驗框架實現(validation.xml)

1. 修改Web.xml

2. 創建struts.xml

3. 在struts.xml中註冊action和result

複製代碼
        <action name="login" class="com.clzhang.ssh.member.action.LoginAction">
            <result name="input">/ssh/demo2/login.jsp</result>
            <result name="error">/ssh/demo2/wrong.jsp</result>
            <result name="list" type="redirectAction">
                <param name="idInList">${id}</param>
                <param name="actionName">listBook</param>
            </result>
        </action>
        <action name="listBook" class="com.clzhang.ssh.member.action.ListAction">
            <result name="showList">/ssh/demo2/bookList.jsp</result>
        </action>
複製代碼
  • 第一個action的name爲login,對應處理類爲LoginAction;
  • result爲input的JSP頁面指明,如果驗證用戶輸入失敗,則轉向到此頁面(如用戶名爲空等);
  • result爲error的JSP頁面指明,如果登錄失敗(密碼錯誤等等),則轉向到此頁面;
  • result爲list的配置指明,登錄成功後,做一個redirect操作,由另一個action業務類去處理相關業務邏輯,並且在其中配置了參數傳遞(id字段);
  • 第二個action的name爲listBook,對應處理類爲ListAction。

4. 創建登錄JSP頁面

複製代碼
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page isELIgnored="false"%>
<%@ taglib uri="/struts-tags" prefix="s"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <body>
        <s:form action="login" method="post">
            <s:textfield name="loginInfoRef.username" label="賬號"></s:textfield>
            <br />
            <s:textfield name="loginInfoRef.password" label="密碼"></s:textfield>
            <br />
            <s:submit value="提交"></s:submit>
        </s:form>
        <br />
    </body>
</html>
複製代碼

其中用到了struts標籤,在以後章節中予以解讀。

注意:因爲將表單封裝進了JavaBean所以,表單中元素的名稱有所改變,如:loginInfoRef.username,此名稱必須與相關action類中的變量名稱一致

5. 創建登錄表單對應的實體類

複製代碼
package com.clzhang.ssh.member.action;

public class LoginInfo {

    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;
    }

}
複製代碼

6. 創建登錄業務處理action類

複製代碼
package com.clzhang.ssh.member.action;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 模擬登錄 
 * 1.如果輸入爲空,提示錯誤,返回到登錄頁面;
 * 2.登錄錯誤,轉向錯誤頁面;
 * 3.登錄成功,轉向列表頁面。
 */
public class LoginAction extends ActionSupport {
    public static final long serialVersionUID = 1;
    
    // a.這個參數是轉到列表頁面需要的
    private int id;
    // b.將JSP提交的表單封裝爲一個JavaBean
    private LoginInfo loginInfoRef;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public LoginInfo getLoginInfoRef() {
        return loginInfoRef;
    }

    public void setLoginInfoRef(LoginInfo loginInfoRef) {
        this.loginInfoRef = loginInfoRef;
    }

    @Override
    // 重載ActionSupport類的方法(Validateable接口)
    public void validate() {
        super.validate();
        
        // 驗證方式一:
        if ("".equals(loginInfoRef.getUsername())) {
            this.addFieldError("loginInfoRef.username", "對不起,用戶名不可以爲空!");
        }
        if ("".equals(loginInfoRef.getPassword())) {
            this.addFieldError("loginInfoRef.password", "對不起,密碼不可以爲空!");
        }        
        
        // 如果執行了addFieldError()/addActionError()等方法,則會轉到input對應的頁面
    }

    @Override
    // 重載ActionSuppoer類的方法(Action接口)
    public String execute() {
        if (loginInfoRef.getUsername().equals("test")
                && loginInfoRef.getPassword().equals("123")) {
            System.out.println(loginInfoRef.getUsername() + "成功登錄...");
            this.setId(100);

            return "list";
        } else {
            System.out.println(loginInfoRef.getUsername() + "成功失敗!");
            
            // 這些屬於屬於Action接口
            return ERROR;
        }
    }
}
複製代碼

7. 創建顯示登錄錯誤JSP頁面

複製代碼
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page isELIgnored="false"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <body>
        wrong! :(
    </body>
</html>
複製代碼

8. 創建生成列表的action類

複製代碼
package com.clzhang.ssh.member.action;

import java.util.ArrayList;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 登錄成功後顯示的列表處理
 * @author acer
 *
 */
public class ListAction extends ActionSupport {
    public static final long serialVersionUID = 1;

    private ArrayList<String> bookList = new ArrayList<String>();

    private int idInList;

    public ArrayList<String> getBookList() {
        return bookList;
    }

    public void setBookList(ArrayList<String> bookList) {
        this.bookList = bookList;
    }

    public int getIdInList() {
        return idInList;
    }

    public void setIdInList(int idInList) {
        this.idInList = idInList;
    }

    public String execute() {

        bookList.add("book1");
        bookList.add("book2");
        bookList.add("book3");
        bookList.add("book4");
        bookList.add("idInList=" + idInList);

        ServletActionContext.getRequest().setAttribute("usernameRequest",
                "你現在怎樣");
        ServletActionContext.getRequest().getSession().setAttribute(
                "usernameSession", "我現在不怎樣");
        ServletActionContext.getServletContext().setAttribute(
                "usernameApplication", "你怎樣");

        return "showList";
    }

}
複製代碼
  • 其中,idInList參數是由struts.xml爲配置的;
  • 處理完成後,轉向result配置爲idInList的JSP頁面,那就是bookList.jsp。

9. 創建顯示列表的JSP頁面

複製代碼
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page isELIgnored="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="/struts-tags" prefix="s"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <body>
        <c:forEach var="bookName" items="${bookList}">
            <c:out value="${bookName}"></c:out>
            <br />
        </c:forEach>

        <br />
        request:
        <s:property value="#request.usernameRequest" />
        <br />
        <br />
        session:
        <s:property value="#session.usernameSession" />
        <br />
        <br />
        application:
        <s:property value="#application.usernameApplication" />
        <br />
        <br />
    </body>
</html>
複製代碼

同樣,此JSP用到了struts的標籤,以後章節予以介紹。

10. 測試

10.1 打開IE

輸入地址:http://127.0.0.1:8080/st/ssh/demo2/login.action,顯示如下界面:

10.2 直接提交,顯示錯誤:

10.3 輸入用戶名:test,密碼:456,提交:

10.4 返回登錄頁面,輸入用戶名:test,密碼:123,提交:

 

圖解

 

發佈了2 篇原創文章 · 獲贊 13 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章