跳至内容 Java Solaris 社区 Sun 商店 加入 SDN 我的个人档案 加入的益处
 
“为 Java Studio Creator 编写定制组件”第 2 部分:设计时注意事项
作者:Edwin Goei 和 Beth Stearns,2006 年 4 月  

组件开发者希望他们开发的组件能够在 Sun Java Studio Creator 2 IDE 中正常工作并且易于使用,这就是 IDE 的主要目标。通过遵循本文介绍的规则和准则,开发者可以确保其组件不仅可以接受,而且能够在工具中正常工作。

本文面向的读者是为 Sun Java Studio Creator 2 集成开发环境 (Integrated Development Environment, IDE) 编写定制 JavaServer Faces(tm) 组件的第三方组件开发者。本文假定您是具有较高水平的开发者,并且深入了解 JavaServer Faces 和常规 Java 平台开发方面的知识。

目录
 
组件的设计时注意事项
工具集成
小结
 

在阅读本文之前,您可能需要查看其姊妹篇“为 Java Studio Creator 编写定制组件”第 1 部分:开发组件库

组件的设计时注意事项

在设计时,Java Studio Creator 2 IDE 使用标准 JavaBeans(tm) 组件体系结构将属性编辑器、定制器以及其他元数据与组件关联起来。JavaBean 组件或 Bean 是一种可重复使用的软件单元,它向工具公开其功能(其属性、方法和事件)。IDE 要求用户可处理的对象是 Bean。这包括 JavaServer Faces 组件(如文本字段和命令按钮)以及 JavaServer Faces 转换器和验证器。这也适用于非 JavaServer Faces 组件(如数据提供器),这些组件派生 DataProvider 类的子类。IDE 使用 BeanInfo 类和 Java Studio Creator 设计时 API 来获取这些 Bean 的元数据。

Java Studio Creator 组件未必是 JavaServer Faces 组件,但它们必须都是 JavaBeans 组件。例如,数据提供器是 Bean,但它们不是 JavaServer Faces 组件。JavaServer Faces 组件是 UIComponent 的子类,通常将其称为可视组件,因为它通常包含用于呈现在用户代理中显示的标记的代码。对于可视组件,IDE 在设计时在可视设计器中显示呈现的标记。其他类型的 Bean 称为非可视组件,它们不包含用于呈现标记的代码。

非可视组件的开发过程相对简单一些。例如,像所有 Bean 一样,它们需要具有包含存取方法的具体类型化属性。IDE 在设计时使用 BeanInfo 类来获取组件的相关信息(如其基实例名称),随后在项目中实例化和永久保存 Bean 时使用该信息。Java Studio Creator 设计时 API 文档提供了有关 BeanInfo 常量的详细信息。

JavaServer Faces 可视组件更为复杂,本文将重点介绍这些组件。像所有 Bean 一样,可视组件的基本要求与非可视组件相同;开发这些组件时,开发者还需要遵循一些额外的准则。尤其是,在为可视组件编写运行时代码时,还应该记住组件代码的某些部分将在运行时在 IDE 中运行。

可视组件通常包括三个部分:组件类、呈现器和标记处理程序。此外,它还包括标记库描述符文件,该文件通常使用 .tld 扩展名进行标识。IDE 当前忽略标记库描述符文件,但 Servlet 容器或应用服务器可能会使用此文件。

以下几节介绍了这些规则,并为可视组件的不同部分提供了开发提示。

组件类准则

组件应具有具体的属性,而不应依赖于 UIComponent 超类的通用属性功能。IDE 使用 JavaBeans 体系结构,并且要求使用包含存取方法的类型化属性。如果可能,应避免使用对象类型的属性,因为在 Java 代码中使用这种类型会要求进行强制类型转换。请改用适当类型的属性或者提供别名属性。例如,在组件代码中使用以下属性:

public String getText() {
	return (String) getValue();
}
public void setText(String text) {
	setValue(text);
}
 

通过使用适当类型的属性或别名属性,IDE 用户可以使用 IDE 的代码完成功能,并且可以避免插入类型强制转换。用户不必编写如下所示的代码:

String myString = (String) textField1.getValue();

IDE 用户可以改为编写如下所示的代码:

String myString = textField1.getText();

组件应具有 style 属性。Java Studio Creator 使用此 style 属性来进行绝对定位。通常,组件还具有用于保存 CSS 样式类名称的 styleClass 属性。有关详细信息,请参见“呈现器准则”。

呈现器准则
组件的呈现器通常是作为单独的类来实现的。下面列出了用于编写呈现器的准则。

由于 IDE 在设计时调用呈现方法以在可视设计器中生成可视表示,因此,呈现器必须能够在特殊运行时情况下成功执行。例如,组件属性可能处于部分初始化状态,因为用户在设计过程中可能更改其属性,并且工具调用组件的呈现器以更新其可视表示。同样地,还可能需要重新初始化任何缓存帮助器组件或 facet。

除非传递属性中的用户标记,否则,应避免使用 ResponseWriter.write 方法。请改为使用 ResponseWriter.startElementResponseWriter.endElementResponseWriter.writeAttribute 方法来生成标记。

