zoukankan      html  css  js  c++  java
  • 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>

    常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    Codeforces 177G2 Fibonacci Strings KMP 矩阵
    Codeforces Gym100187C Very Spacious Office 贪心 堆
    Codeforces 980F Cactus to Tree 仙人掌 Tarjan 树形dp 单调队列
    AtCoder SoundHound Inc. Programming Contest 2018 E + Graph (soundhound2018_summer_qual_e)
    BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学
    NOIP2016提高组Day1T2 天天爱跑步 树链剖分 LCA 倍增 差分
    Codeforces 555C Case of Chocolate 其他
    NOIP2017提高组Day2T3 列队 洛谷P3960 线段树
    NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp
    NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序
  • 原文地址:https://www.cnblogs.com/htj10/p/13458144.html
Copyright © 2011-2022 走看看