FeaturesDocs & SupportCommunityBlogsPartners

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

 

2007 年 12 月 [修订号:V6.0]    

在本教程中,您将学习 JSF 1.2(Woodstock)中的转换器和验证器。转换器用来将字符串输入转换为数据型 Java 数据类型,以达到计算之类的多种目的。验证器用来核实用户输入是否落在指定的范围内。您将使用 Visual Web JSF 框架来创建一个将温度从摄氏转换为华氏的应用程序。该应用程序使用一个转换器来将用户输入从一个字符串值转换为数值型 Java 数据类型,应用程序就能用它来进行计算。该应用程序还是用一个验证器来检查数据是否落在指定的范围内,并通过一个消息组件来报告验证错误。然后您将生成一个计算货币值并显示格式化的时间值的 Web 应用程序。

您还将学习如何向应用程序添加您自己的验证处理程序,以及如何在标准验证失败时覆盖由 IDE 提供的内建错误消息。

内容

本页上的内容适用于 NetBeans IDE 6.0

- 设计应用程序
- 使用验证器
- 使用转换器
- 测试应用程序
- 做更多:使用数值和日期时间转换器
- 做更多:添加您自己的验证处理程序
- 做更多:定制标准验证器消息
- 小结

 

本教程要用以下技术和资源来运作

JavaServer Faces 组件/
Java EE 平台
works with1.2 和 Java EE 5*
works with1.1 和 J2EE 1.4
Travel 数据库 not required非必需

* 为利用好 NetBeans IDE 6.0 的 Java EE 5 功能,请使用与 Java EE 5 规范完全兼容的应用服务器,比如 Sun Java Application Server 9 / GlassFish。

本教程被编写成适用于 GlassFish V2 应用服务器。如果您使用不同的服务器,请查阅发行说明FAQ 以了解已知问题和解决办法。要了解有关受支持的服务器和 Java EE 平台的详细信息,请参见发行说明

设计应用程序

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

  1. 创建一个 Web 应用程序项目,命名为“ValidatorConverter”。启用 Visual Web JavaServer Faces 框架。

    图 1 显示了您将在下列步骤中创建的页面。
  2. 从“组件面板”的“基本”类别,将一个“文本字段”拖放到页面上。将“label”属性设为“Celsius”,“text”属性设置为“0.0”。

    label”和“text”属性位于“属性”窗口的“外观”类别下。text 值是运行时的缺省显示值。
  3. 将文本字段的“required”属性设为“True”,方法是选中“属性”窗口中的复选框。

    required”属性位于“属性”窗口的“数据”类别下。True 值要求用户为该输入字段输入值。如果用户没有输入值而尝试提交页面,就会返回一个标准验证错误消息。Celsius 标签旁出现一个红色星号,表明 required 值已被设置。
  4. 在页面上放置一个“标签”组件。将标签的文本设为“Fahrenheit”。
  5. 在 Fahrenheit 标签右边放置一个“静态文本”组件。将“text”属性设为“32.0”,代表华氏温标里水的冰点。
  6. 从“组件面板”的“基本”类别,将一个“消息”组件拖放到 Fahrenheit 标签下面。
  7. 按住 Ctrl+Shift 键,从消息组件向文本字段组件拖出一条线。

    消息组件的文本变为“textField1 的概要消息”,如下图所示:

    图 1:概要消息
    图 1:概要消息

在下一节中,您将添加一个验证器以确保用户的输入落在指定的范围里。

使用验证器

如果您的应用程序要从用户收集信息,例如登录和密码,那么核实用户数据就很重要。IDE 提供了用来验证用户输入的一系列组件;您可以从“组件面板”的“验证器”类别得到它们。最简单的验证将确保输入字段具有某种类型的值。

双精度范围验证器测试数值输入的值是否在指定的范围内。数据类型必须是浮点类型或可转换为浮点的类型。其它验证器包括长度验证器和长型范围验证器。

  • 使用长度验证器来验证为某个组件输入的文本长度不短于或不长于您为验证器的“minimum”和“maximum”属性指定的值。该值必须是一个 java.lang.String
  • 使用长型范围验证器来验证用户输入的值落入了一个最小和最大值的范围内。该值必须是任何可转换为 Java long 数据类型的字符串值。
图 2:“组件面板”中的验证器
图 2:“组件面板”中的验证器

 

