因为primefaces在国内使用的并非太多,所以,国内对jsf作系统、详细的介绍的资料不多,即便有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至仍是错误的,极可能会误导使用者。html
相对来讲,看国内的那些仅仅是翻译过来的文章或书籍不如直接看国外的官方文档或资料来的实在,在我讲述jsf页面中如何使用js调用后台bean方法以前,先给你们说几个国外的资料。在primefaces官方网站上,你能够搜索到几乎全部你须要的东西,primefaces官网为:http://www.primefaces.org/showcase/index.xhtml 如过以为本身英语很差的童鞋,能够前往primefaces国内镜像网站查阅资料: http://www.primefaces.cn/ ,只是国内的这个网站正在翻译中,有些东西还不完善;若是有想细致的了解primefaces的朋友,还能够下载primefaces的官方文档,最新的官方文档为5.2,全英文,我在这里给你们提供我下载好的primefaces官方文档:http://pan.baidu.com/s/1mg3i9Ry ,在这个文档里你能够经过他们的示例来组合出来不少有趣的东西。另外我在淘宝上发现了Primefaces官方的JSF框架,官方售价300RMB,淘宝售价才五元,你们能够前去学习:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-12555052969.2.nPXnNz&id=523880497056java
在本文中,咱们将介绍 JSF 转换和验证框架的概念,它比您所想的要容易使用得多,也灵活得多。git
首先咱们将介绍应用于 JSF 生命周期的转换和验证过程,而后展现一个简单的 JSF 应用程序中 的默认转换和验证过程。接着将展现如何建立和插入自定义的实现,以应对要求更高的场景。正如 Rick 在之前的文章中所说的,咱们会理论与实践并重,先介绍概念,再用一个实际 例子说明这些概念的应用。示例应用程序将涵盖大多数转换和验证用例,虽然只是初级的。web
注意,示例应用程序的默认编译环境是 Maven,不过 , 还提供了一个 Ant 脚本。 能够单击本页顶部或者底部的 Code图标下载示例源代码。为了简便起见,您会发现,该例子的设置与上一篇文章中的同样。 关于构建环境配置的更多说明,包括在 Ant 环境中而不是在 Maven 环境中编译和运行 示例应用程序的说明,请参阅 参考资料。框架
虽然在 JSF Web 应用程序中使用转换和验证不必定要理解 JavaServer Faces 生命周期的基础知识,可是在深刻转换和验证内容以前,最好对一些基本知识作一回顾。 此外,掌握一点 JSF 生命周期技巧能够极大地帮助简化 Web 应用程序的开发 工做。还有助于更好地理解 JSF 的可插入能力。jsp
下面的图片描绘了咱们所说的“基本 JSF 生命周期”。 基本是在暗示这只是一个典型的处理所提交表单值的请求 - 响应(request-and-response)场景。学习
显然,不一样的场景对这里重点描述的生命周期有不一样的影响。咱们将在 本文稍后介绍其中一些场景。如今,只须要注意转换和验证过程发生在 应用请求值、处理验证和 呈现响应阶段便可。网站
咱们将在稍后介绍为何转换和验证会在这些阶段出现,可是首先让咱们 澄清一个更基本的问题:转换是什么?简单地说,转换是确保数据拥有正确的对象或者类型的过程。下面是两个典型的转换:spa
java.util.Date
。至于 验证,它用于确保数据包含所指望的内容。下面是两个 典型的验证:翻译
java.util.Date 的格式为 MM/yyyy。
Float 在 1.0 和 100.0 之间。
转换和验证的主要目的是确保在更新模型数据以前已经通过了正确的 无害处理。以后,当须要调用应用程序方法用这些些数据实际 作一些事情时, 就能够有把握地假定模型的某些状态。转换和验证使您能够侧重于业务逻辑,而不是侧重于对输入数据进行繁琐的资格认定,好比 null 检验、长度限定、范围边界,等等。
所以,在 更新模型数据生命周期阶段中,在组件数据被绑定到 backing bean 模型 以前 进行转换和验证处理是有道理的。正如图 1 所示,转换发生在应用请求值阶段,而验证发生在 处理验证阶段。下图突出显示了这些阶段。
注意,图 2 中描绘的转换和验证过程表示了将 UIInput
组件的 immediate
属性设置为 false
时的应用程序流程。 若是这个属性设置为 true
,那么转换和验证会发生在生命周期更早的时期,即应用请求值阶段(参见图 3)。对使用 immediate 属性的详细讨论超出了本文的范围,可是在某些状况下,好比管理动态清单(可能您还记得,本系列的上一篇文章中曾介绍过),它颇有用,它甚至能够绕过验证(在与 UICommand
组件结合使用时)。能想像一个 须要彻底绕过验证的应用程序吗?
下面的图片内容展现了当 immediate
属性设置为 true
时, 在 JSF 应用程序生命周期中的哪些地方进行转换和验证。
下面,咱们将用一个示例应用程序展现所讨论的概念。本月的示例应用程序 将展现 JSF 的转换和验证能力。记住,这个示例应用程序很是简单,没有追求一些没必要要的面面俱到: 不管如何,咱们的目的不是构建一个在真实世界中使用的应用程序!这个示例应用程序 将展现如下几点:
使用标准 JSF 转换器转换表单字段数据。
使用标准 JSF 验证组件验证表单字段数据。
如何编写自定义转换器和验证器。
如何在 faces-config.xml 文件中注册自定义转换器和验证器。
如何定制默认错误消息。
这个示例应用程序是一个简单的用户注册表单。咱们的目标是收集用户数据,好比 姓名、年龄、电子邮箱地址和电话号码。而后,咱们将展现如何利用 JSF 转换和验证 确保收集的数据对于模型是适合的。
这个应用程序使用了三个 JSP 页:
index.jsp 将用户定向到 UserRegistration.jsp。
UserRegistration.jsp 包含应用程序的表单字段。
results.jsp 通知应用程序用户已经注册。
咱们将首先分析编写 JSF 转换过程的选择。
如前所述,转换是确保数据对象或者类型正确的一个过程,所以,咱们将字符串值 转换为其余类型,好比 Date
对象、基本浮点型或者 Float
对象。可使用自带的转换器,也能够编写 自定义的转换器。
JSF 提供了许多标准数据转换器。也能够经过实现 Converter
接口插入 自定义转换器,可是这些将在后面进行介绍。下表显示了 JSF 进行简单数据转换所使用的转换器 id及其对应的实现类。大多数数据转换是自动发生的。
javax.faces.BigDecimal | javax.faces.convert.BigDecimalConverter |
javax.faces.BigInteger | javax.faces.convert.BigIntegerConverter |
javax.faces.Boolean | javax.faces.convert.BooleanConverter |
javax.faces.Byte | javax.faces.convert.ByteConverter |
javax.faces.Character | javax.faces.convert.CharacterConverter |
javax.faces.DateTime | javax.faces.convert.DateTimeConverter |
javax.faces.Double | javax.faces.convert.DoubleConverter |
javax.faces.Float | javax.faces.convert.FloatConverter |
下图展现了用户年龄的默认转换。
JSF 标签配置以下:
<h:inputText id="age" value="#{UserRegistration.user.age}"/>
UserRegistration.user.age表示一个值绑定属性,它的类型为 int
。对于基本型或者 BigInteger
/ BigDecimal
的绑定,JSF 选择了标准转换器。不过,还能够经过 <f:converter/>
标签,利用一个特定的转换器来增长粒度,以下所示。
<h:inputText id="age" value="#{UserRegistration.user.age}"> <f:converter id="javax.faces.Short"/> </h:inputText>
在下图中,能够看到 JSF 使用标准转换器的场景。在这种状况下,虽然 年龄其实是一个有效的整数,但转换仍然会失败,由于该值不是短整型的。
尽管在默认状况下,JSF 能够很好地处理基本型及相似的类型,可是在处理 日期数据时,必须指定转换标签 <f:convertDateTime/>
。 这个标签基于 java.text
包,并使用短、长和自定义样式。下面是一 个例子:
<!-- UserRegistration.jsp --> <h:inputText id="birthDate" value="#{UserRegistration.user.birthDate}"> <f:convertDateTime pattern="MM/yyyy"/> </h:inputText>
这个例子展现了如何用 <f:convertDateTime/>
确保用户的生日能够转换为 格式为 MM/yyyy(月 / 年)的日期对象。请参阅 JSF 的 java.text.SimpleDataFormat
(在参考资料中),以获取模式列表。
除了能够转换日期和时间格式外,JSF 还 提供了处理像百分数或者货币数据这类值的特殊转换器。 这个转换器处理分组(如逗号)、小数、货币符号等。例如, 如下 <f:convertNumber/>
的用法就是处理货币的一种技巧:
<!-- UserRegistration.jsp --> <h:inputText id="salary" value="#{UserRegistration.user.salary}"> <f:convertNumber maxFractionDigits="2" groupingUsed="true" currencySymbol="$" maxIntegerDigits="7" type="currency"/> </h:inputText>
在下图中,能够看到一些格式编排不正确的货币数据,以及所致使的转换错误。
若是须要将字段数据转换为特定于应用程序的值对象,则须要自定义数据转换, 以下面例子所示:
String 转换为 PhoneNumber 对象 (PhoneNumber.areaCode、PhoneNumber.prefix、 ...)。
String 转换为 Name 对象 (Name.first、Name.last)。
String 转换为 ProductCode 对象 (ProductCode.partNum、ProductCode.rev、 ...)。
要建立自定义转换器,必须完成以步骤:
实现 Converter
接口(也就是 javax.faxes.convert.Converter
)。
实现 getAsObject
方法,它将一个字段(字符串) 转换为一个对象(例如,PhoneNumber
)。
实现 getAsString
方法,它将一个对象 (如 PhoneNumber
)转换为一个字符串。
在 Faces
上下文中注册自定义转换器。
用 <f:converter/>
标签在 JSP 中插入这个转换器。
您能够本身看到如何在 JSF 应用程序生命周期中加入这些步骤。 在下图 中,JSF 在应用请求值阶段调用自定义转换器的 getAsObject
方法。 转换器必须在这里将请求字符串转换为所需的对象类型,而后返回这个对象,将它存储在相应的 JSF 组件中。 若是该值被返回呈如今视图中,那么 JSF 将在呈现响应阶段调用 getAsString
方法。 这意味着转换器还要负责将对象数据转换回字符串表示形式。
我将在下一篇博客中国使用一个案例分析来展现 Converter
接口、getAsObject
和 getAsString
方法的实现,同时还将展现如何在 Faces
上下文中注册这个转换器。