1. 程式人生 > 實用技巧 >Struts2中驗證表單資料(使用宣告式驗證)

Struts2中驗證表單資料(使用宣告式驗證)

1. struts.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <constant name="struts.devMode" value="true"></constant>
    <package 
name="p1" extends="struts-default"> <!-- 宣告式驗證器案例的動作類配置 --> <action name="addStudent" class="com.ljq.web.action.StudentAction" method="addStudent" > <result name="input">/student.jsp</result> <!-- 驗證失敗時,請求引數帶回 --> <
result>/success.jsp</result> <!-- 預設name=“success” --> </action> </package> </struts>

2. POJO類 (Plain Ordinary Java Object 簡單的Java物件,實際就是普通JavaBeans)

package com.ljq.domain;

import java.io.Serializable;
/**
 * URL: uniform resource locator 統一資源定位符
 * 
http://localhost:8080/day25_ee19_05struts2convert/register.jsp * 協議 主機 埠 URI * URI: uniform resource identifier 統一資源識別符號 * /day25_ee19_05struts2convert/register.jsp * @author zhy * */ public class Student implements Serializable { private String username;//不能為null和空字串。要去空格 private int age;//整數,介於18-100之間 private String email;//按照郵箱的格式輸入 private String password;//密碼,長度是3~8位 private String repassword;//確認密碼,必須和密碼一致。寫在這的目的,完全是為了演示驗證器的使用。實際開發中根本不會儲存確認密碼 private int score;//成績,必須是自然數 private String url;//個人主頁:必須符合url格式。 private String gender;//性別 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRepassword() { return repassword; } public void setRepassword(String repassword) { this.repassword = repassword; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } }
View Code

3. Action類

package com.ljq.web.action;

import com.ljq.domain.Student;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class StudentAction extends ActionSupport implements ModelDriven<Student> {

    Student stu = new Student();

    @Override
    public Student getModel() {
        return stu;
    }
    
    //動作方法
    public String addStudent(){
        return SUCCESS;
    }

    public Student getStu() {
        return stu;
    }

    public void setStu(Student stu) {
        this.stu = stu;
    }

}

4. 驗證配置檔案 StudentAction-addStudent-validation.xml ,放在Action類所在的包下。寫了該配置檔案,就要在struts.xml 中配置 <result name="input"> 標籤,否則報錯(No result defined for action.....and result input

命名規範:Action類名 - ActionName(struts.xml中的action name)-validation.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
          "-//Apache Struts//XWork Validator 1.0.3//EN"
          "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<!-- 當使用ActionClassName-validation.xml來命名檔案時,它是一個動作類驗證器。會驗證動作類中的所有動作方法,  同樣可以使用 @SkipValidate 跳過驗證-->
<!-- 當使用ActionClassName-ActionName-validation.xml來命名檔案時,它是一個指定動作方法的驗證器。只會驗證指定的動作方法 -->
<validators>
    <field name="username">
        <field-validator type="requiredstring">
            <message>請輸入使用者名稱</message>
        </field-validator>
    </field>
    
    <field name="age">
        <field-validator type="int">
            <!-- 使用注入的方式,設定最大和最小值 -->
            <param name="min">18</param>
            <param name="max">100</param>
            <message>請輸入18-100之間的整數</message>
        </field-validator>
    </field>
    
    <field name="email">
        <field-validator type="email">
            <message>請輸入正確的郵箱格式</message>
        </field-validator>
    </field>
    
    <field name="password">
        <field-validator type="requiredstring">
            <!-- 注入取消使用trim -->
            <param name="trim">false</param>
            <message>請輸入密碼</message>
        </field-validator>
        <field-validator type="stringlength">
            <param name="minLength">3</param>
            <param name="maxLength">8</param>
            <message>密碼長度是3~8位的</message>
        </field-validator>
    </field>

    <!-- 確認密碼和密碼必須保持一致,是2個欄位的事,所以要使用基於驗證器的宣告方式 -->
    <validator type="expression">
        <param name="expression">
            <![CDATA[
                password == repassword
            ]]>
        </param>
        <message>兩次密碼必須一致</message>
    </validator>
    
    <field name="score">
        <field-validator type="regex">
            <param name="regex">
                \d+
            </param>
            <message>請輸出正確的成績</message>
        </field-validator>
    </field>
    
    <field name="url">
        <field-validator type="url">
            <message>請輸入正確的url地址</message>
        </field-validator>
    </field>
    
    <field name="gender">
        <!-- required是一個只驗證是否null的內建驗證器,不會去除空格 -->
        <field-validator type="required">
            <message>請選擇性別</message>
        </field-validator>
    </field>
</validators>

5. student.jsp 顯示

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--匯入struts2的標籤庫 --%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>使用者註冊,使用的是struts2的標籤</title>
    <s:head></s:head>
  </head>
  <body>
      <s:actionerror/> <%--動作錯誤 --%>
      <%--<s:fielderror /> 欄位錯誤 --%>
      <%--struts2的form標籤,它提供了和原始html表單標籤幾乎一致的屬性
          action:請求的地址。直接寫動作名稱。不用寫contextPaht
          method:請求的方式。在這裡不用寫。struts2的form表單預設就是post
          enctype:表單編碼的MIME型別
      --%>
      <s:form action="addStudent.action">
          <s:textfield name="username" label="使用者名稱" />
          <s:textfield name="age" label="年齡"/>
          <s:textfield name="email" label="郵箱"/>
          <s:textfield name="password" label="密碼" />
          <s:textfield name="repassword" label="確認密碼"/>
          <s:textfield name="score" label="成績"/>
          <s:textfield name="url" label="個人主頁"/>
          <%--list中的取值是生成一個list集合,並往集合中放入元素 --%>
          <s:radio name="gender" list="{'男','女'}"  label="性別"/>
          <s:submit value="註冊"/>
      </s:form>
  </body>
</html>