当您使用验证器(或在下面的使用转换器中描述的转换器)时,您也许还想使用一个消息组件来指明验证失败。Web 应用程序在调用任何值更改或动作侦听器(如按钮动作方法)前进行所有的验证。如果发生一个或多个验证错误,值更改侦听器和动作侦听器将不会被调用,而且 Web 应用程序重新渲染页面以便让用户能改正问题。

对于本应用程序,您想检查文本字段组件在页面提交前包含至少一个字符。您还需要一个消息组件来指明验证失败。

 

您在前一节中添加的“消息”组件将在验证失败时向用户指明。

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

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

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

    • 将“maximum”属性设为“1000.0”(非常热的温度)。
    • 将“minimum”属性设为“-273.15”(例如摄氏温标上的绝对零度)。

在本节中,您使应用程序能够用双精度范围验证器来验证用户输入值。在下一节中,您将使用一个转换器来使应用程序能够计算一个摄氏温度数值字符串输入的华氏值。

使用转换器

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.math.util.Calendar 数据类型之间转换。例如在您将 JSF 组件绑定到具有 dateTime 类型字段的 Web 服务时,该转换器将起作用。

 

在前面的步骤中,您设置了一个验证器来核实输入的摄氏温度落在绝对零度和 1000° 之间。在随后的步骤中,您将使用一个双精度转换器来将用户输入转换为双精度型,这样您就能用该双精度型来计算摄氏输入的华氏值。

  1. 展开“组件面板”的“转换器”类别。从“组件面板”拖一个“双精度转换器”到“文本字段”组件上。

    该转换器指定文本字段组件返回 Double 对象而不是 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));

    }

    这段代码设了两个变量:输入 textField1 的值 celsiusTemp,以及通过对 celsiusTemp 应用指定的计算转换出来的值 fahrenheitTemp。最后一行在静态文本字段中设置了新值 fahrenheitTemp

测试应用程序

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

  1. 选择“运行”>“运行主项目”来生成和运行应用程序。
  2. 从文本字段删除 0.0,不输入值按下 Enter。请核实对文本字段显示了一个错误,如下图所示。

    图 4:要求输入时的验证错误
    图 4:必需输入时的验证错误

    错误实际上是因为我们将文本字段的“required”属性设为“true”而发生的。当页面访客提交页面时,Web 应用程序按下列顺序进行输入核实:

    1. 转换
    2. 必需输入
    3. 验证
    注意:值更改事件只在值实际上更改且所有的核实成功时发生。

     

  3. 输入不同的数值来测试应用程序。下图显示了当您输入 100 时的结果。

    图 5::成功验证
    图 5::成功验证
  4. 请核实在您输入超出范围的值时显示的验证错误,以及在您输入非数值字符串值时显示的转换错误。

    下图显示当您输入 -1000 时的结果。注意当验证或转换错误发生时,值更改侦听器方法没有被调用,静态文本组件中的值没有更改。

    图 6:值超出范围时的验证错误
    图 6:值超出范围时的验证错误
  5. 输入字母数字式的字符串,例如 20x。因为应用程序被配置为只转换数值类型,它将返回转换错误,如下图所示。

    图 7:输入值的格式不正确时的转换错误
    图 7:输入值的格式不正确时的转换错误

做更多:使用数值和日期时间转换器

两个标准转换器——数值转换器和日期时间转换器——有它们自己的属性,使您能够指定数据的格式和类型。这个小教程演示如何使用这两个转换器。

下图显示了您将在本节中创建的页面:

