-------------------------------------------------------------------------------------------------------------
                                      留言                     上一页                 回首页


     

   

   

   

  
   

Sun Java Studio Creator   

组件开发全攻略   

   

作者:封朋成 刘应杰   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

摘要sun java studio creator(以下简称creator)SUN公司新出的一个快速的WEB应用程序及Portlet的可视化开发工具;在本文中,将介绍creator(以及相关的JSF)开发的特点;深入研究creator,开发用户定制组件;  

 

关键字 creator  JSF  compontent  ANT 定制组件 可视化  

   

一、creator 开发环境简介   

    Java Studio Creator 开发工具允许以可视化方式快速地开发 Web 应用程序和 PortletJava 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中配置ANThttp://www.crackj2ee.com/Article/ShowArticle.asp?ArticleID=5  

2、建立工程  

    Myeclipse中,新建Web工程,添加JSF,配置ant  

eclipse中建立的文件目录结构如下(其中不包括build,dist目录,是由ant自动生成的):  

   

四、JSF组件开发(7)   

因为Creator的组件开发与JSF组件开发很相似,所以首先介绍JSF组件的开发,作为Creator组件开发的对比。  

采取的步骤如下: 

  1. 扩展 UIComponent  
    • 创建一个类,扩展 UIComponent  
    • 保存组件状态  
    • faces-config.xml 登记组件  
  2. 定义呈现器*Render类或者内联地实现它  
    • 覆盖 encode  
    • 覆盖 decode  
    • faces-config.xml 登记渲染器 
  3. 创建定制标签,继承 UIComponentTag  
    • 返回呈现器类型  
    • 返回组件类型  
    • 设置可能使用 JSF 表达式的属性 
  4. 登记定制标签,编写arcmind.tld  
    • 定制tag-uri  
    • 定制前缀 
    • 编写标签 

具体实现介绍如下: 

(用户可参考:JSF组件开发http://www.blogjava.net/raozhh/archive/2006/01/10/27351.html 

第一步:扩展 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:artistcdForm:pricecdForm:titledecode 方法的最后一步是把提交的值保存到组件。   

b).编码方法没什么惊讶的。第一个方法 encodeBegin,委托给三个帮助器方法 encodeLabelencodeInput encodeMessage   

c). faces-config.xml 登记呈现器:与组件的登记方法相同;   

第三步:创建定制标签,继承 UIComponentTag   

a).返回呈现器类型: setRendererType("com.example.DateDisplayer"); 

b).返回组件类型: 编写方法 

   public String getFamily() { 

        return "com.example.DateDisplayer"; 

    } 

c).设置可能使用 JSF 表达式的属性:例如:stylestyleClassTile 

第四步:登记定制标签,编写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,javagetCompontentType()方法的返回值是一致的,类似的情况也同样要注意! 

b).face-config.xmlRender标签的CompontenType标签不Compontent保持一致! 

    另外,在编写 JavaServer Faces 组件时,需要遵循四条规则6。遵循了这些规则,可以确保在使用 CSS 属性调整了组件的大小和位置后,该组件可以正常发挥作用。它们还可以确保在设计阶段,这些组件能够很好地在 Java Studio Creator 之类的工具中使用。下面将按照重要性的优先顺序来介绍这四条规则:  

    规则 1:使用 ResponseWriter 类的方法 startElementendElement writeAttribute  

    最重要的是:必须使用 ResponseWriter startElementendElement 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 标记的样式属性是至关重要的。遗憾的是,实际情况并非简单,应该记住以下三种可能出现的复杂情况并采取应对措施来避免出现问题:  

    呈现单个顶级的 HTML 元素 - 通常,您使用 JSP 标记来呈现单个顶级的 HTML 元素(甚至可能包含子级元素)。在本例中,只需将 JSP 标记的样式属性值复制到顶级 HTML 标记属性中即可。例如,如果 JSP 中包含
<h:commandButton style="width: 100px"/>
,则会呈现
<input type="submit" style="width: 100px"/>  

   呈现多个顶级的 HTML 标记,但只有一个可视标记 - 如果需要呈现多个顶级的 HTML 标记,但只有一个标记是可视标记,则应该复制该可视标记的样式属性。例如,组件可能要先呈现 <script> 标记,然后再呈现它的一个可视元素,即 <table> 标记。呈现 <table> 标记后,组件可能会呈现另一个非可视元素,如类型为 hidden <input>。在本例中,只需发出 <script>,然后发出 <table>(其 style 属性值来自 JavaServer Faces 组件),最后发出类型为 hidden <input> 即可。  

    将多个可视元素呈现为同等顶级元素 - 如果必须将多个可视元素呈现为同等的顶级元素,则需要将这些元素包装在单个容器组件(如 <span> <div>)中。请务必将样式属性只放在外部组件级别上,从而包装 <span> <div>。还请注意,只有当呈现的所有子元素都是内联元素时,才应该使用 <span> 容器组件。  

    规则 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.javaBeanInfoBase.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