跳至内容 Java Solaris 社区 Sun 商店 加入 SDN 我的个人档案 加入的益处
 
JavaServer Faces 组件简介
 
作者:Beth Stearns,2006 年 2 月  
本文介绍了定制现有的 JavaServer Faces™ 标准组件与生成新的定制组件之间的区别。并说明了您可能需要生成自己的组件的原因,以及决定执行此操作时应注意的事项。本文还向您介绍了在 Java Studio Creator 2 应用程序开发环境(即 IDE)中开发的应用程序中使用这些组件时需要执行的步骤。本文包含了如下主题:
 
目录
 
Java Studio Creator 2 组件:简介
为什么应该使用组件?
何时不生成组件
何时生成定制组件
如何生成定制组件
在 Creator 应用程序中使用定制组件
确保组件能够很好地在 IDE 中使用
 
Java Studio Creator 2 组件:简介
 

Java Studio Creator 2 IDE 附带了一组捆绑的标准组件,您可以使用这些组件为应用程序开发可视界面。这些可重用的组件依赖于 JavaServer Faces™ 技术,它们是用户界面的基本组成块。由于 JavaServer Faces 组件满足了 Web 页请求和响应的最常见要求,因此,可通过组装这些标准组件来构建大多数的应用程序。

此外,还可以生成您自己的组件,并在其他应用程序中重用这些“定制”组件。通常,可通过扩展标准组件的 API 来生成新的组件。但是,需要牢记某些信息,您才可以确保生成的新定制组件能够很好地在 Java Studio Creator 2 IDE 中使用。

看完该简介后,您可能希望阅读其他深入探讨该高级主题的文章,例如:

还可以阅读《核心 JavaServer Faces》一书,此处提供了其中的一些章节。

 
为什么应该使用组件?
 

IDE 包含的标准组件使用 JavaServer Faces 技术来处理应用程序中的各种任务。例如,组件可以处理它在页面上的显示或呈现方式。并将其属性的内部表示编码为合适的标记语言以进行页面呈现。同时,组件还会将与传入请求关联的属性转换为自己的相应属性。也就是说,组件将传入请求的参数、头和 Cookie 解码为属性。

除了让 JSF 组件将传入请求转换为组件可使用的形式外,组件还使用 JavaServer Faces 技术来验证请求的语法和语义。组件还可以在多个请求之间保存和恢复它们的状态。它们可以将事件放在队列中以实现一个或多个组件的状态更改。

 
何时不生成组件
 

将组件放到 Java Studio Creator 页面上时,您可能(并且很可能)更改其属性以满足应用程序的要求。通过执行此操作,您可以根据具体的需要来定制该标准组件。

例如,如果只想更改标准组件的可视表示或者要更改其解码行为(例如,组件处理传入请求的方式),并不真正需要生成全新的定制组件。则只需定制现有的标准组件,即通过更改其属性值来更改其可视表示。还可以定制现有的组件来更改其处理请求的方式。虽然组件可以将处理请求操作委托给单独的呈现器(呈现器用于确定如何向用户显示组件,并避免应用程序遇到这些问题)来执行,但这样做与生成新组件一样繁琐。在您编写自己的呈现器时,就如同生成定制的组件一样,仍然需要执行许多相同的定义和包装任务。

 
何时生成定制组件
 

生成新组件与定制或使用现有的组件是不相同的。如果您不想通过组件的属性来更改组件的行为,则需要考虑生成定制组件。

组件供应商或组件开发者生成定制组件是由于业务需要:他们生成复杂的组件以提供标准组件不具备的功能。作为应用程序开发者,您可能需要生成定制组件以添加到标准组件中或修改标准组件的工作方式。例如,如果您需要一个支持新类型事件的组件,则需要考虑生成定制组件。出于类型安全方面的原因,每个标准组件只支持一种特定类型的事件。无法将一个组件的事件类型扩展为一种不同的新事件类型。

您可能还需要生成一个定制组件,为其指定任何标准组件所不具有的行为。另外,当您需要取代标准组件的工作方式,即需要取代该组件的解码、转换、验证和在请求之间处理状态(保存和恢复状态)的方式时,可以考虑生成定制组件。例如,您可能不想在请求之间保留组件的状态。或者,您可能希望组件具有其标准属性以外的其他属性。在这种情况下,您自己的组件包含了标准组件的扩展,这样它不但提供了标准属性,并且还实现了其他属性。

 
如何生成定制组件
 

您无需从头开始生成定制组件。生成定制组件的最简便方法是对现有的标准组件进行扩展。通过选择一个功能近似于定制组件的标准组件,定制组件可以继承标准行为的有用部分。

编写定制组件功能

