primefaces_使用Bean验证扩展PrimeFaces CSV

primefaces

你们中有些人已经知道我和我的合著者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与银行卡号一起用作安全功能。 它是一个长度在三到四位数之间的数字。 例如,万事达卡或Visa卡需要三位数,而美国运通卡需要四位数。 因此,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 Validation 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"/>

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

3427_10_04

3427_10_05

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

3427_10_06

这个怎么运作…

消息密钥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

primefaces

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android math类,GitHub - Zihin/MathModeling-Android

MathModeling-Android项目背景说明与数学建模有关的基于Android平台的手机应用软件&#xff0c;面向全体人员提供数学建模相关服务&#xff0c;开发人员均为东北大学软件学院本科学生&#xff0c;开发时间为两个月。基本功能实现如下功能&#xff0c;满足同学们在数学建模学习上…

guid主键 oracle_使用GUID作为数据库主键的测试

今天听了MSDN的WebCast&#xff0c;是关于Entlib的数据访问的讲座&#xff0c;末尾我问了两个自己所关心的问题&#xff1a;在一个较大型的应用中&#xff0c;如果需要用到两套以上的数据库(如&#xff1a;SQL Server和Oracle)&#xff0c;是否可以把需要的sql查询全部封装在存…

函数指针,指针函数,函数指针数组

这是一个群友发的笔试题目&#xff0c;里面涉及的东西也比较有意思。直接看代码void (*f[])(char *)这个是个什么东西&#xff1f;我们先看看下面的东西函数指针和指针函数的定义我们看个代码int *func(int a,int b)我们之前说过运算符的优先级&#xff0c;「 * 」 的优先级低…

win10默认浏览器不显示谷歌浏览器_win10系统谷歌浏览器怎么用不了?谷歌浏览器打不开网页的解决方法...

刚接触谷歌Chrome浏览器的时候&#xff0c;会觉得这个软件的操作界面非常地陌生&#xff0c;界面简洁得不像话。win10系统电脑下载好Google Chrome既谷歌浏览器后&#xff0c;发现打不开网页&#xff0c;谷歌浏览器怎么用不了&#xff1f;其实通过设置搜索引擎就可以打开了&…

畅享10e会有鸿蒙吗,功能虽小作用很大 华为畅享10e隐藏功能大揭秘

原标题&#xff1a;功能虽小作用很大 华为畅享10e隐藏功能大揭秘如今使用手机游戏、观影、听音乐、刷短视频、拍照等多种多样的娱乐方式,充斥着年轻人生活之中。作为年轻用户娱乐的重要载体,现在的手机不仅硬件强大,在软件功能上方面也取得了突破性进展,不仅仅是高端机,甚至千元…

jax-ws和jax-rs_使用JAX-RS和Spring构建HATEOAS API

jax-ws和jax-rs在我以前的博客文章中&#xff0c;我展示了如何使用Spring Boot配置Jersey多么容易。 我对Spring Boot和Jersey的探索并未结束&#xff0c;我研究了在Spring Boot应用程序中将Spring HATEOAS与Jersey一起使用的可能性。 Spring HATEOS允许创建遵循HATEOAS原理的R…

C this指针的理解和作用

C 程序到 C 程序的翻译 要想理解 C 的 this 指针&#xff0c;我们可以先把下面的 C 代码转换成 C 代码&#xff1a;C 语言是没有类定义 class 关键词&#xff0c;但是有跟 class 类似的定义&#xff0c;那就是 struct 结构体。m_price 变量是 Car 类的成员变量&#xff0c;那…

yolov3安卓实现_YOLOv3 的 TensorFlow 实现,GitHub 完整源码解析

来自华盛顿大学的 Joseph Redmon 和 Ali Farhadi 提出的YOLOv3 通过在 YOLO 中加入设计细节的变化&#xff0c;这个新模型在取得相当准确率的情况下实现了检测速度的很大提升&#xff0c;一般它比 R-CNN 快 1000 倍、比 Fast R-CNN 快 100 倍。这里附上 YOLOv3 的论文地址&…

C++ inline 函数简介

1.inline 函数简介inline 函数由 inline 关键字定义&#xff0c;引入 inline 函数的主要原因是用它替代 C 中复杂易错不易维护的宏函数。2.编译器对 inline 函数的处理办法编译器在编译阶段完成对 inline 函数的处理&#xff0c;即对 inline 函数的调用替换为函数的本体。但 in…

intellij ide_UltraESB的首选IDE – IntelliJ IDEA

intellij ide在AdroitLogic&#xff0c;我们长期以来一直在使用IntelliJ IDEA进行开发。 它是Java和相关语言/技术的最佳IDE&#xff08;它可能也是许多其他语言的选择&#xff0c;但我的经验主要是Java和相关技术&#xff09;。 Groovy和IDEA的Grails的集成很棒。 通过自动发…

install npm 到某个文件下执行_如何将npm安装到指定目录?

从npm版本3.8.6开始&#xff0c;您可以使用npm install --prefix ./install/here 安装在指定的目录中。node_modules即使node_modules较高层次结构中已存在目录&#xff0c;NPM 也会自动创建文件夹。您还可以package.json在当前目录中拥有a &#xff0c;然后使用以下--prefix选…

android 启动界面位置,android 修改默认启动项launcher(一)

需求&#xff1a;不去掉系统自带launcher的前提下&#xff0c;默认启动指定应用作为launcher现象&#xff1a;应用中带有属性"android.intent.category.HOME"&#xff0c;开机会弹出选择界面思路&#xff1a;跳过选择界面&#xff0c;直接选中要启动的launcher并直接…

C++抽象类

概念在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。抽象类往往用来表征对问题领域进行分…

iview select选中值取值_iView的Select选择框

目录在此先列出解决了那些问题&#xff0c;以防读者看完了没有用处&#xff1a;1、示例&#xff0c;最基础的使用方法2、传参&#xff0c;传多个值的方式3、默认值4、清空重置无效5、可搜索的用法及如何限制搜索字符长度一、示例html:{{item.name}}js:data: {formSend: {name: …

tibco_TIBCO产品的微服务和DevOps

tibco大家都在谈论微服务 &#xff0c;这些天。 您可以在数百篇文章和博客文章中读到很多有关微服务的信息。 马丁福勒 &#xff08; Martin Fowler &#xff09;的文章是一个很好的起点&#xff0c;该文章引发了有关这种新架构概念的大量讨论。 另一个不错的资源是独立于供应…

android 冰箱 活动,Android活动的使用

创建第一个应用&#xff1a;步骤一&#xff1a;1、Activity :一个页面2、Layout &#xff1a;页面布局3、Res&#xff1a;页面内的资源注意&#xff1a;所有的Activity都是继承与android.app.activity类&#xff0c;通过override实现。简单理解Activity 代表一个用户所能看到的…

C atoi函数

作用atoi()函数将数字格式的字符串转换为整数类型。例如&#xff0c;将字符串1253124127转换成数字1253124127。注意首要注意atoi函数可以转化如下这种字符串1fdafhdjfhkas关于参数的注意事项&#xff0c;atoi()函数的参数是要转换的字符串。该字符串的格式为[空格][符号][数字…

python lock_python多线程Lock和RLock的区别

python多线程Lock和RLock的区别1. 两种锁的不同1.1 定义为了确保对共享资源的访问&#xff0c;python提供了两种锁&#xff0c;一个是上一篇提到的Lock&#xff0c;还有一个就是RLock&#xff0c;他们的区别在于&#xff1a;Lock是可用的最低级别的同步指令&#xff0c;一个线程…

开式蓄冷罐与闭式蓄冷罐_一罐将其全部统治:Arquillian + Java 8

开式蓄冷罐与闭式蓄冷罐借助Java 8 &#xff0c;已实现了许多新的语言改进&#xff0c;以简化开发人员的生活。 在我看来&#xff0c; Java 8的最大优点之一是&#xff0c;在某些情况下&#xff0c;已开发的代码看起来比使用以前的方法更漂亮&#xff0c;我指的是Lambdas和Meth…

C 预处理指令

C 预处理指令C语言、C 语言的预处理器。用于在编译器处理程序之前预扫描源代码&#xff0c;完成头文件的包含, 宏扩展, 条件编译, 行控制&#xff08;line control&#xff09;等操作编译的四个阶段C语言标准规定&#xff0c;预处理是指前4个编译阶段&#xff08;phases of tra…