Struts2学习(八)数据校验实现

原创 2017年01月03日 21:19:32

我们的网站是要与用户进行交互的,其中最重要的交互方式便是数据的输入输出。但对于用户来说,并不是会按照我们所期望的形式来进行输入,这是就需要对用户输入的数据的格式进行校验,也就是所谓的数据校验。

其实数据校验意义就是保证进入后台的数据都是安全的!

在大多数情况下我们使用的是JavaScript来进行输入数据的校验,但是这种方式具有局限性

如图所示:我们可以通过使用url拼接的方式直接将数据传到后台去,这时的数据校验便失去了意义。


所以单纯通过js无法满足我们的安全要求。

 

目前主流的web层框架都具备校验的相关功能,我们的Struts2提供了两种较为简易的校验方式:

  1. 硬编码方式---易理解、不易维护
  1. xml配置方式---易维护、易管理、不侵入源代码推荐

下面我们以一个注册为例,讲解一下两种方式验证流程

我们要验证的数据为:

用户名:要求 不能为空!大于6位小于11

密码:要求 不能为空!大于6位小于11 两次密码一致

年龄:要求 0-150

邮箱:要求 不能为空!必须符合邮箱格式

电话:要求 不能为空!必须是电话格式(1(3/5/8)xxxxxxxx,或010-xxxxxxxx        0531-xxxxxxxx)


首先我们使用硬编码方式校验

 

硬编码方式实现步骤:

第一步:创建Struts2项目

第二步:编写一个普通表单

第三步jsp中加入标签库支持

第四步jsp中加入struts2校验框架提供的两种校验级别错误:       

属性级错误:   <s:fielderrorcssStyle="color:red;"/>

         Action级错误:<s:actionerrorcssStyle="color:red;"/>

通常属性校验失败我们将错误信息放入fielderror对象中,action级别错误信息放入actionerror 对象中。

第五步创建Action类,配置到struts.xml

注意一定要配置一个resultname值为input,用于验证失败跳转页面

第六步Action类中创建校验方法,方法命名规则:

 validate+要验证的方法名(首字母大写)

(例如:execute()方法,校验方法validateExecute())

 假如action中有很多方法,也可以分开验证。

第七步:完善校验方法中具体的判断

错误信息共分为两种:FieldErrorActionError

将错误信息放入Field域中:

this.addFieldError("username","用户名不能为空");

将错误信息放入Action域中:

this.addActionError("请两次密码必须一致"); 

实际上会将错误信息放入Struts2默认栈队map集合中

页面可以使用 ${errors.username[0]}来单独展示属性错误信息

复杂验证例如邮箱、电话等判断需要用到正则表达式


用到的界面代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title>index</title>
  </head>
  <body>
  <s:fielderror cssStyle="color: red"/><br>
  <s:actionerror cssStyle="color: red;"/><br>
  <hr/>
    <form method="post" action="ch07RegisterAction.action">
        <%--错误信息内部存储方式是数组,为防止一个表单元素有多个属性--%>
        <%--对象方式页面错误信息的编写方式有所不同--%>
        账号:<input type="text" name="users.username"/>${errors["users.username"][0]}<br>
        密码:<input type="password" name="users.password"/>${errors["users.password"][0]}<br>
        重新输入密码:<input type="password" name="users.repassword"/>${errors["users.repassword"][0]}<br>
        E-mail:<input type="text" name="users.email"/>${errors["users.email"][0]}<br>
        手机号:<input type="text" name="users.phonenumber"/>${errors["users.phonenumber"][0]}<br>
        年龄:<input type="text" name="users.age"/>${errors["users.age"][0]}<br>
        <input type="submit" value="提交"/>
    </form>
  </body>
</html>

ValidateAction