要选择一个标准组件进行扩展,则首先按照您需要该组件执行的操作对其进行分类。组件类型可划分为以下几类:输出、输入、控制或容器组件,有时是这些类型的组合。例如,定制组件可以只显示某些数据,或者可以接受某些用户输入。如果只用于显示,则需要对 JSF 标准输出 (UIOutput) 组件进行扩展。如果组件处理输入数据,则还应考虑它接受的输入类型。如果组件接受简单的文本输入,在这种情况下应对 JSF UIInput 组件进行扩展。如果希望组件接受用户从列表中选择的输入,这可能包含对一个或多个数据片段的选择。这时请考虑是对 UISelectOne 组件(从列表中选择一项)进行扩展还是对 UISelectMany 组件(选择多项)进行扩展。

当用户激活控制类型的组件(如按钮)时,该组件将触发特定于应用程序的命令或操作。对于这些组件,应扩展 UICommand。组件也可以是一个包含或嵌套其他组件的容器。对于这些组件,应扩展 UIPanel。

有时,您希望定制组件具有组合的标准组件的行为。在这种情况下,应扩展一个标准类来获取某种类型的行为,然后实现 JSF 行为接口来获取另一种类型的行为。例如,假设您希望组件接受输入操作并处理控制操作。您可以扩展 UIInput 标准组件以添加输入行为,然后实现 JSF ActionSource 接口以获取操作行为。