始终提供组件对 ResponseWrite 方法 startElement(String name, UIComponent component) 的引用。工具使用此引用来确定用户在可视设计器中选择的组件。

将 style 属性传播到呈现的输出以便可以定位组件并调整其大小。对于具有单个顶级元素或单个可视顶级元素的组件,请复制该元素上的 style 属性。例如,如果 JavaServer Pages (JSP) 页面包含:

<foo:bar style="width: 400px; color: blue"/>

呈现的输出应该如下所示:

<div style="width: 400px; color: blue">
	<input type="submit" value="Hello"/>
</div>

具有多个可视顶级元素的组件应包装在单个顶级元素中。

请按与 style 属性类似的方式来处理 styleClass 属性。也就是说,考虑提供 styleClass 属性,它以类似方式传播到 HTML 类属性以及与 style 属性相同的元素。

通过对 Beans.isDesignTime 进行测试,可以将设计时呈现作为特殊情况处理。此外,也可以在普通运行时呈现器上放置一个特殊设计时呈现器。例如,可以创建一个 MyDesignTimeRenderer,它将委派给普通运行时 MyRenderer。接下来,创建另外一个设计时 META-INF/faces-config 文件(将其添加到设计时 JAR 文件中),然后在 MyDesignTimeRenderer 中添加一个条目以引用设计时 faces-config 文件。工具仅执行设计时呈现器;而在运行时不会执行它。

标记处理程序准则

由于在设计时不执行与组件关联的 JSP 标记,因此,除了在具有类型转换的相关属性中进行复制外,这些标记不应包含任何其他逻辑。您需要遵循此准则以确保组件也可以与非 JSP 视图处理程序配合使用。

工具集成

组件的运行时部分包装在一个或多个运行时 JAR 文件中并部署到 Web 容器(如应用服务器)上。在设计时,除了设计时代码和元数据外,工具还可以使用某些运行时部分。Java Studio Creator 使用 JavaBeans 来存储静态设计时元数据,并依赖 Java Studio Creator 设计时 API 来启用动态设计时行为(有关 Java Studio Creator 设计时 API 规范,请访问 http://developers.sun.com/prodtech/javatools/jscreator/reference/docs/apis/designtime/)。

您可以使用 Java Studio Creator 设计时 API 来执行以下操作:

  • 创建上下文菜单项。
  • 添加增强的属性编辑器和 Bean 定制器。
  • 创建有关放置操作的专用行为。
  • 添加将组件链接到一起的功能。
  • 接受或拒绝父组件或子组件放置操作。
  • 创建更高级的行为,如内联编辑、鼠标区域等。
工具集成示例

IDE 需要知道组件与标记之间的映射,并且它从 BeanInfo 中获取此静态元数据。例如:

private java.beans.BeanDescriptor beanDescriptor;
	...
beanDescriptor.setValue(Constants.BeanDescriptor.TAG_NAME,"commandButton");
beanDescriptor.setValue(Constants.BeanDescriptor.TAGLIB_PREFIX,"h");
beanDescriptor.setValue(Constants.BeanDescriptor.TAGLIB_URI,
				"http://java.sun.com/jsf/html");

 

您可以手动编写 BeanInfo 类或使用代码生成器。代码生成器输入是一个 XML 文件 sun-faces-config.xml,它包含每个组件的元数据。有关详细信息,请参见“为 Java Studio Creator 编写定制组件”第 1 部分:开发组件库一文中介绍的示例 sample-simple-<version>.complib(可从 IDE 更新中心下载)。尤其是,请参见该文章中的运行代码生成器一节。

以下代码显示了呈现器所需的元数据。

<renderer-extension>
...
	<instance-name>button</instance-name>
	<tag-name>commandButton</tag-name>
	<taglib-prefix>h</taglib-prefix>
	<taglib-uri>http://java.sun.com/jsf/html</taglib-uri>
</renderer-extension>
 

您可能想知道什么是合格的动态设计时行为。下面这种情况就是此类动态行为的一个很好的示例:将一个表组件放在可视设计器中,然后创建一些伪行和列。通过使用 DesignInfo 类可以将动态行为与组件关联起来。您同样可以在上述 sample-simple-<version>.complib 中找到一个简单的示例(可以从 IDE 更新中心下载此 complib)。

小结

您已了解了一些为 Java Studio Creator 2 IDE 编写定制组件(尤其是可视组件)时应牢记的准则。此外,您还了解了如何编写组件类,以及用于呈现器和标记处理程序文件的代码。

相关信息

功能简介文章 Sun Java Studio Creator 2 的 Java Studio Creator 设计时 API 简要介绍了 API。您可能还想了解 Java Studio Creator 设计时 API 规范

 
Edwin Goei
Edwin Goei 是一名 Java Studio Creator 软件工程师,他的主要专业技术领域是 JavaServer Faces 组件开发和组件库。他发表了一些有关部署应用程序和创建定制组件的博客文章。
 
Beth Stearns 撰写了许多有关 Java 技术的文章和书籍。最近,她与别人合著了一本有关 J2EE BluePrints 的书籍《Designing Web Services with the J2EE 1.4 Platform》(使用 J2EE 1.4 平台设计 Web 服务)。