FeaturesDocs & SupportCommunityBlogsPartners

在 Visual Web JSF 应用程序中转换和验证数据

在本教程中,您将学习 JSF 1.2(Woodstock) 转换器和验证器。转换器用于转换输入的字符串,使其成为 Java 数据类型以满足各种不同的目的(如计算)。验证器用于验证特定范围内的用户输入。您将使用 Visual Web JSF 框架创建一个温度转换应用程序,用于将温度从 Celsius 转换成 Fahrenheit。该应用程序使用转换器将用户输入从字符串值转换成数值的 Java 数据类型,应用程序可对此类型执行计算。该应用程序使用验证器验证指定范围内的数据,并通过消息组件报告验证错误。随后,您将构建一个 Web 应用程序,用于计算货币值并显示格式化的日期值。

同时,您还将了解如何将验证处理程序添加到应用程序中,以及如何在标准验证失败时重写 IDE 提供的内置错误信息。

预计时间:30 分钟

目录

本页上的内容适用 NetBeans IDE 6.5

 

要学习本教程,您需要具备以下软件和资源。

软件或资源 要求的版本
NetBeans IDE Java 6.5 版本
Java 开发工具包 (Java Developer Kit, JDK) 版本 6 或版本 5
JavaServer Faces 组件/
Java EE 平台
1.2(带有 Java EE 5*)或
1.1(带有 J2EE 1.4)
GlassFish 应用服务器 V2
Travel 数据库 无版本要求

* 要利用 NetBeans IDE 的 Java EE 5 功能,请使用完全符合 Java EE 5 规范的应用服务器,例如 GlassFish Application Server V2 UR2。如果使用的是其他服务器,请查阅发行说明常见问题解答,了解已知问题和解决方法。有关支持的服务器和 Java EE 平台的详细信息,请参见发行说明

设计应用程序

在本节中,您将创建应用程序并在其中添加必要的组件。

  1. 创建一个新的 Web 应用程序项目,并将其命名为 ValidatorConverter。启用 Visual Web JSF 框架。

    下图显示了以下步骤将创建的页面。
  2. 从“组件面板”的“Woodstock 基本”部分拖动一个“文本字段”组件放到页面上。将 label 属性设置为 Celsius 并将 text 属性设置为 0.0

    label text 的属性位于“属性”窗口的“外观”类别下。text 值在运行时将显示为缺省值。
  3. 通过选中“属性”窗口中的复选框将“文本字段”组件的 required 属性设置为 True。

    required 属性“属性”窗口的“数据”部分下。TRUE 的属性值要求用户为输入字段输入值。如果用户没有输入值就提交页面,则会返回标准的验证错误信息。红色的星号出现在 Celsius 标签旁表明设置了必需的属性。
  4. 右键单击“文本字段”组件并选择“添加绑定属性”
  5. 在页面上放置一个“标签”组件。将该标签的 text 属性设置为 Fahrenheit
  6. 将“静态文本”组件放在该标签的右侧。将 text 属性设置为 32.0 表示 Fahrenheit 刻度下水的冰点。
  7. 右键单击“静态文本”组件并选择“添加绑定属性”
  8. 从“组件面板”的“基本”类别下拖动一个“消息”组件放到 Fahrenheit 标签下。
  9. 在“消息”组件的“属性”窗口中,选择 textField1 作为其 for 属性。

    设置消息组件的属性

    “消息”组件的文本更改为 extField1 的“消息”摘要,如下图所示。

    textfield1 的消息摘要

在下节中,您将添加验证器以确保用户输入的条目介于指定的范围内。

使用验证器

如果应用程序需要从用户收集信息(例如登陆名和密码),那么验证用户数据就很重要。IDE 提供了一组用于验证用户输入的组件;您可以从“组件面板”的“验证器”部分访问它们。最简单的验证是确保输入字段含有某种数值。

“双精度范围验证器”用于测试数字型输入是否在指定范围内。数据类型必须是浮点型或者可以转换成浮点型。其他验证器包括“长度验证器”和“长整型范围验证器”。

  • “长度验证器”用于验证为组件输入的文本长度不小于或不大于验证器的最小和最大属性指定的值。其值必须是 java.lang.String
  • 使用“长整型范围验证器”验证用户输入值是否介于最小和最大值范围之内。其值必须是能转换成 Java 长数据类型的任何字符串值。

