Struts2中驗證表單資料(使用宣告式驗證)
阿新 • • 發佈:2020-08-08
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> <packagename="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 統一資源定位符 *View Codehttp://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; } }
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>