首页 > 代码库 > 数据校验

数据校验

三种方式实现数据校验

 

 

1.首先搭建实体类UserInfo 包含两个属性用户名Username  密码password 并封装实体类

public class UserInfo {    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;    }

2.创建两个JSP页面 regist.jsp注册页面  

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><%@ taglib uri="/struts-tags" prefix="s"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="http://www.mamicode.com/">        <title>注册页面</title>    </head>    <body>    <h2>用户注册</h2>    <!-- 取出所有错误信息 -->    <s:fielderror></s:fielderror>        <s:form action="execute" method="post">    <s:textfield name="info.username" label="用户名"></s:textfield>    <br/>         <s:textfield name="info.password" label="密码"></s:textfield>    <br/>         <s:textfield name="okpwd" label="确认密码"></s:textfield>    <br/>        <s:submit value="http://www.mamicode.com/注册"></s:submit>        </s:form>          </body></html>

技术分享

 

success.jsp成功页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="http://www.mamicode.com/">        <title>成功页面</title>          </head>    <body>    欢迎您!${info.username }  </body></html>

 

 

 

1、用execute()方法实现数据校验

创建ExecuteAction

 

继承自ActionSupport类,重写execute()

 

  1. package cn.happy.action;import cn.happy.entity.UserInfo;import com.opensymphony.xwork2.ActionSupport;public class ExecuteAction extends ActionSupport {    private UserInfo info;    // 确认密码    private String okpwd;    @Override    public String execute() throws Exception {        if (info.getUsername().length() == 0) {            addFieldError("username", "用户名不能为空");        }        if (info.getPassword().length() == 0) {            addFieldError("pwd", "密码不能为空");        }        if (!info.getPassword().equals(okpwd)) {            addFieldError("pwd", "两次密码必须一致");        }                //判定FieldError对象中是否有错误信息        //若有错误信息 则返回input        if(this.hasErrors()){            return INPUT;        }        return SUCCESS;    }        public UserInfo getInfo() {        return info;    }    public void setInfo(UserInfo info) {        this.info = info;    }    public String getOkpwd() {        return okpwd;    }    public void setOkpwd(String okpwd) {        this.okpwd = okpwd;    }}

    其次在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>    <!-- 修改文件 tomact不用重启 -->    <constant name="struts.devMode" value="http://www.mamicode.com/true" />    <package name="default" namespace="/" extends="struts-default">            <!-- 测试execute方法 -->         <action name="execute" class="cn.happy.action.ExecuteAction">            <result name="success">success.jsp</result>            <result name="input">regist.jsp</result>        </action>

效果:

技术分享

如果用户名 密码均符合规定则跳转至success.jsp

技术分享

2.用validateXxx()方法实现数据校验

 

public class ValidateXxxAction extends ActionSupport{    private UserInfo info;    //确认密码    private String okpwd;        public void validateRegist(){        if(info.getUsername().length()<6){            addFieldError("username", "用户名长度不能小于6位");        }    }        public String regist(){        return SUCCESS;    }        @Override    public String execute() throws Exception{        return SUCCESS;    }        //实现数据校验    @Override    public void validate() {        if(info.getUsername().length()==0){            addFieldError("username", "用户名不能为空");        }                if(info.getPassword().length()==0){            addFieldError("pwd", "密码不能为空");        }                if(!info.getPassword().equals(okpwd)){            addFieldError("pwd", "两次密码必须一致");        }    }        public UserInfo getInfo() {        return info;    }    public void setInfo(UserInfo info) {        this.info = info;    }    public String getOkpwd() {        return okpwd;    }    public void setOkpwd(String okpwd) {        this.okpwd = okpwd;    }}

 

<!-- 测试validateXxx方法 -->        <action name="ValidateXxx" class="cn.happy.action.ValidateXxxAction" method="regist">            <result name="success">success.jsp</result>            <result name="input">regist.jsp</result>        </action> 

实现效果:

技术分享

   用validateXxx()方法实现数据校验

        在validate()方法中对数据验证是可以工作的,如果在字段非常多的情况下,而且每个字段又有很复杂的验证,那么我们的validate方法中的代码会越来越多。

        针对特定的方法输入的数据的验证我们把他放到validateXxx方法中,Xxx是方法名的首字母大写形式

 

3.用validate()方法实现数据校验

 

继承ActionSupport类,该类实现了Validateable接口,该接口中定义了一个validate()方法,在自定义的Action类中重写validate()方法,

如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后通过OGNL表达式负责输出。

 

package cn.happy.action;import cn.happy.entity.UserInfo;import com.opensymphony.xwork2.ActionSupport;public class ValidateAction extends ActionSupport{    private UserInfo info;    //确认密码    private String okpwd;        @Override    public String execute() throws Exception{        return SUCCESS;    }        //实现数据校验    @Override    public void validate() {        if(info.getUsername().length()==0){            addFieldError("username", "用户名不能为空");        }                if(info.getPassword().length()==0){            addFieldError("pwd", "密码不能为空");        }                if(!info.getPassword().equals(okpwd)){            addFieldError("pwd", "两次密码必须一致");        }    }        public UserInfo getInfo() {        return info;    }    public void setInfo(UserInfo info) {        this.info = info;    }    public String getOkpwd() {        return okpwd;    }    public void setOkpwd(String okpwd) {        this.okpwd = okpwd;    }}

 

<!-- 测试validate方法 -->        <action name="Validate" class="cn.happy.action.ValidateAction">            <result name="success">success.jsp</result>            <result name="input">regist.jsp</result>        </action>

实现效果:

技术分享

-------------------------------------------------------------------------------------------------------------------------------

用struts2的验证框架实现数据校验

        ① 为什么要用验证框架:

      当验证规则比较复杂时,Action类的代码将变得很繁琐,假如我们要对电话号码的格式进行验证,是非常麻烦的

        ②验证框架的优点:

      Struts2中内置了一个验证框架,将常用的验证规则进行了编码实现,使用验证框架时,用户无需再进行编码,只要在外部配置文件中指定某个字段需要进行的验证类型,并提供出错误信息即可,从而大大减轻了开发者的负担,提高开发效率

        ③命名规范:

       1、文件的命名规则:

      ActionName-validation.xml,ActionName为需要校验的Action类名,如:UserAction-validation.xml

 

       2、文件存放路径:

      该文件与Action类的class文件位于同一个路径下

 

       3、文件格式:包括如下3个配置元素

       <field>: 为每一个需要校验的字段添加一个验证元素<field>,name属性表示要校验的字段名。

       <field-validator>: 使用该元素来指定校验规则,type属性为校验规则名

       <message>: 使用该元素来指定校验出错时要显示的标签,key属性指向资源文件中的标签名

 技术分享

1.创建UserAction

package cn.happy.action;import cn.happy.entity.UserInfo;import com.opensymphony.xwork2.ActionSupport;public class UserAction extends ActionSupport{    private UserInfo info;    private String okpwd; //确认密码        @Override    public String execute() throws Exception {        return SUCCESS;    }                public UserInfo getInfo() {        return info;    }    public void setInfo(UserInfo info) {        this.info = info;    }    public String getOkpwd() {        return okpwd;    }    public void setOkpwd(String okpwd) {        this.okpwd = okpwd;    }}

 

2.创建UserAction-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>             <!--    用户名:不能为空 长度在6-10之间   -->         <field name="info.username">         <field-validator type="requiredstring">         <param name="trim">true</param>         <message>用户名不能为空</message>         </field-validator>                  <field-validator type="stringlength">         <param name="maxLength">10</param>         <param name="minLength">6</param>        <message>用户名长度必须在${minLength}和${maxLength}之间</message>         </field-validator>                  </field>                 <!-- 验证密码 -->        <field name="info.password">        <field-validator type="requiredstring">        <message>密码不能为空</message>        </field-validator>        </field>               <!--  确认密码 -->                  <field name="okpwd">        <field-validator type="fieldexpression">        <param name="expression">info.password==okpwd</param>        <message>密码和确认密码必须一致</message>        </field-validator>        </field>               <!--  验证电话号码     -->                <field name="info.phone">        <field-validator type="requiredstring">        <message>电话号码不能为空</message>        </field-validator>        </field>                        <field name="info.phone">        <field-validator type="regex">        <param name="regex">^(\d{3,4}-){0,1}(\d{7,8})$</param>        <message>电话号码格式不正确</message>        </field-validator>        </field>                                 </validators> 

 

 实现效果:

技术分享  技术分享

如果各项均符合要求

技术分享 技术分享

 

常用验证规则:

 技术分享

 

实现数据校验的流程:  

 

① 对输入的数据首先进行类型转换,并封装成Action属性

 

② 如果类型转换出现错误,就将错误提示保存到ActionContext,并封装到fieldError中

 

③ 类型转换执行完毕后,会根据项目的配置执行验证框架的校验,也可能通过执行validate()或者validateXxx()方法进行校验

 

④ 如果经过以上步骤都没有出现错误,那么将直接调用Action里用于处理用户请求的方法,然后根据结果类型转入相应的视图资源。一旦出现了错误,那么系统将直接返回输入数据的视图资源,后者通常由workflow拦截器处理

 

数据校验