在某些情况下,您可以为所有组件扩展抽象基类 UIComponentBase。如果在标准组件中找不到非常匹配的行为,可以考虑使用这种方法。UIComponentBase 类提供了几乎每种组件方法的缺省实现。然后,您就可以将精力主要投身于定制组件的独有特性中(通过以下网址 http://java.sun.com/j2ee/javaserverfaces/reference/api/index.html,您可以获取 JavaServer Faces 规范,它详细介绍了可用的接口和组件类)。

为了说明这一点,让我们了解一下创建定制的日历组件(即允许用户选择日期的日期选取器组件)需要包含哪些内容(请参见图 1)。“日期选取器”与另一个显示日期的定制组件“日期显示器”包装在一起。可以从样例组件页中获取这些组件进行演示和下载。

图 1:日期选取器组件
图 1:日期选取器组件
 

首先,为您的组件扩展相应的 UIComponent 类,并为组件指定单一类型的名称字符串作为标识。例如,可以使用字符串 com.example.DatePicker。然后,在组件类中实现或调用几种方法。您需要实现 getFamily 方法以返回组件名称字符串。Creator 使用该组件名称字符串和 rendererType 来查找负责呈现该组件的代码(如下一部分所述,您将手动编写呈现器代码)。还必须包含对 setRendererType 方法的调用,以将组件名称字符串作为参数传递给它。最后,实现 saveStaterestoreState 方法。

为使用户能够在 IDE 属性表单中查看组件的属性,该属性必须是包含类型化存取方法的 JavaBeans 组件属性。目前,IDE 要求组件包含 String 属性 style,它将呈现为 style 属性和 rendered 属性。还可以包含其他属性(可选),如 title 属性(IDE 将其呈现为 title 属性)或 styleClass 属性(IDE 将其呈现为 styleClass 属性)。您也可以为组件包含其他定制属性。例如,日期选取器可以包含名为 numYearsint 属性。

创建组件工件和组件库

在您生成定制组件时,除了定制组件外,您还会创建一组工件(如呈现器、元数据和图标图像),然后将所有这些内容包装在组件库或单个归档文件(称为 complib 文件)中。complib 文件类似于其他 JAR 文件(如 WAR 或 EAR 文件),可通过这种方法将组件分发给其他用户。您可以使用处理 JAR 文件的压缩实用程序(如 WinZip)来查看和处理 complib 文件。

生成定制的 JSF 组件需要编写三种类型的类以及一些元数据,所有这些内容都将作为运行时 JAR 的一部分部署到服务器上。让我们了解一下生成日期选取器组件需要执行哪些操作。您需要编写 UIComponent 类本身,即 DatePicker.java。还必须手动编写组件的呈现器 DatePickerRenderer.java 及其标记处理程序 DatePickerTag.java。呈现器类必须(直接或间接)扩展 javax.faces.render.Renderer。此外,还需要编写两个元数据文件 sample-date.tldfaces-config.xml

JSF 实现使用 faces-config.xml 文件来确定组件、验证器和呈现器。sample-date.tld 文件(它是 JSP 标记库描述符)会通知容器的 JSP 编译器如何在 JSP 页中处理这些标记,并且它与标记处理程序密切相关。sample-date.tld 文件包含标记名称 (datePicker)、标记类名 (com.example.DatePickerTag)、Creator 属性(stylerenderedstyleClasstitle)以及任何定制的组件属性 (numYears)。对于每个属性,必须在标记处理程序中定义 JavaBean 样式设置方法。除了这些设置方法外,标记处理程序还包括以下两个方法(用于在元数据中返回有关组件类的信息):getComponentType 用于查找组件类;getRendererType 用于查找呈现器类。您还会在标记处理程序中实现以下两个其他方法:setProperties 用于将 JSP 属性值传输到组件中;release 用于释放资源。

Java Studio Creator IDE 通过您为组件提供的额外设计时工件来改进该设计体验。这些工件包括另一个元数据文件 faces-config.xml。理想的情况下,应该在 faces-config.xml 文件中保留最少的元数据,并将其他信息(如属性所在的属性表单类别)放在 faces-config.xml 文件中。这两个元数据文件简化了开发过程,因为代码生成器使用这些文件为组件生成 BeanInfoBase 类。您可以扩展该基类以生成设计时类,如用于日期选取器组件的 DatePickerBeanInfo.java。此外,还可以编写属性编辑器(如 DateEditor.java)以及创建定制图标图像和定制 Javadoc 文档。所有设计时工件(Javadoc 文件除外)都会放在设计时 JAR 文件中。

要完成组件包装,请收集所有工件以及清单文件,然后将所有内容放在 complib 文件中。

 
在 Creator 应用程序中使用定制组件
 

在使用 Java Studio Creator IDE 开发的应用程序中,可以使用您自己的定制组件或其他供应商提供的定制组件。 有关定制组件并导入在应用程序中使用的组件的说明,请参见在 Sun Java Studio Creator 2 环境中编写 JavaServer Faces 定制组件在 Sun Java Studio Creator 2 中编写定制组件的规则

通过执行以下简单步骤,您可以在应用程序中使用定制组件。首先,将组件库包文件(complib 文件)下载到系统中。然后,在 IDE 的“组件面板”窗口中,右键单击任何类别节点以显示其上下文菜单,然后选择“管理组件库...”选项。将出现“组件库管理器”对话框。导航到下载的组件库文件位置,然后在组件面板中指定要将组件库导入到的类别(或者让 IDE 创建一个新类别)。导入过程完成后,将在组件面板上显示新组件,您可以将其放在任何应用程序或项目中。

IDE 导入组件库文件时,它将对包进行扩展并装入组件的 BeanInfo 和运行时类。IDE 还会使用新组件来填充组件面板类别。同时,IDE 将组件文件复制到用户目录下的以下位置:~/.Creator/2_0/complibs

 
确保组件能够很好地在 IDE 中使用
 

可以执行某些操作来改进定制组件在 IDE 中的工作方式。正如前面所述,IDE 要求组件具有 style 属性(stylestyleClass)。Java Studio Creator IDE 还要求每个组件都具有绑定属性。为了实现其应用程序模型(每个页面上有一个 Java 类,并且可以在页面上处理所有组件),IDE 使用组件绑定以使该组件在表示页面的 Java 类中可用。此外,由于 IDE 要求使用 JSP 标记,因此您需要为所有定制组件开发标记库和支持标记类。

熟悉 JavaBeans 体系结构是很有帮助的,因为 IDE 将组件作为 JavaBeans 组件进行处理。特别是,您应该了解 BeanInfo 接口以及 IDE 如何使用该接口来查找组件属性和支持的事件。BeanInfo 接口还在组件的设计时 API 中发挥作用,它用于改进组件的设计时可用性。由于设计时行为是由 BeanInfo 属性和可选 DesignInfo 类控制的,因此,可通过为这些类编写您自己的设计时支持来改进 IDE 中的组件设计时用户体验。

通常,将在运行时 JavaServer Faces 框架中调用组件方法。Java Studio Creator IDE 本身也会调用一些在 JSF 生命周期中支持组件角色的方法,特别是调用一些通过呈现组件树来生成其应用程序页面设计视图的方法。因此,在组件方法中引用应用程序的外部上下文时要特别小心,因为通常在应用程序 Servlet 上下文中出现的对象可能在 IDE 中不存在。这意味着,IDE 无法呈现组件;如果出现这种情况,组件在 IDE 的设计视图中也是不可见的。

 
小结
 

现在,您应该了解了定制标准组件和生成新组件之间的区别以及这些任务中涉及的概念,并且,您还应该清楚 JavaServer Faces 技术在 Java Studio Creator 2 组件中发挥的作用。

Beth Stearns 撰写了许多有关 Java 技术的文章和书籍。最近,她与别人合著了一本有关 J2EE BluePrints 的书《Designing Web Services with the J2EE 1.4 Platform》(使用 J2EE 1.4 平台设计 Web 服务)。