自1999处JSP 1.0发布以来,JavaServer Pages(JSP)可谓掀起了一场风暴,其追随者蜂拥而至。JSP为企业Java开发人员提供了一个开发动态Web网站和Web应用的灵活工具。随着JSP标准标记库(JSTL)的引入,JSP规范第一版中略显粗糙的方面也有了大幅改进,JSP 2.0则将此技术又推向了一个新的高度。
《JSP设计(第三版)》得到了充分的修订和更新,以涵盖JSP 2.0和JSTL 1.1规范。其中详细介绍了JSP 2.0中新增的表达式语言(EL)、JSTL 1.1标记库和新的函数库、支持定制标记库开发(而无须Java代码)的新标记文件格式、简化的Java标记库API、在JSP XML语法方面所做出的改进等等。不仅如此,在此还详尽地描述了Apache Tomcat服务器的建立、JSP和JSTL语法和特征、错误处理和调试、鉴别和个人化、数据库访问、XML处理和国际化等诸多内容。
希望学习JSP的专业人士可以划归为两大阵营,而这本书也充分认识到这两大阵营存在着不同的需求:网页设计人员感兴趣的是如何在Web页面中使用JSP元素,而程序员则更希望了解JSP API,以及如何将JSP有效地用做企业应用的一部分。如果你身为网页设计人员,那么会从本书第二部分的实用Web应用示例中获益匪浅。如果你是一个程序员,则会对第三部分详细介绍的高级主题倍加推崇,例如如何使用流行的Apache Struts MVC(模型-视图-控制器)框架将Servlet和JavaBeans组件与JSP集成,以及如何使用JSP API开发定制标记库,在此还提供了一些实际示例,开发你自己的标记库时可以将这些示例作为起点。
前言
第一部分 JSP应用初步
第一章 JavaServer Pages入门
什么是JavaServer Pages?
为什么使用JSP?
如何起步
第二章 HTTP和Servlet基础
HTTP请求/响应模型
Servlet
第三章 JSP概述
Servlet
JSP页面剖析
JSP处理
采用MVC模型的JSP应用设计
第四章 建立JSP环境
安装Java软件开发工具包
安装Tomcat服务器
测试Tomcat
安装书中的例子
示例Web应用概述
第二部分 JSP应用开发
第五章 生成动态内容
创建一个JSP页面
安装JSP页面
运行JSP页面
使用JSP指令元素
使用模板文本
使用JSP动作元素
第六章 在JSP页面中使用JavaBeans组件
什么是bean?
在JSP页中声明bean
读取bean性质
设置bean性质
第七章 使用定制标记库和JSP标准标记库
定制标记库是什么?
安装定制标记库
声明定制标记库
使用标记库中的动作
第八章 处理输入和输出
读取请求参数值
验证用户输入
格式化HTML输出
第九章 错误处理和调试
处理语法错误
调试JSP应用
处理运行时错误
第十章 在JSP页面、请求和用户间共享数据
在页面间传递控制和数据
共享会话和应用数据
在线购物
内存使用考虑
第十一章 将定制标记库开发为标记文件
创建和使用标记文件
访问属性值
处理动作体
处理片段属性
通过变量向调用页面提供数据
中止页面处理
将标记文件打包以便于重用
第十二章 访问数据库
从JSP页面访问数据库
不采用bean验证复杂的输入
使用事务
特定于应用的数据库动作
第十三章 鉴别和个人化
容器提供的鉴别
应用控制的鉴别
其他安全问题
第十四章 国际化
Java对国际化和本地化的支持
生成本地化输出
位的简史
处理本地化输入
第十五章 处理XML数据
生成XML响应
将XML转换为HTML
将XML转换为依赖于设备的格式
处理XML数据
第十六章 使用脚本元素
使用page指令脚本属性
陷式JSP脚本对象
使用小脚本
使用表达式
使用声明
混合动作元素和脚本元素
处理脚本语法错误
第十七章 拾遗补缺
缓冲
包含页面片段
全局配置选项
混合客户端和服务器端代码
预编译JSP页面
避免JSP页面缓存
将JSP页面写作XML文档
如何解释URI
第三部分 J2EE和JSP组件开发中的JSP
第十八章 Web应用模型
J2EE
MVC设计模型
可扩展性
第十九章 结合JSP和Servlet
Servlet、过滤器和监听者
为各项任务选择适当的组件类型
使用监听者初始化共享资源
使用过滤器进行访问控制
使用Servlet集中处理请求
使用一个通用JSP错误页面
第二十章 为JSP开发JavaBeans组件
Bean作为JSP组件
JSP Bean示例
意料之外的行为
第二十一章 使用Java开发定制标记库
开发简单标记处理器
开发传统标记处理器
开发标记库函数
创建标记库描述文件
打包和安装标记库
第二十二章 高级定制标记库特性
开发协作动作
验证语法
在标记库中使用监听者
动态属性值和类型
第二十三章 定制代码与JSTL的集成
设置和使用配置变量
集成定制条件动作
集成定制循环动作
集成定制国际化动作
集成定制数据库动作
使用JSTL标记库验证器
第二十四章 数据库访问策略
JDBC基础知识
使用连接和连接池
使连接池对应用组件可用
使用通用数据库bean
开发特定应用的数据库组件
第四部分 附录
附录一 JSP元素参考
附录二 JSTL动作和API参考
附录三 JSP表达式语言参考
附录四 JSP API参考
附录五 本书示例中定制动作的API参考
附录六 Web应用结构和部署描述文件参考
索引
Hans Bergsten是Gefion Software的创始人,这家公司主要致力于基于J2EE技术的服务器端Java服务和产品的开发。从Servlet和JSP规范诞生之日起,Hans就一直是相应工作级别中的一位积极参与者。他还对其他一些相关的JCP规范也有所贡献。如JSP标准记库和FJavaServer Faces。作为Apache Jakarta项目管理委员会的最初成员之一,他还大力推动了Servlet和JSP的Apache Tomcat参考实现的开发。
自1999年首次发布以来,JavaServer PagesTM(JSP)作为一种面向Web开发的技术得到了颇多关注。自此以后,JSP已经经历了3次修订,而本书所覆盖的是其规范的 2.0版本。
为什么JSP如此令人欢欣鼓舞?一大原因在于JSP是基于Java的,而JavaTM 极其适用于企业计算。实际上,JSP正是J2EE(Java 2TM Enterprise Edition,Java 2TM 企业版)平台的关键部分,并充分利用了诸多企业Java 企业库(Java EnterpriseTM libraries),如JDBCTM、JNDITM和Enterprise JavaBeansTM等。另一个原因在于JSP支持一种用于开发Web应用的强大模型,从而可以将表示与处理相分离。倘若想理解这一点的重要性,还需要对一些历史背景有所了解。在Web发展的最初岁月,能够开发动态Web内容的工具惟CGI(Common Gateway Interface,通用网关接口)莫属。CGI指定了Web服务器如何使用户输入对程序可用,而且指定了程序如何向Web服务器提供动态的内容以便发回。CGI脚本通常用 Perl编写(事实上,大量动态Web网站仍仰仗Perl/CGI脚本运作)。不过,CGI却不是一个高效的解决方案。对应每一个请求,Web服务器都必须为之创建一个新的操作系统进程,在此要完成以下工作,即加载一个Perl解释器和Perl脚本,执行该脚本,并在执行完时再将其释放。
为了提供一种更为高效的解决方案,过去数年间,程序员们得以看到多种取代CGI的新方法和工具应运而生:例如,FastCGI就可以在一个外部持久性进程(或进程池)中运行各个CGI程序。除此以外,面向Apache的mod_perl、面向Netscape 的NSAPI 以及面向Microsoft IIS的ISAPI 等都是在Web服务器本身所在的进程中运行服务器端程序。尽管这些解决方案能够提供更好的性能和可扩展性,但是仅有为数不多的常用Web服务器对其提供支持。
Java Servlet API于1997年初引入,这是针对可移植性问题提供的一种解决方案。
不过,以上所有技术都存在一个通病,即需要在程序中嵌入HTML代码。如果你曾经查看过一个Servlet的代码,可能会注意到代码中会大量调用out.println(),而其中所包含的HTML标记(tag)也可谓成篇累牍。如果一位开发人员单独地开发一个简单的Web网站,这种方法可能并无不可(甚至还算不错),但是如果由水平不同、技能各异的多位开发人员来共同开发一个Web应用,则会相当困难。
这种嵌入的HTML代码越来越暴露为一个严重的问题。随着Web网站复杂性的日益增加,而且越来越事关一个企业(机构)的成败,Web界面的外观和可用性也变得至关重要。新的客户技术(如客户端脚本和DHTML)可用于开发响应式和交互式的用户界面,样式表(stylesheet)的使用使得全局性地修改字体和颜色更为容易,而图像则使界面更能引人入胜。与此同时,服务器端代码却变得越来越复杂,对可靠性、高性能以及容错性的需求也在逐步增长。随着Web应用的复杂性增加,这就需要一种开发模型,以便身携不同技术的人们能够高效地协同工作。
JSP所提供的正是这样一种开发模型,从而使得在客户端技术和可用性等领域颇为擅长的Web网页设计人员、能够与熟捻于服务器端技术(如多线程、资源池、数据和缓存等)的程序员并肩协力地工作。尽管还存在其他一些技术也支持类似的开发模型(如ASP、PHP和ColdFusion),但其中无一能够提供JSP所具有的所有优点。
本书内容
本书(第三版)涵盖了于2003年末发布的JSP规范2.0 版本。另外还覆盖了相关的JSTL(JSP Standard Tag Library,JSP标准标记库)规范1.1版本,这也是在2003 年后期发布的。
你将了解到如何使用所有的JSP标准元素和特性,这包括用于访问JavaBeans组件的元素;如何将处理分摊至多个页面以提高可重用性,并简化维护,以及如何在页面、请求和用户之间共享信息。你还将学习如何针对某些任务使用JSTL,如条件处理、数据库数据的集成、国际化以及XML处理等,此外,对于标准组件未涉及的任务,你还将了解到如何为之开发你自己的定制组件。
本书中的例子将引导你完成一系列常见JSP设计问题的解决方案,从基本问题(如获取和验证用户输入)到更为高级的领域(如开发一个数据库驱动的网站、对用户进行身份鉴别、提供个人化内容、缓存数据以得到更高的性能,以及实现国际化等等)都有所涵盖。本书最后一部分介绍了如何将JSP与其他Java技术相结合;具体地,在此描述了如何使用流行的Apache Struts框架来结合JSP 和Servlet,并概要介绍了JSP如何适用于更大规模的J2EE。
致第二版的读者 如果你曾阅读过本书第二版,就会注意到,更多在以前版本中所用的定制组件在这一版中都被代之以JSTL中常见的标准组件,需要说明,我有幸参与制订了新版本的JSTL规范,而且基于本书第一版和第二版所探讨的一些思想建立了相关的标准。另外可以注意到的是,所有章都有所调整(不过各章的调整幅度不同),以涵盖最新版本JSP和JSTL规范中引入的新特性。另外还增加了全新的一章,以描述如何使用新的标记文件格式来开发定制的标记库,不仅如此,有关使用Java完成定制库开发的一章也做了相当大的扩充,从而覆盖了新的简单标记处理器(tag handler)
(译注1)API以及将表达式语言(Expression Language,EL)函数纳入标记库的新机制。
针对Servlet 2.4规范(JSP 2.0即基于此建立)中增加的特性和更正,各章也做了相应更新。对于本书涉及的所有规范,以下是对其中所做主要修改的小结:
结合了表达式语言(Expression Language,EL),EL首次由JSP规范中的JSTL规范引入(从而可用于所有标准组件和定制组件,也可用于模板文本)。
基于一种函数调用机制以及一组增加至JSTL(译注2)的常用函数而扩展的EL。
可以将定制标记库开发为标记文件(带有JSP元素的文本文件),也可以开发为一个新的简单标记处理器Java API以及各种新的标记库特性,如对动态属性表和可执行片段属性的支持。
对编写为XML文档的JSP页面提供了更多灵活的规则,并支持常规JSP页面中采用XML语法的JSP指令(directives)和脚本(scripting)元素。
新的JSP标准元素,主要是为了完成更为灵活的属性值赋值,以及支持新的标记文件格式和XML格式改进。
可以访问JSP错误页面中的更多信息,并且调整了属性名以满足Servlet规范。
更为严格的容器需求,以改善对JSP页面的语法错误报告和调试的支持。
对于带有新配置选项的所有规范提供了基于XML 模式(XML Schema)的部署描述文件,这些配置选项包括自动加入页面分段、页面编码规范、禁用脚本元素以及针对JSP的更多选项。
加入了一种新的请求监听者组件类型,以及可以应用于内部请求的过滤器。
不建议对Servlet和JSP使用单线程模型( 此为即将废弃的特性)。
新的JSTL标记库URI以及对XML库的一些属性名修改。
面向对象
只要对使用JSP技术开发Web应用有兴趣,那么就将从这本书获益。特别地,编写这本书的目的是为了对那些开发基于JSP的应用的人有所帮助,具体如下:
网页设计人员
网页设计人员主要开发应用的Web界面。这个群体往往采用HTML、样式表和客户端代码来开发漂亮的用户界面。网页设计人员可能还希望了解如何在Web页面中使用JSP元素,从而与其他服务器组件交互,如Servlet、数据库和Enterprise JavaBeans(EJB)。 Java程序员
Java程序员擅长使用 Java程序设计语言和Java Servlet。这个群体所希望了解的是如何开发JSP组件,以便网页设计人员在Web页面中使用,如JSP定制动作(custom action)和JavaBeans,以及如何将JSP与其他Java服务器端技术相结合,如Servlet和 EJB。本书划分为三大部分(后面将做简要介绍),以便你能够更容易地找到感兴趣的内容。
需要了解的预备知识
通常很难断定读者的水平如何。对于这本书,由于其内容所面向的读者归属两大阵营:网页设计人员和程序员,因此更难加以预测。
在此假设阅读这本书的人有一定的HTML经验;因此对于例子中所用的标准HTML元素将不做解释。但是即使你是一个“HTML盲”也不必担心,你可以籍此作为体验动态 Web内容和Web应用的入门材料。对于驱动所有Web应用的HTTP协议,在此给出了完整的介绍,并对特定于Servlet和基于JSP 的应用的相关概念和特性提供了完备的说明。如果希望了解有关HTML的更多知识,建议阅读Chuck Musciano和BillKennedy所著的《HTML and XHTML: The Definitive Guide》(O'Reilly出版)。如果你是一位网页设计人员,则假设你对编程一窍不通,不过倘若你曾经接触过客户端脚本语言[如VBScript 或JavaScript(ECMAScript)]也没有什么坏处。通过使用标准组件和定制组件,很少需要(甚至完全不必)处理Java代码。除了专门介绍如何在JSP页面中嵌入Java代码的那一章外,第一部分和第二部分中的所有例子都无需Java编程知识。
我认为阅读这本书的程序员应当熟悉Java编程、面向对象概念和Java Servlet。如果你计划为网页设计人员开发JSP组件,但不熟悉Java编程,我建议你先阅读一本 Java入门书,如Patrick Niemeyer和Jonathan Knudsen所著的《 Learning Java》(O'Reilly出版)(译注3)。在此尽管对Servlet API有一个简要的介绍,但是仍建议你阅读Jason Hunter和William Crawford所著的《Java Servlet Programming》(O'Reilly出版)(译注4),或者是另外一本详细介绍Servlet技术的书。本书中讨论数据库访问的一些章节需要你对SQL和数据库有一般的认识。我会详细解释运行有关例子所需的知识,但是如果希望开发数据库驱动的应用,那么除了本书所介绍的内容外,仍有必要对数据库有更多的了解。
内容组织
这本书划分为三大部分。第一部分描述了HTTP的基本知识(这是所有Web应用所使用的协议),介绍了Servlet与JSP的关系,并说明了如何建立一个JSP开发环境。
第二部分所关注的是如何使用标准JSP元素、JSTL和定制组件来开发基于JSP的Web应用。通过实际的例子,你将了解到如何处理常见的任务,如验证用户的输入、访问数据库、对用户进行身份鉴别和保护Web页面、本地化Web网站以及有关的更多内容。这一部分更侧重于网页设计人员,不过程序员可能对此也会感兴趣。
在第三部分中,你将了解到如何开发自己的定制动作和JavaBeans,以及如何将JSP与其他Java服务器端技术相结合,如Servlet和EJB。第三部分所面向的将是完成编程的群体。
总而言之,全书共包括24章和6个附录,以下做简要介绍。
第一部分,JSP 应用初步
第一章, JavaServer Pages入门
解释JSP为何能够适用于Web应用的架构中,并将它与其他技术加以比较。
第二章,HTTP和Servlet基础
在此描述了你所需了解的HTTP和Servlet基本概念,以充分发挥JSP的所有潜力。
第三章, JSP概述
本章概要介绍了JSP特性,并说明了JSP页面与Servlet的异同之处。在此还介绍了模型-视图-控制器(Model-View-Controller,MVC)设计模型,以及如何将其应用于JSP。
第四章,建立JSP环境
介绍了在哪里可以得到JSP参考实现(Apache Tomcat),以及如何在你的系统上建立此环境。另外还解释了如何安装本书中的例子。
第二部分,JSP应用开发
第五章,生成动态内容
本章分析了JSP的基本谌荩ㄈ绾未唇ā⒉渴鸷驮诵幸桓鯦SP页面,以及如何使用JSP元素来生成动态内容。
第六章,在JSP页面中使用 JavaBeans组件
介绍了JavaBeans组件是什么,以及如何在JSP中有效地加以使用。
第七章,使用定制标记库和JSP标准标记库
在此描述了定制标记库是什么,并说明了如何部署和使用定制标记库,还对JSTL(JSP Standard Tag Library,JSP标准标记库)做了介绍。
第八章,处理输入和输出
本章解释了如何用一个HTML表单向Web应用发送数据,以及如何使用JavaBeans和JSTL来处理数据,另外还指出了生成动态输出时所要注意的问题。
第九章,错误处理和调试
这里描述了开发基于JSP的应用时可能遇到的各种错误,并指出了有助于加以解决的相应策略和JSP特性。
第十章,在 JSP页面、请求和用户间共享数据
对于不同页面中不同类型的处理,这一章解释了将其加以分离以简化维护和进一步开发的JSP特性。另外还介绍了会话(session)如何建立针对同一用户一系列请求的相关信息,以及如何使用应用作用域(application scope)将可应用于所有用户的信息进行共享。
第十一章,将定制标记库开发为标记文件
介绍了如何将定制标记库的动作开发为标记文件,即带有JSP元素的常规文本文件。
第十二章,访问数据库
提供了对关系数据库、JDBC和SQL基本知识的简要概述,并介绍了用于读取、更新和删除数据库数据的JSTL动作。
第十三章,鉴别和个人化
介绍了如何使用容器提供的机制和应用控制的机制来实现鉴别和访问控制,以及如何使用当前用户的有关信息对Web页面进行个人化。
第十四章,国际化
本章解释了国际化和本地化,以及可用于实现国际化应用的Java特性,另外还描述了支持多语种Web网站开发的JSTL动作集。
第十五章,处理XML数据
在此解释了JSP如何生成XML,以及如何使用JSTL XML动作来处理XML输入。
第十六章,使用脚本元素
这一章所介绍的JSP元素可以使你将Java代码直接嵌入到JSP页面中,另外对于使用这个特性时必须处理的一些错误类型在此也做了描述。
第十七章,拾遗补缺
这一章讨论的是前面各章未涉及的一些领域,如使用JSP页面XML语法、JSP和客户端代码的结合、通过将JSP文件片段加入JSP页面中从而加以重用、预编译JSP页面等等。
第三部分,J2EE和JSP组件开发中的JSP
第十八章,Web应用模型
对于使用JSP并结合其他Java技术建立的J2EE和Web应用架构,本章在此提供了一个概述。
第十九章,结合JSP和 Servlet
在此详细介绍了通过使用流行的Apache Struts框架,如何将JSP与Servlet(以及监听者和过滤器组件类型)相结合。
第二十章,为JSP开发JavaBeans组件
这一章提供了与JSP有关的JavaBeans组件的详细介绍,包括会话和应用作用域bean的线程和同步问题,以及如何使用JavaBeans组件从而更易于迁移至一种EJB架构。
第二十一章,使用Java开发定制标记库
介绍了JSP标记扩展机制(JSP Tag Extension mechanism),并说明了如何使用前面章节(及例子)中所用的诸多定制动作来开发定制标记库。
第二十二章,高级定制标记库特性
本章介绍了可以供定制动作充分利用的更多高级特性,如开发协作动作、语法验证和用法验证、属性值类型转换等等。
第二十三章,定制代码与JSTL的集成
描述了JSTL规范所提供的所有集成手段,并介绍了如何开发充分利用这些集成手段的定制动作、Servlet、监听者和过滤器。
第二十四章,数据库访问策略
提供了对JDBC的一个简要介绍,并介绍了在Web应用中高效使用数据库的各种策略,如建立一个连接池,应用组件可以通过Servlet上下文或JNDI使用此连接池,另一种策略是在单独的类或定制动作中封装数据库访问代码,除此以外,还包括其他一些策略。
第四部分,附录
附录一,JSP元素参考
包括了所有标准JSP 2.0 元素的描述。
附录二,JSTL动作和API参考
包含了所有标准JSTL 1.1 元素的描述,并介绍了相关编程接口和支持类。
附录三,JSP表达式语言参考
包含了对JSP EL语法和规则的描述。
附录四, JSP API参考
对于Servlet和JSP API中所定义的可用于JSP页面的所有隐式对象,在此附录中提供了相应的描述,并介绍了标记扩展机制类和接口。
附录五,本书示例中定制动作的API参考
包含有对例子中定制动作、bean和实用工具类(utility class)的描述。
附录六,Web应用结构和部署描述文件参考
包含了对标准Web应用结构和Web应用部署描述文件中所有元素的描述。
如果你是一位网页设计人员,建议你把重点放在第一部分和第二部分的章节上。你可能也想浏览第三部分,从而对后台工作是如何进行的有所认识,但是如果并非Java程序员,要想全盘理解是不太可能的。
如果你是一位Java程序员,那么第三部分正是为你而设。如果你对HTTP和Servlet已经很熟悉,那么可以快速地略过第一部分。不过,本书第一部分中还包括有Servlet 2.2 API所引入Web应用概念的有关信息,即使你使用Servlet已非一日两日,对于这些内容可能也并不了解。建议你一定要阅读第二部分,以了解JSP是如何工作的,但是实际上你可能希望从第三部分入手,这样在阅读第二部分之前,可以先了解例子中各个组件是如何实现的,其后再通过阅读第二部分了解它们是如何使用的。
关于示例
这本书包含了大量示例,这些示例展示了诸多有用的技术,如输入验证、数据库访问、信息缓存、应用控制鉴别和访问控制、国际化、XML处理等等。这些例子中,不仅有完整的应用(包括一个网上商店网站、一个员工名册以及一个个人化项目公告栏),也包括一些较小的例子和页面片段。在所提供的示例标记库中包含10个左右的定制动作,你可以将其直接用于你的应用中,也可以作为自行开发的起点。所有示例以及大多数定制动作的代码在正文中都已提供;也可以从O'Reilly网站(http://www.oreilly.com/catalog/jserverpages3)下载所有代码。
另外,通过访问http://www.TheJSPBook.com/,你不仅能够看到更多实用示例,还可以下载代码、向我咨询,并找到与JSP相关的产品等等。所有示例都在使用Sun Java 2 SDK标准版(1.4.2)的Windows ME和Linux(Red Hat Linux 7.2)上测试通过,在此所使用的是官方发布的JSP 2.0参考实现(Apache Tomcat 5)。如果希望了解更多关于下载和安装Apache Tomcat服务器以使用上述例子的内容,请参考第四章。
本书约定
斜体字(Italic)路径名、文件名、程序名、编译器、选项和命令新术语初次定义时 Internet地址,如域名和URL 粗体字(Bold):计算机键盘上的某个按键用户界面按钮和菜单名等宽字(Constant width) JSP页面或Java程序中原样显示的所有内容,这包括关键字、数据类型、常量、方法名、变量、类名和接口名需要逐字在屏幕上键入的命令行和选项所有JSP和Java代码清单 HTML文档、标记和属性等宽斜体字(Constant width italic)通用占位符(placeholder),以指示在你自己的程序中相应的项要代之以某个实际的值等宽粗体字(Constant width bold)代码示例中要求由用户键入的文本 建议与评论
本书的内容都经过测试,尽管我们做了最大的努力,但错误和疏忽仍然是在所难免的。如果你发现有什么错误,或者是对将来的版本有什么建议,请通过下面的地址告诉我们:
美国:
O'Reilly Media, Inc. 1005 Gravenstein Highway North Sebastopol, CA 95472 中国:
100080北京市海淀区知春路49号希格玛公寓B座809室奥莱理软件(北京)有限公司
O'Reilly的每一本书都有专属网页,你可以在此找到关于该本书籍的相关信息,包括示例程序的下载、勘误表与相关资源的链接。
http://www.oreilly.com/catalog/jserverpages3/
要评价本书或询问有关技术问题,请发电子邮件到:
bookquestions@oreilly.com
info@mail.oreilly.com.cn
要了解更多有关书籍、会议、资源中心和O'Reilly Network的信息,请参见 O'Reilly的Web站点:
http://www.oreilly.com
http://www.oreilly.com.cn