struts2验证:Struts2 数据输入校验(2) —— XML验证

  struts2提供了通过XML方式对输入数据进行验证校验框架

  在和XXXAction同级目录下,建立XXXAction-validation.xml即为该Action校验逻辑

  该校验XMLdtd格式文件为 http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd具体内容可以展开下面代码:

http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!--
 XWork Validators DTD.
 Used the following DOCTYPE.
 <!DOCTYPE validators PUBLIC
     "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
     "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-->
<!ELEMENT validators (field|validator)+>
<!ELEMENT field (field-validator+)>
<!ATTLIST field
  name CDATA #REQUIRED
>
<!ELEMENT field-validator (param*, message)>
<!ATTLIST field-validator
  type CDATA #REQUIRED
  -circuit (true|false) "false"
>
<!ELEMENT validator (param*, message)>
<!ATTLIST validator
  type CDATA #REQUIRED
  -circuit (true|false) "false"
>
<!ELEMENT param (#PCDATA)>
<!ATTLIST param
  name CDATA #REQUIRED
>
<!ELEMENT message (#PCDATA)>
<!ATTLIST message
  key CDATA #IMPLIED
>


  可以看到数据校验XML根元素<validator>下面可以包含两种 子元素:field和validator

  1、前者field   是针对字段进行校验;

  2、后者validator 是非字段或者说全局范围校验

  在介绍完校验是如何回事后后面会简单比较下两种校验方式区别

  、字段校验:(field)

  先看个基本举例

<validators>
  <field name="username">
    <field-validator type="required">
      <message key="error.username.required"/>
    </field-validator>
  </field>
    <field name="password">
        <field-validator type="length">
      <param name="trim">true</param>
      <param name="minLength">4</param>
      <param name="maxLength">10</param>
      <message>password should be ${minLength} to ${maxLength} characters long.</message>
    </field-validator>
    </field>
</validators>


  有几个地方需要注意

  1、field-validatortype在哪里定义

  struts2校验框架预设类在包com.opensymphony.xwork2.validator.validators中,同目录下default.xml中定义了field-validator中type名称和对应处理类

default.xml
<!-- START SNIPPET: validators-default -->
<validators>
  <validator name="required" ="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
  <validator name="required" ="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
  <validator name="" ="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
  <validator name="double" ="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
  <validator name="date" ="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
  <validator name="expression" ="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
  <validator name="fieldexpression" ="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
  <validator name="email" ="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
  <validator name="url" ="com.opensymphony.xwork2.validator.validators.URLValidator"/>
  <validator name="visitor" ="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
  <validator name="conversion" ="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
  <validator name="length" ="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
  <validator name="regex" ="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
</validators>
<!-- END SNIPPET: validators-default -->


  其中name是上面type需要引用名字而后面则是这些validator对应这些类中大部分都是自解释其中fieldexpression比较特殊它提供了种多个field的间比较值机制

  2、param值又是在哪里找到呢?

  param中name值在上述类中被定义为属性譬如说在类com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator中(也就是Length对应处理类)就定义了

  boolean trim;

   minLength,maxLength;

  及它们get/思路方法

  3、message注意事项

  (1)每个field都必须拥有个message;message信息最后是以addFieldError实现也就是说是field

  (2)message中可以引用param变量引用格式为${param1},如上面例子中对password验证失败报错信息

  (3)message内容可以放到全局i18n属性文件中并在message中以key属性值指定比如上面例子中对username验证失败报错信息

   2、非字段校验/全局校验

  全局校验和字段校验其实类似使用验证器也是那些区别在于校验方式和关注点区别:

  1、字段校验先指定那个字段要校验再指定用那些校验器来校验该字段;

  2、全局校验不针对特定字段先指定验证器再来指定用该校验器校验那些字段

  基本举例如下:

<validators>
  <validator type="required" -circuit="true">
    <param name="fieldName">username</param>
     <param name="fieldName">password</param>
     <param name="fieldName">password_confirmed</param>
    <message key="error.field.required"/>
  </validator>
   <validator type="length">
      <param name="trim">true</param>
      <param name="minLength">4</param>
      <param name="maxLength">10</param>
       <param name="fieldName">password</param>
       <param name="fieldName">password_confirmed</param>
      <message>password should be ${minLength} to ${maxLength} characters long.</message>
   </validator>    
</validators>


  举例很简单个validator是校验“不为空串”校验“用户名”、“密码”、“确认密码”字段第 2个校验器校验“串长度6-10”校验“密码”、“确认密码”两个字段

  很明显如果页面中存在些共性验证要求用这种方式就比针对字段验证要方便但这种方式可能不如前种方式清晰易读

  两种验证方式可以混用

   3、其他问题

  1、对多验证和跳转逻辑支持

  和Struts2 数据输入校验(1) —— 验证 中所说内容校验框架也支持多验证和跳转逻辑比如说在struts.xml文件中配置了

<action name="XXXAction" ="com.myspace.myname.XXXAction" method="ExcuteName">
   <result>success.jsp</result>
</action>


  则校验文件名字为XXXAction-ExcuteName-validation.xml

  当然在执行了上面校验的后如果存在XXXAction-validation.xml则还会执行这个文件中定义校验

  同时需要注意如果该Action存在父类则会先行执行父类相应校验

  2、客户端校验

  客户端校验是不安全但struts仍然提供了客户端校验

  思路方法是在<s:form>中设置validate属性为true,如果该属性被设置则struts不会在服务器端验证取而代的是在客户端生成Javascript代码但这些Js代码功能较弱灵活度也比较低且不会刷新因此不推荐使用

  其实strutsControl控件本身和HTMLControl控件如果想做客户端验证可以触发它们onXXX事件和通常HTML页面做法

Tags:  struts2 excel数据输入 struts2表单验证 struts2验证

延伸阅读

最新评论

发表评论