Struts2学习教程之输入校验示例详解

前言

数据校验几乎是每个应用都要做的工作。用户输入的数据,发送到服务器端,天知道用户输入的数据是否是合法的,是否为恶意输入。所以一个健壮的应用系统必须对用户的输入进行校验,将非法的输入阻止在应用之外,防止这些非法的输入进入系统,从而保证系统的稳定性、安全性。

我们都知道,为了更好的用户体验,以及更高的效率,现在的Web应用都存在以下两重数据校验:

  • 客户端数据校验
  • 服务器端数据校验

对于客户端数据校验主要是通过JavaScript代码来完成;而对于服务器端数据校验是整个应用阻止非法数据的最后防线,主要通过在应用中编程实现。

Struts2框架为了减轻开发人员的工作量,提高工作效率,在数据校验这方面也下了很大功夫,那么Struts2是如何完成数据校验的呢?(由于Struts2框架的客户端校验能力较弱,不予总结,这篇文章主要总结Struts2框架的服务器端数据校验功能)

编写校验规则文件

我们都知道数据校验都是一些繁琐的代码,为了从这些繁琐的代码中抽身出来,Struts2框架提供了基于配置文件的数据校验,只需要编写校验规则文件即可,校验规则文件指定每个表单域应该满足怎样的规则。

下面通过一个Demo示例来说说Struts2框架的输入校验。

前台页面:

<body>
 <form action="login" method="post">
  用户名:<input type="text" name="name" /><s:fielderror fieldName="name" /><br>
  密码:<input type="password" name="password" /><s:fielderror fieldName="password" /><br>
  年龄:<input type="text" name="age" /><s:fielderror fieldName="age" /><br>
  生日:<input type="text" name="birthday" /><s:fielderror fieldName="birthday" /><br>
   <input type="submit" value="提交" />
 </form>
</body>

后台Action处理代码:

public class LoginAction extends ActionSupport
{
 private String name;
 private String password;
 private int age;
 private Date birthday;
 private String tip;

 public void setName(String name)
 {
  this.name = name;
 }

 public String getName()
 {
  return name;
 }

 public void setPassword(String password)
 {
  this.password = password;
 }

 public String getPassword()
 {
  return password;
 }

 public void setAge(int age)
 {
  this.age = age;
 }

 public int getAge()
 {
  return age;
 }

 public void setBirthday(Date birthday)
 {
  this.birthday = birthday;
 }

 public Date getBirthday()
 {
  return birthday;
 }

 public void setTip(String tip)
 {
  this.tip = tip;
 }

 public String getTip()
 {
  return tip;
 }

 public String execute() throws Exception
 {
  // 这里简化了操作
  return SUCCESS;
 }
}

通过上面的Action代码可以看到,我并没有为添加任何的字段校验代码,而我们只需要编写一个校验文件,如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 指定校验配置文件的DTD信息 -->
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN"
 "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<!-- 校验文件的根元素 -->
<validators>
 <!-- 校验Action的name属性 -->
 <field name="name">
  <!-- 指定name属性必须满足必填规则 -->
  <field-validator type="requiredstring">
   <param name="trim">true</param>
   <message>必须填入名字</message>
  </field-validator>
  <!-- 指定name属性必须匹配正则表达式 -->
  <field-validator type="regex">
   <param name="regexExpression"><![CDATA[(\w{4,25})]]></param>
   <message>您输入的用户名只能是字母和数字,且长度必须在4到25之间</message>
  </field-validator>
 </field>

 <!-- 校验Action的password属性 -->
 <field name="password">
  <field-validator type="requiredstring">
   <param name="trim">true</param>
   <message>必须输入密码</message>
  </field-validator>
  <field-validator type="regex">
   <param name="regexExpression"><![CDATA[(\w{4,25})]]></param>
   <message>您输入的用户名只能是字母和数字,且长度必须在4到25之间</message>
  </field-validator>
 </field>

 <!-- 校验Action的age属性 -->
 <field name="age">
  <field-validator type="int">
   <param name="min">1</param>
   <param name="max">150</param>
   <message>年龄必须在1到150之间</message>
  </field-validator>
 </field>

 <!-- 校验Action的birthday属性 -->
 <field name="birthday">
  <field-validator type="date">
   <param name="min">1900-01-01</param>
   <param name="max">2050-02-21</param>
   <message>生日必须在 ${min}到${max}之间</message>
  </field-validator>
 </field>
</validators>

Struts2的校验文件规则与Struts1的校验文件设计方式不同,Struts2中每个Action都有一个校验文件,因此该校验文件的文件名应该遵守如下规则:

<Action名字>-validation.xml

前面的Action名是可以改变的,后面的-validation.xml部分总是固定的,且该校验文件应该被保存在与Action class文件相同的路径下。

