struts2学习笔记(六)——校验器

本文详细介绍了Struts2的输入校验功能,包括客户端和服务器端的校验流程,自定义校验方法,内置校验器以及如何实现自定义校验器。通过实例展示了如何使用验证规则文件进行客户端校验,以及服务端自定义校验的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入校验

         应用无需书写任何代码,即可完成大部分的校验功能,并可以同时完成客户端和服务器端的校验。如果应用的输入校验规则特别,Struts2也允许通过重写validate方法来完成自定义校验。

校验流程:

见附图

客户端js校验:

a)        在jsp中使用s:form,form的validate属性要设置为true,并且不要将theme属性指定为simple.(simple表示struts2将把这个解析成普通的HTML标签) 

b)        编写<Action名字>-Validation.xml(该文件保存在和Action相同的路径下),实例如下:

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<!-- 校验文件的根元素 -->
<validators>
<!-- 校验Action的name属性 -->
<field name="name">
   <!-- 指定name属性必须满足必填规则 -->
   <field-validator type="requiredstring">
    <!-- 校验前去掉name属性的前后空格 -->
    <param name="trim">true</param>
    <!-- 提示信息 -->
    <message>必须输入名字</message>
   </field-validator>
   <!-- 指定name属性必须满足匹配指定的正则表达式 -->
   <field-validator type="regex">
    <param name="expression"><![CDATA[(\w{4,25})]]></param>
    <message>您输入的用户名只能是字母和数组,且长度必须在4到25之间</message>
   </field-validator>
</field>
<field name="pass">
   <field-validator type="requiredstring">
    <param name="trim">true</param>
    <message>必须输入密码</message>
   </field-validator>
   <field-validator type="regex">
    <param name="expression"><![CDATA[(\w{4,25})]]></param>
    <message>您输入的密码只能是字母和数组,且长度必须在4到25之间</message>
   </field-validator>
</field>
<field name="age">
   <!-- 指定age属性必须在指定的范围内 -->
   <field-validator type="int">
    <param name="min">1</param>
    <param name="max">150</param>
    <message>年纪必须在1到150之间</message>
   </field-validator>
    </field>
<field name="birth">
   <!-- 指定age属性必须在指定的范围内 -->
   <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>



在其中使用<message>${getText("name.requried")}</message>方式获取国际化资源,”name.requried”需要在国际化文件中定义,实例如下:

<fieldname="birth">
   <!-- 指定age属性必须在指定的范围内 -->
   <field-validatortype="date">
    <paramname="min">1900-01-01</param>
    <paramname="max">2050-02-21</param>
    <message>年纪必须在${min}到${max}之间</message>
   </field-validator>
</field>


c)        客户端校验仅仅支持如下几种校验器:required validator 必填校验器,requiredstring validator 必填字符串校验器,stringlengthvalidator 字符串长度校验器,regex validator 表达式校验器,email validator 邮件校验器,url validator 网址校验器,int validator 整数校验器,double validator 双精度数校验器,其他的需要服务器端配合

d)        短路校验器:对于同一个输入框的多个校验器,如果第一个失败后,后面不会继续校验,配置 xml中的field-validator的属性short-circuit=true时

e)       校验文件搜索顺序

          例如有一个LoginAction继承BaseAction,这两个Action中都有业务方法login,并且存在4份校验规则文件如下:BaseAction-vadition.xml, BaseAction-login-validation.xml , LoginAction-validation.xml, LoginAction-login-validation.xml那么用户访问LoginAction的login方法里,会按照以上的顺序执行校验规则,实际的校验规则是以上四个校验规则的总和,但是如果存在冲突的情况下,后面的校验规则优先。


服务端自定义校验

1.        实现 validate()函数,在该函数中使用addFieldError()向前台传递字段错误信息

2.        在jsp中使用 <s:fielderror /> 完成显示

内建校验器

1.        required必填校验器,要求字段必须有值

2.        requiredstring必填字符串校验器,要求必须有值且长度大于0,即不能是空字符串。默认会去掉字符串前后空格

3.        int整数校验器,可以配置整数在指定的范围内

4.        double双精度校验器,可以配置双精度数在指定的范围内

5.        date日期校验器,可以配置日期在指定的范围内

6.        fieldexpression字段表达式校验器,当参数expression计算的值为true时,校验通过,否则返回提示。多用于在用户的两次输入中间进行判断,如下例:

<!-- 要校验的属性为rpass -->
    <field name="rpass">
    <!-- 使用fieldexpression校验器 -->
        <field-validator type="fieldexpression">
        	<param name="expression"><![CDATA[(rpass == password)]]></param>
            <message>两次密码不相同!</message>
        </field-validator>
    </field>

7.        email邮件地址校验器,要求被检查的字段如果非空,则必须是合法的邮件地址。

8.        url网址校验器,要求被检查的字段如果非空,则必须是合法的URL地址。7和8都是基于正则表达式来计算的,可能会随着技术的进步而不同,用户可以自己扩展。