“组件面板”中的“验证器”和“转换器”。

使用验证器(或转换器,详见使用转换器一节)时,您可能还需要使用消息组件来指示验证失败的情况。在调用值更改或操作侦听程序(例如按钮操作方法)之前,Web 应用程序将执行所有验证。如果出现一个或多个验证错误,Web 应用程序就不再调用值更改侦听程序及操作侦听程序,而是重新提交该页面以便用户纠正问题。

对于本应用程序,在提交页面之前,您希望检查“文本字段”组件至少包含一个字符。同时需要一个消息组件来指示验证失败的情况。

 

如果验证失败,之前添加的“消息”组件会向用户发出通知。

  1. 展开“组件面板”的“验证器”部分。从“组件面板”拖动一个“双精度范围验证器”放到“文本字段”组件上。

    双精度范围验证器是不可见组件。缺省值 doubleRangeValidator1 出现在“导航”窗口和“属性”窗口的 验证器 属性中,如下图所示。

    “导航”窗口“属性”窗口
  2. 在“导航”窗口中,选择 doubleRangeValidator1。
  3. 在“属性”窗口中,为验证器设置范围。

    • maximum 属性设置为1000.0(非常高的温度)。
    • minimum 属性设置为 -273.15 (即在 Celsius 刻度下的绝对零度)。

在本节中,您将在应用程序中使用“双精度范围验证器”组件来验证用户的输入值。在下节中,您将在应用程序中使用转换器计算 Celsius 数值字符串的 Fahrenheit 值。

使用转换器

IDE 还提供了一组能转换组件数据的转换器。转换器在组件属性的 java.lang.String 值和 Java 数据类型之间进行数据类型转换。 可以从“组件面板”的“转换器”部分访问标准转换器。在绑定组件时,IDE 通常会标识数据类型,并在建立值属性绑定时设置相应的转换器。但是,您也可以在 IDE 里通过设置组件的转换属性来人为添加转换器。

注意:转换是在验证过程开始之前执行的。如果应用程序无法将用户提供的值转换成指定的数据类型,Web 应用程序就会拒绝输入并发送错误消息。如果页面中存在“消息组”组件和相关的“消息”组件,该错误信息就会出现在其中。可以用“数值转换器”指定输入必须匹配的模式,因此它是非常有用的转换器。

其他转换器组件包括(但不局限于)如下:

  • “Big Decimal 转换器”在 java.lang.String 值和 java.math.BigDecimal 之间进行数据类型转换,例如将 JSF 组件绑定到 Oracle 数据库列的 NUMBER 类型。
  • “布尔转换器”组件在 java.lang.String 值和 java.lang.Boolean 或 Java boolean 基本类型之间进行数据类型转换,例如将 JSF 组件绑定到数据库列的 BOOLEAN 类型。
  • “字节转换器”组件在 java.lang.String 值和 java.lang.Byte 或 Java byte 基本类型之间进行数据类型转换,例如将 JSF 组件绑定到数据库列的 SMALLINT 或 TINYINT 类型。
  • “日历转换器”组件在 java.lang.String 值和java.util.Calendar 之间进行数据类型转换。例如,可以使用此转换器将值转换成包含 dateTime 类型字段的 Web 服务。

 

在先前的步骤中,您设置了验证器以验证输入的 Celsius 温度是否介于绝对零度和 1000°之间。在以下的步骤中,您将使用“双精度转换器”将用户输入转换成双精度型,以便使用双精度型计算以 Celsius 输入的 Fahrenheit 值。

  1. 展开“组件面板”的“控制器”部分。从“组件面板”拖动一个“双精度转换器”放到“文本字段”组件上。

    该转换器指定“文本字段”组件返回“双精度”对象,而不是 "String"。缺省值 doubleConverter1 出现在“属性”窗口和“导航”窗口中。
  2. 双击“文本字段”组件,在 Java 编辑器中打开其源代码。

  3. 将以下代码(显示为粗体)添加到 textField1_processValueChange 操作方法中。

    代码样例 1:值更改事件处理程序方法
    public void textField1_processValueChange(ValueChangeEvent event) {
    double celsiusTemp = ((Double) textField1.getText()).doubleValue();
    double fahrenheitTemp = 9.0 * celsiusTemp / 5.0 + 32.0;
    staticText1.setText(new Double(fahrenheitTemp));

    }

    此代码设置了两个变量: celsiusTemp,输入到textField1 的值,和 fahrenheitTemp,通过应用指定计算得到 celsiusTemp 转换值。最后一行代码用于在“静态文本”字段设置 fahrenheitTemp 的新值。

