【51CTO.com独家特稿】2008年12月25日,51CTO联合机械工业出版社邀请了Java开发专家、《JSF Web应用开发实战》一书的作者麻地河老师作客51CTO嘉宾聊天室,就Java Web开发框架和JSF技术与网友进行了深入交流。
麻地河:原名李文兵,湖南人,硕士。投身软件行业超过十年。最初在某贸易公司电脑部任程序员三年,后以系统分析员身份进入某软件公司,参与了若干大型MIS的需求分析、设计和编码,并先后担任开发部经理及总工等职务。此后职业规划渐从技术转向管理。曾在 Nortel某R&D中心任职,对外企的软件开发管理模式感受颇深,后受聘于国内某大型软件企业,负责项目管理。2004年辞职创业,现为顾问。 因不舍程序员身份,遂自诩为IT自由撰稿人,希望藉此认识更多的程序员朋友,分享彼此的程序人生。
以下为聊天实录,51CTO略有整理。
JSF站在Web技术的“前端”
51CTO:谈到Java Web开发,大家首先想到的是Servlet、JSP、Struts这些技术,这几个技术也反映了Java Web开发方面的一个进化过程。李老师能不能向大家介绍一下JSF是一种怎样的技术?在Java Web开发的技术发展体系中JSF处于一个怎样的位置?
麻地河:按照官方的定义,JSF是Java Web表示层框架。通俗地说:
1)JSF是继Servlet、JSP和Struts之后又一项Java Web应用编程技术;
2)JSF是编写网页的一种新方法。完整的Java Web应用包括网页、业务逻辑和数据库,其中后两者都有成熟的解决方案,例如EJB和JPA,唯独网页的编写还停留在很原始的阶段,需要处理诸多底层细节。JSF的出现正是为了解决网页编写的问题。可以说,JSF和EJB、JPA一起,构筑了Java Web应用完美的三层体系结构。
51CTO:与传统的Java Web开发的前端技术相比,JSF以面向组件、基于事件驱动模型的而闻名,这与基于请求驱动模型的技术相比有哪些优势?
麻地河:最大的优势,就一句话,极大地简化了网页的编写。在JSF之前,我们编写网页都是和tag、Http请求、http响应等打交道,而JSF允许我们将网页视为在Java桌面应用中司空见惯的窗口,用类似编写桌面应用的方式编写Java Web应用。在JSF里,没有tag、没有http请求,也没有http响应,取而代之的是UI组件、事件和事件处理例程这些普通Java程序员耳熟能详的概念。
当然,我这样表述JSF,并不是说JSF不需要tag和http请求响应,在JSF框架内部,真正支撑JSF运作的还是tag和http请求响应,只不过JSF屏蔽了细节,让程序员集中精力于业务逻辑代码。
51CTO:我们知道ASP.NET也是面向组件,基于事件驱动模型的技术,与ASP.NET相比,JSF在Web开发方面有哪些优势?
麻地河:与ASP.NET相比,JSF的优势我认为有这么两点:
1) 有些优势是JSF天生的,例如平台无关性,这是从Java语言中继承的优势。平台无关性的好处大家都很清楚,我就不废话了;
2) JSF是规范,而不是具体产品,这是Sun的聪明之处,也是Sun的厚道之处。事实上,Java的很多技术都是以规范的形式出现的,这与Microsoft以具体产品的形式推出新技术截然不同。规范的好处是允许不同厂商在具体产品上展开竞争,使用户受益。例如JSF,现在Sun自己的参考实现很少人用了,倒是一些开源的JSF实现如Apache的MyFaces等大行其道。Sun这样做既鼓励了竞争,又能腾出更多功夫致力于规范的改进,可谓一举两得。
3) 从技术的角度看,JSF不但与平台无关,甚至与用来描述页面的标记语言无关。换句话说,在PC上,我们现在通常以HTML为标记语言,实际上,在其他类型的终端上,如果描述页面的标记语言不是HTML,JSF仍然可以胜任。当然,这个优势,对于普通程序员好像意义不大,但如果眼光放长远一些,这种标记语言的无关性,是JSF技术前瞻性的具体表现,它使得JSF的生命力更长久。
51CTO:目前,JSF框架在IDE和厂商支持方面怎么样?有没有一些JSF开发的成功案例向我们介绍?
麻地河:基于Sun在Java业界的领袖地位,目前几乎所有的大厂商都在JSF上投入重金,这其中包括IBM,Oracle,BEA,Apache、Borland,JBoss等。大厂商的支持给JSF带来了繁荣,以IDE为例,现在JSF集成开发环境的选择面很大,我所知道的比较优秀的IDE就有NetBeans,IntelliJ IDEA,JDeveloper,JBuilder,MyEclipse等。这些IDE中,我个人主要使用NetBeans,《JSF Web应用开发实战》一书的范例也是基于NetBeans的,因为NetBeans是从Sun的JSF开发工具Sun Java Creator转过来的,在可视化开发的方面走得比较靠前,而可视化开发是JSF最重要的特征。
至于JSF的实际案例,已经有很多,大家上Google可以搜索到。在Google中输入allinurl: "index.jsf",可以找到用JSF开发的网站,数量当以百万计了。大家要考察JSF在实际项目中的表现,可以试着访问这些网站,看看JSF能做什么,性能如何。这个搜索的含义是搜索含有index.jsf的url,这是JSF应用的一个明显特征。
第 1 页:JSF站在Web技术的“前端” | 第 2 页:JSF学习之路 |
第 3 页:JSF渐入佳境 | 第 4 页:网友问答实录 |
JSF学习之路
51CTO:网友们看了我们的访谈,如果想深入学习一下JSF,除了您的《JSF Web应用开发实战》一书,还有没有其他的网络资源或是开源项目向大家推荐?
麻地河:大家可能不知道,JSF的研发始于2001年,从这个时间算起,可以说JSF已经很老了。不过,由于JSF在技术方面的跨越十分巨大,因此,直到三年后的2004年,JSF规范的第一版才出台,而真正进入实用,是在2006年年中,当Sun推出JSF 1.2版本的参考实现时。JSF 1.2版本的发布是JSF历史上重要的里程碑,大概在其发布半年后的2006年底2007年初,JSF开始受到Java Web社区的广泛关注,国内很多程序员,估计也是在2007年开始尝试了解和使用JSF的,从这个意义上说,JSF又可以说非常年轻。
由于是一门相对较新的技术,现在市面上JSF教材并不多,尤其是中文的,几乎没有。这也是我着手写《JSF Web应用开发实战》这本书的原因。我用JSF做过几个项目,其速度和效率不是JSP可以比拟的,因此十分看好JSF的发展,后来打算成为职业IT作家后,就写了这本书,希望将JSF介绍给更多的程序员,让大家提高一点效率,少加点班,生活轻松一点。
与《JSF Web应用开发实战》一书配套的,还有一个论坛,www.madihe.com。这是一个面向JSF初学者的论坛,上面还可以下载所有范例程序。我每天都会上论坛去看看,解答坛友的一些提问,网友们如果对JSF感兴趣,欢迎你们去论坛逛逛。
如果你的英文不错,那么我推荐www.jsfcentral.com这个网站,上面收录了JSF相关的很多资料,包括新闻、技术文章、产品等等。
此外,Sun的Java EE入门教程即Java EE tutorial也不错,其中用若干章的篇幅介绍了JSF技术。可惜的是,有些内容对于初学者不太合适,例如生命周期和自定义UI组件这两部分,有点太深奥了。
51CTO:谈到技术学习,我们很多程序员在由Servlet/JSP技术向MVC框架过渡的时候都遇到一些困难,我认为,很大程度上这是一个思维模式的转变;JSF这种面向组件,基于事件驱动的开发技术是不是也有一些学习上的难点?与之前的Java Web开发技术相比,我们在学习过程中需要注意哪些问题?
麻地河:谈到这个问题,让我想起了很多年前大家学OO时的情景。我本人是从汇编开始学习编程的,中间经历了Basic、Fortran、C、Pascal、Debase、FoxBase、PowerBuilder、Delphi等等很多编程语言,直到现在的Java。从一种编程语言向另一种编程语言的转变,有时候很容易,有时候很难。大家可能发现,著名的C++并没有出现在上面的清单中,为什么?我其实是稍微懂一些C++的,所谓稍微,是指我能把C++当成C来用。
C++是面向对象的编程语言,而C是面向过程的,把C++当成C来用,实在是对C++的亵渎。据我所知,和我有着同样经历的老程序员,很多人也像我一样,只是“稍微”懂一点C++。相反,那些直接从C++开始的新手,却很快学到C++的精髓。其实原因很简单,在C++诞生之前,我们一直是面向过程编程的,C++要求我们面向对象,对于有着根深蒂固的面向过程思想的程序员来说,这个弯子拐得太猛了,令人难以适应。
从JSP或者Struts转向JSF,和从面向过程转向面向对象非常类似。JSF和JSP或者Struts是完全不同的,就像面向过程和面向对象的不同。如果你是Java Web的初学者,那么恭喜你,你没有历史包袱,可以放开手脚去干;如果你是资深的JSP或者Struts程序员,你的知识积累可能是一种促进,也可能是一种阻碍,这取决于你的态度。JSF所提出的UI组件模型和事件驱动模式,不论是在JSP还是在Struts上,都不曾出现过,如果愿意接受这种新技术并且适应它,那么你很快就能学会JSF。
51CTO:由于JSF是基于事件驱动的,很多JSF的学习者感叹JSF中的生命周期过于复杂,您怎么看这个问题?
麻地河:这个问题我得多说两句。
首先,我想强调的一点是,对于普通程序员,JSF非常简单。看过《JSF Web应用开发实战》这本书的读者都有体会,看完第二章《快速入门》,理解WebLogin这个简单的Web登录应用,就可以动手编写自己的JSF程序了。为什么会这么简单?原因有几点:
1)JSF不要求你弄懂http请求和响应,只要求你有组件和事件的概念,即使是最初级的Java程序员,也具备这样的技能;
2)工具会给你提供很强大的支持。例如,在NetBeans中,编写JSF页面不过是从组件面板上拖放组件到网页上而已。你可以在属性窗口中修改组件的属性如颜色和字体等等,如果你想对组件例如一个按钮做出响应,只需双击组件,然后在事件处理方法中编写事件处理代码,这和你编写普通Swing桌面应用没有什么区别。当用户在网页上点击按钮时,你写的代码将被执行,你可以在代码中调用业务方法,也可以直接导航到其他页面,或者先调用业务方法,然后转到其他页面,就这么简单。
3)JSF框架会替你处理很多细节,以前很繁琐的一些事情,现在变简单了。举个例子,你想确保用户输入的数值在指定范围内,你可以拖放一个范围验证器到组件上,给这个范围验证器设一个上限和下限即可。更进一步,你还可以设定一条消息,当用户输入超出范围时,这个消息自动显示在输入框的旁边,而这一切,都是可配置的,无需任何编码。
其次,有人说JSF很复杂,那要看站在什么角度来说。JSF框架本身(请注意,我说的是其“本身”)确实比较复杂,但那是专家和JSF厂商才需要关注的事,和普通程序员没有太多关系。为什么这么说呢?因为程序员是使用JSF,而不是研究JSF的。JSF厂商按照JSF规范编写JSF框架,而程序员利用JSF框架编写Web应用,两者的出发点不同,因此结论也大相径庭。这好比看待一辆自动档的汽车,厂家说自动档的汽车比手动挡要复杂得多,但驾驶员得出的结论恰恰相反,自动档的汽车开起来比手动挡容易多了。所以说,JSF的复杂和简单其实是不矛盾的,正是JSF框架本身的复杂,给程序员带来了使用上的简单。
好了,既然从使用者的角度而言,JSF非常简单,那么,为什么网络上到处流传着JSF很难学的说法呢?我想原因有这么两个:
1)不正确的宣传导向。我在2004年首次接触JSF的时候,没有什么资料可以参考,只有Sun的Java EE教程英文版(即Sun Java EE tutorial)里有一些介绍。在这个内容少得可怜的介绍中,Sun开篇就大肆推销JSF的生命周期,对于一个从未接触过JSF的人来说,多达六个阶段的JSF生命周期是一座难以逾越的高山,很容易直接被吓死在山脚下。其实JSF生命周期不是不重要,但以生命周期为入口来学习JSF显然是错误的。现在我上Sun的网站,看到Java EE Tutorial的JSF部分还是老样子,摆一个六阶段的生命周期在那里吓人。
2)有很多误会。由于Sun的Java EE Tutorial影响广泛,大家谈到JSF时,首先想到的就是六阶段生命周期,这直接导致一个错误的结论:JSF太复杂,学习曲线高。这个误会在国内尤其严重。国外的情况好一些,在TheServerSide上看到的JSF还是以新闻和技术讨论居多,但误会既然已经形成,自然要予以消除,以至于JSF规范专家组的一个成员不得不出面澄清,在博客中专门撰文呼吁,初学者不要轻易陷入JSF生命周期的泥潭中。
罗罗嗦嗦说了这么多,我想表达的意思是,作为JSF的初学者,如果绕过JSF生命周期,选择一本合适的书作为教材,学会JSF可以说轻而易举,甚至比你学会JSP和Struts还要容易。入门仅需三天,学会也不超过三周,而你如果愿意花三个月,那你一定会成为JSF高手。这个时候,回过头来看看JSF的生命周期,你才会发出“原来如此”的感叹。
第 1 页:JSF站在Web技术的“前端” | 第 2 页:JSF学习之路 |
第 3 页:JSF渐入佳境 | 第 4 页:网友问答实录 |
JSF渐入佳境
51CTO:现在Java的Web开发框架很多,Struts、WebWork、Tapestry、Spring等等,开发中使用Struts框架的好像多些。JSF目前的占有率怎么样? Sun在JSF的推广上有哪些策略?
麻地河:这个问题我认为用数据来说话最有说服力。两年前,我发表第一篇介绍JSF的文章时,为了比较JSF的流行程度,我在google上搜索JSF和Struts这两个关键字,用搜得的网页数量作为流行与否的一个参考,当时得到的结果是:英文网页,JSF与Struts的比例是的60:100;简体中文网页则是40:100。两年之后的现在,我在google上做同样的搜索,这个两个比例已经分别上升为104:100和79:100。这两组数据说明,经过两年的时间,JSF在国外已经和Struts平起平坐,甚至略有超出,而在国内,JSF的流行度虽然还不如Struts,但比值由40上升到79,足足翻了一倍,可见势头惊人。粗略估计,不论是国内还是国外,JSF平均每年有20%的增长率,目前国内79:100的比例,相当于国外一年前的比例,这也印证了国内在新技术上一般与国外存在大约一年的差距这样一个主观感受。所以,参考国外的趋势,JSF的流行,包括在国内流行起来,是毋庸置疑的。
数据只能说明结果,如果我们尝试分析这一结果背后的原因,可以罗列出以下几条理由:
1)随着Java EE 5的发布,JSF由替补变成主力,成为官方规范的强制部分,所有Java应用服务器,现在必须提供对JSF的支持,这使得JSF身价倍增,自然而然成为万众瞩目的焦点;
2)JSF的开发工具渐入佳境,以NetBeans为首的一批支持JSF可视化编程的集成开发环境正在改变人们编写Java Web应用的习惯。NetBeans拖放式的Web界面开发,都给程序员留下了深刻印象;
3)Java EE 5最重要的使命是简化Java开发,为此,Sun连续使出了三大绝招,一是推出JSF,二是推出EJB3,三是推出JPA。明眼人一看就知道,这三大技术分别涵盖了三层体系结构中的表示层、业务层和数据层,虽说不能一统天下,但在规范层面建立一个完整体系的目的非常明确。规范是技术的制高点,只要Sun不倒,JSF就有足够硬的后台支持它的发展。
51CTO:在Java框架方面,很多人会拿Sun主推的EJB和轻量级的Hibernate做比较,甚至有人说Hibernate是赢在轻量和简单;你如何看待JSF和Struts这两项技术的前景?
麻地河:很多人喜欢把JSF和Struts对立起来,但我不这样看。Struts无疑是最优秀的Java Web表示层框架技术之一,不过,任何技术都有其生命周期,就像Struts的前辈Servlet和JSP一样,出道之时无不光芒四射,震撼人心,但随着时间的推移,技术的进步,Struts头顶的光环褪色,老态渐显。新陈代谢是不可避免的自然规律,单纯就技术而言,Struts的淡出和JSF的登场,只不过是新技术替代老技术而已。我本人并没有使用Struts的经历,因此,无法从细节评估JSF和Struts的优劣。关于JSF和Struts的对比,网络上有很多讨论,大家感兴趣的话可以搜索一下看看。
大家知道Struts的架构设计和开发者是Craig R.McClanahan,但可能不知道,他也是JSF规范专家组的领导之一。Craig R.McClanahan的双重身份说明,JSF和Struts不是对立的,相反,它们是一脉相承的,JSF既借鉴了Struts的成功经验,也实现了质的飞跃。当然,相比从Servlet到JSP再到Struts的飞跃,Sun三年才磨出JSF这一剑,这次的飞跃无疑来得更大一点。
51CTO:感谢麻地河老师做客今天51CTO嘉宾访谈,和大家一起探讨JSF开发技术,让我们对JSF面向组件、基于事件驱动模型的Web开发技术有了一个初步的认识;麻地河老师还向大家介绍了JSF的学习方法、Java开发框架的技术前景和发展趋势。再次感谢麻地河老师。
第 1 页:JSF站在Web技术的“前端” | 第 2 页:JSF学习之路 |
第 3 页:JSF渐入佳境 | 第 4 页:网友问答实录 |
网友问答实录
cool:做那类网站最合适使用JSF开发?
麻地河: 如果要分类的话, 我觉得以数据为中心的网站比较适合JSF开发. 与这个相对的, 是以用户体验为中心的网站, 这样的网站用JSF去开发可能不合适, 至少目前阶段如此。
当然,随着支持Ajax的JSF组件的不断推出,JSF将来也可以适用这类应用。其实现在已经有一些Ajax-enabled的JSF组件了,我之所以说JSF更适合数据为中心的应用,是因为这种应用更能体现JSF的价值,换句话说就是简化开发。
piegon:现在JSF国内用的范围广吗?
麻地河: 应该说不是很广, 因为在国外, JSF广泛应用也不过是去年的事, 按照通常的惯例, 一项技术从国外到国内一般有一年的延迟, 因此, 我预计JSF明年下半年会在国内推广开来。至少一年的延迟 。
zp: 是不是应该把JSP学明白了再去学JSF啊?可不可以直接去学JSF?
麻地河: 完全可以直接学JSF,除非你要研究JSF框架,否则,JSF不需要太多的JSP知识。站在程序员的角度,JSF其实和普通Java桌面应用差不多,像事件啊,组件啊,这些都是在桌面应用中经常用到的,大家都懂。
当然,如果你懂JSP,对于理解JSF的运行机制,会有帮助。但这个问题要一分为二,如果你的思维太JSP了。那也可能阻碍你将想问题的方式转成JSF的方式。
vip: JSF跟Ajax等当今一些流行的技术集成的怎么样?JSF开发的项目好维护吗?
麻地河: JSF与Ajax的集成非常自然,这主要得益于JSF先进的技术架构。具体来说,有三种集成方式
第一是直接开发支持Ajax的JSF组件,在组件一级支持Ajax,这种方式主要靠第三方厂家推出支持Ajax的JSF组件包
第二是扩充JSF框架,在框架一级支持Ajax,这种方式下,普通JSF组件可以非常容易地加入Ajax特性
第三是在现有JSF组件的外层包装一个支持Ajax的外壳,是的普通JSF组件支持Ajax
项目的维护方面,如果你遵循三层体系结构,那么维护不是问题,就怕混淆层的划分,那样就会给维护带来很大的负担
ss007: JSF能不能胜任业务层的一些东西?还是比较简单的东西都需要交给其他的框架或者技术去做?
麻地河: 这里需要对JSF的定位有一个清醒的认识。按照官方定义,JSF是Java Web应用的表示层框架,也就是说,它的目标不是业务层。
三层体系结构是目前公认的软件设计最佳实践,对于大规模应用,我本人强烈推荐这种体系结构,以增加软件的灵活性,可扩充性和可维护性。
但是,现实情况是,我们经常有一些小规模应用,这样的应用,三五人一两月就要交货,因此,有时候,对于小规模应用,我们也允许打破层的划分。
因此,JSF也允许这样来使用。在NetBeans中,提供了数据提供器,可以直接通过JSF页面访问数据库,对于小型应用,这个特性是十分方便的。
当然,我还是要继续倡导三层体系结构,各位网友如果想在编程领域有所成就,就一定要往这个方向上走,对于Java Web,Sun的架构蓝图是JSF + EJB + JPA,大家不妨多了解一下这方面的知识。