图 8:货币转换器应用程序
图 8:货币转换器应用程序
  1. 在“项目”窗口中,右键单击“ValidatorConverter”>“Web 页”,选择“新建”>“Visual Web JSF”页。将该页命名为“Currency”,单击完成。
  2. 右键单击“ValidatorConverter”>“Web 页”>“Currency.jsp”,选择“设置为起始页”。
  3. 从“组件面板”的“基本”类别,将一个“文本字段”组件拖放到页面上。在“属性”窗口中,将文本字段的“label”属性设为“Dollar Amount:”,“required”属性设为“True”。
  4. 将一个“按钮”组件放到文本组件的右边。将按钮的文本更改为“Convert”。
    • 重要提示:在 IE7 中,有一个已知的问题将影响 JSF 1.2 按钮的宽度。解决办法是将按钮组件放到一个布局组件中(网格面板、组面板或布局面板)。改变布局组件的大小将自动改变按钮组件的大小。
  5. 从“组件面板”的“基本”类别,将两个“标签”组件拖到页面上。

    将第一个标签的文本设为“Converted to Euros:”,第二个标签的文本设为“Date and Time:”。
  6. 分别将一个“静态文本”组件放到各标签旁。
  7. 从“组件”面板的“基本”类别,将一个“消息”组件拖放到 Date and Time 标签下面。

     按住 Ctrl+Shift 键,从消息组件向文本字段组件拖出一条线。
  8. 从“组件面板”的“转换器”类别,将“数值转换器”拖放到文本字段上。

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

    注意“货币代码”是如何缺省为“USD 美利坚合众国,美元”(和语言环境相关联的货币缩写、国家和货币名称)的。请选择不同的语言环境来显示各种货币。

    图 9:“数字格式”对话框
    图 9:“数字格式”对话框

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

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

    这次“货币代码”缺省为“EUR 欧盟成员国,欧元”。(如果,假如您选择“德文 (瑞士)”,“货币代码”将缺省为“CHF 瑞士,瑞士法朗”,因为瑞士不在欧盟地区中。)
  12.  从“组件面板”将一个“日期时间转换器”拖放到 Date and Time 标签旁的静态文本上。
  13. 在“导航”窗口中,选中“dateTimeConverter1”。
  14. 在该转换器对应的“属性”窗口中,单击“pattern”属性对应的省略号按钮
  15. 在“模式”字段中键入“EEE, d MMM yyyy HH:mm:ss zzzz”,单击“确定”。在您向模式添加元素时,当前值将出现在“属性”窗口中的“pattern”属性里。

    注意在您输入元素时值是如何改变的。例如,如果您在开始键入“EEEE”而非“EEE”,模式就将包括完整的星期而非缩写。如果您在末尾只输入一个“z”,时区将会缩写。

    请参考 Java 教程中的定制格式课程以获得格式化日期和时间的更多信息(外部链接将显示在单独的页面中)

添加代码

  1. 双击 Convert 按钮以在 Java 编辑器中打开它的源代码。
  2. 紧靠 button1_action 方法上方添加下面两行。0.74 近似于欧元到美元的汇率。

    代码示例 2:将美元转换为欧元的常量
    // 将美元转换为欧元的常量 
    private static final double us2euros = 0.74;
  3. 将下面的代码(粗体)添加到 button1_action 方法。代码中的注释表明每行的目的。

    Code Sample 3: Constant Value for Dollars to Euros Exchange
    public String button1_action( ) { 
    // 获取用户输入的美元数量
    Number dollars = (Number) textField1.getValue();
    // 将美元转换为欧元
    double euros = dollars.doubleValue() * us2euros;
    // 显示欧元数量
    staticText1.setText(new Double(euros));
    // 算出日期和时间
    Date date = new Date();
    staticText2.setText(date);
    return null;
    }
  4. 右键单击 Java 编辑器,选择“修复导入”。选择完整全限定名称“java.util.Date”,单击“确定”。

测试应用程序

  1. 运行应用程序。
  2. 输入各种数量,例如“$10”。注意以下规则:
    • 如果输入字符串的第一个字符不是货币符号(这一次是 $),或在货币符号和第一个数字间有空格,转换器将抛出异常。消息组件将显示该错误。
    • 您可以用逗号作为分隔符,例如 $1,234,但并不是必需的。即使逗号放在错误的位置,甚至在小数点右边,都会被忽略。转换后,逗号将重新显示在正确位置。
    • 在小数点后输入超过两位数字将造成四舍五入到最接近的便士。这是语言环境决定的,并且对不同的环境也不同,例如日本,货币值极少用数字值显示。

    下图显示了在您输入“$100.00”时的结果。

    图 10:显示转换结果的页面
    图 10:显示转换结果的页面

    下图显示当您输入 100 而没有 $ 时的结果。从前一次计算转换的结果保留下来,但将显示转换错误。

    图 11:显示转换错误的页面
    图 11:显示转换错误的页面

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

做更多:添加您自己的验证处理程序