测试应用程序

在本节中,您将使用各种输入来运行应用程序,以演示可能的验证和转换错误。

注意:缺省情况下,创建项目时会启用保存时编译功能,因此在 IDE 中运行应用程序时不需要首先编译代码。有关保存时编译功能的更多信息,请参见创建、导入、配置 Java 项目指南的“保存时编译”一节。

  1. 选择“运行”>“运行主项目”,以生成并运行应用程序。
  2. 从文本字段中删除 0.0 ,不输入任何值并按 Enter 键。验证文本字段出现了错误,如下图所示。

    要求输入时的验证错误

    发生这种错误的原因是已将文本的 required 属性设置为ture。访问者提交页面之后,Web 应用程序将按以下顺序执行输入验证 :

    1. 转换
    2. 需要输入
    3. 验证
    注意:只有在值实际发生更改并在所有验证成功时,值更改事件才会发生。

     

  3. 输入各种数字以测试应用程序。下图显示了输入值 100 时的结果。

    验证成功
  4. 在此验证了:输入越界的值后会显示验证错误,输入非数值字符串值后会显示转换错误。

    下图显示了输入值 -1000 时的结果。注意,在发生验证或转换错误时,程序不会调用值更改监听器方法并且“静态文本”组件中的值也不会发生更改。

    值越界时的验证错误
  5. 输入由字母或数值组成的字符串,例如 20x 。由于仅配置应用程序用于转换数值格式的数据,故返回转换错误,如下图所示。

    非法格式的转换错误

更多内容:使用“数值转换器”和“日期时间转换器”

“数值转换器”及“日期时间转换器”,作为其中的两个标准转换器,拥有各自的属性,允许您方便地指定数据的格式和形式。本教程演示了如何使用这两个转换器。

下图显示了本节将要创建的页面:

货币转换器应用程序

  1. 在“项目”窗口中,右键单击“验证器转换器”>“Web 页”并选择“新建”>“Visual Web JSF 页”。将页面命名为 Currency 并单击“完成”。
  2. 右键单击“验证器转换器”>“Web 页”> "Currency.jsp" 并选择“设置为起始页”。
  3. 从“组件面板”的“ Woodstock 基本”部分拖动一个“文本字段”组件并将其放到页面上。在“属性”窗口中,将“文本字段”的 label 属性设置为 Dollar Amount: ,并将其 required 属性设置为 True
  4. 右键单击“文本字段”组件并选择“添加绑定属性”
  5. 在“文本字段”组件的右侧放置一个“按钮”组件。将此按钮的 text 属性更改为 Convert

    注意:这样做会影响 JSF 1.2 “按钮”组件在 IE7 中的宽度。解决方法是在工作区的布局组件(网格面板,组面板,布局面板)中放置“按钮”组件。自动重新调整布局面板尺寸,调整“按钮”组件的大小。

  6. 右键单击“按钮”组件并选择“添加绑定属性”
  7. 从“组件面板”的“基本”部分拖动两个“标签”组件放到页面上。

    将第一个标签的 text 属性设置为 Converted to Euros: ,将第二个标签的 text 属性设置为 Date and Time:
  8. 在每个标签旁放置一个“静态文本”组件。
  9. 右键单击每个“静态文本”组件并选择“添加绑定属性”
  10. 从“组件面板”的“基本”部分,拖动一个“消息”组件放到 Date and Time 标签下方。

  11. 在“消息”组件的“属性”窗口,选择 textField1 作为其 for 属性。
  12. 从“组件面板”的“转换器”部分,拖动一个“数值转换器”放到“文本字段”组件上。

    数值转换器将指定“文本字段”组件返回数值型对象,而不是 "String"。
  13. 在“数字格式”对话框中,从“类型”下拉列表中选择“货币”。将“小数属性最大值”属性设置为 2 和并将“语言环境”设置为为“英国(美国)”,如下图所示,并单击“确定”。

    注意,“货币代码”的缺省设置为 USD 美利坚合众国, 美元,货币的缩写、国家及货币名称与“语言环境”是彼此相关的。选择不同的“语言环境”以显示其不同的货币。

    “数字格式”对话框

    “数值转换器”出现在“属性”窗口的转换器属性和“导航”窗口中。

  14. 从“组件面板”中,拖动一个“数值计算器”放到 Converted to Euros 标签旁的“静态文本”上。
  15. 在“数字格式”对话框中,从“类型”下拉表中选择“货币”并在“语言环境”下拉列表中选择“德文(德国)”。将“小数位数最大值”属性设置为 2,并单击“确定”。

    这次,“货币代码”的缺省值为EUR,欧洲各成员国,欧元。(例如,如果选择“德文(瑞士)”,“货币代码”的缺省值将为CHF,瑞士,法郎,因为瑞士不属于欧元区)。
  16. 从“组件面板”中,拖动一个“日期时间转换器”放到 "Date and Time" 标签旁的“静态文本”上。
  17. 在“导航”窗口中,选择 dateTimeConverter1
  18. 在转换器的“属性”窗口中,单击 pattern 属性的省略号 (...) 按钮。
  19. 在“模式”字段中键入 EEE, d MMM yyyy HH:mm:ss zzzz ,并单击“确定”。在模式字段中添加元素时,当前值就会出现在“属性”窗口中的模式属性中。

    请注意输入元素时值是怎样发生变化的。例如,如果你在开头键入 "EEEE" 替换 "EEE" ,模式值就会包含完整的星期天数,而不是其缩写形式。如果在结尾仅输入一个 "z" ,时区就缩写了。

    有关格式化日期和时间的更多信息,请参见定制格式的 Java 教程课程(外部链接显示在单独页面中)

添加代码

  1. 双击“转换器按钮”,在 Java 编辑器中打开其源代码。
  2. button1_action 方法上方添加以下两行代码。欧元与美元兑换率大约为 0.74。

    代码样例 2:欧元兑美元汇率的常量值
    // constant value for dollars to euros exchange 
    private static final double us2euros = 0.74;
  3. 将以下代码(粗体)到添加到 button1_action 方法中。代码中的注释指明了每行的作用。

    代码样例 3:美元兑欧元汇率的常量值
    public String button1_action( ) { 
    // get the amount of dollars the user entered
    Number dollars = (Number) textField1.getValue();
    // exchange the dollars for euros
    double euros = dollars.doubleValue() * us2euros;
    // display the amount of euros
    staticText1.setText(new Double(euros));
    // figure out the date and time
    Date date = new Date();
    staticText2.setText(date);
    return null;
    }
  4. 在 Java 编辑器中单击鼠标右键,然后选择“修复导入”。选择“全限定名称” java.util.Date 并单击“确定”。

测试应用程序

注意:缺省情况下,创建项目时会启用保存时编译功能,因此在 IDE 中运行应用程序时无需首先编译代码。有关保存时编译功能的更多信息,请参见创建、导入、配置 Java 项目指南的“保存时编译”一节。

  1. 运行应用程序。
  2. 输入各种数量的字符串,例如 $10。注意以下规则:
    • 如果输入字符串的第一个字符不是货币符号(如此例中的 $ )或者货币符号和第一个数字间存在空格,转换器都会抛出异常。“消息”组件将显示错误。
    • 可用逗号作分隔符,例如在 $1,234, 中,当然这不是必需的。逗号放在错误的位置,甚至在小数点的右边,就会被忽略。完成转换之后,小数点将重新显示在正确的位置。
    • 在小数点右边输入两位以上就会四舍五入到分位。这是特定于语言环境的,其与语言环境不同。(例如在日本,货币值很少以带小数点值的形式出现)

    输入 $100.00 后,显示的结果如下图所示。

    显示转换结果的页面

    输入 100 而不带 "$" , 结果如下图所示。从上图转换的值仍然不变,但是却显示了转换错误。

    显示了转换错误的页面