package cn.lovepi.chapter07.action;
import com.opensymphony.xwork2.ActionSupport;
import java.util.regex.Pattern;
/**
* 
* 数据校验示例——硬编码格式
*/
public class ValidateAction extends ActionSupport{
    private String username;
    private String password;
    private String repassword;
    private String email;
    private String phonenumber;
    private int age;
    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
    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;
    }
    public String getRepassword() {
        return repassword;
    }
    public void setRepassword(String repassword) {
        this.repassword = repassword;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPhonenumber() {
        return phonenumber;
    }
    public void setPhonenumber(String phonenumber) {
        this.phonenumber = phonenumber;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
配置当前的Action
<package name="chapter07" extends="struts-default">
        <!--硬编码配置数据校验-->
        <action name="ch07ValidateAction" class="cn.lovepi.chapter07.action.ValidateAction">
            <result name="success">/chapter07/index.jsp</result>
            <!--必须配置,用于数据校验出错时跳转-->
            <result name="input">/chapter07/index.jsp</result>
        </action>
</package>
ValidateAction类种对应的校验方法

   public void validateExecute(){
        if (null==username || username.length()<6 ||username.length()>10) {
            this.addFieldError("username", "username has error");
        }
        if (null==password || password.length()<6||password.length()>10) {
            this.addFieldError("password", "password has error");
        }else if (null==repassword || repassword.length()<6||repassword.length()>10) {
            this.addFieldError("repassword", "repassword has error");
        }else if(!password.equals(repassword)){
            this.addFieldError("password", "tow password is not be same");
        }
        if (age<=0 ||age>150) {
            this.addFieldError("age", "年龄不符合人类规范!");
        }
        //验证邮箱! 123dsaw@163.com
        //只允许a-z A-Z 1-9 -_
        //正则表达式---专门用于复杂字符判断的技术。可以应用于所有软件编程语言
        Pattern p = Pattern.compile("^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\\.([a-zA-Z0-9_-])+)+$");
        if (null==email || !p.matcher(email).matches()) {
            this.addFieldError("email", "邮箱验证失败!");
        }
        Pattern p1=Pattern.compile("^(((13[0-9])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8})|(0\\d{2}-\\d{7,8})|(0\\d{3}-\\d{7,8})$");
        if (null==phonenumber || !p1.matcher(phonenumber).matches()) {
            this.addFieldError("phonenumber", "电话格式不正确!");
            this.addActionError("action级别错误!");
            //这些错误信息被默认放入struts2默认的栈队中。Map集合errors
        }
    }


xml配置方式校验

 

Xml配置方式实现步骤:

 

第一步:创建Struts2项目,创建实体类Users

第二步:编写一个普通表单

第三步:jsp中加入Struts2标签库支持

第四步:jsp中加入Struts2校验框架提供了两种校验级别错误:       

属性级错误:    <s:fielderrorcssStyle="color:red;"/>

Action级错误:<s:actionerrorcssStyle="color:red;"/>

单属性方式页面错误信息:${errors.username[0]}

对象方式页面错误信息:${errors["user.username"][0]}

第五步:创建Action类,配置到struts.xml

注意一定要配置一个result,name值为input,用于验证失败跳转页面

RegisterAction

第六步:action类同包下创建一个Xml配置文件,该文件用于写校验信息

命名规则:Action名-validation.xml(例:UserAction-validation.xml)

第七步:编写UserAction-validation.xml校验信息  


用到的代码:

User类

public class Users {
    private String username;
    private String password;
    private String repassword;
    private String email;
    private String phonenumber;
    private int age;
    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;
    }
    public String getRepassword() {
        return repassword;
    }
    public void setRepassword(String repassword) {
        this.repassword = repassword;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPhonenumber() {
        return phonenumber;
    }
    public void setPhonenumber(String phonenumber) {
        this.phonenumber = phonenumber;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
用到的界面和上面一样

RegisterAction

public class RegisterAction extends ActionSupport{
    private Users users;
    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
    public Users getUsers() {
        return users;
    }
    public void setUsers(Users users) {
        this.users = users;
    }
}

配置文件编写

<package name="chapter07" extends="struts-default">
        <!--xml配置数据校验-->
        <action name="ch07RegisterAction" class="cn.lovepi.chapter07.action.RegisterAction">
            <result name="success">/chapter07/success.jsp</result>
            <result name="input">/chapter07/index.jsp</result>
        </action>
</package>
UserAction-validation.xml校验信息
<?xml version="1.0" encoding="UTF-8"?>
        <!--注意这里的代码在对应的/lib/xwork-core.jar/xwork-validator-1.0.3.dtd中
        使用1.0.2执行报错-->
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<!--具体需求验证代码-->
<validators>
    <!--对username属性进行验证-->
    <field name="users.username">
        <!--具体验证器,验证属性不能为空-->
        <field-validator type="requiredstring">
            <!--去空格-->
            <param name="trim">true</param>
            <!--错误信息-->
            <message>用户名不能为空</message>
        </field-validator>
        <!--使用正则表达式进行验证,验证账户名只能为数字或字母,并且长度在6-25之间-->
        <field-validator type="regex">
            <param name="regex">
                <![CDATA[(\w{6,25})]]>
            </param>
            <message>账号只能是数字或字母,并且长度得在6-25之间</message>
        </field-validator>
    </field>
    <!--对password属性进行验证-->
    <field name="users.password">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>密码不能为空</message>
        </field-validator>
        <field-validator type="stringlength">
            <param name="minLength">6</param>
            <param name="maxLength">18</param>
            <message>密码长度得在6-18位之间</message>
        </field-validator>
        <!--注意这里得用fieldexpression来比较两个属性之间的关系-->
        <field-validator type="fieldexpression">
            <param name="expression">
                <![CDATA[(users.password==users.repassword)]]>
            </param>
            <message>两次密码必须一致</message>
        </field-validator>
    </field>
    <!--对age属性进行验证-->
    <field name="users.age">
        <field-validator type="int">
            <param name="min">0</param>
            <param name="max">150</param>
            <message>年龄不合法</message>
        </field-validator>
    </field>
    <!--对邮箱属性进行验证-->
    <field name="users.email">
        <field-validator type="email">
            <message>邮箱格式不正确</message>
       </field-validator>
    </field>
    <!--对手机号码进行验证-->
    <field name="users.phonenumber">
        <field-validator type="regex">
            <param name="regex">
                <![CDATA[
^(((13[0-9])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8})|(0\d{2}-\d{7,8})|(0\d{3}-\d{7,8})$
                ]]>
            </param>
            <message>手机号码格式错误</message>
        </field-validator>
    </field>
</validators>







版权声明:本文为博主原创文章,未经博主允许不得转载。

struts2的数据校验

数据校验指对数据合法性进行检查,根据验证数据的位置可以分为客户端验证和服务器端验证,今天主要写的是实现服务器端的数据验证,服务器端数据验证主要特点: ·数据提交后在服务器端验证 ·防止绕过客户端验证提...
  • a491857321
  • a491857321
  • 2016年10月07日 17:17
  • 1356

Struts2之validate数据校验两种方式

1.Action中的validate()方法Struts2提供了一个Validateable接口,这个接口中只存在validate()方法,实现这个接口的类可直接被Struts2调用,ActionSu...
  • woaigaolaoshi
  • woaigaolaoshi
  • 2016年03月23日 11:18
  • 3643

struts2框架------验证机制

在struts2中,我们可以实现对action类的所有方法进行校验或者对action的指定方法进行校验。 对于输入校验struts2提供了两种实现方法: 1. 采用手工编写代码实现(编程式)。 2. ...
  • u012176984
  • u012176984
  • 2015年02月18日 00:41
  • 758

struts2--(3)--一些小的知识---简单数据验证信息回显问题

---- 简单的数据校验 在struts2中,action在接受到用户提交的数据时,有时需要对其进行校验,检验成功或失败需要向用户 回显相关的信息,为了能够方便在jsp页面回显相关信息,action...
  • wliang11
  • wliang11
  • 2014年03月27日 23:50
  • 1043

Struts2中的两种输入校验方法

struts中提供两种校验方法:硬编码和校验框架;        硬编码就是直接写validate()进行验证,validate()方法对应execute()方法。       在action里也可以...
  • u011225629
  • u011225629
  • 2015年08月27日 21:29
  • 1743

struts2(三)---struts2中的服务端数据验证框架validate

struts2为我们提供了一个很好的数据验证框架–validate,该框架可以很方便的实现服务端的数据验证。ActionSupport类提供了一个validate()方法,当我们需要在某一个actio...
  • u012116457
  • u012116457
  • 2015年09月06日 20:21
  • 2544

Struts2的输入校验,手工实现输入校验

Struts2的输入校验 手工实现输入校验 (核心:重写valiadate()方法校验单个处理逻辑)   1;jsp(登录) String path = request.getC...
  • pangqiandou
  • pangqiandou
  • 2016年10月30日 12:25
  • 550

struts2学习之表单校验的两种方式

基于覆盖validate方法的表单校验Action类一般都继承ActionSupport类。通过覆盖ActionSupport类的validate方法即可在自己的Action类中校验输入项的值。校验动...
  • u011726984
  • u011726984
  • 2015年04月20日 14:41
  • 3573

Struts2数据校验(1)--通过Action的validate()方法校验

Struts2数据校验 数据校验分为客户端校验和服务器端校验,客户端校验是指通过JavaScript或jQuery等前端手段,对提交前的数据进行一些格式的校验;服务器校验是指服务器端通过检查客户端的...
  • chentiefeng521
  • chentiefeng521
  • 2017年02月28日 16:46
  • 210

struts2使用Validator校验数据

需要对用户的输入数据进行验证,比如网站的注册,需要对各个数据项进行数据校验,Struts2提供了一些默认的校验器,比如数字的检测,邮箱的检测,字符串长度的检测等等.   常用的Validato...
  • sinat_35767703
  • sinat_35767703
  • 2017年03月28日 10:50
  • 139
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Struts2学习(八)数据校验实现
举报原因:
原因补充:

(最多只允许输入30个字)