与类型转换失败相似的是,当输入校验失败后,Struts2也是自动返回名为"input"的Result,因此需要在struts.xml文件中配置名为"input"的Result。

国际化提示信息

对于校验失败的情况下,就需要给用户提示错误信息,那么现在就出现了个问题,在多语言环境下,如何正确的提示对应语言的提示信息呢?像上面那样直接在校验文件中写死可不行。为了国际化提示信息,为message元素指定key属性,该key属性指定是国际化提示信息对应key。

例如,上述的校验文件,可以大致写成这样:

<!-- 校验Action的name属性 -->
<field name="name">
 <!-- 指定name属性必须满足必填规则 -->
 <field-validator type="requiredstring">
  <param name="trim">true</param>
  <message key="name.required"/>
 </field-validator>
 <!-- 指定name属性必须匹配正则表达式 -->
 <field-validator type="regex">
  <param name="regexExpression"><![CDATA[(\w{4,25})]]></param>
  <message key="name.regex"/>
 </field-validator>
</field>

内建校验器

在上面的校验文件中,可以看到这样的语句:

<field-validator type="requiredstring">
<field-validator type="regex">
...

这里的type属性值就是校验器。在Struts2框架内部提供了大量的内建校验器,这些内建的校验器可以满足大部分应用的校验需求,我们只需要使用这些校验器即可。

我们可以使用解压缩工具打开xwork-core-2.3.24.1.jar文件,在xwork-core-2.3.24.1.jar\com\opensymphony\xwork2\validator\validators路径下可以找到一个default.xml文件,这个文件就是Struts2默认的校验器注册文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
  "-//Apache Struts//XWork Validator Definition 1.0//EN"
  "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">

<!-- START SNIPPET: validators-default -->
<validators>
 <!-- 必填校验器 -->
 <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>

 <!-- 必填字符串校验器 -->
 <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>

 <!-- 整数校验器 -->
 <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>

 <!-- 长整数校验器 -->
 <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>

 <!-- 短整数校验器 -->
 <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>

 <!-- 双精度浮点数校验器 -->
 <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>

 <!-- 日期校验器 -->
 <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>

 <!-- 表达式校验器 -->
 <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>

 <!-- 字段表达式校验器 -->
 <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>

 <!-- 电子邮件校验器 -->
 <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>

 <!-- URL校验器 -->
 <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>

 <!-- visitor校验器 -->
 <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>

 <!-- 转换校验器 -->
 <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>

 <!-- 字符串长度校验器 -->
 <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>

 <!-- 正则表达式校验器 -->
 <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
 <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>
<!-- END SNIPPET: validators-default -->

关于这些校验器的具体使用,这里就不一一举例了。

总结