有关数字格式的更多信息,请参见 Java 教程定制格式(外部链接显示在单独页面中)

更多内容:添加自己的验证处理程序

如果标准验证器不能执行您所需要的验证检查,您可以方便的添加自己的验证处理程序。本节将使用 "NetBeans Visual Web JSF Application" 的功能创建验证处理程序以检查用户的输入并将其限制为三位数的数字。可以将这些步骤添加之前创建的 Currency.jsp 页面中。

  1. 单击“设计”按钮,返回“可视设计器”。
  2. 选择 Dollar Amount “文本字段”组件,将其 "required" 属性设置为 "False"。
  3. 从“组件面板”的“Woodstock 基本”部分拖动一个“文本字段”组件放到当前页面中。将“文本字段”的 "label" 属性设置为值:,并将 "required" 属性设置为 "True"
  4. 右键单击“文本字段”组件并选择“添加绑定属性”
  5. 拖放一个“按钮”组件到“文本字段”组件的右边。将此按钮的 text 属性更改为“提交”。
  6. 右键单击“按钮”组件并选择“添加绑定属性”
  7. 拖放一个“消息”组件到“文本字段”组件下方。

  8. 在“消息”组件的“属性”窗口中,选择 textField2 作为其 for 属性。

    “消息”组件的 text 属性将更改为“textField2 的消息摘要”。
  9. 右键单击“文本字段”属性并选择“编辑事件处理程序”> "validate"。

    此时将打开 Java 编辑器。IDE 将自动为 ValidatorException、FacesContext 及 FacesMessage 类添加 "import" 代码声明。插入点位于文本字段的 " validate" 事件中。第三个参数,value,就是将要验证的 "String" 。
  10. 输入以下代码(粗体)。

    代码样例 4:定制验证代码
    public void textField2_validate(FacesContext context, UIComponent component, Object value) {
    String s = String.valueOf(value);
    if (!s.matches("\\d\\d\\d")){
    throw new ValidatorException(new FacesMessage
    ("Not a three-digit number."));
    }
    }

    处理 String matche 方法使用正则表达式指定 String 可以接受的合法值。 \d 匹配数字(0-9)。

    字符串型的 "\" 对于 Java 解析器有特殊的含义。指定额外的 "\" 来转义第二个 "\" ,以确保其毫无改变地从解析器传递到模式解释器。因此,表达式 \d\d\d 匹配任何从 000 到 999 的三位数。

    如果 String 无法与正则表达式匹配,则传递信息给 ValidatorException 构造函数。消息在 FacesMessage 上排队并在呈现响应阶段显示在页面上。

  11. 在 Java 编辑器中单击鼠标右键,然后选择“修复导入”。在“修复所有导入”对话框中,单击“确定”。 IDE 将导入 javax.faces.validator.ValidatorException javax.faces.application.FacesMessage 包。
  12. 运行应用程序。输入不同长度的数字和字符串以测试应用程序。同时验证:未在文本字段中输入值时,程序将显示标准验证错误。

    输入四位数字后,结果显示如下。

    定制验证器示例与结果

更多内容:定制标准验证器消息

当标准验证失败时,您可以覆盖 NetBeans IDE 提供的内置错误信息。 如果您希望提供自定义消息,可以为项目创建资源包。请注意这是全局覆盖,而不是组件级覆盖。这意味着所有需要的组件都将返回相同的值。

定制消息

本节将介绍如何在 JSF 1.1 / J2EE 1.4 中为“长度验证器”、“双精度范围验证器”、“长整型范围验证器”定制消息。可以看到,这个过程比在 JSF 1.2 里添加定制消息要稍长一些。您将使用 IDE 为需要的输入定制缺省的错误信息。首先,创建资源包,其在程序使用的键和显示给用户的字符串之间建立映射,然后编辑 faces-config.xml 以指向 MyResources.properties 资源库。

