JSF中的组件树概念尤其重要。组件树大量使用了组合设计模式,为开发者提供了大量的包括日历,表格,树,列表等标准Web组件。
同时JSF还提供了大量的组件支持类,例如转换器(可以进行类型转换),验证器(进行数据验证),绘制器(不仅仅可以使用HTML来绘制组件)。接下来我们分析一下用户界面组件。
所有组件都要实现javax.faces.component.UIComponent接口。这个接口定义了浏览组件树,和支持Bean交互,管理组件(包括数据验证,数据转换和组件绘制)等任务和方法。
JSF提供了一个组件基类:javax.faces.component.UICompoentBase。它实现了一些基本的默认的组件方法,给开发人员提供了方便,一般来说,你只需要重写特定的方法即可。
JSF使用了适配器模式帮助你使用最少的代码完成大部分工作。
如果你想创建组件,那么有三条路可以走:
直接实现UIComponent接口
继承UIComponentBase类
继承已经存在的UIComponent实现
已经存在的UIComponent组件类主要有如下:
● UIForm 表示一个输入表单
● UICommand 表示一个可在激活时执行一个动作的命令组件
● UIOutput 表示一个可显示值的组件
● UIGraphic 表示一个可显示图像的组件
● UIInput 表示一个可获取和显示用户输入的组件
● UIParameter 用于为父组件配置参数值
● UIPanel 表示一个面板(容器)组件
● UISelectItem 表示选择组件中的一个选择项
● UISelectItems表示选择组件中的多个选择项
● UISelectBoolean表示一个具有boolean值的组件
● UISelectOne 表示一个允许用户在一系列值中选择零个或一个值的组件
● UISelectMany表示一个允许用户在一系列值中选择零个或多个值的组件
事实上,一个JSF组件包括了三个部份:Tag、Component
与Renderer。
Tag就是之前使用的标签,它的目的在于设定Component属性,设定验证器,设定方法绑定等。
Component请求时,每个Component会根据自己的ID值,从请求中取得相应的值,绑定到Bean。当请求来到应用程序时,需要通过解码(decode)来
将HTTP中的内容转变成JSF组件需要的值,相对的,当JSF组件将值转变成HTTP字串资料送到客户端,供客户端显示,就称为编码(encode)。
Component可以自己实现编码,解码,也可以委托Renderer来实现。
Renderer是一个可替换的组件,Component可以搭配不通的Renderer,而不用自定义编码,解码工作,这样Component可以达到重用。
你也可以编写自己的Renderer,如果你对前台的显示有自己独特的要求的话。甚至可以让你的系统在移动设备等不同的平台上应用。
javax.faces.component.UIComponent
自订Component所要继承的父类别,但通常,您是继承其子类别,例如UIInput、UIOutput等等。
javax.faces.webapp.UIComponentTag
自订JSF标签所要继承的父类别,继承它可以帮您省去许多JSF标签处理的细节。
javax.faces.context.FacesContext
包括了JSF相关的请求资讯,您可以透过它取得请求物件或请求参数,或者是。
javax.faces.application.Application物件
包括了一个应用程式所共享的资讯,像是locale、验证器、转换器等等,您可以透过一些 工厂方法 取得相关的资讯。