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寄存器一样。这给了程序员极大的权力,同时也带来了沉重的负担,程序员不但需要生成业务相关的信息,还要给这些信息加上诸如
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。
(责任编辑 火凤凰 sunsj@51cto.com TEL:(010)68476636-8007)