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语句是指编程语言(包…

gradle创建web工程_Gradle入门:创建Web应用程序项目

gradle创建web工程这篇博客文章描述了如何使用Gradle创建一个Web应用程序项目。 更具体地说,我们想创建一个使用Java的Web应用程序项目,将我们的Web应用程序打包到WAR文件中,并在开发环境中运行我们的Web应用程序。 让我们找出如何满足这些…

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,…

php保存成乱序,php – 调用MySQL存储过程时出现乱序错误

我正在尝试使用PDO调用存储过程,但在尝试对结果进行获取时遇到以下错误.警告:数据包乱序.预计1收到16.数据包大小 163我的存储过程使用两个游标,我在从临时表中选择之前关闭它.我怀疑这可能是问题,因为我可以直接在MySQL中调用我的SP并且可以看到结果.在迁移到php_p…

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…

Matlab中的logspace函数,matlab之logspace函数

logspace()在matlab帮助里的英文注释是这样的&#xff1a;logspaceGeneratelogarithmically spaced vectorsSyntaxy logspace(a,b)y logspace(a,b,n)y logspace(a,pi)DescriptionThe logspace function generates logarithmically spacedvectors. Especially useful for cre…

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…

php拼接多个insert,php – 将多个INSERTS分成一个表和多个表

我正在尝试使用PostgreSQL数据库在 PHP中开发一个Q& A网站.我有一个动作来创建一个页面,其中包含标题,正文,类别和标签.我设法插入所有这些字段,但是我在插入多个标记值时遇到了一些问题.我使用这个函数将逗号分隔的值放到一个数组中,现在我想要一些东西将每个数组元素插入…

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

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

gradle maven_将工件从Gradle自动提升到Maven Central

gradle maven快速教程&#xff0c;无需在带有Gradle Nexus Staging插件的Nexus GUI中单击即可将Gradle项目中的工件提升/释放到Maven Central。 介绍 Maven Central &#xff08;又名“中央存储库”&#xff09;是&#xff08;可能是&#xff09;全球最大的一组开源工件&#…

matlab 自定义对象,自定义类的对象显示

用于自定义对象显示的特定方法You can customize object display based on the state of the object and you can change different parts of the display.Change the order and number of properties displayed for an object of your class.Customize each of the three part…

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响应…

图像锐化处理算法matlab,图像锐化matlab算法

《图像锐化matlab算法》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《图像锐化matlab算法(2页珍藏版)》请在读根文库上搜索。1、%常用图像锐化算法clcclearclose allimaimread(132.jpg);%读入图像imargb2gray(ima);%转为灰度图像 imadouble(ima);bw1 edge(ima,sobe…