<!----><!----> <!---->
专家访谈:JSF 技术是否在国内普及
麻地河介绍:
湖南人氏,硕士,投身软件行业超过十年。最初在某贸易公司电脑部任程序员三年,后以系统分析员身份进入某软件公司,参与了若干大型MIS 的需求分析、设计和编码,并先后担任开发部经理及总工等职务。此后职业规划渐从技术转向管理。曾在 Nortel 某R&D 中心任职,对外企的软件开发管理模式感受颇深,后受聘于国内某大型软件企业,负责项目管理。2004 年辞职创业,现为顾问。 因不舍程序员身份,遂自诩为IT 自由撰稿人,希望藉此认识更多的程序员朋友,分享彼此的程序人生。
记者:请您用简单的几句话概括一下JSF ?
麻地河:JSF 是Java Web 表示层的标准规范,借鉴了包括Struts 在内的很多Java Web 框架技术的优点,是目前有影响力的Java Web 框架技术的集大成者,今后也将继续吸收最具代表性的Java Web 技术。各大厂商不遗余力地推广JSF ,正是看好了JSF 的前景。现在Java Web 的框架非常多,程序员面对这么多的选择时,往往无所适从,有一个规范无疑是好事。与其他所有Java Web 框架不同的是,JSF 不是具体的实现,它只是一个规范,并没有限制各个厂商的活力,他们可以在规范之下提出自己独特的实现,在性能、易用性、友好性和扩充功能方面下功夫。有一个基本的框框,又留出足够的自由空间,这正是规范的魅力所在。借此机会,我呼吁国内的程序员尽快转向JSF ,不管你是新程序员还是老程序员,学会JSF ,让你能够把握Java Web 框架技术的发展趋势,从容面对Java Web 开发的未来。
记者:JSF 目前状况如何?未来会向什么方向发展?
麻地河: JSF 的现状可以从几个方面来说明。先说接受程度, Google 的关键词搜索数据显示,在国外, JSF 已经和 Struts 平分秋色,甚至略有超出,国内稍微差一点, Struts 还是占据第一的位置。这是可以理解的, JSF 的流行度在国外处于快速上升的阶段,而国内对新技术的采纳一般要比国外晚一年左右,因此,可以预计,一年之后,国内的 JSF 也将和 Struts 平起平坐。
再说 JSF 的成熟度。版本方面, JSF 的版本由 1.0 到 1.1 到 1.2 ,已经挤干了 bug ,添足了功能,完成了雪中送炭的任务,进入实用阶段,后面的 2.0 版本会有比较大的动作,包括提高易用性等,是锦上添花之举。开发工具方面,现在市面上已经有很多支持 JSF 的 IDE ,最著名的当属开源的 NetBeans ,这也是我目前使用的 JSF 开发工具。除此以外, IBM 、 Oracle 、 BEA 和其他一些公司也有不错的 IDE ,并且大部分都是开源或者免费的。最令人欣喜的是, JSF 页面可视化开发已经成为开发工具的一种“标准配置”,使用起来非常方便和高效。
不尽如人意的地方也是有的,最突出的是 JSF 的中文资料非常缺乏,尤其是面向 JSF 初学者的,以实用性为主的图书,几乎没有。这也是我写 《 JSF Web应用开发实战》 这本书的初衷。 JSF 的初学者不需要也没有必要了解 JSF 的技术细节,他们需要的是快速进入 JSF 领域,马上开始写自己的第一个 JSF 程序,了解 JSF 有哪些技术要点,如何在 Java Web 编程中使用这些技术,还有就是丰富的、可以运行的范例,以及对范例的详细代码分析。 《 JSF Web应用开发实战》 这本书正是带着这些目的去写的。
JSF 未来的发展,最值得关注的,是 JSF 工具的进化。任何技术,如果不能在工具的支持下给程序员带来效率的提高和使用上的简便,是不会长久的。 JSF is designed to be tooled ,离开工具, JSF 的优势无从发挥。工具的进化我认为会体现在两条线上,一条线是继续向可视化和自动编码方向发展,例如,你拖放一个数据库表到页面上,工具可以自动生成规范的 CRUD (指记录的生成、读取、更新和删除)代码,很多目前需要手工编写的代码,未来会更多地由工具自动生成;另一条线是 UI 组件的大量涌现,专用的、通用的或者各种特殊用途的,有点类似 Windows 领域的 ActiveX 控件。实际上,现在已经有很多 UI 组件包出现了,有的还直接提供对 Ajax 的支持,不过现在 UI 组件包和开发工具的集成还不容易,未来会在这方面提出规范,使得开发工具和 UI 组件包能够无缝集成,增加程序员的选择范围。
工具的进化,是程序员最容易感受到的,其实,作为 Web UI 的标准框架,未来 JSF 还会衍生出很多新技术。这方面 JBoss 已经走在前面,它的 Seam 允许程序员直接将 EJB 定义为 JSF 的托管 Bean ,从而将表现层和业务层很容易地“粘合”在一起。 Seam 是 JBoss 的私产,在规范领域,与之对应的是 WebBeans ,这一规范的提出,将把 JSF 和 EJB 有机地集成在一起,极大地简化企业级 Java Web 应用的开发,非常值得期待。
记者:您说JSF 能提高Java Web 开发的效率,能说说具体是从哪些方面提高效率的吗?
麻地河:关于 JSF 提高 Java Web 开发的效率,最明显的莫过于 JSF 减少了业务无关代码的编程量。这是什么意思呢?我们编写任何应用程序,代码无非划分为两类,一类是业务相关的,一类是业务无关的。以登录页面为例,业务相关代码是指验证用户名和密码并给出验证结果的代码,你可能针对某种规则去验证,也可能与数据库中的注册信息进行比对,验证通过返回 true ,否则返回 false ,这些都是业务相关。业务无关的代码是你获取用户名和密码以及将验证结果回馈给用户的代码,这包括从 HTTP 请求中解码用户输入、将其转换为字符串类型、验证它的长度是否合适、将“恭喜你,验证通过”或者“用户名或密码错误”的提示信息显示在页面上等等。当然,这个划分不是绝对的,有些代码既可以理解为业务相关的,也可以理解为业务无关的,取决于你的观察点。我粗略对比过,用 JSP ,业务相关代码和业务无关代码的比例大致是一半对一半,而用 JSF ,这个比例可以上升到 80 %比 20 %,也就是说,原来你需要 5 个小时编写业务无关代码,现在你只需要 2 个小时就够了,多出来的 3 个小时,你可以编写更多的业务相关代码,这就是效率提高的表现。
为什么 JSF 能够做到大规模减少业务无关代码呢?这是因为 JSF 框架替程序员处理了很多 HTTP 协议底层细节。比如说,多数情况下你不用编写类型转换代码, JSF 缺省的转换器会自动完成需要的类型转换。再比如,假设你写了验证数据有效性的类,你不用考虑在什么时候什么地方显式地实例化验证器类,调用其验证方法,也不用操心验证错误消息怎么显示在页面上,只需配置好你的验证器, JSF 会在适当的时候自动完成这些工作。
限于时间关系,这里只能列举 JSF 相对比较明显的一些技术优势,实际上, JSF 有很多创新技术,例如托管 Bean 、导航、可插入性等等,当然,这些技术的优势不是那么直接表露,需要对 JSF 有一定的了解后才能体会到。可以这么说, JSF 诞生于 Sun 大刀阔斧简化 Java 开发的大背景之下,其设计目的就是为了简化 Java Web 开发,提高 Java Web 的开发效率,因此,即使你并不十分了解 JSF 的技术细节,你也可以相信这一点。
记者:很多程序员想学或者正在学JSF ,对他们,您有什么建议?学习JSF 应该注意什么问题?
麻地河:谈到这个问题,让我想起了很多年前大家学 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 Web应用开发实战》 这本书出版以后,为了配合读者的要求,我在 www.madihe.com 上建立了论坛,并且公布了我的邮箱 [email protected] ,用来和读者交流。从论坛帖子和读者来信看,有着深厚的 JSP 或者 Struts 基础的读者更多地对 JSF 抱着审慎怀疑的态度,喜欢探讨各种框架技术的优劣,而初出茅庐的程序员却对 JSF 展开怀抱,提出的都是与 JSF 使用有关的实际问题。
JSF 和 JSP 或者 Struts 是完全不同的,就像面向过程和面向对象的不同。如果你是 Java Web 的初学者,那么恭喜你,你没有历史包袱,可以放开手脚去干;如果你是资深的 JSP 或者 Struts 程序员,你的知识积累可能是一种促进,也可能是一种阻碍,这取决于你的态度。 JSF 所提出的 UI 组件模型和事件驱动模式,不论是在 JSP 还是在 Struts 上,都不曾出现过,如果愿意接受这种新技术并且适应它,那么你很快就能学会 JSF 。如果你对 JSF 抱怀疑态度,浅尝辄止者多半会放弃 JSF ,但锲而不舍者最终会为 JSF 的技术所折服,但你一定要有思想准备,探究 JSF 的实现细节,可能花费你很多的时间和精力。
具体来说,有这么几点,可以帮助你更快地学习 JSF :
1. 不做框架优劣之辩。每种框架都有存在的理由,辩论一种框架能否“战胜”另一种框架,只会浪费你和别人的时间,除非你在两方面都是专家,但即使是专家,在论坛中脱口而出的结论,也未必是深思熟虑的;
2. 接受 JSF ,而不是怀疑它,除非你已经对 JSF 了如指掌,达到了可以对它品头论足的程度。仅仅用 JSF 做过几个项目是不够的,如果你能给出一个自己的 JSF 实现,那大家都会承认你是 JSF 专家。
3. 如果你还是忍不住怀疑 JSF ,那么不妨留意一些基本事实。第一, JSF 规范由 Sun 提出,先后获得了 IBM 、 Oracle 、 Borland 、 Apache 、 BEA 等的支持,而 Sun 目前仍然稳坐 Java 老大的位置,其他如 IBM 、 Oracle 和 Apache 等也未见颓势,这些巨鳄不倒, JSF 不乏撑腰的;第二, JSF 已经成为 Java EE 规范的强制部分,所有 Java EE 服务器,必须支持 JSF ;第三, JSF 的推进一天也没有停滞,后续版本( JSF 2.0 )陆续出现,基于 JSF 技术的新技术如 JBoss 的 WebBeans 不断推出,开源的 JSF 组件包层出不穷。
记者:我知道您最近写了一本JSF 方面的专著,书名叫做《JSF Web 应用开发实战》 ,是目前国内不可多得的中文JSF 原创类图书精品,能谈谈您为什么要写这本书吗?
麻地河:我写这本书的目的其实很简单,就是向国内的程序员推广 JSF 这一 Java Web 编程技术。我最初接触 Java Web 编程时,并不知道有 JSF 这个东西。我的第一个项目用的是 JSP ,很痛苦,为什么呢,不是因为我要从零开始学习 JSP ,我的自学能力算比较强的,学习新技术不存在太大的困难,让我觉得痛苦的是,我大部分的时间没有花在业务逻辑上,而是花在了编写与业务逻辑无关的 Request 和 Response 处理代码上。做过项目的程序员都知道,项目的时间就像电脑的内存,永远都不够, JSP 需要程序员花费大量精力照顾 HTTP 协议底层的细节,从这一点看, JSP 的效率是很低的,因此,我在第二个项目时,就决定弃用 JSP 了。
那时是 2004 年, Struts 如日中天,不过由于我是刚刚进入 Java Web 编程这个领域,相当的孤陋寡闻,所以并不知道大名鼎鼎的 Struts 。如果当时我请教过任何一个 Java Web 的高手,他们一定会推荐 Struts 给我,可是我没有,我只是闷头在 Sun 的网站上寻找 JSP 的替代技术,就这样,我在 Sun 的 Java EE Tutorial 文档中看到了对 JSF 的介绍,可以说是一见钟情。最初吸引我的是 JSF 的组件模型和事件驱动模式,因为这是我在桌面应用中早已熟知的概念,感觉很亲切,后来才知道, JSF 不止这些,它的集中式页面导航、托管 Bean 机制以及工具支持下的可视化开发,都是提高开发效率的利器。
当时国内很少人用 JSF , JSF 的中文资源更是几乎没有,所有我很孤独。碰到问题,没有任何人可以帮我,我只能在 Sun 的网站和论坛中搜索答案,幸亏阅读英文资料的能力还行,不过学起来确实辛苦。用 JSF 做了一两个项目后,对 JSF 有了一定了解,知道了 JSF 的开发效率,为了交结更多的 JSF 同学,我就开始在 IT168 上发表文章介绍 JSF ,想让更多的人转向 JSF 。原本是想给自己一个找到组织的感觉,后来经不住 IT168 编辑赵恒的撺掇,最终决定安下心来写了这本书,权当是对自己学习 JSF 的过程的一个总结吧。