9.        visitorVisitor校验器,用于检测Action里的复合属性。例如:RegistAction中包含了一个User属性,那么要校验User里的属性就要使用Visitor校验器,RegistAction-validation.xml文件中的配置如下:

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<!-- 指定校验user属性 -->
<field name="user">
   <!-- 使用visitor校验器 -->
   <field-validator type="visitor">
    <!-- 指定校验规则文件的context -->
    <param name="context">userContext</param>
    <!-- 指定校验失败后的提示信息是否添加下面的前缀 -->
    <param name="appendPrefix">true</param>
    <!-- 指定校验失败的提示信息的前缀 -->
    <message>用户的:</message>
   </field-validator>
</field>
</validators>

还要另外再为User属性配置单独的校验文件,默认的文件名应为User-validation.xml,因为刚在在RegistAction-validation.xml文件中指定了visitor的context属性为userContext,因此校验文件名应为:User-userContext-validation.xml,该文件同一般的校验文件一样,代码如下:

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE validators PUBLIC 
   "-//OpenSymphony Group//XWork Validator 1.0//EN" 
   "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
  
<validators>
<field name="name">
   <field-validator type="requiredstring">
    <param name="trim">true</param>
    <message>必须输入名字</message>
   </field-validator>
   <field-validator type="regex">
    <param name="expression"><![CDATA[(\w{4,25})]]></param>
    <message>您输入的用户名只能是字母和数组,且长度必须在4到25之间</message>
   </field-validator>
</field>
<field name="pass">
   <field-validator type="requiredstring">
    <param name="trim">true</param>
    <message>必须输入密码</message>
   </field-validator>
   <field-validator type="regex">
    <param name="expression"><![CDATA[(\w{4,25})]]></param>
    <message>您输入的密码只能是字母和数组,且长度必须在4到25之间</message>
   </field-validator>
</field>
<field name="age">
   <field-validator type="int">
    <param name="min">1</param>
    <param name="max">150</param>
    <message>年纪必须在1到150之间</message>
   </field-validator>
    </field>
<field name="birth">
   <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>
还要另外再为User属性配置单独的校验文件,默认的文件名应为User-validation.xml,因为刚在在RegistAction-validation.xml文件中指定了visitor的context属性为userContext,因此校验文件名应为:User-userContext-validation.xml,该文件同一般的校验文件一样,代码如下:

当然这时候的JSP页面中也与之前的不一样,它要把页面属性直接赋值给Action中的User中的属性,这在之前的几课中已经有过说明,页面代码如下:

<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>请输入您的注册信息</title>
</head>
<body>
<H1>请输入您的注册信息</H1>
<s:fielderror/>
<FORM METHOD="POST" ACTION="regist.action">
用户名:<INPUT TYPE="text" NAME="user.name"><br>
密  码:<INPUT TYPE="text" NAME="user.pass"><br>
年  龄:<INPUT TYPE="text" NAME="user.age"><br>
生  日:<INPUT TYPE="text" NAME="user.birth"><p>
<INPUT TYPE="submit" value="注册">
</FORM>
</body>
</html>



10.     conversion转换校验器,它检查被校验字段在类型转换过程中是否出现错误。例子如下:

<field name="age">
   <field-validator type="int">
    <param name="min">1</param>
    <param name="max">150</param>
    <message>年纪必须在1到150之间</message>
   </field-validator>
   <field-validator type="conversion">
    <!-- 指定类型转换失败后,返回输入页面依然保留原来的错误输入 -->
    <param name="repopulateField">true</param>
    <!-- 转换失败后的提示信息 -->
    <message>你的年龄必须是一个整数</message>
   </field-validator>
</field>


11.     stringlength字符串长度校验器,它要求被校验的字段长度必须在指定的范围内,否则校验失败。例:

<field name="pass">
   <field-validator type="stringlength">
    <param name="minLength">4</param>
    <param name="maxLength">10</param>
    <message>长度必须在4-10之间</message>
   </field-validator>
</field>


12.    regex 正则表达式校验器,它检查被校验的字段是否匹配指定的正则表达式,例:

<field name="pass">
   <field-validator type="regex">
   <param name="expression"><![CDATA[(\w{4,25})]]></param>
    <message>您输入的密码只能是字母和数组,且长度必须在4到25之间</message>
   </field-validator>
</field>


自定义校验器

       我们也可以开发自己的校验器。方法如下:添加一个validators.xml文件在WEB\INF\classes目录下,validators.xml文件中的配置则同刚才说的Struts2的内建校验器的配置相同。再开发出自己的校验器类,在validators.xml中注册就可以了。如果在WEB-INF\classes目录添加了文件validators.xml文件,则Struts2不会再应用默认的校验器,因此这时需要将default.xml文件中的所有校验器都复制到validators.xml文件中。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值