注意:本节中的步骤依赖于名称为 ValidatorConverter 的项目。如果要选择不同的名称,请调整所有使用项目名称的地方,让它们能反映出您的项目名称。

  1. 在“项目”窗口中,右键单击该项目,然后选择“新建”>“其他”。
  2. 在“新建文件”向导中,从“类别”中选择“其他”并从“文件类型”中选择“属性文件”,然后单击“下一步”。
  3. 在“文件名”字段输入 MyResources 并在“文件夹”字段键入 src/java/validatorconverter ,单击“完成”。

    IDE 将创建资源包并在其中打开 MyResources.properties 文件。 MyResources.properties 文件为组件使用的信息提供替换文本。
  4. 关闭 MyResources.properties 文件。
  5. 在“文件”窗口中,展开 ValidatorConverte> src> java > validatorconverter ,右键单击 MyResources.properties ,然后选择“打开”以打开“键值属性编辑器”。

    在“键值属性编辑器”中,可以向资源包中添加键值对。
  6. 单击“新建属性”。
  7. 在“新建属性”对话框中,在“键”字段中键入 javax.faces.component.UIInput.REQUIRED。在“值”字段中,键入 Please enter a value and then press Enter

    重要注意:确保键的结尾处没有空格。空格会阻止应用程序在运行时正常工作。

    有关标准消息的所有键列表,请参见下面的标准消息键
  8. 单击“确定”。如下图所示,该值显示在“属性编辑器”中。

    MyResources.properties 的属性编辑器
  9. 在“项目”窗口中,展开“Web 页”> "Web-INF" 节点。右键单击 faces-config.xml 并选择“打开”。
  10. 在编辑工具栏中,单击 "XML" 。
  11. 在 faces.config 文件中,输入以下代码。请注意,此代码包含项目名称。如果项目名称不为 ValidatorConverter,请适当更改代码中的文本。请注意,在 message-bundle 元素中,应该把项目名称中的大写字符更改为小写字符。

    <application>
    <message-bundle>validatorconverter.MyResources</message-bundle>
    </application>

    message-bundle 元素代表一组本地化信息。此元素包含含有本地化消息资源包的全限定路径,在此,即为 validatorconverter.MyResources

  12. 运行项目。

    注意:缺省情况下,创建项目时会启用保存时编译功能,因此在 IDE 中运行应用程序时无需首先编译代码。有关保存时编译功能的更多信息,请参见创建、导入、配置 Java 项目指南的“保存时编译”一节。

  13. 删除文本字段中的任何文本并按下 Enter 键。

    如下图所示,您定制的消息显示在消息字段中。

    定制验证器消息

标准消息键

在 NetBeans IDE 中,您可以使用资源包处理信息消息,此消息是在请求处理生命周期中由于转换、验证及其他应用操作而导致出现的。下表列出了用于定义消息的键。

描述
javax.faces.component.UIInput.CONVERSION 出现转换错误
javax.faces.component.UIInput.REQUIRED 需要输入值
javax.faces.component.UISelectOne.INVALID 非有效选项值
javax.faces.component.UISelectMany.INVALID 非有效选项值
javax.faces.validator.NOT_IN_RANGE 指定属性不在预期值 {0} 和 {1} 之间
javax.faces.validator.DoubleRangeValidator.MAXIMUM 值大于允许最大值 {0}
javax.faces.validator.DoubleRangeValidator.MINIMUM 值小于允许最小值 {0}
javax.faces.validator.DoubleRangeValidator.TYPE 值类型不正确
javax.faces.validator.LengthValidator.MAXIMUM 值大于允许最小值 {0}
javax.faces.validator.LengthValidator.MINIMUM 值小于允许最小值 {0}
javax.faces.validator.LongRangeValidator.MAXIMUM 值大于允许最大值 {0}
javax.faces.validator.LongRangeValidator.MINIMUM 值小于允许最小值 {0}
javax.faces.validator.LongRangeValidator.TYPE 值类型不正确

结束语

在此教程中,您学习了如何:

  • 使用转换器将输入的字符串转换为数字值,以便在温度格式和货币值之间转换,并显示日期格式。
  • 使用验证器确保输入值在指定范围及格式之内
  • 创建自己的验证处理程序并向用户显示定制信息。

 

另请参见


本页的最后修改时间:2008 年 4 月 22 日

Companion
Projects:
                  Powered by: