第28章 构件开发

28.1. 构件开发的一般过程
28.2. 渲染机制介绍
28.3. 开始实例
28.3.1. FushionCharts Column2D构件
28.3.1.1. 开发过程分析
28.3.1.1.1. 第一步:写出HTML代码
28.3.1.1.2. 第二步:找出可变部分与不变部分
28.3.1.1.3. 第三步:决定需要的构件类应该有哪些属性
28.3.1.1.4. 第四步:生成构件类,看看有没有可改进的地方
28.3.1.1.5. 第五步:为渲染器类准备资源
28.3.1.1.6. 第六步:确定渲染器需要覆写哪些方法
28.3.1.1.7. 第七步:实现渲染器中各要覆盖方法
28.3.1.1.8. 第八步:配置各个配置文件
28.3.1.1.9. 第九步:打包成jar文件
28.3.1.2. 使用OperaMasks来开发FusionCharts Column2D构件
28.3.1.2.1. 第一步:新建一个构件工程
28.3.1.2.2. 第二步:添加一个构件
28.3.1.2.3. 第三步:写构件Base类,生成构件类
28.3.1.2.4. 第四步:准备资源
28.3.1.2.5. 第五步:写渲染器类
28.3.1.2.6. 第六步:打包成jar文件
28.3.1.3. 使用自定义的构件
28.3.1.4. 对Column2D构件进行改进
28.3.2. FusionCharts Area2D构件

28.1. 构件开发的一般过程

在正式讲构件开发之前,先给出几个名词:

  • Base类(Base Class):构件类的父类,其实这个类不是必需的,但是为了方便OperaMasks Studio自动生成构件类和Tag类,我们把无法生成的代码放在这个类中,所以实际上构件Base类和构件类合起来才是真正的构件类。这个类直接或间接继承自javax.faces.component.UIComponentBase类,里面包含构件的所有属性,当然还可能会有一些特殊API、一些private方法,当然还可能会有一些本应该出现在构件类里的方法、常量、变量(注意:如果构件Base类中已经存在某些由Operamasks Studio生成并本应该出现在构件类中的常量、属性、方法等,则Studio自动生成构件类时不会重复生成,一般是不必要在构件Base类中写这些的,但是如果有特殊需要而无法由Studio自动生成,则用户可以将这些特殊的方法、常量、变量写在构件Base类中以达到特殊定制的目的)。

  • 构件类(Component Class):这个类一般直接继承自构件Base类。这个类一般由Studio自动生成,里面包含一些getter/setter方法、saveState/restoreState方法、Operation/Delegate方法、构造函数、getFamily/getComponentType/getRendererType以及特殊的operationMethodsMap变量和getOperationMethodsMap()方法。

  • 渲染器类(Renderer Class):构件的渲染器类。对构件进行渲染,生成显示构件用的HTML+JavaScript代码的类。

  • Tag类(Tag Class):构件的Tag类。这个类一般由Studio自动生成,里面包含一些属性、getter/setter方法、setProperties方法、release方法。

  • 构件类型(Component Type):在同一命名空间中一个构件区别于另一个构件的唯一标识,一般存在于构件类中,自动生成,也可能在Base类中由用户手工指定。

  • 构件家族(Component Family):构件所属的分类。一般存在于构件类中,自动生成,也可能在Base类中由用户手工指定。

  • Render Kit:它代表一个渲染器的集合,通常基于客户端设备类型、标记语言和/或用户locale的某些组合,专门用于渲染应用中的用户界面构件,类似于主题或皮肤的功能。

  • 资源(Resources):渲染构件时使用到的一些外部资源文件(js头文件、css文件、图片、音乐、swf文件、applet文件、HTML文件等)。

那么要开发一个构件一般会做这些事情:

  • 1 定义一个构件Base类。这个类直接或间接继承自javax.faces.component.UIComponentBase类(间接继承意思是继承自另外一个已经存在的构件,那个构件已经继承了javax.faces.component.UIComponentBase类)。

  • 2 定义一个构件类。这个类直接继承自构件Base类,这个文件可以全部由Operamasks Studio生成。

  • 3 定义一个Tag类。这个类直接继承或间接继承自org.operamasks.faces.webapp.html.HtmlBasicELTag类。这个文件可以全部由Operamasks Studio生成。

  • 4 准备一些js、css、图片等资源,并在“资源描述符”中配置js和css的分组和别名,OperaMasks Studio提供了可视化的界面,用户不必手工编写xml文件。

  • 5 定义一个渲染器。直接或间接继承自HtmlBasicRendererBase或AjaxRendererBase(如果要用在f:view的renderKitId="AJAX"的页面中,则必须继承AjaxRendererBase)。

  • 6 在xml中配置该构件。配置命名空间、tag名、tag名与构件类对应信息、构件与渲染器对应信息等,这此配置全部由OperaMasks Studio自动生成。

  • 7 导出成jar包,在其它工程或服务器中使用这个jar包。

其中有两个主要部分:构件类和渲染器类。构件类无非就是一些属性和getter/setter等方法,大部分内容可以自动生成,一个构件有哪些属性也比较容易确定。重点是渲染器类,这个类根据用户使用构件的情况“写”出一些HTML和JavaScript代码到页面的源代码中。要开发出一个构件,需要了解OperaMasks引擎中构件的渲染机制,请看下一节。