jsf表单验证_JSF:在正确的阶段进行验证(了解生命周期)

jsf表单验证

嗨,大家好!

尽管标题强调验证一词,但本文实际上是关于JSF生命周期的。 那是因为我相信,真正了解生命周期的最简单方法之一就是通过做出我们一直在做的事情:验证用户输入。

通常,了解所谓的JSF生命周期是使初级开发人员与众不同的地方,这些初级开发人员主要复制并粘贴他们在其面前看到的所有内容,而高级开发人员则可以在面对不常见的情况而不会损害代码质量的情况下“赞叹”它。 。

通常,当我面试某个声称拥有JSF经验并且似乎不了解生命周期的人时,我认为这是一个不好的信号:)

总览

如果您曾经读过一本关于JSF的书,那么您可能已经看过以下图片:

jsf-life-cycle

此图显示了生命周期中的所有阶段。 关于本文感兴趣的内容,其中三个对我们最有用: 流程验证更新模型值调用应用程序

让我们假设一个假设的应用程序在其中注册用户。 在其中,我们将询问用户的姓名和年龄:

用户表格

为了“处理”上面的表单,我们可能需要两个工件:一个接受请求的Managed Bean和一个表示正在注册的Person的实体对象:

类

证实

直截了当地,让我们假设我们有一个要求说明“年龄”字段不能接收负值。 完全有道理,因为没有人可以拥有“ -32”岁。 (我们还假设使用javascript是没有问题的。在这样的简单验证中,javascript就可以了。但是请耐心等待这个。):)

然后,我们剩下两种主要方法来验证“年龄”字段:

  1. 在我们的Managed Bean类的“ save()”方法内部。 ( 建议使用)
  2. 使用JSF验证程序 。 (推荐的)

我坚持使用“不建议”和“推荐”这两个词来强调,在过程验证阶段之外验证用户输入不是犯罪。 我们经常面临无法实现“幸福之路”的情况。 犯罪是在做事的时候根本不知道发生了什么!

接下来是解释。

不像这样

我归类为“不推荐”的方法是在“ save()”方法所包含的逻辑中验证托管Bean中的“ age”字段。 当用户点击在“提交”,JSF生命周期踢,并调用“保存()”调用应用程序相法右(注意这是在处理验证阶段之后 ):

保存方法

为了了解为什么这可能是不好的,我们需要了解在每个JSF生命周期阶段中发生的事情,并且还要记住Invoke Application阶段发生 Process ValidationUpdate Model Values之后 。 概括地说,这意味着仅在Person对象已经通过JSF生命周期更新了其“ age”属性之后才调用“ save()”方法:

完整生命周期

查看上图,您可能已经注意到,当调用我们的“ save()”方法时,JSF生命周期已经在域类Person对象的“ age”属性中设置了不一致的值。 那是个问题吗?

是的,可能是。 由于我们的域类大多数时候都是由JPA管理的,因此,像这样的无效值可能最终会在没有我们意识到的情况下进入数据库。 根据我的个人经验,我得出的结论是,在使用“扩展的持久性上下文”(即跨越多个请求/响应周期的JPA上下文)时,此类错误更为常见。 如今,这通常是通过使用“对话上下文”来完成的,例如CDI中或在已故的JBoss Seam中。

现在我们在说

理想情况下,我们应该使用JSF Validator验证输入。 注意,这并不一定意味着仅为验证逻辑创建一个单独的类,而是意味着我们必须在正确的阶段流程验证)触发验证

  1. 我们可以创建一个带有@FacesValidator注释的验证器类。
  2. 或在我们的Managed Bean类中创建一个验证方法

两个验证者

就像我说的那样,无论如何进行验证,主要要注意的是在正确的阶段进行验证。 还有几种验证输入的方法,例如Bean Validation

就这样

希望你们喜欢。 评论和问题可以留在下面。 直到下一次!

翻译自: https://www.javacodegeeks.com/2015/03/jsf-validation-at-the-right-phase-understanding-the-life-cycle.html

jsf表单验证

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

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

相关文章

java广度优先爬虫示例,【爬虫】广度优先遍历抓取数据概述

这次都是一些纯语言的表达,可能会有点啰嗦,或者有点枯燥,也是对爬虫的一些小小的见解,可能只是一些常见话,哈哈,还是耐心的写完。网络爬虫的整体执行流程:1)确定一个(多个)种子网页2)进行数据内…

if语句的用法是什么

if语句的用法:if语句是指编程语言(包括c语言、C#、VB、java、汇编语言等)中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。if语句概述if语句是指编程语言(包…

c语言如何实现玫瑰花

c语言实现玫瑰花的方法:#include #include ?#include #include #include #pragma comment(lib,"winmm.lib")//定义全局变量int rosesize 500;int h -250;//定义结构体struct DOT {double x;double y;double z;double r;double g;};bool calc(double a,…

maven 部署nexus_设置本地Nexus存储库并从Maven部署WAR文件

maven 部署nexusMaven Central充当中央存储库管理器,二进制文件由不同的团队/公司/个人上载并与世界其他地方共享。 就像github和其他对源代码控制非常有效的源代码存储库一样,这些存储库管理器还充当您自己生成的二进制工件的部署目标。 设置本地存储库…

c vector用法是什么

在c 中&#xff0c;vector是一个十分有用的容器&#xff0c;c vector用法是&#xff1a;1、基本操作(1)头文件#include.(2)创建vector对象&#xff0c;vector vec;(3)尾部插入数字&#xff1a;vec.push_back(a);(4)使用下标访问元素&#xff0c;cout<<vec[0]<<endl…

c语言for循环如何打印菱形

c语言for循环打印菱形的方法&#xff1a;使用两个for循环&#xff0c;实现条件判断&#xff0c;代码为【int i,j;for(i0; i<2*n-1; i )_(in-i-1&&jc语言for循环打印菱形的方法&#xff1a;方法一&#xff08;以循环为主打印&#xff09;#include void print(int n) …

quasar 异步回调_Java IO基准测试:Quasar与异步ForkJoinPool与ManagedBlock

quasar 异步回调“ Arien看到了我们运行的parallelStreams和ForkJoin基准测试的结果后&#xff0c;在Twitter上与我们联系。 这激起了他的兴趣&#xff0c;因此他进行了一些自己的测试&#xff0c;将Quasar纤维加入了混合物。 这是他的结果和结论。” –塔基皮&#xff08;Taki…

php微信自动回复机器人,微信自动回复机器人功能怎么实现?

原标题&#xff1a;微信自动回复机器人功能怎么实现&#xff1f;微信自动回复机器人功能怎么实现&#xff1f;最近有不少小伙伴都在询问这个问题。很多人在微信营销的过程中&#xff0c;都会有这样的问题&#xff0c;微信好友太多&#xff0c;想要都在第一时间回复&#xff0c;…

C语言怎么合并两个有序链表

C语言合并两个有序链表的方法&#xff1a;拼接指定的两个有序链表的所有节点即可。例如两个有序链表分别为【1->2->4】和【1->3->4】&#xff0c;合并后的有序链表为【1->1->2->3->4->4】。具体方法&#xff1a;将两个有序链表合并为一个新的有序链…

jira集成开发代码_7种JIRA集成可优化您的Java开发流程

jira集成开发代码有哪些最佳集成可以用来优化JIRA工作流程&#xff1f; 我喜欢寻找在工作流程中提高效率的方法。 看着那些小小的自动化和流畅的流程&#xff0c;我的脸上露出了微笑。 我知道我并不孤单&#xff0c;有时花费更多的时间来获得一点点提升以使其正常工作&#xff…

c语言源程序结构是怎样的?

一个C语言源程序至少一个有main函数&#xff0c;定义函数必须指定 4 个元素&#xff1a;返回类型、函数名、圆括号内的形参表&#xff08;可能为空&#xff09;和函数体。源程序的结构特点&#xff1a;1、一个C语言源程序可以由一个或多个源文件组成。2、每个源文件可由一个或多…

c语言规定在一个源程序中main函数的位置是什么?

一个c程序有且仅有一个main函数&#xff0c;除main函数之外可以有若干个其它的函数&#xff0c;每个函数实现某一特定的操作。C语言规定&#xff0c;在一个源程序中&#xff0c;main函数的位置可以任意。因为&#xff1a;在一个C语言源程序中&#xff0c;程序总是从main函数开始…

jax-ws和jax-rs_使用JAX-RS和Jetty创建Web服务和Rest Server

jax-ws和jax-rs用Java创建WebService非常容易。 将其添加到ServletContainer并将其部署到嵌入式WebServer仅需要几行代码。 让我们创建一个具有两个函数的简单计算器&#xff0c;作为WebService的示例。 计算器将计算任意数量的squareRoot和平方。 它将返回一个简单的JSON响应…

可运行的c语言程序的扩展名为什么?

C语言源程序经过C语言编译程序编译之后&#xff0c;生成一个后缀为“.OBJ”的二进制文件(称为目标文件)&#xff0c;最后还要由称为“连接程序”(link)的软件&#xff0c;把此“.OBJ”文件与c语言提供的各种库函数连接在一起&#xff0c;生成一个后缀“.EXE”的可执行文件。显然…

activemq消息持久化_将ActiveMQ持久消息传递性能提高25倍

activemq消息持久化Apache ActiveMQ&#xff0c;JBoss A-MQ和Red Hat Apache ActiveMQ是一个非常受欢迎的开源消息传递代理&#xff0c;由创建&#xff08;和从事&#xff09; Apache Karaf &#xff0c; Apache Camel &#xff0c; Apache ServiceMix以及许多其他工具的人提供…

c语言实现两个有序链表的合并(代码示例)

c语言实现两个有序链表的合并&#xff1a;现有两个有序单链表&#xff0c;通过代码实现将两个单链表合并为一个有序的新表&#xff0c;要求使用旧表的空间&#xff0c;不能新分配内存#include #include typedef struct List{ int a; struct List *next;}list;void newLis…

hibernate工厂模式_Hibernate锁定模式–乐观锁定模式如何工作

hibernate工厂模式显式乐观锁定 在上一篇文章中 &#xff0c;我介绍了Java持久性锁定的基本概念。 隐式锁定机制可防止丢失更新 &#xff0c;它适用于我们可以主动修改的实体。 尽管隐式乐观锁定是一种广泛使用的技术&#xff0c;但很少有人了解显式乐观锁定模式的内部工作原理…

using用法是什么?

using用法是&#xff1a;1、命名空间using namespace 命名空间;//这样每次使用命名空间中的变量时就不用指定命名空间了注意&#xff1a;头文件中不应有using命名空间的声明2、类型别名&#xff08;C 11&#xff09;using aa double;//等价于typedef double aatypedef double …

学习C ,常见的误解

学习C 你是否会有以下几点误解&#xff1f;1. “要理解C &#xff0c;你必须先学习C”2. “C 是一门面向对象的语言”3. “为了软件可靠性&#xff0c;你需要垃圾回收”4. “为了效率&#xff0c;你必须编写底层代码”5. “C 只适用于大型、复杂的程序”如果你中*了&#xff0c…

openshift使用_OpenShift DIY:使用Gradle构建Spring Boot / Undertow应用程序

openshift使用由于此错误&#xff0c; Gradle 1.6是在OpenShift上运行的最后一个受支持的Gradle版本。 但是从Gradle 2.2开始&#xff0c;这不再是问题&#xff0c;因此&#xff0c;使用自己动手做墨盒&#xff0c;在OpenShift上运行最新的Gradle不再是问题。 DIY盒带是一种实验…