图书前言

前    言

为什么要写这本书

早在2004年,我根据在项目中使用Struts的经验,写出了一篇名为“Struts的原理与实践”的文章,投到某杂志社,该杂志的编辑觉得文章还过得去,只是认为仅一篇文章会给人一种意犹未尽的感觉,他建议我写一个系列。后来,该杂志因故停刊,杂志编辑说:“其实,可以将这些文章写成一本书。”还热心地说,如果要出书,他可以帮助推荐给出版社的编辑。

由于当时我忙于其他事务,没有时间写书。那时恰逢赛迪网征集这方面的文稿,就把这些写成了的文章寄给赛迪网,文章在赛迪网上发表后,引起了较大的反响,在相当长的一段时间里排在该网站的技术应用栏目的技术文章排行榜的前列,并被许多网站转载。

后来,当有空的时候,就想起了那位编辑关于写书的建议。我就在想,写一本什么样的书呢?光阴荏苒,很快,两年的时间就悄无声息地过去了。大家不要忘了,这个时代对Java来说是一个礼崩乐坏的时代。历史反复证明,这样的时代也是牛人辈出的时代。随之,各种新的思想、新的技术井喷一样地呈现在人们的面前。

在这期间,Java世界也已经和正在发生剧烈的变化。轻量级的J2EE应用程序开发已经成为一种时尚。框架也不再是Struts的一统天下,各种新的框架层出不穷。在这些框架中最引人注目的是JSF,居然成了Java EE规范的一部分,这在框架的发展史上好像是绝无仅有的。

在选择该书的表现层框架时,我是这样考虑的,虽然目前国内SSH方兴未艾,但JSF不仅是标准,有众多大公司的支持,而且在实践中也日益成熟起来,如常被人们诟病的早期版本中的那些错误在JSF 1.2版中都得到了很好的解决。它的组件模型、事件驱动及依赖注入等比老式的框架如Struts的确提供了更高的抽象和更强大的功能。国外的调查也表明它的市场占有率在不断扩大。从论坛的帖子也可以看出,如果是做一个新项目一般也是建议使用JSF。不过,总的说来,与国外人们对JSF的关注程度相比,国内就显得冷清多了。表现在论坛中的帖子不多,市面上关于它的图书更是少之又少。这种局面是很不正常的,是不是又要等到落后一大截后,才想起来追赶呢?到那时可能就悔之晚矣。我也希望本书在改变这种不相称的局面方面起到些许作用。

而且,框架也不再局限于表示层,而是向J2EE多层应用程序的各个层面发展,如集成层就出现了Hibernate(这里要说明一下,有的人不认为Hibernate是框架)。Spring就更是涉及到应用程序的多个层。这些框架的涌现,一方面给了开发者更多的选择,另一方面也增加了开发人员的学习量。特别是由于各种框架都有其自己最擅长的一面,实际应用中往往会组合使用多个框架,以便充分发挥它们的特长,在实践中形成了一些常见的组合,如Struts+Spring+Hibernate(即人们常说的SSH)、JSF+Spring+Hibernate等组合,这就更进一步地加大了初学者的学习难度。

反观市面上有关这方面的一些书籍。它们大多是分门别类地介绍单一的技术。比如专门介绍Struts的书、专门介绍JSF的书、专门介绍Hibernate的书以及专门介绍Spring方面的书。这些书的写法往往是这样的,即除了介绍某种单一的技术外,其他部分可能就是根据作者的特长随意使用一些其他的技术,比如介绍Struts的书,它的数据访问部分不是直接使用JDBC的API就是使用EJB,而不会采用编程实践中采用得较多的SSH组合。偶尔看到一些书介绍与其他框架组合使用的书,如一些Spring书籍中介绍Spring与Struts的组合、Spring与Hibernate的组合,往往是蜻蜓点水般的一般性介绍。可以说,到目前为止,无论是国内还是国外,都还没有一本真正意义上的较全面地介绍用JSF+Spring+Hibernate框架进行开发的书籍,而实际的开发过程中却是综合应用这些技术(例如,使用AJAX来改善用户体验),这样就难免学用脱节。有没有办法帮助初学者尽快掌握这些技术呢?想到这里眼前豁然一亮。

