组件开发全攻略
作者:封朋成
刘应杰
摘要:sun
java studio creator(以下简称creator)是SUN公司新出的一个快速的WEB应用程序及Portlet的可视化开发工具;在本文中,将介绍creator(以及相关的JSF)开发的特点;深入研究creator,开发用户定制组件;
关键字:
creator
JSF
compontent
ANT
定制组件 可视化
一、creator
开发环境简介
Java Studio Creator
开发工具允许以可视化方式快速地开发
Web
应用程序和
Portlet。Java
Studio Creator 2
构建于
NetBeans 4.1
基础之上;具有一组新的
JavaServer Faces
组件
;支持构建符合
JSR-168
规范的
Portlet;访问数据库轻松、简便
;此外,它还提供了简化而有效的应用程序模型
等功能
。
详情参考官网:http://gceclub.com/prodtech/javatools/jscreator/index.html
二、开发creator用户定制组件
当Creator的现有组件无法满足开发需求时,需要用户开发定制化组件,深入了解Creator这个开发工具。
三、搭建开发环境
1、开发环境选择:
JDK5.0 + Myeclipse4.1 + eclipse3.1
+ ant + Creator2+Sun Java
Application Server
8.1;
开发工具各自官方网站均提供下载服务,不再赘述;
配置参考如下:
Myeclipse中配置ANT:http://www.crackj2ee.com/Article/ShowArticle.asp?ArticleID=5
2、建立工程
在Myeclipse中,新建Web工程,添加JSF,配置ant;
在eclipse中建立的文件目录结构如下(其中不包括build,dist目录,是由ant自动生成的):
四、JSF组件开发(7)
因为Creator的组件开发与JSF组件开发很相似,所以首先介绍JSF组件的开发,作为Creator组件开发的对比。
采取的步骤如下:
具体实现介绍如下:
(用户可参考:JSF组件开发http://www.blogjava.net/raozhh/archive/
第一步:扩展
UIComponent
a).第一步是创建一个组件,继承
UIOutput,后者是
UIComponent
的子类。
除了继承这个类之外,另外添加您要在组件将会显示的属性。
b).JSF
通常通过会话、隐藏表单字段、cookies
等进行实际的存储和状态管理。(这通常是用户配置的设置)。要保存组件状态,需要覆盖组件的
saveState
和
restoreState
方法。
c).用
faces-config.xml
登记组件:
<faces-config>
<component>
<component-type>
com.example.DateDisplayer </component-type>
<component-class>
arcmind.simple.XXXComponent//.class文件地址
</component-class>
</component>
…
第二步:定义呈现器或者内联地实现它
a).如果定制的组件只有显示输出,则继承
UIOutput
组件,不需要进行解码;相反,组件是一个
UIInput
组件,这意味着该组件接受输入,所以
必须
进行解码。decode
方法可以从会话、cookie、头、请求等处读取值。在大多数请问下,decode
方法只是像上面那样从请求参数读取值。组件呈现器的
decode
方法从组件得到
clientId,以标识要查找的请求参数。给定组件容器的路径,clientId
被计算成为组件的全限定名称。而且,因为示例组件在表单中(是个容器),所以它的
clientid
应当是
nameOfForm:nameOfComponent
这样的,或者是示例中的
cdForm:artist、cdForm:price、cdForm:title。decode
方法的最后一步是把提交的值保存到组件。
b).编码方法没什么惊讶的。第一个方法
encodeBegin,委托给三个帮助器方法
encodeLabel、encodeInput
和
encodeMessage
c).用
faces-config.xml
登记呈现器:与组件的登记方法相同;
第三步:创建定制标签,继承
UIComponentTag
a).返回呈现器类型:
setRendererType("com.example.DateDisplayer");
b).返回组件类型:
编写方法
public String getFamily() {
return "com.example.DateDisplayer";
}
c).设置可能使用
JSF
表达式的属性:例如:style、styleClass、Tile
第四步:登记定制标签,编写arcmind.tld
a).定制tag-uri:<uri>**</uri>
b).定制前缀:<short-name>http://**</short-name>
c).编写标签:
<tag>
<name>**</name>
<tag-class>**</tag-class>
<attribute>
<name>*</name>
<description> </description>
</attribute>
</tag>
这是JSF组件开发的过程,可以在.jsp文件中手动写标签,这些是JSF组件的开发过程。JSF组件应用在Creator中还需要做适当的更改,并且还要添加更多的类。
五、开发Creator用户定制组件概述
将第三方组件添加到
Java Studio Creator
的主要步骤如下所示(1):
1.
创建运行时JAR。创建运行时JAR时,开发者应该考虑设计时行为,因为某些代码可能会在设计时执行。组件应该是
JavaBeans
组件,并且应该遵循一些准则以确保它们可以在
Java Studio Creator 2
中正常使用。修改现有组件以在
IDE
中使用时,也应该遵循这些准则(与本文第
2
部分中所述的准则相同)。
2.
创建设计时JAR。设计时JAR包括
JavaBeans BeanInfo
类、属性编辑器、定制器、图标和其他资源以及属于
Java Studio Creator
设计时
API
一部分的类。
3.
将所有部分(运行时组件、设计时代码、图标、Javadoc、源代码以及
complib
清单)组装为一个
complib
文件。
4.
将
complib
导入到
IDE
中。用户将
complib
导入到
IDE
中并在应用程序中使用这些组件。
设计时是指仅由
IDE(如
Java Studio Creator 2)在设计JSF页面时所使用的组件部分。运行时是指部署到
Servlet
容器或应用服务器上的组件部分。在设计时,也可能在
IDE
中使用某些运行时部分(1)。例如:Render类,IDE环境要运行他在IDE中将可视化组件显示出来;
开发用户定制组件涉及到的主要文件列举如下:
1.
运行时:
a)
UIComponent组件本身:XXXComponent.java
b)
组件的呈现器:XXXRender.java
c)
组件的标记处理程序:XXXTag.java
d)
自定义标签库:XXX.tld
e)
配置文件:face_config.xml
2.
设计时:
a)
BeanInfo类:XXXBeanInfo.java
b)
BeanInfoBase类:XXXBeanInfoBase,java
c)
配置文件(生成BeangInfoBase类):sun-face-config,xml
3.
其他
a)
Javadoc文件
b)
源码
c)
帮助
六、开发运行时组件JAR
下面,将介绍开发流程,重点讲解开发过程中遇到的常见问题的解决办法!
开发Creator运行时组件和开发JSF组件十分相似,但是也有不同的地方。
1、
开发Compomnent类:考虑到要在IDE环境中显示,开发该类时注意不要使用html的元数据,而是采用JSF环境自带的api,例如:
a)
不采用Java.lang.String而应使用javax.faces.component.html.HtmlOutputText;
2、
开发呈现器:呈现器主要是在运行时生成html页面显示语句;并在IDE环境中运行充当着呈现器的角色;
3、
开发标签处理文件:在*Tag.java文件中声明,运行时JAR文件的地址,以及组件的属性;
4、
开发自定义组件库:根据标签处理类,定义该组件对应的标签;
5、
在face-config.xml文件中注册;
6、
常见错误分析:
a).编写过程中一定要保证在face-config.xml文件中定义的属性与Compontent,java中getCompontentType()方法的返回值是一致的,类似的情况也同样要注意!
b).face-config.xml中Render标签的CompontenType标签不Compontent保持一致!
另外,在编写
JavaServer Faces
组件时,需要遵循四条规则(6)。遵循了这些规则,可以确保在使用
CSS
属性调整了组件的大小和位置后,该组件可以正常发挥作用。它们还可以确保在设计阶段,这些组件能够很好地在
Java Studio Creator
之类的工具中使用。下面将按照重要性的优先顺序来介绍这四条规则:
规则
1:使用
ResponseWriter
类的方法
startElement、endElement
和
writeAttribute。
最重要的是:必须使用
ResponseWriter
的
startElement、endElement
和
writeAttribute
方法,而不是使用
write
方法。不能简单地通过
write
方法以流的方式线性输出
HTML
字节来编写标记,这一点至关重要。
但是,此规则有一个出现机率很小的例外情况:那就是某些组件需要生成用户提供的
HTML
输出。在这种有限的情况下,您可以使用
write
方法。例如,如果将
HtmlOutputText
组件的
Escape
属性设置为
false,则此例外情况适用于该组件。
规则
2:始终将组件引用传递给
ResponseWriter
中的
startElement
方法。
始终将组件引用传递给
ResponseWriter
的
startElement
方法是至关重要的。例如,如果
UIComponent
是一个
PanelGrid,并且您要生成
<table><tr><td>...作为输出,则应该将以下内容传递给
startElement:
writer.startElement("table", gridpanel);
writer.startElement("tr", gridpanel);
writer.startElement("td", gridpanel);
规则
3:为每个组件使用一个样式属性。
每个组件都应具有一个样式属性,该属性用于对所呈现的
HTML
标记呈现样式属性。当具有了样式属性,Java
Studio Creator
等工具就可以使用样式表来调整组件的大小和位置。
请记住,复制所呈现的顶级
HTML
标记的样式属性是至关重要的。遗憾的是,实际情况并非简单,应该记住以下三种可能出现的复杂情况并采取应对措施来避免出现问题:
<h:commandButton style="width: 100px"/>,则会呈现
<input type="submit" style="width: 100px"/>
规则
4:切勿从呈现器中抛出异常!
请务必不要从呈现器中抛出异常。例如,即使某个值是一个必需的属性,也不要只因为呈现的值为
null
而抛出配置异常!如果确实需要组件向用户提示出现了问题,可以在运行期间使用该组件时抛出异常。但在设计时,组件尚未正确配置是很正常的。例如,用户可能刚将组件放在页面上,正准备对其进行配置。
如有必要,可以在呈现器中添加代码来检查设计时是否使用了组件呈现器。代码应如下所示:
if (java.beans.Beans.isDesignTime()) {
// Designtime - better render error handling here
...
}else{
// Runtime - throw your exceptions if you must
...
}
七、开发设计时JAR
在设计时,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
的元数据(3)。
设计时JAR的的开发是IDE独有的,这个在JSF开发中是没有的。前面的概述中已经提到这部分文件包括:beanInfo.java、BeanInfoBase.java以及sun_face-config.xml文件。详细介绍如下:
1、
开发BeanInfo文件(2):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,它包含每个组件的元数据。
以下代码显示了呈现器所需的元数据。
<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>
2、
开发BeanInfoBase文件:这是IDE设计时最重要的文件,它向IDE环境提供了用户定制的组件的所有详细信息。该文件可以由代码生成器根据文件sun-face_config.xml的配置情况生成;如果要选择自己写,当然也可以。
3、
配置sun-face-config.xml文件:在sun-face-config.xml文件中定义了所有IDE要知道的信息:包括组件的属性、呈现器、组件在IDE中显示的标签名和前缀等;例如:
<render-kit>
<renderer>
<component-family>
com.example.LabelDisplayer
</component-family>
<renderer-type>
com.example.LabelDisplayer
</renderer-type>
<renderer-extension>
<instance-name>labelDisplayer</instance-name>
<is-container>false</is-container>
<renders-children>true</renders-children>
<tag-name>labelDisplayer</tag-name>
<taglib-prefix>liu</taglib-prefix>
<taglib-uri>
http://www.example.com/products/LabelDisplayer
</taglib-uri>
</renderer-extension>
</renderer>
4、
常见错误分析:
a).sun-face-config.xml文件的DTD(文档解析器)需要从网上下载,包含到工程目录,并且要指明所在的路径。
b).这里定义的前缀和URI要与.tld文件中定义的保持一致!
八、生成.complib
文件
相信对于有JSFCompontent开发经验的人,以上这些开发都不是难事;因为相对于JSF组件开发只有几个问题需要注意就可以了;而下面要进行的开发,对于熟悉用过ANT工具的人,也是很轻松的事情;
&n