使用JSF 2.0可以更轻松地进行多字段验证

开发应用程序表单时最常见的需求之一是多字段验证(或跨字段验证,但我没有使用此术语,因为当我将其放在Google上时,实际上得到了一些战后图片)。 我正在谈论的情况是,我们需要比较初始日期是早于结束日期还是值小于另一个日期。 这不是在每个面向业务的框架中都有明显的功能吗? 并不是的。
不幸的是,JSF规范默认情况下不支持它。 因此,直到最新的生产版本( JSR 245 – JSF 2.1),JSF才提供现成的多字段验证功能。 由于JSR 344提到了“多字段验证”,我们可能希望在JSF 2.2中有所收获 。 同时,开发人员利用了他们卓有成效的创造力来实施他们的解决方案。 您可以在Stackoverflow.com上找到许多可行的替代方案; 人们创建自己的组件 ; 在Java EE之上构建的框架试图覆盖此功能; 还有很多其他情况。

我不喜欢找到的任何解决方案。 有些很复杂,有些则不太优雅。 因此,我决定也要有创造力,并尝试一个更简单的解决方案,当重构时间到来时,易于理解和更改。 这并不意味着我提出的建议比其他建议要好。 我只是提出一些更简单的建议。

在以下示例中,我检查分配的预算是否小于预算限制。 如果不是,则向用户显示一条消息。 该示例仅考虑两个字段,但是可以根据需要扩展到任意多个字段。

步骤1:在托管bean中为每个要验证的字段创建一个属性:

以下属性专用于多字段验证。

private BigDecimal allocatedBudget;
private BigDecimal budgetLimit;

在此示例中,我在名为MBean的类中进行编码,并用@ManagedBean和@RequestScoped进行了注释。

步骤2:在相同的托管Bean中为每个字段创建一个验证方法

此解决方案考虑在托管bean中实现的验证方法,而不是接口javax.faces.validator.Validator的实现。 只要定义三个标准参数,即FacesContext,UIComponent和代表字段输入值的Object,就可以为验证方法命名。 只有该值对我们的验证有用。 请参阅验证方法:

public void validateAllocatedBudget(FacesContext context,UIComponent component, Object value) {this.validationAllocatedBudget = (BigDecimal) value;
}public void validateBudgetLimit(FacesContext context,UIComponent component, Object value) {this.validationBudgetLimit = (BigDecimal) value;if(this.validationBudgetLimit.compareTo(this.validationAllocatedBudget) < 0) {throw new ValidatorException(new FacesMessage("Invalid allocated budget!");}
}

validateAllocatedBudget方法不会验证分配的预算。 它只是将属性validationAllocatedBudget设置为允许其值在以后使用。 有可能因为验证方法的调用顺序与在JSF代码中声明的顺序相同。 因此,您可以为验证所涉及的每个字段创建一个简单的方法。 有效的验证发生在方法validateBudgetLimit中,该方法是JSF文件中最新调用的验证方法,因此也是最后一个要执行的方法。

最好以表单中字段的相同顺序声明属性和验证方法。 顺序不会影响算法的功能,但是有助于理解逻辑。 另一方面,JSF文件中的调用顺序很重要。

步骤3:使用参数验证器来引用验证方法

从下面的字段中调用上述方法。 请记住,属性和方法是在类MBean中实现的。

<h:outputLabel for="allocBudget" value="Allocated Budget"/>
<h:inputText id="allocBudget" label="Allocated Budget"value="#{mBean.operation.allocatedBudget}"validator="#{mBean.validateAllocatedBudget}"/><h:outputLabel for="budgetLimit" value="Budget Limit"/>
<h:inputText id="budgetLimit" label="Budget Limit"value="#{mBean.operation.budgetLimit}"validator="#{mBean.validateBudgetLimit}"/>

参考: Hildeberto博客博客中的JCG合作伙伴 Hildeberto Mendonca提供的使用JSF 2.0的更轻松多字段验证 。

翻译自: https://www.javacodegeeks.com/2012/12/easier-multi-field-validation-with-jsf-2-0.html

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

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

相关文章

mysql 5.6.34 二进制下载_linux下安装mysql二进制版本(5.6.34)

我这里下载的是mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz1.创建mysql用户和用户组#groupadd mysql#useradd -g mysql mysql#passwd mysql2.下载解压二进制文件,解压,进入解压出来的文件[roothost01 db]# tar -xvf mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz[roothost01 db]#…

Cesium调用Geoserver发布的 WMS、WFS服务

1 GeoServer服务发布 1.1 WMS服务 下载GeoServer安装版安装&#xff0c;同时安装geopackage扩展&#xff0c;以备使用。使用XX地图下载器下载地图&#xff0c;导出成GeoPackage地图文件。 &#xff08;1&#xff09;下载 GeoPackage DEM数据 &#xff08;2&#xff09;打开GeoS…

curl put delete post get请求类型参数

curl如何发起DELETE/PUT请求 DELETE: curl_setopt($ch, CURLOPT_CUSTOMREQUEST, DELETE);PUT: curl_setopt($ch, CURLOPT_PUT, true);GET: curl_setopt($ch, CURLOPT_HTTPGET, true);POST: curl_setopt($ch, CURLOPT_POST, true); 转载于:https://www.cnblogs.com/xuhaohao/p/7…

如何用ThreadLocals射击自己

它将很好地启动。 像大多数故事一样。 您会发现一个新概念&#xff0c;并对其功能感到惊讶。 然后突然装备了这把新锤子&#xff0c;一切开始看起来像钉子。 根据我们过去几个月的经验&#xff0c; java.lang.ThreadLocal真是一锤定音。 我想这全都归结为ThreadLocal的工作原理…

mysql--------四种索引类型

一、索引的类型 mysql索引的四种类型&#xff1a;主键索引、唯一索引、普通索引和全文索引。通过给字段添加索引可以提高数据的读取速度&#xff0c;提高项目的并发能力和抗压能力。索引优化时mysql中的一种优化方式。索引的作用相当于图书的目录&#xff0c;可以根据目录中的…

Mysql高级考试题_MySQL高级应用答案试题题目及答案,期末考试题库,章节测验答案...

MySQL高级应用答案试题题目及答案,期末考试题库,章节测验答案更多相关问题MgSO4&#xff1f;7H2O在医药上常用做泻药&#xff0c;工业上可用氯碱工业中的一次盐泥为原料生产。已知一次盐泥中含有镁、钙、铁、铝、下列实验方案设计正确的是A&#xff0e;分解高锰酸钾制氧气后&am…

CSS--选择符大全(常用css选择符)

&#xff08;一&#xff09;元素选择符 E&#xff08;某个元素,如p&#xff09;id&#xff08;使用id&#xff0c;如#idName&#xff09;class&#xff08;使用class&#xff0c;如.myclass&#xff09;通配符&#xff1a;* &#xff08;二&#xff09;关系选择符 包含选择符…

51nod 1384 全排列

直接使用STL函数就可以 AC代码&#xff1a; #include<bits/stdc.h>using namespace std;int main(){ char a[100]; int n; while(cin>>a) { int nstrlen(a); sort(a,an); do { cout<<a<<endl; }while(next_permutation(a,an)); } return 0;} 转载于:ht…

bzoj4709 [Jsoi2011]柠檬

Description Flute很喜欢柠檬。它准备了一串用树枝串起来的贝壳&#xff0c;打算用一种魔法把贝壳变成柠檬。贝壳一共有\(N(1\le N\le 100000)\)只&#xff0c;按顺序串在树枝上。为了方便&#xff0c;我们从左到右给贝壳编号 \(1...N\) 。每只贝壳的大小不一定相同&#xff0c…

确保任务的执行顺序

有时有必要对线程池中的任务施加一定的顺序。 JavaSpecialists通讯的第206期提出了一种这样的情况&#xff1a;我们有多个连接&#xff0c;使用NIO可以从中读取。 我们需要确保给定连接中的事件按顺序执行&#xff0c;但是不同连接之间的事件可以自由混合。 我想提出一个类似但…

西瓜大战java_Java中的线程及(简单飞机大战)实现

在讲到线程之前我们先聊一下程序&#xff0c;进程&#xff0c;线程这三者的概念&#xff1a;程序是指为了实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合。程序存储在磁盘上&#xff0c;由一系列的文件数据组成。进程&#xff1a;程序运行起来之后就是一个进程…

transition

一、语法 transition: property duration timing-function delay transition属性是个复合属性&#xff0c;她包括以下几个子属性&#xff1a; transition-property &#xff1a;规定设置过渡效果的css属性名称transition-duration &#xff1a;规定完成过渡效果需要多少秒或…

CentOS服务器

CentOS搭建Wordpress 这是一个很有趣的学习链接&#xff1a;https://cloud.tencent.com/developer/labs/lab/10001 可以亲自动手试试,当你联系完之后&#xff0c;还有阅读文档&#xff0c;可以保存记录下来。 登录linux服务器搭建Wordpress用到的命令 登录服务器 登录服务器 s…

rust tpa_Rust(腐蚀)怎么tp求大神指教。请写在下面

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼拆除自己建筑的建筑:/removetp到别人旁边:/tpr 游戏名字接受别人tp:/tpa创造战队:/clan create 战队名字 战队简介(这东西没什么卵用)邀请成员加入战队:/clan invite 游戏名字接受邀请进入战队:/clan join 战队名字查看战队成员:/c…

图解在VC里使用graphics.h画图(相似TC)

1 www.easyx.cn 下载 EasyX 库 我下的2014;解压后例如以下图&#xff1b; 2 依据自己的VC 版本号进行安装 3 在控制台画一个圆 #include <graphics.h> // 引用图形库 #include <conio.h> void main() {initgraph(640, 480); // 初始化画图窗体circle(200, 200, 100…

使用SwingWorker的Java Swing中的多线程

如果要使用Swing用J​​ava编写桌面或Java Web Start程序&#xff0c;您可能会觉得需要通过创建自己的线程在后台运行某些东西。 没有什么可以阻止您在Swing中使用标准的多线程技术&#xff0c;并且需要遵循通常的注意事项。 如果您有多个线程访问相同的变量&#xff0c;则需要…

微信小程序之阻止冒泡事件

众所周知&#xff0c;在微信小程序给标签绑定点击方法大家都会想到 "bindtap" 但是在页面中会遇到 点击 会冒泡而触发其他元素的时间发生 那么怎么办呢 就把引发冒泡事件的始作俑者的 bindtap 更改成catchtap 即可 转载于:https://www.cnblogs.com/wzy0526/p/8423989…

MySql Jar 包下载

MySql JAR 包下载 我们要使用Spring 链接MySql 需要两个Jar 包 一个是C3p0 一个是MySql 的Connection Jar 包 C3p0&#xff1a; 进入下面的网址 http://www.mchange.com/projects/c3p0/ 按照黄色的指示 下载 2. MySql Jar 包 进入MySql 官网 https://dev.mysql.com/down…

c语言以空格分割字符串_c语言中,输入任意字符串,任意空格隔开

c语言中,输入任意字符串,任意空格隔开关注:132 答案:3 mip版解决时间 2021-01-27 16:01提问者更无风月2021-01-27 01:51如题,希望大神代码最佳答案二级知识专家闪光的男人2021-01-27 02:50用scanf以%s读入字符串&#xff0c;即可实现输入以空格分隔的字符串。以下代码功能为&…

Unity经典游戏教程之:是男人就下100层

版权声明&#xff1a; 本文原创发布于博客园"优梦创客"的博客空间&#xff08;网址&#xff1a;http://www.cnblogs.com/raymondking123/&#xff09;以及微信公众号"优梦创客"&#xff08;微信号&#xff1a;unitymaker&#xff09;您可以自由转载&#x…