本月,Rizon Software 的 CTO Paul Tabor 应邀与我一道解除针对 JSF 的 FUD。在本文中,我们将介绍 JSF 转换和验证框架的概念,它比您所想的要容易使用得多,也灵活得多。
首先我们将介绍应用于 JSF 生命周期的转换和验证过程,然后展示一个简单的 JSF 应用程序中的默认转换和验证过程。接着将展示如何创建和插入自定义的实现,以应对要求更高的场景。正如 Rick 在以前的文章中所说的,我们会理论与实践并重,先介绍概念,再用一个实际例子说明这些概念的应用。示例应用程序将涵盖大多数转换和验证用例,虽然只是初级的。
注意,示例应用程序的默认编译环境是 Maven,不过, 还提供了一个 Ant 脚本。可以单击本页顶部或者底部的 Code 图标下载示例源代码。为了简便起见,您会发现,该例子的设置与上一篇文章中的一样。关于构建环境配置的更多说明,包括在 Ant 环境中而不是在 Maven 环境中编译和运行示例应用程序的说明,请参阅参考资料。
转换和验证
虽然在 JSF Web 应用程序中使用转换和验证不一定要理解 JavaServer Faces 生命周期的基础知识,但是在深入转换和验证内容之前,最好对一些基本知识做一回顾。此外,掌握一点 JSF 生命周期技巧可以极大地帮助简化 Web 应用程序的开发工作。还有助于更好地理解 JSF 的可插入能力。
图 1 描绘了我们所说的“基本 JSF 生命周期”。 基本 是在暗示这只是一个典型的处理所提交表单值的请求-响应(request-and-response)场景。
图 1. 基本 JSF 生命周期
显然,不同的场景对这里重点描述的生命周期有不同的影响。我们将在本文稍后介绍其中一些场景。现在,只需要注意转换和验证过程发生在应用请求值、处理验证 和呈现响应 阶段即可。
我们将在稍后介绍为什么转换和验证会在这些阶段出现,但是首先让我们澄清一个更基本的问题:转换 是什么?简单地说,转换是确保数据拥有正确的对象或者类型的过程。下面是两个典型的转换:
字符串值可以转换为 java.util.Date。
字符串值可以转换为 Float。
至于验证,它用于确保数据包含所期望的内容。下面是两个典型的验证:
java.util.Date 的格式为 MM/yyyy。
Float 在 1.0 和 100.0 之间。
关注生命周期阶段
转换和验证的主要目的是确保在更新模型数据之前已经经过了正确的无害处理。之后,当需要调用应用程序方法用这些些数据实际做一些事情 时,就可以有把握地假定模型的某些状态。转换和验证使您可以侧重于业务逻辑,而不是侧重于对输入数据进行繁琐的资格认定,比如 null 检验、长度限定、范围边界,等等。
因此,在更新模型数据 生命周期阶段中,在组件数据被绑定到 backing bean 模型之前 进行转换和验证处理是有道理的。正如图 1 所示,转换发生在应用请求值阶段,而验证发生在处理验证阶段。图 2 突出显示了这些阶段。
图 2. 要关注的转换和验证阶段