何不写这样一本书呢?从编程的实践角度出发,比较全面地介绍JSF框架的基础知识及其他框架最基本、最常用的知识,以及在一个真实的开发过程中如何综合地应用它们。以便尽快引领初学者综合应用这些框架。本书就是这种想法的一个尝试。

为本书的问世做出贡献的人们

2006年国庆节前的一天,我在一个编程论坛中看到一个清华大学出版社征集书稿的帖子,就按照帖子给出的邮件地址给发帖子的编辑“冰冰”发了一个Email,在该Email中谈了写这本书的一些初步打算。本没有抱很大的希望,出乎意料的是很快就收到编辑的来信,编辑的真名叫陈冰,他本人原来就是一位计算机图书作者。他让我写一份简历,连同以前发表过的一些文章一起发给他。我就简单地罗列了一下自己的学习和工作经历,并收集了一下以前发表的文章给他寄去。因为我以前从未写过书,更担心自己才疏学浅,因此把自己的一些顾虑也写在Email中。这里不得不提的是,他的回信中的一句鼓励的话:“英雄不问出处!”让我至今难忘,好一个英雄不问出处,正是这份信任,让我们开始了接下来的坦诚合作。坦率地说,没有陈冰先生和出版社领导们的这份信任就不会有该书的问世。

几封Email往来,一个初步的目录和样章就出来了,书名也商量好了。国庆节后不久正式的出版合同就签订了。拿到合同后,才发现自己正处于一个多事之秋。工作上,金税工程系统升级、综合征管系统数据省级集中等工作接踵而至;家庭方面则因为要迁居而装修房子。写书稿只有晚上和节假日才有    时间。

凡事空想容易,实干难。写书尤其如此。一方面因为时间紧张,进度很难保证。另一方面又往往为找不到好的思路和合适的例子来把问题讲得尽量浅显易懂而着急,深感压力沉重。着急就容易上火,说起话来分贝值就免不了比平时大了许多,我的妻子在这方面的感受可能最深,她为此受了不少委屈。此外,在写稿期间,她承担了所有的家务、悉心照料我和儿子的饮食起居。为我分担了不少压力。平心而论,本书也凝聚着她的不少心血。

能够顶住压力完成本书,还要感谢我的父母,是他们的言传身教使我懂得了一分耕耘,一分收获;不怕慢,只怕站等这些质朴而让人受用终身的道理;是他们的淳朴善良、乐于助人的品格,让我体会到予人玫瑰、手有余香的真谛,愿意将自己在学习和工作中的一些心得拿出来与大家分享。

能够完成本书,还要感谢教育过我的老师们,他们不仅传授给我知识,培养了我的技能,还让我懂得了业精于勤荒于嬉,行成于思毁于随的道理。

能够完成本书,还要感谢领导的关怀和同事们的帮助。是领导们为我提供了不少学习的机会,使得我有幸接触到一些新的技术,同时也给我提供了主持或参与一些项目的机会,使得我可以在实践中应用所学的知识。在该书的书写期间我的同事们主动分担了更多的工作任务,同事杨蜜还帮助校对了部分章节的文稿,找出了其中的一些笔误及标点符号错误。在此,再一次对所有为本书做出贡献的人们表示诚挚的感谢!

本书的结构与写法

第1章概括地介绍了J2EE应用程序的基本知识,以及一些常用框架的产生。

第2章介绍了Web应用程序的一些基础知识,为正式介绍JSF做一些必要的铺垫。

第3~15章介绍了JSF的一些基本知识。包括JSF的请求处理生命周期、基本构成、JSF标签、表达式语言与托管Bean、转换与验证,国际化编程,以及与Tile的集成和访问数据库等。

第16章介绍J2EE应用程序的异常处理。

第17章介绍了应用程序中的日志记录方法。

第18章介绍JSF与AJAX的集成,其内容是如何利用AJAX来改善JSF应用程序的用户体验。

第19~20章主要介绍Hibernate的基本知识及其与JSF的集成。其中,第19章介绍了对象关系映射的基本概念和面临的一些问题,以及Hibernate的基本构成,和一些常见的对象关系映射。还介绍了检索对象的方法。第20章则介绍Hibernate和JSF的集成。