这篇文章对Struts2框架中的校验器进行了简单的总结,对于这里说的校验器,基础的是如何使用,而最重要的是掌握Struts2校验器这种思想,将写代码来做的事情,通过配置来完成,这种方法很值得我们借鉴,在我们学习其它框架中,我们也会碰到这种方式。学习,痛并快乐着。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Struts2的输入校验实例代码

    在我们项目实际开发中在数据校验时,分为两种,一种是前端校验,一种是服务器校验:   客户端校验:主要是通过jsp写js脚本,它的优点很明显,就是输入错误的话提醒比较及时,能够减轻服务器的负担,但是客户端校验并不是安全的,简单来讲就是防君子防不了小人.    服务器端校验:最大特点就是数据安全,但是如果只有服务器端校验,会大大增加服务器端的负担. 所以一般在我们开发中,是客户端和服务器端校验相结合作用的. 那这篇文章,我只讲服务器端校验,在Struts2支持两种校验方式: 代码校验 :在服务器通过

  • Struts2学习教程之输入校验示例详解

    前言 数据校验几乎是每个应用都要做的工作.用户输入的数据,发送到服务器端,天知道用户输入的数据是否是合法的,是否为恶意输入.所以一个健壮的应用系统必须对用户的输入进行校验,将非法的输入阻止在应用之外,防止这些非法的输入进入系统,从而保证系统的稳定性.安全性. 我们都知道,为了更好的用户体验,以及更高的效率,现在的Web应用都存在以下两重数据校验: 客户端数据校验 服务器端数据校验 对于客户端数据校验主要是通过JavaScript代码来完成:而对于服务器端数据校验是整个应用阻止非法数据的最后防线,

  • Go语言学习教程之反射的示例详解

    目录 介绍 反射的规律 1. 从接口值到反射对象的反射 2. 从反射对象到接口值的反射 3. 要修改反射对象,该值一定是可设置的 介绍 reflect包实现运行时反射,允许一个程序操作任何类型的对象.典型的使用是:取静态类型interface{}的值,通过调用TypeOf获取它的动态类型信息,调用ValueOf会返回一个表示运行时数据的一个值.本文通过记录对reflect包的简单使用,来对反射有一定的了解.本文使用的Go版本: $ go version go version go1.18 dar

  • Struts中使用validate()输入校验方法详解

    1.在ActionSupport中有一个validate()方法,这个方法是验证方法,它会在execute()方法执行之前执行,所以能够起到很好的验证的作用. @Override //重写Action中的validate()方法 public void validate() { if(null==this.username||this.username.length()<4||this.username.length()>6){ this.addActionError("userna

  • 人工智能学习Pytorch梯度下降优化示例详解

    目录 一.激活函数 1.Sigmoid函数 2.Tanh函数 3.ReLU函数 二.损失函数及求导 1.autograd.grad 2.loss.backward() 3.softmax及其求导 三.链式法则 1.单层感知机梯度 2. 多输出感知机梯度 3. 中间有隐藏层的求导 4.多层感知机的反向传播 四.优化举例 一.激活函数 1.Sigmoid函数 函数图像以及表达式如下: 通过该函数,可以将输入的负无穷到正无穷的输入压缩到0-1之间.在x=0的时候,输出0.5 通过PyTorch实现方式

  • python神经网络学习数据增强及预处理示例详解

    目录 学习前言 处理长宽不同的图片 数据增强 1.在数据集内进行数据增强 2.在读取图片的时候数据增强 3.目标检测中的数据增强 学习前言 进行训练的话,如果直接用原图进行训练,也是可以的(就如我们最喜欢Mnist手写体),但是大部分图片长和宽不一样,直接resize的话容易出问题. 除去resize的问题外,有些时候数据不足该怎么办呢,当然要用到数据增强啦. 这篇文章就是记录我最近收集的一些数据预处理的方式 处理长宽不同的图片 对于很多分类.目标检测算法,输入的图片长宽是一样的,如224,22

  • GoFrame实现顺序性校验示例详解

    目录 引言 基本介绍 无序的原因 顺序校验 总结 引言 在上一篇文章中 GoFrame数据校验之校验结果 | Error接口对象 ,关于顺序与非顺序性校验没有做充分的介绍. 这篇文章填上之前留的坑,我们以map校验举例: 基本介绍 我们通过上一篇文章了解到:Error接口对象的方法,其顺序性只有使用顺序校验规则时有效,否则返回的结果是随机的. 即使我们使用FirstItem, FirstString()等其他方法获取校验结果也是一样,返回的校验结果不固定. 无序的原因 因为校验的规则我们传递的是

  • Mysql教程分组排名实现示例详解

    目录 1.数据源 2.数据整体排名 1)普通排名 2)并列排名 3)并列排名 3.数据分组后组内排名 1)分组普通排名 2)分组后并列排名 3)分组后并列排名 4.分组后取各组的前两名 1.数据源 2.数据整体排名 1)普通排名 从1开始,按照顺序一次往下排(相同的值也是不同的排名). set @rank =0; select city , score, @rank := @rank+1 rank from cs order by score desc; 结果如下: 2)并列排名 相同的值是相同

  • MySQL教程DML数据操纵语言示例详解

    目录 1.数据操纵语言(DML) 2.增添数据(insert) 3.复制已有表,生成新表 1)复制已有表的结构和数据. 2)只复制已有表的结构(得到的是一个空结构表). 3)在2的基础上,向空结构表中插入数据. 4.修改数据update 5.删除数据delete:物理删除(一旦删除就彻底没有了). 6.truncate和delete的区别 1)delete 2)truncate 3)truncate和delete的区别 1.数据操纵语言(DML) 数据操纵语言全称是Data Manipulati

  • TensorFlow人工智能学习数据合并分割统计示例详解

    目录 一.数据合并与分割 1.tf.concat() 2.tf.split() 3.tf.stack() 二.数据统计 1.tf.norm() 2.reduce_min/max/mean() 3.tf.argmax/argmin() 4.tf.equal() 5.tf.unique() 一.数据合并与分割 1.tf.concat() 填入两个tensor, 指定某维度,在指定的维度合并.除了合并的维度之外,其他的维度必须相等. 2.tf.split() 填入tensor,指定维度,指定分割的数量

  • Git基础学习之分支操作的示例详解

    目录 1.新建一个分支并且使分支指向指定的提交对象 2.思考 3.项目分叉历史的形成 4.分支的总结 1.新建一个分支并且使分支指向指定的提交对象 使用命令:git branch branchname commitHash. 我们现在本地库中只有一个 master 分支,并且在 master 分支有三个提交历史. 需求:创建一个 testing 分支,并且testing 分支指向 master 分支第二个版本. # 1.查看提交历史记录 L@DESKTOP-T2AI2SU MINGW64 /j/

随机推荐