博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Webx框架:表单验证
阅读量:2190 次
发布时间:2019-05-02

本文共 6908 字,大约阅读时间需要 23 分钟。

表单验证

传统的应用中,表单中的数据是放在Java代码中进行检验的。这种方法在编写java代码的时候很无聊,而且后期的修改也不方便。 而webx框架将表单验证的逻辑独立放在配置文件中。这种方式更加方便。

webx中,表单的验证有三个步骤:

  1. 定义验证规则
  2. 在Java代码中调用该规则
  3. 在页面中显示验证结果。

定义验证规则。下面是验证规则的一个例子。

  
    
      
        
 必须填写 ${displayName}
      
      
        
${displayName} 必须由字母、数字、下划线构成 
      
      
        
${displayName} 最少必须由 ${minLength} 个字组成,最多不能超过 ${maxLength} 个字 
      
    
  

上面这个例子中,最外层是form,表示表单验证服务。一个验证服务中可以包含多个group,表示验证组。 一个验证组中可以包含多个field,表示验证字段。每个验证字段中可以包含多个validator,表示验证规则。 每个验证规则只能包含一个错误消息。

编写Java代码。下面是Java代码的一个例子。

public class AddUserAction {   
public void doAdd(@FormGroup("register") MyUser user, Navigator nav) throws Exception {
save(user);
nav.redirectTo("registerSuccess");
}
}

上面这个例子中使用了@FormGroup注解,它的意思是通过register规则校验表单, 如果校验失败会让用户重新填写表单,如果校验成功,就会执行方法中的代码。 AddUserActiondoAdd这些符号需要告诉框架,在后面会详细讲解。

编写表单。首先要定义表单工具,这样才能在页面中通过$form进行访问。

  
  ...

表单内容。

 
  
  #set ($group = $form.register.defaultInstance)
 
  
  
  
  #if(!$group.username.valid)
    $group.username.message
  #end
 
  
 
  
  
 
  
  
 
 

修改老数据。有时候项目的需求比如是修改账户资料。那么在打开修改页面的时候,表单中就已经有数据了, 那么这种需求该怎么做呢?只要在Java代码中将数据填入到Context中,再将数据填充给group即可。

Java代码:将数据放在context中。

public void execute(Context context) throws Exception {
  User user = ...;
  context.put("user", user);
}

页面中:将user变量中的数据填充到group中:

#set ($group = $form.userAccount.defaultInstance) 
$group.mapTo($user)

如果$user没有定义,那么mapTo会忽略。

postonly属性。这个属性的作用是让表单只支持post方式提交,这样会略微提高CSRF的攻击难度。它的配置方法如下:

  

trimming参数。目的是去除字段值两端的空格。下面是配置的例子:

  
    
  

displayName参数。目的是让错误消息中重复使用字段的显示名称。下面是配置方法:

  
    
 必须填写 ${displayName}
  

类型转换。表单中的值只能用字符串表示,如果想要转换成Java中的类型,就需要声明类型转换器。

  

验证消息国际化。目的是让验证消息支持多语言。下面这段配置告诉框架,消息文本需要从form_msgs***中加载。

 
  
    
      
form_msgs
    
  

下面这段验证规则,消息内容会对应到ResourceBundle中的form.register.userId.required中:

  
    
      
    
  

表单拆分。有时候表单的数量非常多,放在一个文件中不方便维护,这时就需要将form标签进行拆分,分配到多个文件中。 配置方法如下。例子中的primary属性表示框架会从这个form开始加载验证规则,而不是从其他文件中进行加载。

  
  
  ...

其他文件中的form配置如下:

  ...
 
  ...

Group继承。有时候两个Group之间有很多相似的地方。这时就可以用继承来消除重复。

  ...
  ...

默认值:

验证错误消息。它可以包含变量,下面是一个例子。

  
${displayName} 最少必须由 ${minLength} 个字组成,最多不能超过 ${maxLength} 个字 

验证器。有以下几种:

名称 作用
required-validator 必选验证器。
regex-validator 正则验证器
string-length-validator 字串长度验证器
string-byte-length-validator 字节长度验证器
string-compare-validator 字符串比较验证器。属性有equalTonotEqualToignoreCase
mail-address-validator 邮箱验证器
number-validator 数字验证器
number-compare-validator 数字比较验证器
date-validator 日期验证器
uploaded-file-validator 文件上传验证器
csrf-validator 验证csrf字段
custom-error 自定义验证
multi-values-count-validator 多值验证

number-validator数字验证器。属性有以下几个:

  • numberType 数字的类型。可用的类型为:intlongfloatdoublebigDecimal。 如不设置,默认值为int
  • equalTo 可选数字范围:要求数字等于指定值。
  • notEqualTo 可选数字范围:要求数字不等于指定值。
  • lessThan 可选数字范围:要求数字小于指定值。
  • lessThanOrEqualTo 可选数字范围:要求数字小于或等于指定值。
  • greaterThan 可选数字范围:要求数字大于指定值。
  • greaterThanOrEqualTo

number-compare-validator 数字比较验证器。有以下几个属性:

  • numberType 数字的类型。可用的类型为:int、long、float、double、bigDecimal。如不设置, 默认值为int。
  • equalTo
  • notEqualTo 可选数字范围:要求数字不等于指定字段的值。
  • lessThan 可选数字范围:要求数字小于指定字段的值。
  • lessThanOrEqualTo 可选数字范围:要求数字小于或等于指定字段的值。
  • greaterThan 可选数字范围:要求数字大于指定字段的值。
  • greaterThanOrEqualTo

date-validator 日期验证器。可以指定的属性有:

  • format 日期的格式,如不指定,默认为yyyy-MM-dd。
  • minDate 可选的日期范围:最早的日期。该日期格式也是用format参数来表示的。
  • maxDate

uploaded-file-validator 文件上传验证器。可以验证以下属性。

  • minSize 最小文件尺寸。可使用K/M等单位,例如:10K、1M等。
  • maxSize 最大文件尺寸。可使用K/M等单位,例如:10K、1M等。
  • extension 允许的文件名后缀,多个后缀以逗号分隔。例如:gif、jpg、png。注意,文件名是由浏览器传递给服务器的,因此验证器并不能保证文件的扩展名和内容一致。例如,xxx.jpg有可能是一个exe可执行文件。
  • contentType

custom-error 自定义验证。将验证逻辑放在action中,其余特性与普通的验证器一样。首先要增加CustomErrors参数,错误通过setError进行设置。

public void doRegister(@FormField(name = "userId", group = "register") CustomErrors err, ...) throws Exception {
  try {
    ...
  } catch (DuplicatedUserException e) {
    Map
 params = createHashMap();
    params.put("userId", user.getUserId());
    err.setMessage("duplicatedUserId", params);
  }
}

验证器还可以增加条件验证,有if、choose、all-of、none-of、any-of。

  
    
 必须填写 ${displayName}
  
  
  

多值验证。可以验证值的数量范围。

  
 至少选择 ${minCount} 项,最多选择 ${maxCount} 项 

还可以对各个值进行验证。

  
${allMessages}
  
  
 至少有一个 ${displayName} 要符合要求 
  
 所有 ${displayName} 都不能符合要求 
  
  

form-tool对象。首先要声明pull服务。

...

这样在页面中就可以直接引用$form对象了。 它的接口如下:

$form.valid 
#set ($group = $form.group1.defaultInstance) 取得group1的默认实例,如果不存在,则创建之。
#set ($group = $form.group1.getInstance("id")) 取得group1的指定id的实例,如果不存在,则创建之。
#set ($group = $form.group1.getInstance("id", false)) 取得group1的指定id的实例,如果不存在,则返回null。
#foreach ($group in $form.groups) ... #end 遍历当前form中所有group实例。
#foreach ($group in $form.getGroups("group1")) ... #end

$group对象有以下接口:

#if ($group.valid) ... #end 判断当前group是否验证为合法,或者未经过 
验证(即初始表单)
#if ($group.validated) ... #end 判断当前group是否经过验证(初始表单为未
经过验证的表单)
$group.field1 取得field1
#foreach ($field in $group.fields) ... #end 遍历当前group中所有的fields
$group.mapTo($bean)

$field对象提供的接口:字段的名称、字段值、多值、是否验证通过、错误消息。

#if (!$field.valid)
  
$field.message
#end
#foreach ($value in $field.values) ... #end
$field.getAbsentHiddenField($value)

在字段中附上一个Java对象。

$field.setAttachment($obj) 
$field.attachmentHiddenField

转载地址:http://gpyub.baihongyu.com/

你可能感兴趣的文章
用 Grid Search 对 SVM 进行调参
查看>>
用 Pipeline 将训练集参数重复应用到测试集
查看>>
PCA 的数学原理和可视化效果
查看>>
机器学习中常用评估指标汇总
查看>>
什么是 ROC AUC
查看>>
Bagging 简述
查看>>
详解 Stacking 的 python 实现
查看>>
简述极大似然估计
查看>>
用线性判别分析 LDA 降维
查看>>
用 Doc2Vec 得到文档/段落/句子的向量表达
查看>>
使聊天机器人具有个性
查看>>
使聊天机器人的对话更有营养
查看>>
一个 tflearn 情感分析小例子
查看>>
attention 机制入门
查看>>
手把手用 IntelliJ IDEA 和 SBT 创建 scala 项目
查看>>
GAN 的 keras 实现
查看>>
AI 在 marketing 上的应用
查看>>
Logistic regression 为什么用 sigmoid ?
查看>>
Logistic Regression 为什么用极大似然函数
查看>>
SVM 的核函数选择和调参
查看>>