你们中有些人已经知道我和我的合著者MertÇalışkan正在研究PrimeFaces Cookbook的2.版。 Packt Publishing允许我从新章节“客户端验证”的一个食谱中摘录一小部分摘录。 这将有助于使读者知道这本书的内容。 在此博客文章中,我想讨论使用Bean验证扩展的PrimeFaces客户端验证(CSV)。

Bean Validation是一个验证模型,可作为Java EE 6平台的一部分使用,它允许通过约束将字段,方法或类上的批注形式的验证。 JSF 2.2支持对托管bean以及Spring或CDI bean中的字段(属性及其getter / setter)的验证。 只要不使用OmniFaces之类的实用程序,尚不支持在类级别进行验证。

PrimeFaces的CSV具有与Bean验证的内置集成。 注释定义的约束可以通过CSV框架在客户端进行验证。 尽管Bean Validation API定义了一整套标准约束注释,但可以轻松想到这些标准注释不足的情况。 对于这些情况,您可以为特定的验证要求创建自定义约束。 PrimeFaces中的客户端验证API与自定义约束无缝协作。

在本食谱中,我们将开发一种特殊的自定义约束和验证器,以验证卡验证码( CVC )。 CVC用作带有银行卡号的安全功能。 它是一个长度在三到四位数之间的数字。 例如,万事达卡或维萨卡要求输入三位数,而美国运通卡要求输入四位数。 因此,CVC验证将取决于所选的银行卡。 用户可以通过p:selectOneMenu选择银行卡,然后在p:inputText中输入CVC,然后提交输入。

怎么做…

我们将从用于CVC字段的自定义注释开始。