第21章主要介绍Spring的一些基本知识及与JSF和Hibernate的集成。

第22章介绍常见的IDE(Eclipse和MyEclipse组合)的使用。

第23章对面向方面编程(AOP)做了一个简单的介绍,并介绍了事务管理的有关内容。

第24~26章是综合应用示例。其中,第24章介绍的是一个基于角色的访问控制系统,在该示例中,以一个程序员的眼光来看JSF、Hibernate和Spring在一个比较真实的应用中各自所处的位置及它们间的相互关系。第25章介绍的是一个名为办公用品管理系统的示例应用程序,在该示例中,从软件工程的角度出发,来演示一个项目的需求分析、设计、编码、测试等各个阶段。第26章是讲解应用程序的安全性。主要介绍了Java安全架构的一些基本知识。结合示例应用介绍了如何防止用户绕过登录环节;并介绍了口令加密的基本方法。

本书在写法上也做了一些尝试,既不像有的书高高在上地专门讨论一些高深的概念,使读者看完全书后都不容易做出一个简单的应用程序;也不像有的书全部是一些示例的杂乱堆砌,搞得一本书没有主线、没有灵魂。本书采用的方式是对那些最基本的概念先做一些解释,用它们去指导实践,然后用一些简单的示例来检验这些理论方面的东西。采用这种学用结合的方式可能更有助于读者对那些基本知识的理解。

本书在写法上的另一个特点,就是不平均使用力量。对那些在编程实践中经常容易遇到的,也是论坛中被频繁问及的一些问题,会花费更多的笔墨去解释。这方面的例子很多,比如,讲MVC时就有很多人对耦合与解耦的概念产生模糊认识;再如,关于回调的理解、关于乱码的问题,以及Java中的日期时间问题等等,我都会不惜笔墨,设法尽可能把它们讲得浅显易懂,为读者克服这些障碍提供一些切切实实的帮助。相反,对那些用得不是很普遍的东西,以及理解起来不会有什么困难的东西则会一笔带过,或者是完全不提及。如在介绍HttpServlet时对不常用的方法doHead()等就没有提及。否则,这本书的篇幅将会急剧膨胀,这就会与我的初衷相悖。

在介绍的这些框架的版本选择上,考虑到大多数读者从学到真正使用有一个过程,因此尽可能采用比较新的版本。这样,当他们真正使用的时候,这些版本就已经成为稳定版本了。为此,本人付出不少额外的劳动,原来本书是以JSF 1.1为基础来介绍的,在本书快要完稿之际,JDK 1.6及Tomcat 6的相继发布为采用JSF 1.2奠定了基础。因此,在修改稿件时,使本书的版本基本建立在JSF 1.2上,对绝大部分示例应用也用JSF 1.2重写了一遍。

欢迎提出反馈意见

尽管我费了很大的工夫来写本书,比如,大年初一就在准备书中的综合示例。但限于我的学识水平,又加上时间仓促,很多地方没有工夫来仔细推敲,书中可能有不少缺点和错误。尽管如此,如果本书能对初学者有些许帮助,我的心血就没有白费,我的内心也将会感到非常愉悦和满足。

幸好,人的学习过程正如范增先生的一幅画上的题字那样——“师古人亦师造化”。人们从书本上学习知识时也不会拘泥于书本,还要向自然学习。对应用程序开发人员来说还要向社会学习。

对书中存在的缺点和错误,欢迎各位批评指正。人性中有一个弱点,就是喜欢听表扬的话,不喜欢听批评的话。闻过则喜可能只有理想中的圣人才能做到,我当然远没有达到这种境界。但无论您如何评价本书,只要您说得有理有据,即使是批评,我也将真诚接受,因为这对于今后的工作与学习都是有利的。另一方面,我相信人的内心深处都会是向往真、善、美的。对“真”的追求应该是人生中的一个不变的追求。

如果您在阅读本书的过程中有任何的意见或建议,请给我发Email,我的Email地址是lhbf@sina.com。

罗会波         

2007年6月19日    

IV

JSF第一步——JSF+Spring+Hibernate+AJAX编程实践

III

前    言