JSF——自订组件

来源:互联网 发布:淘宝客服售后工作 编辑:程序博客网 时间:2024/05/29 02:32

自订组件

  JSF 让您可以自订组件,每个组件都是可替换的,这使得组件在搭配时更有弹性,但相对的却使开发组件的过程复杂的多,这边对自订JSF 组件只是个入门砖,更多有关自订组件的细节可得要专书来说明。

  • JSF 生命周期与组件概述
    要开发 JSF 组件,您需要更深入了解 JSF 的一些处理细节,包括了 JSF 生命周期以及 JSF 框架。
    o JSF 生命周期
    o 概述自订组件

JSF 生命周期

JSF的每个组件基本上都是可替换的,像是转换器(Converter)、验证器(Validator)、组件(Component)、绘制器 (Renderer)等等,每个组件都可以替换让JSF在使用时更有弹性,但相对的所付出的就是组件组合时的复杂性,为此,最基本的,如果您打算自订一些 JSF组件,那么您对于JSF处理请求的每个阶段必须要有所了解。

  下图是JSF处理请求时的每个阶段与简单说明,起始状态即使用者端发出请求时,终止状态则相当于绘制器发出响应时:

  扣除事件处理,JSF总共必须经过六个阶段:

  • 回复画面(Restore View

  对于选择的页面如果是初次浏览则建立新的组件树。如果是会话阶段,会从使用者端或服务器端的数据找寻数据以回复每个组件的状态并重建组件树,如果不包括请求参数,则直接跳过接下来的阶段直接绘制响应。

  • 套用申请值(Apply Request Values

  每个组件尝试从到来的请求中找寻自己的参数并更新组件值,在这边会触发ActionEvent,这个事件会被排入队列中,然后在唤起应用程序阶段之后才会真正由事件处理者进行处理。
然而对于设定immeduatetrue的命令(Commamnd)组件来说,会立即处理事件并跳过之后的阶段直接绘制响应,而对于设定 immediatetrue的输入(Input)组件,会马上进行转换验证并处理值变事件,之后跳过接下来的阶段,直接绘制响应。

  • 执行验证(Process Validations

  进行转换与验证处理,如果验证错误,则会跳过之后的阶段,直接绘制响应,结果是重新呼叫同一页绘制结果。

  • 更新模型值(Update Model Values

  更新每一个与组件绑定的backing bean或模型对象。

  • 唤起应用程序(Invoke Application

  处理动作事件,并进行后端应用程序逻辑。

  • 绘制回应(Render Response

  使用绘制器绘制页面。

  如果您只是要「使用」JSF,则您最基本的只需要知道「执行验证」、「更新模型值」、与「唤起应用程序」这三个阶段及中间的事件触发,JSF参考实作将这三个阶段之外的其它阶段之复杂性隐藏起来了,您不需要知道这几个阶段的处理细节。

  然而如果您要自订组件,则您还必须知道「回复画面」、「套用请求值」与「绘制响应」这些阶段是如何处理的,这几个阶段相当复杂,所幸的是您可以使用JSF 所提供的框架来进行组件自订,JSF提供的框架已经很大程度上降低了组件制作的复杂性。

  当然,即使JSF框架降低了复杂性,但实际上要处理JSF自订组件还是很复杂的一件事,在尝试开发自订组件之前,您可以先搜寻一些网站,像是 Apache MyFaces http://myfaces.apache.org/,看看是不是已经有相关类似的组件已经开发完成,省去您重新自订组件的气力。

概述自订组件

所谓的「自订JSF组件」是一个概略的称呼,事实上,一个JSF组件包括了三个部份:TagComponent Renderer

 Tag即之前一直在使用的JSF卷标,类似于HTML卷标,JSF卷标主要是方便网页设计人员进行版面配置与数据呈现的一种方式,实际的处理中,JSF标签的目的在于设定Component属性、设定验证器、设定数据绑定、设定方法绑定等等。

 Component的目的在于处理请求,当请求来到伺服端应用程序时,每一个Component都有机会根据自己的client id,从请求中取得属于自己的值,接着Component可以将这个值作处理,然后设定给绑定的bean

 当请求来到Web应用程序时,HTTP中的字符串内容可以转换为JSF组件所需的值,这个动作称之为解碼(decode),相对的,将JSF 组件的值转换为HTTP字符串数据并送至客户端,这个动作称之为编码(encode),Component可自己处理编码、译码的任务,也可以将之委托给 Renderer来处理。

 当您要自订Component时,您可以继承UIComonent或其相关的子类别,这要根据您实际要自订的组件而定,如果您要自订一个输出组件,可以继承UIOutput,如果要自订一个输入组件,则可以继承UIInput,每一个标准的JSF组件实际上都对应了一个 UIComponent的子类别,下图为一个大致的类别继承架构图:

 

 实际上要自订一个组件是复杂的一件工作,您首先要学会的是一个完整的自订组件流程,实际上要自订一个组件时,您可以参考一下网络上的一些成品,例如 Apache MyFaces http://myfaces.apache.org/,接下来后面的几个主题所要介绍的,将只是一个自订组件的简单流程。

 Renderer是一个可替换的组件,您的Component可以搭配不同的Renderer,而不用自行担任绘制响应或译码的动作,这会让您的 Component可以重用,当您需要将响应从HTML转换为其它的媒介时(例如行动电话网络),则只要替换Renderer就可以了,这是一个好处,或 者您可以简单的替换掉一个Renderer,就可以将原先简单的HTML响应,替换为有JavaScript功能的Renderer

 当您开始接触自订组件时,您会开始接触到JSF的框架(Framework),也许有几个类别会是您经常接触的:

  • javax.faces.component.UIComponent

 自订Component所要继承的父类别,但通常,您是继承其子类别,例如UIInputUIOutput等等。

  • javax.faces.webapp.UIComponentTag

 自订JSF标签所要继承的父类别,继承它可以帮您省去许多JSF标签处理的细节。

  • javax.faces.context.FacesContext

 包括了JSF相关的请求信息,您可以透过它取得请求对象或请求参数,或者是 javax.faces.application.Application物件。

  • javax.faces.application.Application

 包括了一个应用程序所共享的信息,像是locale、验证器、转换器等等,您可以透过一些 工厂方法 取得相关的信息。

 

 
原创粉丝点击