如果标准验证器不能进行您需要的验证检查,您可以轻松添加自己的验证处理程序。本节将使用 NetBeans Visual Web JSF 应用程序的功能来创建一个验证处理程序,它能检查用户的输入并将其限制为三位数。您可以将这些步骤添加到在前一节中创建的 Currency.jsp 页面中。

  1. 单击“设计”按钮回到可视编辑器。
  2. 选择 Dollar Amount 文本字段组件,将它的“required”属性设为“False”。
  3. 从“组件”面板的“基本”类别,将一个“文本字段”组件拖放到页面上。将文本字段的“label”属性设为“Value:”,“required”属性设为“True”。
  4. 将一个“按钮”组件放到文本字段组件的右边。将按钮的文本更改为“Submit”。
  5. 将一个“消息”组件放到文本字段下方。按住 Ctrl+Shift 键,从消息组件向文本字段组件拖出一条线。

    消息组件的文本变为“textField2 的概要消息”。
  6. 右键单击文本字段组件,选择“编辑事件处理程序”>“validate”。

    这将打开 Java 编辑器。IDE 自动将 ValidatorException、FacesContext 和 FacesMessage 类的导入语句添加到代码。插入点位于文本字段的 validate 事件上。第三个参数“value”是您将验证的 String。
  7. 输入下面的代码(粗体)。

    代码示例 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 s 上的 matches 方法使用正则表达式来指定 String 可接受的合法值。\d 匹配数字(0-9)。

    字符串字面中的“\”对 Java 解析器有特殊含义。您指定一个额外的“\”来转义第二个“\”,确保它不被更改地通过解析器传给模式解释器。所以表达式 \d\d\d 匹配任何从 000 到 999 的三位数。

    如果字符串不匹配该正则表达式,一个消息就被传递到 ValidatorException 构造方法。该消息被队列到 FacesMessage 上,并在渲染响应过程中显示到页面上。

  8. 右键单击 Java 编辑器,选择“修复导入”。在“修复所有导入”对话框中,单击“确定”。IDE 将导入 javax.faces.validator.ValidatorExceptionjavax.faces.application.FacesMessage 包。
  9. 运行应用程序。输入各种长度的数字和字符串来测试应用程序。还要在文本字段没有输入值时,核实显示了标准验证错误。

    下图显示了当您输入一个四位数时的结果。

    图 12:自定义验证器示例和结果
    图 12:定制验证器示例和结果

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

标准验证失败时,您可以覆盖 NetBeans IDE 提供的内建错误消息。您将为项目创建一个提供定制消息的资源包。注意这是全局覆盖而非组件级覆盖。这意味着需要它的所有组件都返回相同值。

定制消息

本节说明如何为 JSF 1.1 / J2EE 1.4 中的长型、双精度范围和长型范围验证器定制消息。正如你看到的,这将是比在 JSF 1.2 中添加定制消息稍长的过程。您使用 IDE 来为必需的输入定制缺省错误消息。首先您创建一个资源包,程序用其中的键来映射向用户显示的字符串,然后您将编辑 faces-config.xml 来指向 MyResources.properties 资源包。

注意:本节中的步骤依赖于叫做 ValidatorConverter 的项目。如果您选择不同的名称,请调整所有项目名称的使用来反映您的项目的名称。

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

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

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

    重要:请确保键的末尾没有空格。空格将在运行时阻止程序运作。

    要了解用于标准消息的所有键的列表,请查看下面的标准消息键
  8. 单击“确定”。值将显示在“属性”窗口中,如下图所示。

    图 13:MyResources.properties 的属性编辑器
    图 13:MyResources.properties 的属性编辑器
  9. 在“项目”窗口中,展开“ValidatorConverter”>“Web 页”>“WEB-INF”。右键单击“faces-config.xml”,选择“打开”。
  10. In the editing toolbar, click XML. 在编辑工具栏中单击“XML”。
  11. 在 faces-config.xml 文件中,输入下面的代码。注意这段代码包含项目的名称。如果您的项目名称不是 ValidatorConverter,请适当更改代码中的文本。注意在 message-bundle 元素中,您应当将项目名称中的大写字母改为小写字母。

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

    message-bundle 元素代表本地化消息集。该元素包含到包含了本地化消息的资源包的全限定路径,这一次是 validatorconverter.MyResources

  12. 运行项目。
  13. 删除文本字段中的任何文本,按下 Enter。

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

    图 14:定制错误消息
    图 14:定制错误消息

Standard Message Keys标准消息键

在 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 值的类型不正确

小结

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

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

 

参见

Companion
Projects:
                  Powered by: