嗨,大家好!
尽管标题强调验证一词,但本文实际上是关于JSF生命周期的。 那是因为我相信,真正了解生命周期的最简单方法之一就是通过做出我们一直在做的事情:验证用户输入。
总的来说,理解所谓的JSF生命周期是使初级开发人员与众不同的地方,初级开发人员主要复制并粘贴他们看到的所有内容,而高级开发人员则可以在面对不常见的情况而不会损害代码质量的同时“贴上翅膀” 。
通常,当我面试某人声称自己拥有JSF的经验并且似乎不了解其生命周期时,我认为这是一个不好的信号:)
总览
如果您曾经读过一本关于JSF的书,那么您可能已经看过以下图片:
此图显示了生命周期中的所有阶段。 关于我们对本文感兴趣的内容,其中三个对我们最有用: 流程验证 , 更新模型值和调用应用程序 。
让我们假设一个假设的应用程序在其中注册用户。 在其中,我们将询问用户的姓名和年龄:
为了“处理”上面的表单,我们可能需要两个工件:一个接受请求的Managed Bean和一个表示正在注册的Person的实体对象:
证实
直截了当地,让我们假设我们有一个要求,说明“ age”字段不能接收负值。 完全有道理,因为没有人可以拥有“ -32”岁。 (我们还假设使用javascript是没有问题的。在这样的简单验证中,javascript就可以了。但是请允许我继续使用这个。):)
然后,我们剩下两种主要方法来验证“年龄”字段:
- 在我们的Managed Bean类的“ save()”方法内部。 ( 不建议使用)
- 使用JSF验证程序 。 (推荐的)
我坚持使用“不推荐”和“推荐”这两个词来强调,在过程验证阶段之外验证用户输入不是犯罪。 我们经常面临无法实现“幸福之路”的情况。 犯罪是在做事的时候根本不知道发生了什么!
接下来是解释。
不像这样
我归类为“不推荐”的方法是在“ save()”方法所包含的逻辑中验证托管Bean中的“ age”字段。 当用户点击在“提交”,JSF生命周期踢,并调用“保存()”的调用应用程序相法右(注意这是在处理验证阶段之后 ):
为了了解为什么这可能是不好的,我们需要了解在每个JSF生命周期阶段中发生的事情,并且还要记住Invoke Application阶段发生在 Process Validation和Update Model Values之后 。 概括地说,这意味着仅在Person对象已经通过JSF生命周期更新了其“ age”属性后 ,才调用“ save()”方法:
查看上图,您可能已经注意到,当调用我们的“ save()”方法时,JSF生命周期已经在域类Person对象的“ age”属性中设置了不一致的值。 那是个问题吗?
是的,可能是。 由于我们的域类大多数时候都是由JPA管理的,因此,像这样的无效值可能最终会在没有我们意识到的情况下进入数据库。 根据我的个人经验,我得出的结论是,使用“扩展持久性上下文”(即跨越多个请求/响应周期的JPA上下文)时,此类错误更为常见。 如今,这通常是通过使用“对话上下文”来完成的,例如CDI中或在已故的JBoss Seam中。
现在我们在说
理想情况下,我们应该使用JSF Validator验证输入。 注意,这并不一定意味着只为验证逻辑创建一个单独的类,而是意味着我们必须在正确的阶段 ( 流程验证)触发验证 :
- 我们可以创建一个带有@FacesValidator注释的验证器类。
- 或在我们的Managed Bean类中创建一个验证方法 。
就像我说的那样,无论如何进行验证,主要要注意的是在正确的阶段进行验证。 还有几种验证输入的方法,例如Bean Validation 。
就这样
希望你们喜欢。 评论和问题可以留在下面。 直到下次!
翻译自: https://www.javacodegeeks.com/2015/03/jsf-validation-at-the-right-phase-understanding-the-life-cycle.html