Thursday, August 03, 2006

JSF 中的装饰器

前端的UI 组件一般情况下并不关心如何“装饰”自己。如果组件可以自我装饰的话,我们称之为直接扩展模式,不过JSF还同时提供了另一种方式,称之为层次扩展模式,这种模式可以将装饰类从UI种分类出来。这些装饰类就是我们说的装饰器(renderders)。

装饰器一般被分包组合,特定类型的装饰器被放到一起。JSFHTML4.1提供了一套标准的装饰器,当然,除了HTML外还有其他的装饰器套件,比如WMLSVG等,甚至可以是AppletJava应用程序或者其他客户端。

你可以把装饰器看作是客户端与服务端之间的一个翻译器。在服务器端装饰器负责编码,这一过程将让组件变成客户端可以看懂的形式。当JSF接收到来自客户端的响应时,装饰器复杂解码,这一过程将解析当前请求的参数并根据这些参数设置组件的值。

比如下面的代码定义了一个Html输入框:

当这个组件被编码之后,在客户端将显示下面的代码:

maxlength="30" size="20" />

假设,用户在这个文本框中输入“foo”这个词。解码的过程就是通过http协议传输这个值并在服务器端给组件赋值为“foo”。目前,标准html套件中的文本框装饰器负责处理这一过程。因为所有的编码和解码过程都由一个实体负责(包括组件和装饰器),组件的显示和请求响应的底层传输协议都是自包含的。

当组件使用层次扩展模式时,修改页面显示的样式只要更换组件装饰器就可以了。这意味着你可以非常容易的定义组件的显示模板,对于HTMLWMLSVG不同的格式,组件都是相同的,如果需要使用不同的扩展标记只要修改一些装饰器就可以了。

值得注意的是,使用HTML开发时,HTML装饰器已经非常完备了。所有标准HTML组件的装饰器已经具备,所以你不必再为这些担心。然而,当你想动态修改你的应用程序外观时,或者想开发自己的自定义组件时,JSF中的装饰器就变得非常重要了。我会在后续的文章中详细介绍装饰器。

No comments: