摘要:一个没有Java经验,完全不懂Web编程的程序员,也能用JSF写出复杂的Web程序?本文作者向读者介绍了自己的JSF历程,以亲身经历证明JSF是程序员通往Java   Web世界的捷径。

说实在的,我的Java   Web之路,其实没有什么特别的,之所以写成文字,将自己的经历拿出来和读者共享,是希望给刚刚投身Java的程序员们一个参考。我相信每个Java程序员都有自己独特的Java历程,每段Java历程都有值得大家去分享的理由。经验也好,教训也罢,如果能够在Java程序员彷徨徘徊之际,给予他们一点帮助,让他们鼓起勇气,继续前进,那就不枉此文了。 
  
为了让您对文章内容有个大致的了解,以便决定是否要浪费时间看下去,下面列出了文章的目录: 

    1.   前言:此文的目的 

    2.   Hello,world!我的全部Java经验

        初遇Java,我的真实感受 
        缺乏IDE的Java 
        别了,Java 

    3.   一片空白的Web 

        不懂Web的老程序员 
        程序人生的十字路口 
        鱼与熊掌,不可兼得

    4.   用JSP写的第一个Web程序

        Jbuilder引领我的JSP之旅 
        Jbuilder老矣,尚能饭否? 
        Java   Web里的汇编、C和C++ 
        JSP繁琐的Form处理 
        Sun所宣称的JSF优点 

    5.   因为无知,我选择了JSF 

        傻人的傻福 
        JSF的UI组件 
        JSF的事件和生命周期 

    6.   结束语:享受Java,享受程序人生 

初遇Java,我的真实感受 

关于Java的最初记忆已经很遥远了,遥远到连年份都已模糊。是什么吸引我注意Java的?是它奇怪的名字?还是它Write   Once,Run   Anywhere的宣言?我没有确切的答案。只记得那是上个世纪九十年代,我正是一名快乐的程序员,做着自己喜欢做的事,拿着令人羡慕的不菲薪水,生活紧张有序,人生充满期待。 

那时还没有如今这么方便的互联网,看书和上机实践是程序员学习新技术的唯一手段。我手边经常摆放着大量的计算机书籍,各种各样的语言、系统、平台、技术以、内核以及奥秘等等,我都兴趣盎然。写完程序,偶有闲暇时,翻翻书,写段小程序,体验一下新的技术,是我那时最好的娱乐。 

我就是在这样的情形下认识Java的。当时Java刚被发明出来,我不知道从哪里搞来一篇文章,是介绍Java的,具体内容早已忘到爪哇国去了,只记得里面有一个“Hello,world!”的例子。程序员没有不知道“Hello,world!”的,尤其是学过C语言的。我就是在C语言教材里第一次碰到“Hello,world!”的。由于C相当的普及,以至于在屏幕上打印“Hello,world!”,都成了各种编程语言入门教程的八股格式了。 

我照着那篇介绍Java的文章里的例子,原封不动地敲到电脑里面去,当屏幕上果真打印出那句著名的“Hello,world!”时,我一点也不惊奇。 Java的“Hello,world!”没有什么特别的,和C一样,甚至还不如C,至少,C有Borland公司的IDE,Java有吗?用文本编辑器写代码,用字符界面输出信息,用命令行执行程序,没有比这个更落后的了。Java没有打动我,被塞到了书堆的最底层。于是,“Hello,world!”成了我唯一的也是全部的Java经验。

缺乏IDE的Java 

我曾经是“文本-字符-命令行”的狂热爱好者。在大学时代,我们学习单片机,一块电路板上安装了集CPU、RAM和其他一些模块于一体的集成块,配上一些辅助电路,装在一个塑料盒子里,外加一个直流电源,那是我最初的笔记本电脑。虽然屏幕只有一行,虽然一行只能显示16个字符,虽然每个字符只有16个段,但当通电后屏幕上蓝色的字符开始闪烁时,我会立刻变得十分兴奋。胳膊下夹着我的心爱的笔记本电脑,往返于宿舍、食堂和实验室,是我最骄傲的记忆。 

单片机之后是DOS,同样是“文本-字符-命令行”的天下,不过,已经有一些界面优美的程序出现了,最著名的莫过于PCTOOLS了,一个软件集成了几乎所有的操作,并且用一个功能键就代替了冗长的命令行。那时我们用容量为360K或720K的软盘,里面有操作系统、Basic编译程序、 PCTOOLS,揣在书包里,辗转于各个机房,用饭票换上机时间,在单色显示器前用行编辑器写代码,即便经常因为超时被机房管理员呵斥,依然乐此不疲。

别了,Java 

我错过Java的另一个原因,是我首次接触Java时,正是Component(组件)和OO(面向对象)的天下,我沉迷在 PowerBuilder、C++Builder和Delphi的世界里如鱼得水,无暇他顾。Drag-and-Drop技术让开发变得如此轻松,是我在大学通宵达旦写C程序时不曾预料到的,而OO和面向过程的巨大区别,让我以往的经验似乎派不上用场了,我正忙于改变自己,适应潮流。 

所以,第一个Java程序没有给我留下太多的印象:字符界面、命令行以及用文本编辑器写的代码,这些都是已经被Windows只手遮盖的东西了;虚拟机似乎也没什么必要,Windows已经一统天下,再加上一个“中介”,不是多余吗?Java的类,和C++的类有本质区别吗?好象还不如C++那么完善。“Write   Once,Run   Anywhere”对我没有任何意义,因为我只写Windows程序!Java,在我看来,只不过是编程语言芸芸众生中毫不起眼的一个角色,没有C的三头六臂,没有C++的大家风范,也没有VB的善解人意,更比不上PowerBuilder的特立独行,也许用不了多久,Java就会销声匿迹。 

我不曾预料到,这个看似平凡的Java,居然成为影响世界的语言。后来Java之树在服务器端生根发芽,枝叶逐渐蔓延到桌面应用,大有在如日中天的 Windows下撑出一片荫凉之势时,确实有点出乎我的意料。而当程序员招聘广告上Java字样越来越多,我才意识到Java的时代正在到来。而此时的我,只有一点“Hello,world!”的可怜经验。毫无疑问,我已经在Java的世界里掉队,是不争的事实了。 

是Borland公司改变了程序员的生活。著名的Turbo系列集成开发环境,终结了落后的命令行方式。全屏幕编辑、在线帮助、编译错误定位以及单步调试等等,给程序员注入了新的活力。在一个漂亮、清晰、完善的集成开发环境里编写代码、编译、运行、调试,是所有程序员的梦想,Borland做到了。在 Turbo   C里,一切操作都简单到只需按一个功能键!因此,自从开始使用Toubo   C以后,我就再也不愿意回到命令行了。这也解释了为什么当Java的第一个例子以命令行方式运行完成后,我就束之高阁了。如果Java的最初版本是伴随着一个IDE一起发布的,或许我的Java经验就会和Java的年龄一样大了。

不懂Web的老程序员 

如果说Java我至少还写过一个程序的话,那么Web方面我真的是一文不名了。为什么会这样?象我这样一个自诩为老程序员的人,居然会不是Web专家?就算不是Web专家也不要紧啊,难道竟然没有写过若干个大型的Web程序?退一万步吧,大型的Web程序没有写过可以理解,一两个实验性质的网页总编过吧?很不幸,我没有。 

我确实是一个老程序员,程序可以为我作证。我写过很多程序,有些是大多数年轻的程序员甚至不曾听说过的。比如Z80、MCS51、8086、汇编、寄存器、中断等等,恐怕有些读者不知道我在说什么。汇编语言,最接近CPU的编程语言,年轻的程序员也许听说过,但用过的就凤毛麟角了。DOS下的 debug,汇编语言的调试软件,曾经是我最爱用的工具,研究病毒和破解加密程序就是靠它。当然,汇编语言离业务逻辑太远了,再加上莫尔定律下飞速发展的硬件能力,现在甚至连操作系统的核心代码都不用汇编来写了。 

之所以提到汇编语言,只是为了说明我是老程序员。汇编语言的经验在现在没有任何用处了,即使是单片机,如今最次的也都C了。从汇编到C到C++,编程语言层出不穷,作为程序员的我,始终追随着编程语言的步伐,边学边用,不敢有丝毫的懈怠。唯独在Web领域,我远远落在了时代的后面。 

程序员是一个活到老学到老的职业,3个月不抬头看路,你的眼前就会冒出许多技术的新面孔。先是OO,我写了很多C++的程序;然后是 Client/Server,我又写了很多PowerBuilder的程序;后来到了Browser/Server,我还想写很多Web程序,可是,我已经没有写程序的机会了。原因很简单,当Web渐成程序员们的口头禅时,我做“管理”了。 
 

程序人生的十字路口 

我走过的路,和很多程序员一样。22岁,学生们带着从老师那里学来的若干理论,投身到程序员的行列,工作稳定,学习的机会又多,他们满怀期待;25 岁,程序员变成了高级程序员,虽然辛苦,虽然有压力,但薪水不菲,他们充满感激;28岁,高级程序员晋升到资深程序员,登上作为程序员的职业顶峰,见多识广,在技术领域里呼风唤雨,他们踌躇满志。30岁,资深程序员还是资深程序员,虽然还是那样德高望众,虽然还是那样受人尊敬,但他们来到了程序人生的十字路口,他们开始不知所措了。 

“做管理还是做技术,这是个问题”。一直做管理的人,他们不存在这个问题,管理可以从26岁做到62岁;先做技术后做管理的人,有问题但不严重,虽然他们的技术底子可以让他们更专业,但管理经验的不足,通常会成为他们继续晋升的障碍;一直做技术的人,他们的问题就大了,没有人希望你继续做技术,你自己也知道应该转向管理,可是,如果你偏偏生就了一付不喜欢管理的脾气,你该何去何从? 

继续做技术吧,你的性价比不如年轻程序员,因为你受雇的公司通常没有核心技术,也不需要技术积累,或者,即便有核心技术,即便需要技术积累,你的成本还是高于重新培养一个新人。很低的价钱就能招到一个有潜力的程序员,签个培训协议,就能稳定三五年,随时要求加班而毫无怨言。再说了,炒掉你并不需要付出很高的代价,事实上,根本就没有代价,如果你得到了一笔遣散费,那是因为同情。 

这是我的无奈,也是很多老程序员的无奈,更是中国软件行业的无奈,而归根结底,我不知道到底是谁的无奈。程序员被划入吃青春饭一族,与舞女和模特同类,这多少有些中国特色。所以,当我30岁的时候,我把自己归入了老程序员的行列。为了能够体面地生活,像我这样的老程序员接受面试时,都知道必须为自己争取一个管理职位。我会告诉主考官我喜欢管理,我管理过某某项目,并大谈软件开发的过程、文档、规范和质量。学而优则仕,难道是程序员的唯一出路?
 

鱼与熊掌,不可得兼 

我见过很老的美国程序员,也和很老的印度程序员一起工作过,他们的程序就像他们的年龄一样,让人放心。当你向他们要一个程序时,他们会谨慎地告诉你,他们需要一些时间考虑一下,然后,他们会给你一个清单,列出他们认为可能存在的问题。你接过来一看,很多问题确实是你没有考虑到的。他们开始动手写代码的时间总是不如年轻程序员那么早,但他们的代码经历的回归测试的次数也比年轻程序员少,最终你会发现他们的效率是最高的。他们慢,但他们验证了那句名言:越早开始,越晚结束。 

关于老程序员的讨论,是个忧伤的话题,就此打住吧。我想说的是,在我想写程序,而且能写程序的时候,我成了某某经理,成了某某主管,成了某某总。整天说一些言不由衷的话,做一些枯燥乏味的事,想一些没有结论的问题。我的薪水增加了,超过了身边最优秀的程序员,但我觉得很累,没有成就感,而且最伤心的是,我错过了Web。 

好在当C/S逐步向B/S过渡,Web渐成燎原之势时,网上关于Web的技术讨论风起云涌。多亏了那些评论文章,让我用有限的时间了解了关于Web的技术动态。ASP、PHP、JSP这些字眼不时在眼前出现,多少给了我一些Web编程的基本概念。我没有写过一行Web代码,不过,凭着一个程序员的职业敏感,我还是找到了正确的方向,所以,若干年后,当我着手开发我的第一个Web程序时,我决定用JSP。
JBuilder引领我的JSP之旅 

那时我离开了令人厌烦的“管理”岗位,实际上,我决定自己创业,所以辞职不干了。颇具戏剧性的是,我的第一个创业项目不是我所熟知的PowerBuiler或Delphi,而恰恰是我的软肋,Java的Web编程。 

程序是用Jbuilder开发的,采用JSP技术,很简单,但我花了长达3个月的时间。这三个月中,我真正写程序的时间倒不多,大部分的时间里,我都是在Google上搜索。没有时间系统地学习Java的Web编程,我只能摸着石头过河,好在Google上“石头”
很多,所有问题都能找到答案,尽管可能不是最优的。 

开发的过程紧张而又快乐,我又像一个真正的程序员那样,找到了自己的位置,找到了感觉。把全部的心血浇注到键盘上,眼看着代码像豆芽一样生长,我心满意足。 

JSP让我明白了很多Web术语,Servlet、请求、响应、会话、表单、提交、Bean等等,我徜徉在JSP的世界里,感觉自己又恢复了青春的活力。 

值得一提的是Borland的Jbuilder,不愧为一个优秀的集成开发环境。老程序员都会感激Borland公司,从Turbo   C开始,Borland公司为程序员提供了业界最优秀的集成开发环境,不管是C还是Pascal还是Java,Borland公司的开发工具都是值得信赖的。简单的配置、人性化的界面,强大的功能,优秀的帮助文档,详尽的例子以及始终如一的稳定表现,让Borland成为程序员公认的IDE大师。 

就像Turbo   C一样,Jbuilder没有让我失望。下载、安装、运行,在帮助文档的指引下,我编写了我的第一个JSP页面,点击运行按钮,“Hello,world!”郝然出现在浏览器的窗口里,那一刻,我有点呆了,不是因为这一切都来了,而是因为来得太快了。没有任何配置,不需要添加什么插件,Borland为我准备了所有的东西。


Jbuilder老矣,尚能饭否? 

可惜,Borland毕竟老了,Jbuilder现在明显不敌Eclipse了。在开源的时代,产品更新换代的速度不是以年计,而是以月计,以周计,甚至以天计。插件显然比一个全新的版本来得快,也来得容易。这是Eclipse的聪明之处。Eclipse是个空骨架,可是无数的程序员在为其添加血肉,使得Eclipse日渐丰满起来。 

老实说,Eclipse给我的最初印象非常糟糕,仅仅插件的配置就花了我N天的时间。好不容易让JSP在Eclipse中跑起来,一个低劣的插件就能让Eclipse非正常死亡。这在Jbuilder中,你需要有中×××的运气才做得到。非常怀念Borland的Jbuilder,其实 Jbuilder也有插件,称为OpenTool,可惜一直没有流行起来,这应该是Borland公司宣传策略上的失误,要知道,“是金子总会发光”不错,但没有广告,别人是看不到金子的光的。 

我用过的Jbuilder最高版本是Jbuilder   2006。和早期的Jbuilder版本例如7和9相比,Jbuilder   2006显得过于臃肿了。Jbuilder   7甚至在我只有512M内存的PIII   600笔记本上也能跑起来,而Jbuilder   2006,如果没有1G以上的内存,你就准备等到花儿都谢了吧(当然,和Sun的开发环境比起来,Jbuilder   2006就算不上内存杀手了,呵呵)。 

从Jbuilder7到Jbuilder   2006,如果从单纯Java   IDE的角度去评判,Jbuilder给程序员们带来的惊喜,远远不如它占用的内存和硬盘空间那么猛烈。到底是什么让Jbuilder   2006成为了庞然大物呢?是Borland八爪鱼般四处出击的产品线规划。统一建模语言、配置管理、协同工作环境等等,Borland巨人的触角已经深入到软件开发生命周期的几乎所有环节,Jbuilder已经不是单纯的IDE了。 

Borland从IDE发家,难道最后竟然要栽在IDE上么?阿弥陀佛。


Java   Web里的汇编、C和C++ 

用JSP技术开发Web程序,让我联想到Z80和MCS51上的汇编程序。低级语言和高级语言的区别,体现在语言是更靠近CPU还是更靠近业务。汇编语言是离CPU最近的语言,也是离业务最远的语言,所以用汇编语言编程时,可能只有1%的时间是业务相关的,另外99%的时间你都是在寄存器上来来回回倒数据。高级语言如C++,则相当靠近业务了,基本上你不需要关心内存啊句柄啊之类的东西,集中精力写你的业务逻辑就行了。介于汇编和C++之间的是C语言,它比汇编更靠近业务,比C++更靠近CPU。一方面,C语言让你摆脱了内存地址和寄存器的纠缠;另一方面,如果愿意,C也可以直接控制CPU,事实上,在C里面是可以嵌入汇编代码的。C之所以长盛不衰,成为计算机专业的必修语言,和C强大的适应能力是分不开的。 

在Java的Web编程领域,也可以类似方法对诸多技术进行分类。如果把Servlet看成是Web编程的“汇编语言”,那么,建立在Servlet 之上的JSP技术就相当于Web编程的“C语言”了。而引入了component模型和事件驱动模式的JSF则更贴近业务端,几乎可以视同Web编程的 “C++语言”了。 

Servlet是Java动态网页的鼻祖,为Java   Web带来了生成动态内容的能力。Servlet允许程序员干预服务器返回给浏览器的每一个字节,就像汇编语言允许程序员访问CPU寄存器一样。这给了程序员极大的权力,同时也带来了沉重的负担,程序员不但需要生成业务相关的信息,还要给这些信息加上诸如 之类的HTML标签,以使信息能以适当的方式显示在用户的浏览器上。在我看来,这种“一点技术含量都没有”的事情,不应该浪费程序员宝贵的时间。 

JSP比Servlet向前迈进了一步,至少,程序员可以不用再为静态的HTML内容操心,那些难看的HTML标签现在可以交给工具去处理了。程序员的工作,简化为根据业务逻辑生成动态信息,然后插入到JSP文件的适当位置。 

JSF又如何呢?构建在Servlet和JSP技术基础之上的JSF,除了拥有二者的全部优点之外,更引入了组件模型和事件驱动模式,这给Java的Web编程带来了巨大的变革,如同C++在C领域里所带来的震撼一样。后面我们将看到这一点。


JSP繁琐的Form处理 

显然,显示动态网页远非Web编程的全部,除了显示信息,Web程序还需要从用户那里收集信息,这就是Form的作用。JSP在Form的处理方面,非常灵活,也正是因为灵活,JSP的Form处理也异常繁琐。在程序员的世界里,灵活是一面双刃剑。比如C,是我见过除汇编语言外最灵活的编程语言了,可是C也是我见过的最复杂的编程语言。有些C的初学者,对着教材发上几个小时的呆,也不知C的“引用”和“指针”为何物。 

JSP当然没有复杂到C那个程度,但也足以令程序员头痛了。例如JSP写一个简单的输入界面,只有一个文本输入框和一个按钮,用户在文本输入框中输入年龄,按按钮提交。这个过程中,程序员要写的代码包括: 

        获得JSP的Request对象; 
        由于Request对象携带的所有输入都是String,程序员要将String转为正确的类型。此例是int; 
        由于用户可能输入非法字符,例如abc,程序员要处理类型转换失败的意外; 
        年龄不能是-1,也不能是900,程序员要做范围检查; 
        用户输入有误,不能什么也不说,程序员必须告诉用户出了什么错; 
        即使用户输入了错误数据,程序员也不能简单地清除,必须在重新显示的输入页面中显示出错误的输入,以使用户看到自己刚才输入了什么,因此,程序员需要保存来自用户的错误输入,并回显; 
        用户终于输入正确的数据了,程序员要把结果保存到后台Bean或数据库中; 
        保存数据时可能会出现意外,程序员应该通知用户,例如,给用户回馈一个错误页面; 
        。。。。。。 

只是一个最简单的Form处理,就包含了如此多的代码片断,JSP的繁琐可见一斑。其实,代码片断本身并不特别,都是最常见的Java代码,如何让这些代码片断协同工作,才是问题的核心。简单的Form尚且如此,复杂的数据表格又将如何呢?我头大了。 

Sun所宣称的JSF优点 

由于JSP在Form处理上令人失望,所以,当我对JSP的认识还停留在似懂非懂的阶段时,我就已经对JSP失去了信心,认为JSP不值得花大力气去学习。现在回过头来看看,当时的想法实在是幼稚。后来,随着我对JSP了解的加深,我渐渐意识到,JSP其实是Java   Web世界里的C语言,是任何想在Java   Web的殿堂里修行的程序员必须念的一本经书。 

可惜,我那时没有这么高瞻远瞩的目光,也不知道应该向身边的牛人们请教,自顾自从Sun的网站上下载了J2EE的Tutorial,希望Sun给我指点迷津。Sun这样做了,在J2EE   Tutorial的第17章“Javaserver   Faces技术”中,Sun说道: 
精心设计的编程模式和标签库,能显著地减轻带有服务器端UI的Web应用的建立和维护工作。你能够非常容易地: 

        将客户端事件与服务器端应用代码关联在一起; 
        将页面上的UI组件与服务端的数据绑定在一起; 
        利用可重用和可扩展的组件来构造用户界面; 
        跨请求保存和恢复UI状态; 

The   well-defined   programming   model   and   tag   libraries   significantly   ease   the   burden   of   building   and   maintaining   web   applications   with   server-side   UIs.   With   minimal   effort,   you   can 

        Wire   client-generated   events   to   server-side   application   code 
        Bind   UI   components   on   a   page   to   server-side   data 
        Construct   a   UI   with   reusable   and   extensible   components 
        Save   and   restore   UI   state   beyond   the   life   of   server   requests 

看完这几行E文,我欣喜异常,这不正是我所需要的吗?组件模式、事件驱动以及数据绑定,JSP的弱项在JSF中全部得到了加强!我对JSF非常满意,而令我更满意的是,Jbuilder竟然也支持JSF!于是,我马上决定了,我的下一个技术目标就是JSF。  
5.   因为无知,我选择了JSF 

傻人的傻福 

记得华为总裁任正非说过,华为是因为无知才走上通信产业之路的。我在2004年年中开始接触JSF时,也是因为无知。几乎没有Java经验,Web更是一片空白,写了一个半吊子的JSP程序后,我居然判了JSP的死刑,铁下心来钻研我的JSF去了。无知者无畏,说得一点也不错。 

从JSP起步,第二级台阶,也许Struts是最合适的。没有复杂的概念,没有深奥的理论,容易理解,上手快,从JSP向Struts的过渡显得特别自然。这是Struts流行的原因之一。如果当时请教过任何一个Java高手,我十有八九会以Struts作为我的JSP替代技术,并且很有可能成为 Struts的发烧友。可是,机缘巧合,我选择了JSF。 

正应了那句俗语:“傻人有傻福。”采用JSF技术后,Web编程如有神助,一个月时间,我和一个刚毕业的程序员写出了一个规模不小的Web程序:126张数据库表,346个JSP页面,458K   Java源程序,还包括84页的《需求规格说明书》和189页的《数据库设计说明书》。即便是桌面应用,这样规模的程序在一个月内完成,老板也该偷着笑了。其实,效率的提高,完全是JSF的功劳。正如Sun在JSF的规范中所宣称的那样,JSF极大地简化了Java的   Web编程。 

首先,在JSF中,页面干净了许多。无需声明Javabean,也不用嵌入Scriptlet,没有多余的符号,只是一些扩展标签而已,看上去规范而不失优雅,让人赏心悦目。程序员多半是完美主义者,眼睛里容不得丑陋的代码,我认识的一些程序员,平时不修边幅,可以整个冬天都穿同一件夹克,袖口磨得油光发亮,但他们的程序却整洁得让人嫉妒。 

其次,JSP中趾高气扬的Request和Response对象淡出了JSF。在典型的JSF应用中,程序员基本上没有直接操作Request和 Response对象的必要,因为框架隐藏了对这两个对象的处理细节。不论是从Request中解码参数,还是将数据编码到Reponse中,都不需要程序员写任何代码,JSF知道该怎么做。当然,如果非要访问Request,JSF的隐含对象为程序员提供了可能。 

JSF的UI组件 

UI组件是JSF最具特色的组成部分。与桌面程序的UI组件不同的是,JSF的UI组件是服务器端的,但是,在JSF框架的支撑下,这些服务器端的 UI组件,在程序员看来和桌面程序的UI组件没什么不同。我用的Jbuilder版本不支持JSF页面设计的所见即所得,当我拖动一个UI组件到页面上时,Jbuilder为我生成的,是一段标签文本,跟随着我的鼠标,放在指定的位置。一个服务端UI组件就是这样诞生的,其在页面上的表现形式也随之确定。 

没有所见即所得当然有点遗憾,但对我来说,这已经足够了,因为把组件的Value和后台Javabean的属性进行简单的绑定,我就得到了所有需要的程序行为。页面显示和后台数据的同步、用户输入的转换、数据的有效性验证、错误信息的提示以及UI组件状态的保存和恢复,所有这一切不需要我写任何代码,JSF已经代劳了。 

JSF的另一个特色是它的数据组件。我曾经很长时间使用PowerBuilder开发程序,熟悉PowerBuilder的程序员都知道,PowerBuilder最引人注目的是它的所谓数据窗口。并不好看的界面,笨拙的IDE,PowerBuilder单单凭借一个数据窗口,就吸引了大批程序员。PowerBuilder与数据库是天生的一对,长期使用PowerBuilder的结果,我养成了以数据库为中心的设计习惯。

这个习惯一直保持到今天,几乎成了我的嗜好,前面提到的126张表,就是最好的例子,换成别的程序员,也许30张表就够了。 

所以,JSF的数据组件让我一见钟情。数据组件实际上包括两个组件,一个是UIData,一个是UIColumn。JSF将数据表看成是由若干个列组成的一个表格,而行的数目取决于数据源中数据的条数。这与PowerBuilder的数据窗口殊途同归。当然,数据组件不是直接从数据库中取得数据(实际上,设计模式也不允许程序员这样做),而是通过一个Javabean以resultSet的形式传递给数据组件。在JSP中,这样的程序逻辑够我折腾一阵的了,而在JSF中,这和生成一个文本输入框一样容易。 

JSF数据组件的用途并不限于显示数据库表的内容,实际上,所有实现了List接口的对象都可以成为数据组件的数据源,这给Java的Web编程带来了极大的便利。而且,如果你想直接编辑数据表中的数据,JSF也可以做到,只需以可读可写的方式,将UIColumn的value属性和数据源中你想修改的属性绑定在一起,用户在网页上所做的修改,就会自动保存到数据源中。这样的功能,在JSP中,程序员都要深吸一口气才敢动手的。我的第一个JSF程序,之所以能在一个月的时间内完成346个页面,数据组件功不可没。 

JSF的事件和生命周期 

OO中的事件,是对象通信的一种机制,对象通过响应彼此的事件相互协调一致。JSP没有事件,所以JSP的代码需要程序员自己去协调,什么时候执行什么代码,往往让程序员大费周章。如果说JSP代码是一群孩子的话,那么程序员就是这群孩子可怜的父母,吃喝拉撒全要操心,哪里能够集中精力做点事情!所以,小孩要上学,学知识可能只是一个借口,父母想找个老师代管,才是背后真正的原因。 

JSF就是程序员们所要寻找的老师,把代码片断交给JSF去管理,程序员就可以集中精力编写业务逻辑了。在JSF里,有四类事件。值改变事件,当用户在输入框中输入数据后发生;动作事件,当用户提交Form时发生;数据模型事件,当数据表的某行被选中时发生;生命周期事件,当生命周期从一个阶段进入另一个阶段时发生。除了生命周期事件,其他事件都是桌面程序中大家所熟知的,而生命周期事件可以想象成窗口事件,例如窗口的生成、关闭、激活等等。 

谈到JSF,就不能不谈谈JSF请求处理的生命周期。为什么很多人觉得JSF难学?都是生命周期惹的祸。JSP的生命周期只有一个阶段,而JSF却有 6个阶段!为什么要这样呢?其实,这是JSF框架所必需的。JSF只有细分生命周期阶段,才能对Request和Response施加粒度足够细的控制,因为JSP那样粗粒度的控制,不足以支撑UI组件模型和事件模式。 

在我初学JSF时,生命周期成了我最大的障碍。不管我如何咬文嚼字地推敲JSF规范中关于生命周期的描述,我都无法弄明白到底专家们在说什么。甚至直到我完成了我的首个JSF程序的开发,我还是不懂。这让我十分的惴惴不安,时时担心自己误入歧途。奇怪的是,不论是Sun的Tutorial,还是JSF 的官方规范都把生命周期放在“头版头条”的位置,一开篇就大肆推销生命周期概念,生命周期真的那么重要吗? 

这绝对是一个错误!生命周期是JSF的核心,但不是程序员的必修课,初涉JSF的程序员,根本没有必要浪费精力在生命周期晦涩的概念里纠缠,不懂生命周期,照样可以用JSF来编程。花很少的时间看看各个UI组件的功能和属性,然后弄明白各类事件的含义以及应该如何响应这些事件,了解一下JSF可配置的页面导航机制,再搞清楚Managed   Bean是什么东西,马上就可以动手编写你的第一个JSF程序了! 

生命周期当然重要,不理解生命周期是难以在JSF中深入下去的。但是,如果有机会让我来写JSF的入门教程的话,我会把生命周期放在最后一章,等大家都有了JSF的实践经验,对JSF是如何简化Java的Web编程有了感性的认识,再来深入剖析JSF的生命周期,才能水到渠成,一点就通。
6.   结束语:享受Java,享受程序人生
享受Java,享受程序人生 

这就是我的Java   Web之路。从“Hello,world!”开始,跨过JSP的山峰,进入JSF的领地。 

自从踏入程序员行列以来,我接触的编程语言已经不下10种了。汇编的精准,Basic的平易,c的博大,C++的深奥,都给我留下了深刻的印象,它们伴随着我,走过风风雨雨,历经酸甜苦辣。世事变迁,人生无常,唯独它们对我不舍不弃。它们是我最忠实的朋友,不管我是得意还是失意,也不管我是富裕还是贫穷,只要我用键盘呼唤它们,我总是可以从它们那里得到的回应。

在这么多编程语言当中,Java是最特别的。十年前,Java还是埋在土里的一颗种子,我与它失之交臂;十年后,当Java百花齐放时,我们才相见恨晚。从来没有一种编程语言,像Java这样多姿多彩,生机勃勃。这是Java独特的个性,也是Java的魅力所在。老程序员可以在Java世界里踏上熟悉的征程,而新程序员也可以在Java世界里谱写崭新的篇章。不论你是身经百战的老将,还是初出茅庐的新丁,Java一视同仁。 

比如说,我虽然是一个老程序员,但对于Java,我还是新手。与有着N年Java经验的程序员相比,我的那点Java底子实在是难登大雅之堂。所以,多半时间,我都是虚心地端坐在电脑旁,拜读牛人的大作,聆听大师的教诲。他们自信的语言、精妙的见解、入木三分的评论以及信手拈来的术语,把程序员的风采表现得淋漓尽致。 

尽管知识浅薄,但Java仍然给我说话的权利。这是我喜欢Java的原因,它给所有Java程序员同等的待遇,不论新老。Java的核心很简洁,类、属性、方法、接口,小巧而精致,但在这个核心之外,人人都可以构建自己的高楼大厦。Java的技术非常多,而且更多的技术层出不穷。你不必精通所有的 Java技术,也能在Java世界里占一席之地。掌握Java基础,熟悉某项技术,你就可以在Java的舞台上粉墨登场了。 

JSF就是我在Java舞台上的行头。我在探索Java   Web编程技术的道路上邂逅JSF,半信半疑地和JSF走在一起,渐渐发现JSF复杂外表下平易近人的内心世界,终于忍不住要把JSF推荐给你。或许你是 Struts的忠实爱好者,或许你更愿意坚定地追随Spring的步伐,或许WebWork才是你最信赖的伙伴,又或许Tapestry已经让你深深折服,没关系,我发出了我的声音,行使了我作为Java程序员的权利,这就足够了。 

享受Java,享受程序人生,希望在鼎沸的Java之声中,看到你举手,听到你发言。 


---------------------------------------------------------------------------------------------- 

作者简介 

麻地河,湖南人氏,硕士,投身投身软件行业超过十年。最初在某贸易公司电脑部任程序员三年,后以系统分析员身份进入某软件公司,参与了若干大型MIS 的需求分析、设计和编码。又三年后,被某公司聘为开发部经理,并先后担任总工及副总等职务。此后职业规划渐从技术转向管理。曾在Nortel某 R&D中心任职,对外企的软件开发管理模式感受颇深,后受聘于国内某大型软件企业,负责项目管理。2004年辞职创业,现为顾问。因不舍程序员身份,遂自诩为IT自由撰稿人,希望藉此认识更多的程序员朋友,分享彼此的程序人生。