import org.primefaces.validate.bean.ClientConstraint;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;@Constraint(validatedBy = CvcConstraintValidator.class)
@ClientConstraint(resolvedBy = CvcClientConstraint.class)
@Target({FIELD, METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidCVC {String message() default "{invalid.cvc.message}";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};// identifier of the select menu with cardsString forCardMenu() default "";
}

@Constraint是Bean验证API的常规注解,而@ClientConstraint是PrimeFaces CSV框架的注解,它有助于解析元数据。 开发的注释定义消息密钥invalid.cvc.message并且具有Custom属性forCardMenu 。 此属性的值是任何有关PrimeFaces Selectors (PFS)搜索表达式,用于引用银行卡的选择菜单。 这是必需的,因为有效的CVC值取决于所选的卡。

CvcConstraintValidator的目标是验证输入长度。

public class CvcConstraintValidator implements ConstraintValidator<ValidCVC, Integer> {@Overridepublic void initialize(ValidCVC validCVC) {}@Overridepublic boolean isValid(Integer cvc, ConstraintValidatorContext context) {if (cvc == null || cvc < 0) {return false;}int length = (int) (Math.log10(cvc) + 1);return (length >= 3 && length <= 4);}
}

CvcClientConstraint的目标是准备元数据。

public class CvcClientConstraint implements ClientValidationConstraint {private static final String CARDMENU_METADATA = "data-forcardmenu";@Overridepublic Map<String, Object> getMetadata(ConstraintDescriptor constraintDescriptor) {Map<String, Object> metadata = new HashMap<String, Object>();Map attrs = constraintDescriptor.getAttributes();String forCardMenu = (String) attrs.get("forCardMenu");if (StringUtils.isNotBlank(forCardMenu)) {metadata.put(CARDMENU_METADATA, forCardMenu);}return metadata;}@Overridepublic String getValidatorId() {return ValidCVC.class.getSimpleName();}
}

让我们转到客户端实现。 首先,我们必须创建一个JavaScript文件,说validators.js ,并命名空间中的注册有自己的验证PrimeFaces.validator名为ValidCVC 。 此名称是由getValidatorId()方法返回的唯一ID(请参阅类CvcClientConstraint )。 要实现的功能称为validate() 。 它有两个参数:元素本身和要验证的当前输入值。

PrimeFaces.validator['ValidCVC'] = {MESSAGE_ID: 'invalid.cvc',validate: function (element, value) {// find out selected menu valuevar forCardMenu = element.data('forcardmenu');var selOption = forCardMenu ?PrimeFaces.expressions.SearchExpressionFacade.resolveComponentsAsSelector(forCardMenu).find("select").val() : null;var valid = false;if (selOption && selOption === 'MCD') {// MasterCardvalid = value > 0 && value.toString().length == 3;} else if (selOption && selOption === 'AMEX') {// American Expressvalid = value > 0 && value.toString().length == 4;}if (!valid) {throw PrimeFaces.util.ValidationContext.getMessage(this.MESSAGE_ID);}}
};

其次,我们必须为本地化消息创建一个JavaScript文件,例如lang_en.js

PrimeFaces.locales['en'] = {messages : PrimeFaces.locales['en_US'].messages
};$.extend(PrimeFaces.locales['en'].messages, {...'invalid.cvc':'Card Validation Code is invalid'
});

Bean具有两个必需属性,并用@NotNull注释。 另外,属性cvc带有我们的自定义注释@ValidCVCforCardMenu的属性forCardMenu指向列出可用银行卡的p:selectOneMenu的样式类。

@Named
@ViewScoped
public class ExtendCsvBean implements Serializable {@NotNullprivate String card;@NotNull@ValidCVC(forCardMenu = "@(.card)")private Integer cvc;public void save() {RequestContext.getCurrentInstance().execute("alert('Saved!')");}// getters / setters...
}

在XHTML片段中,我们有一个带有两个银行卡的选择菜单和一个CVC输入字段。 p:commandButton验证字段并在回发时执行方法save()

<h:panelGrid id="pgrid" columns="3" cellpadding="3" style="margin-bottom:10px;"><p:outputLabel for="card" value="Card"/><p:selectOneMenu id="card" styleClass="card"value="#{extendCsvBean.card}"><f:selectItem itemLabel="Please select a card"itemValue="#{null}"/><f:selectItem itemLabel="MasterCard"itemValue="MCD"/><f:selectItem itemLabel="American Express"itemValue="AMEX"/></p:selectOneMenu><p:message for="card"/><p:outputLabel for="cvc" value="CVC"/><p:inputText id="cvc" value="#{extendCsvBean.cvc}"/><p:message for="cvc"/>
</h:panelGrid><p:commandButton validateClient="true" value="Save"process="@this pgrid" update="pgrid" action="#{extendCsvBean.save}"/>

注意:如您所见, p:selectOneMenup:inputText指定必需的属性。 我们可以实现的转变@NotNull注释与价值所需要的属性, true ,如果我们设置的参数范围内primefaces.TRANSFORM_METADATAtrue

在最后一步中,所有必需JavaScript文件都必须包含在页面上。

<h:outputScript library="js" name="chapter10/lang_en.js"/>
<h:outputScript library="js" name="chapter10/validators.js"/>

下两张图片显示验证失败时会发生什么

如果一切正常,则出现一个带有已保存文本的警告框。 向用户显示。

怎么运行的…

消息密钥invalid.cvc.message和文本应放在名为ValidationMessages资源包中,例如ValidationMessages_en.propertiesValidationMessages是Bean验证规范中指定的标准名称。 属性文件应位于应用程序类路径中,并包含以下条目: invalid.cvc.message=Card Validation Code is invalid 。 此配置对于服务器端验证很重要。

CvcClientConstraint中的getMetadata()方法提供了一个具有名称,值对的映射。 元数据在呈现HTML中公开。 可以通过element.data(name)在客户端访问这些值,其中element是基础本机HTML元素的jQuery对象。 具有元数据的CVC字段呈现为

<input type="text" data-forcardmenu="@(.card)"data-p-con="javax.faces.Integer" data-p-required="true"...>

最有趣的部分是客户端验证器的实现。 要验证的值已经是数字,因为首先它由PrimeFaces的内置客户端转换器针对数据类型java.lang.Integer转换。 我们只需要检查该值是否为正且具有有效长度。 有效长度取决于菜单p:selectOneMenu中所选的卡片,PrimeFaces JavaScript API可以使用PrimeFaces.expressions.SearchExpressionFacade.resolveComponentsAsSelector(selector)对其进行访问,其中选择器是任何PrimeFaces选择器,在我们的示例中为@(.card) 。 如果验证失败,则通过引发throw PrimeFaces.util.ValidationContext.getMessage(text, parameter)引发异常。

通过在p:commandButton上设置validateClient=”true”来触发客户端验证。

翻译自: https://www.javacodegeeks.com/2015/01/extending-primefaces-csv-with-bean-validation.html

使用Bean验证扩展PrimeFaces CSV相关推荐

  1. primefaces_使用Bean验证扩展PrimeFaces CSV

    primefaces 你们中有些人已经知道我和我的合著者MertÇalışkan正在研究PrimeFaces Cookbook的2.版. Packt Publishing允许我从新章节"客户 ...

  2. Apache CXF 3.0:JAX-RS 2.0和Bean验证1.1最终一起

    即将发布的出色的Apache CXF框架3.0版 (当前处于里程碑2阶段)带来了许多有趣且有用的功能,越来越接近提供完整的JAX-RS 2.0支持. Bean Validation 1.1的支持是我们 ...

  3. easyui js解析字符串_js相关:详解Jquery Easyui的验证扩展

    js相关:详解Jquery Easyui的验证扩展 发布于 2020-7-2| 复制链接 本文主要介绍了Jquery Easyui验证扩展,Easyui验证,Easyui校验,js正则表达式.具有一定 ...

  4. java bean 验证_Java Bean验证基础

    java bean 验证 这篇文章总结了一些简单,快速的示例,这些示例说明了您想使用Java Beans Validation API(JSR 349,JSR 303)进行的最常见操作. 记住,Bea ...

  5. jsr303自定义验证_JSR 310新日期/时间API的自定义JSR 303 Bean验证约束

    jsr303自定义验证 借助JSR 310,Java 8终于为我们带来了不错的日期和时间API. 对于仍在使用Java 7的那些人(就像我目前在我的当前项目中一样),有很好的反向移植,请访问www.t ...

  6. java jax-rs_在Java EE 7和WildFly中使用Bean验证来验证JAX-RS资源数据

    java jax-rs 我过去已经两次接触过这个主题. 首先,在我的文章< 在Java EE 6中将Bean验证与JAX-RS集成>中 ,描述了甚至在Java EE平台规范中尚未定义之前, ...

  7. ejb+jpa_使用Arquillian(包括JPA,EJB,Bean验证和CDI)测试Java EE 6

    ejb+jpa 很长时间以来,我听到很多人对Arquillian说好话 . 尽管我一直在阅读有关其用法的文章,但实际上我无法在一篇文章中找到涵盖我认为重要的某些方面的文章. 当然,我看起来还不够努力. ...

  8. Java Bean验证基础

    这篇文章总结了一些简单易用的示例,这些示例说明了您想使用Java Beans Validation API(JSR 349,JSR 303)进行的最常见操作. 记住,Beans Validation独 ...

  9. java jax-rs_在Java EE 6中将Bean验证与JAX-RS集成

    java jax-rs JavaBeans验证(Bean验证)是Java EE 6平台的一部分提供的新验证模型. 约束通过以JavaBeans组件(例如托管Bean)的字段,方法或类上的注释形式的约束 ...

最新文章

  1. 在Java中实现单例模式的有效方法是什么? [关闭]
  2. Zoom市值达586亿美元,放中国科技巨头能排第6!净利润暴涨135倍,每天3亿人开会...
  3. python常用英文单词怎么写,Python常用英文单词
  4. CentOS忘记密码
  5. 将源字符串的前count个字符拷贝到目的字符串中strncpy()
  6. Nodejs之http模块详解
  7. vs.php中使用apache或IIS7进行外部调试
  8. 人与人之间交往最重要的是什么?
  9. 【云计算】docker registry v2简介
  10. Eclipse安装包 百度网盘
  11. 写Java要用什么编译器最好?
  12. android之socket编程实例
  13. 国企计算机技术岗都干什么,大家听说的国企技术岗都是什么样子的?
  14. 计算机学前教育教案,学前教育视唱练耳教案
  15. 3D汽车作品大赏!汇集世界各地CG大佬们的“汽车梦”
  16. matlab中如何转动三维图_MATLAB小技巧之:绕任意空间轴旋转三维图形
  17. 对称加密 非对称加密
  18. Springboot毕设项目校园二手交易平台x9zo8java+VUE+Mybatis+Maven+Mysql+sprnig)
  19. IMX6ULL裸机程序--4.时钟树分析
  20. 亚马逊AWS服务器下载kaggle竞赛数据

热门文章

  1. 2020蓝桥杯省赛---java---B---4( 合并检测)
  2. 16-就业课(2.1)-应用容器-Docker
  3. java 单例 生命周期_单例模式--- 声明周期托管方式
  4. java this用法_java中this用法小结
  5. 配置oracle网络连接命令,配置oracle网络环境
  6. nginx-配置基于ip或域名的虚拟主机
  7. java日志——基本日志+高级日志
  8. 利用树的先序和后序遍历打印os中的目录树
  9. 如何把模型表导入数据库
  10. 测试框架 如何测试私有方法_高效的企业测试–测试框架(5/6)