日期:2014-05-16  浏览次数:20394 次

编写JSF用户自定义UI组件(之一)

一、慎用自定义UI组件

虽然计算机软件技术发展迅速,但在人机交互的方式却保持相对稳定。鼠标和键盘自诞生之日起就没有发生过什么实质性变化,而我们日常使用软件时,也只是和诸如按钮、菜单、输入框以及下拉列表等有限的几种UI组件打交道,任何一种新UI组件的产生,都意味着向几十年来累积的习惯发起挑战。

JSF框架缺省的UI组件通常能满足你的需求,如果不能满足,则有必要重新审视一下你的界面设计,问问自己这几个问题:
1. 是否用缺省的UI组件就能实现所需的人机交互功能?
2. 如果单个UI组件不能,几个UI组件组合在一起是否可以?
3. 有没有替代的界面设计方案,可以避开使用自定义UI组件?

即使答案都是否定的,也不要急于下编写自定义UI组件的决心。别忘了,除了Sun的参考实现附带的UI组件外,还有很多UI组件包供你选择:
1. 开发工具如NetBeans在安装时一般都会自动安装额外的UI组件包;
2. 专业的第三方厂商会提供种类繁多功能强大的UI组件包,例如MyFaces。JSF规范称这种专业厂商为的Component Writer,是JSF建议的5种职能划分中的一种。
不论是开发工具附送的,还是第三方厂商提供的,这些组件包有专门的开发和维护团队,经过了充分的测试和实战考验,文档详尽,与开发工具集成,有的更有技术支持,总之四个字:方便可靠。

如果这些都不能令你满意,你还是一意孤行要编写自定义UI组件,那么,在开始动手之前,先了解一下自定义UI组件的不足:
1. 需要额外的编码,让你的设计变得复杂
2. 需要花费精力测试,而如果测试不足,则有可能含有Bug
3. 可能隐藏潜在的性能问题
4. 如果你在一个团队中工作,你必须编写足够详细的Java Doc,让别人明白怎么用你的自定义UI组件
5. 如果你希望你的UI组件能够集成到开发工具中,以便显示在组件面板上,你必须面对工具相关的配置工作

二、编写自定义UI组件的好处

当然,尝试编写自定义UI组件也并非全无好处。对于JSF的初学者,这是深入了解JSF内部细节的一种有效途径。当你成功编写一个自定义UI组件并理解了每个代码片段的含义后,你对JSF框架的理解肯定会向前迈进一大步。毕竟,UI组件是JSF框架的核心。

另一个好处是你可以实现一些非标准的界面设计,有时候这是必要的。例如,假设你是JS高手,你完全可以在自定义UI组件上用JS实现一些令人眩目的客户端效果。

将若干个标准UI组件组合成一个有着某种特定功能的组件集合,是自定义UI组件的另一用处。典型的例子如文件上载组件,可由一个文本字段组件、一个“浏览”按钮组件和一个“上传”按钮组件组成。这允许你一次鼠标拖放就能将这些捆在一起的组件添加到页面上,而不必逐个添加。更重要的是,你可以在自定义UI组件的内部处理这些组件之间的相互协调,而无需组件的使用者操心。例如,在文件上传组件中,如果文本字段组件为空,则不允许点击“上传”按钮。

三、写这篇文章的用意

很多读者写邮件给我,提到JSF自定义UI组件的问题。虽然我私底下并不赞成JSF的初学者涉足这个相对比较复杂的编程领域,但程序员们打破沙锅问到底的探索精神确实值得称道。

从邮件中可以看出,大部分读者都关注着JSF的发展,有些读者实际接触过JSF,用JSF做过项目,其中不乏对JSF已经非常了解的程序员。鉴于自定义UI组件在《JSF Web应用开发实战》一书中只是一笔带过,为了使这本书能够适合更多不同程度的读者,我最终还是决定在博客上发表一些文章,系统地介绍一下JSF自定义UI组件的相关知识,作为对书中内容的一个补充。

必须申明,写这样一个文章系列,不是为了演示JSF有多复杂。关于JSF的复杂性,已经有太多的误会,个中原因,主要是JSF生命周期被谈论得太多,以至于让初学者望而却步。其实,读过《JSF Web应用开发实战》一书的读者一定发现了,JSF实际上是迄今为止最简单的、生产率最高的Web应用编程手段之一。JSF的复杂性体现在框架的实现本身,而这恰恰给作为框架使用者的程序员带来了使用上的简单和方便。好比一台自动档的车,虽然波箱比手动档要复杂得多,但显然驾驶员更轻松了。

可以这样说,自定义UI组件好比在波箱上动手脚,至少对于JSF 1.2版本来说是这样。酝酿中的JSF 2.0据说在这方面有很大的提升,编写自定义UI组件将变得十分容易。我对此变化的理解是,Sun已经不满足于自动波了,手自一体才是JSF 2.0的追求。

这个文章系列会包含多少篇文章,说实话我现在心里还真没底。可以肯定的是,我仍然会按照自己的写作习惯去组织文字,一是由浅入深,二是注重实战,三是用例子说话。还有,既然是对《JSF Web应用开发实战》一书的补充,我还是会结合NetBeans来写,至于NetBeans的版本,在写书时6.0.1是最新版,那就还是用6.0.1吧,虽然现在最新版已经是6.1了,好在与6.0.1相比变化不大,6.0.1的代码在6.1中运行应该不会有太多问题。

四、下一篇文章内容预告

好了,开篇说了一堆与编程无关的东西,算是给自己和读者一个交代吧。下一篇文章将举例说明如何编写一个最简单的JSF用户自定义UI组件。这个最简单的东东可能没什么实际用途,但用来说明自定义UI组件的编程步骤却非常合适,好比著名的“Hello world”,不过是在屏幕上显示两个英文单词而已,却是学习编程语言的入门第一课。

1 楼 upheart 2008-11-13  
赞同不要轻易自定义组件:
1.考虑当前组件能不能变通一下使用。
2.第三方组件,比如richfaces等很多
3.考虑使用facelets来自定义、组织和封装组件
4.适当的自定义组件