Struts2-输入验证

1. Struts2 的验证
1). 验证分为两种:
> 声明式验证*
>> 对哪个 Action 或 Model 的那个字段进行验证
>> 使用什么验证规则
>> 如果验证失败, 转向哪一个页面, 显示是什么错误消息
> 编程式验证

2). 声明式验证的 helloworld
I.  先明确对哪一个 Action 的哪一个字段进行验证: age
II. 编写配置文件: 
> 把 struts-2.3.15.3\apps\struts2-blank\WEB-INF\classes\example 下的 Login-validation.xml 文件复制到
当前 Action 所在的包下. 
> 把该配置文件改为: 把  Login 改为当前 Action 的名字. 
> 编写验证规则: 参见 struts-2.3.15.3/docs/WW/docs/validation.html 文档即可.
> 在配置文件中可以定义错误消息: 
<field name="age">
         <field-validator type="int">
             <param name="min">20</param>
             <param name="max">50</param>
             <message>^^Age needs to be between ${min} and ${max}</message>
         </field-validator>
     </field>
     > 该错误消息可以国际化吗. 可以
     <message key="error.int"></message>. 
        再在 国际化资源文件 中加入一个键值对: error.int=^^^Age needs to be between ${min} and ${max}
III. 若验证失败, 则转向 input 的那个 result. 所以需要配置 name=input 的 result
<result name="input">/validation.jsp</result>
IV. 如何显示错误消息呢 ?  
> 若使用的是非 simple, 则自动显示错误消息.
> 若使用的是 simple 主题, 则需要 s:fielderror 标签或直接使用 EL 表达式(使用 OGNL)
${fieldErrors.age[0] } 
OR
<s:fielderror fieldName="age"></s:fielderror>*
3). 注意: 若一个 Action 类可以应答多个 action 请求, 多个 action 请求使用不同的验证规则, 怎么办 ?
> 为每一个不同的 action 请求定义其对应的验证文件: ActionClassName-AliasName-validation.xml
> 不带别名的配置文件: ActionClassName-validation.xml 中的验证规则依然会发生作用. 可以把各个 action 公有的验证规则
配置在其中. 但需要注意的是, 只适用于某一个 action 的请求的验证规则就不要这里再配置了. 
4). 声明式验证框架的原理:
> Struts2 默认的拦截器栈中提供了一个 validation 拦截器
> 每个具体的验证规则都会对应具体的一个验证器. 有一个配置文件把验证规则名称和验证器关联起来了. 而实际上验证的是那个验证器. 
该文件位于 com.opensymphony.xwork2.validator.validators 下的 default.xml
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
5). 短路验证: 若对一个字段使用多个验证器, 默认情况下会执行所有的验证. 若希望前面的验证器验证没有通过, 后面的就不再验证, 可以使用短路验证
<!-- 设置短路验证: 若当前验证没有通过, 则不再进行下面的验证 -->
<field-validator type="conversion" short-circuit="true">
<message>^Conversion Error Occurred</message>
</field-validator>
<field-validator type="int">
<param name="min">20</param>
<param name="max">60</param>
<message key="error.int"></message>
</field-validator>
6). 若类型转换失败, 默认情况下还会执行后面的拦截器, 还会进行 验证. 可以通过修改 ConversionErrorInterceptor 源代码的方式使
当类型转换失败时, 不再执行后续的验证拦截器, 而直接返回 input 的 result

Object action = invocation.getAction();
        if (action instanceof ValidationAware) {
            ValidationAware va = (ValidationAware) action;
            if(va.hasFieldErrors() || va.hasActionErrors()){
            return "input";
            }
        }
7). 关于非字段验证: 不是针对于某一个字段的验证. 
<validator type="expression">
        <param name="expression"><![CDATA[password==password2]]></param>
        <message>Password is not equals to password2</message>
        </validator>
          显示非字段验证的错误消息, 使用 s:actionerror 标签:  <s:actionerror/>
8). 不同的字段使用同样的验证规则, 而且使用同样的响应消息 ?
error.int=${getText(fieldName)} needs to be between ${min} and ${max}
age=\u5E74\u9F84
count=\u6570\u91CF
9). I:自定义验证器:
> 自定义的验证器都需要实现 Validator. 
> 可以选择继承 ValidatorSupport 或 FieldValidatorSupport 类
> 若希望实现一个一般的验证器, 则可以继承 ValidatorSupport
> 若希望实现一个字段验证器, 则可以继承 FieldValidatorSupport
> 具体实现可以参考目前已经有的验证器. 
> 若验证程序需要接受一个输入参数, 需要为这个参数增加一个相应的属性
II.  在配置文件中配置验证器
> 默认情况下下, Struts2 会在 类路径的根目录下加载 validators.xml 文件. 在该文件中加载验证器.
    该文件的定义方式同默认的验证器的那个配置文件: 位于 com.opensymphony.xwork2.validator.validators 下的 default.xml
> 若类路径下没有指定的验证器, 则从 com.opensymphony.xwork2.validator.validators 下的 default.xml 中的验证器加载 
III. 使用: 和目前的验证器一样. 
案例:
<field name="idCard">
      <field-validator type="idcard">
      <message>it is not a idcard!</message>
      </field-validator>

     </field>

validators.xml
<?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="idcard" class="com.cgc.struts.app.IDCardValidator"/>
</validators>

TestAgeAction-testAge-validation.xml
<field name="idCard">
      <field-validator type="idcard">
      <message>it is not a idcard!</message>
      </field-validator>
    </field>
IIII:编程验证:
Struts2 提供了一个 Validateable 接口, 可以使 Action 类实现这个接口以提供编程验证功能. 
ActionSupport  类已经实现了 Validateable 接口
即可在action自己写代码实现验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值