JSF:在正确的阶段进行验证(了解生命周期)

嗨,大家好!

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

总的来说,理解所谓的JSF生命周期是使初级开发人员与众不同的地方,初级开发人员主要复制并粘贴他们看到的所有内容,而高级开发人员则可以在面对不常见的情况而不会损害代码质量的同时“贴上翅膀” 。

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

总览

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

jsf-life-cycle

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

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

用户表格

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

类

证实

直截了当地,让我们假设我们有一个要求,说明“ age”字段不能接收负值。 完全有道理,因为没有人可以拥有“ -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

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

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

相关文章

OpenShift v3:使用WildFly和MySQL的Java EE 7入门

OpenShift是Red Hat的开源PaaS平台。 OpenShift v3 (将于今年发布)将提供使用Docker和Kubernetes运行微服务的整体体验。 以经典的Red Hat方式,所有工作都在OpenShift Origin的开源中完成。 这也将推动OpenShift Online和OpenShift Enterpris…

mySQL日期函数并运行_mysql日期相关的函数

1、获取当前时间:/**获得当前日期时间(date time)函数:now(), 常用**/select now() fromdual;/**获取当前时间戳,current_timestamp或者current_timestamp()**/select current_timestamp, current_timestamp() fromdual;/**获得当前日期时间…

序列化对象C++对象的JSON序列化与反序列化探索

新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 一:背景 作为一名C开发人员,我始终很期待能够像C#与JAVA那样,可以省力的进行对象的序列化与反序列化,但到现在为止&#xff…

python socket udp并发_Python进阶----UDP协议使用socket通信,socketserver模块实现并发

Python进阶----UDP协议使用socket通信,socketserver模块实现并发一丶基于UDP协议的socket实现UDP协议传输数据代码如下:👇### 客户端# -*-coding:utf-8-*-# Author:Dsimport socket# 实例化UDP协议的socket对象 ,配置参数, socket.SOCK_DGRAM(数据报)udp_clisocket.…

Java IO基准测试:Quasar与异步ForkJoinPool与ManagedBlock

“ Arien看到了我们运行的parallelStreams和ForkJoin基准测试的结果后,在Twitter上与我们联系。 这激起了他的兴趣,因此他进行了一些自己的测试,将Quasar纤维加入了混合物。 这是他的结果和结论。” –塔基皮(Takipi)A…

WP8开发札记(一)WP8应用生命周期管理

在介绍生命周期前,我们先了解两个相关的概念。 1、墓碑机制:WP8与Android采用的真后台机制不同,WP8采用的是墓碑机制。一旦从当前应用程序离开(非退出),该应用会被墓碑化,这样可以更好的管理&am…

python类继承中构造方法_第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解...

第8.3节Python类的__init__方法深入剖析:构造方法与继承详解一、 引言上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类没有重写构造方法,Python将会给出默认的__init__方法…

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

由于此bug, Gradle 1.6是在OpenShift上运行的最后一个受支持的Gradle版本。 但是从Gradle 2.2开始,这不再是问题,因此使用自己动手做墨盒在OpenShift上运行最新的Gradle不再是问题。 DIY墨盒是一种实验性墨盒,它提供了一种在OpenS…

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

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

maya 中使用节点连接来求余数:

绑个东西要用到求余,不喜欢用表达式,就想用节点连出来,找了下网上只有 镀金铆钉 在火星时代上的教程,不过不能下载了,就自己想了下,终于搞出来了,做下笔记,不要忘了。 求余的思路&a…

java web 登录界面案例_【JavaWeb】74:写一个登录案例

今天是刘小爱自学Java的第74天。感谢你的观看,谢谢你。话不多说,开始今天的学习:Java又常被称之为后台开发。什么叫后台呢?除了后台还有什么前台、前端后端……这些概念一大堆,还容易弄混。以一个三层架构的知识点来引…

7种JIRA集成可优化Java开发流程

有哪些最佳集成可以用来优化JIRA工作流程? 我喜欢寻找在工作流程中提高效率的方法。 看着那些小的自动化和流畅的流程,使我的脸上露出笑容。 我知道我并不孤单,偶尔花更多的时间来获得一点点提升以使其正常工作,而不是最终节省了我…

hive处理日志,自定义inputformat

开放环境,hadoop-0.20.2,hive-0.6 1.日志分隔符 Xml代码 2010-05-31 10:50:17|||61.132.4.82|||http://www.360buy.com/product/201185.html 2010-05-31 10:50:17|||61.132.4.82|||http://www.360buy.com/product/201185.html分隔符是“ ||| ”&#xf…

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

Apache ActiveMQ,JBoss A-MQ和Red Hat Apache ActiveMQ是一个非常受欢迎的开源消息传递代理,由创建(和工作) Apache Karaf , Apache Camel , Apache ServiceMix以及许多其他工具的人提供给您。 它拥有一个充…

ECMA学习小结(3)——constructor 和 prototype

每个函数都有一个prototype的属性,当我们以这个函数为构造函数创建实例时(即用new的形式),创建出来的这个对象是没有prototype的属性的。以下代码为例:在console里进行调试cf 拥有一个prototype的属性,这个…

java什么是网络接口_java 网络编程 -- IP地址的表示与网络接口信息的获取(InetAddress和NetworkInterface)...

使用java进行网络程序的开发,可以说是一件令人愉悦的事情,对于用惯了C网络接口编程的人来说,当他们首次使用Java开发网络应用程序,会发现java开发网络应用是如此的简单,甚至仅用几分钟时间,您就可以学会这种…

如何使用悲观锁定修复乐观锁定竞争条件

概括 在我以前的文章中 ,我解释了使用显式乐观锁定的好处。 然后我们发现,在很短的时间范围内,并发交易仍可以在我们当前交易被提交之前立即提交产品价格更改。 此问题可以描述如下: 爱丽丝拿产品 然后,她决定订购…

SWT外观:自定义FlatScrollBar颜色等

最近,我引入了一个自定义滑块控件 ,该控件可用于改善SWT外观和更细微的视图布局的感觉。 令人高兴的是,该小部件似乎已经在Code Affine世界之外找到了较早的采用者 。 这导致了一些增强 ,这些增强将在以下各节中介绍。 SWT滚动条…

java虚拟机编译_[四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式...

前言简介前文已经对虚拟机进行过了简单的介绍,并且也对class文件结构,以及字节码指令进行了详尽的说明想要了解JVM的运行机制,以及如何优化你的代码,你还需要了解一下,java编译器到底是如何编译你的代码的本文不是从最底层的编译原理讲解本文是针对java代码,去查看归纳总结编译…

提高性能:流的非阻塞处理

1.简介 想象一下,我们有一个需要访问外部Web服务的应用程序,以便收集有关客户端的信息,然后对其进行处理。 更具体地说,我们无法在一次调用中获得所有这些信息。 如果我们要查找不同的客户端,则需要多次调用。 如下图…