两年前,企业级Java风暴席卷了整个Java社团——开发者们都已认识到它在构建分布式应用程序方面的潜力。而现在, JSP(Javaserver Pages)能够协调网页设计者和程序员之间的工作,让他们共同创建动态网页。然而,JSP不同于其他的Java技术,它可以帮助那些非编程人员开发Web应用程序。
本书带领读者进入令人激动的JSP新世界,对它做了全面介绍。阐述了JSP如何充分利用Java servlet来创建高效的、可复用的Web应用程序。书中还展示了如何用Apache Tomcat服务器启动JSP,并详细讲述了JSP语法、脚本元素、错误处理和调试、数据库访问、身份验证和个性化、国际化、与XML集成等。
前言\r\n\r\n第一部分 JSP应用程序基础\r\n\r\n第一章 JSP介绍\r\n\r\n什么是JSP7\r\n为什么要使用JSP?\r\n开始学习所需要的东西\r\n\r\n第二章 HTTP和Server基础\r\n\r\nHTTP请求/应答模型\r\nservlet\r\n将Java Web应用程序打包\r\n\r\n第三章 JSP概览\r\n\r\nservlet所带来的问题\r\nJSP页面剖析\r\nJSP处理过程\r\n使用MVC设计JSP应用程序\r\n\r\n第四章 构建JSP环境\r\n\r\n安装Java软件开发工具包\r\n安装Tomcat服务器\r\n测试Tomcat\r\n安装本书的例子\r\nWeb应用程序例子概览\r\n\r\n第二部分 JSP应用程序开发\r\n\r\n第五章产生动态内容\r\n\r\n现在是几点?\r\n输入和输出\r\n\r\n第六章 使用脚本元素\r\n\r\nJava启蒙\r\nJSP隐含对象\r\n条件处理\r\n显示数值\r\n使用表达式来设置属性\r\n声明变量和方法\r\n\r\n第七章 错误处理和调试\r\n\r\n处理语法错误\r\n对基于JSP的应用程序进行调试\r\n处理运行时的错误\r\n\r\n第八章 在JSP页面、请求和用户间共享\r\n\r\n在页面间传递控制和数据\r\n共享会话和应用程序数据\r\n使用自定义行为\r\n在线购物\r\n内存使用策略\r\n\r\n第九章 数据库访问\r\n\r\n从JSP页面访问数据库\r\n在不使用beau的情况下进行输入验证\r\n使用事务\r\n应用程序特定的数据库行为\r\n\r\n第十章 身份验证和个性化\r\n\r\n由容器提供的身份验证\r\n应用程序控制的身份验证\r\n另外一些安全问题\r\n\r\n第十一章 国际化\r\n\r\nJava是如何支持国际化和才\r\n产生本地化的输出\r\n比特简史\r\n处理本地化的输入\r\n\r\n第十二章 拾遗补缺\r\n\r\n缓冲\r\n引入页面片段\r\nXML和 JSP\r\n混合客户端代码和服务器端代码\r\n对JSP页面进行预编译\r\n防止JSP页面被缓存\r\nURL是如何被解释的\r\n\r\n第三部分 JZEE中的 JSP和 JSI\r\n\r\n第十三章 Web应用程序模型\r\n\r\nJZEE模型\r\nMVC模型\r\n可缩放性\r\n\r\n第十四章 将servlet和 JSP组合使用\r\n\r\n将servle在用作控制器\r\n使用Action对象来实现一个更加模块化的设计\r\n在servlet和JSP页面间共享信息\r\n对所有的运行时错误使用同一个JSP错误处理贾\r\n\r\n第十五章 开发用于JSP的 JavaBea\r\n\r\n作为 JSP组件的 JavaBeans\r\nJSP bean的例子\r\n意想不到的<jsp:setProperty>行为\r\n\r\n第十六章 开发JSP自定义行为\r\n\r\n标记扩展基础\r\n开发一个简单的行为\r\n处理行为体\r\n让行为互相协作\r\n通过行为创建新的变量\r\n开发迭代行为\r\n创建TLD\r\n语法验证\r\n如何重用标记处理程序\r\n打包和安装标记库\r\n\r\n第十六章 开发数据库访问组件\r\n\r\n使用连接和连接池\r\n使用通用数据库bean\r\n开发通用数据库自定义行为\r\n开发应用程序特有的数据库组件\r\n\r\n第四部分 附录\r\n\r\n附录一 JSP元素的语法参考\r\n附录二 JSP的API参考\r\n附录三 本书例子中的自定义行为和类的章\r\n附录四 Web应用程序结构和配置描述符。\r\n附录五 JSP资源参考\r\n词汇表
JSP(Javaserver Pages, Java服务器页面)是一种开发Web应用程序的新技术. 自从首次发布以来, 它一直受到密切的关注.
为什么JSP如此激动人心?一个原因是它是基于Java的, 而Java极为适用干企业级计算. 事实上, JSP是JZEE(Java 2 Enterprise Edition, Java 2企业版)平台的关键部分, 它能够利用 Java企业版类库的许多优点, 比如JDBC. JNDI和EJB(Enterprise JavaBeans, 企业级JavaBeans).
另一个原因在于JSP支持强大的Web应用程序开发模式, 它可以把外观呈现与处理过程分隔开来. 要理解为什么这个特性如此重要, 我们需要了解一点Web的发展历史. 在Web早期, 开发动态网页的淮一工具是CGI(Common Gateway Interface, 公共网关接口). CGI描述了Web服务器如何使某个程序接收用户的输入, 以及该程序如何向Web服务器提供动态生成的内容作为反馈. CGI脚本通常用Perl语言来编写(事实上, CGI Perl脚本现在依然在许多动态网站上运行着). 然而, CGI并非一种高效率的解决方案. 对于每一个请求, Web服务器都要创建一个新的操作系统进程, 装入一个Perl解释器和Perl脚本, 运行该脚本, 然后, 当一切完成后, 再把整个进程释放掉.
在最近几年里, 为了提供更加有效的解决方案, 许多CGI的替代品进入了程序员的工具箱, 例如, FastCGI, 在外部永久进程(或进程池)中运行每一个CGI程序. 另外, 用于Apache服务器的mod_perl, 用于Netscape服务器的NSAPI, 以及用于微软IIS服务器的ISAPI, 都是在Web服务器的同一进程中运行服务器端程序的方案. 虽然这些解决方案提供了更好的性能和可缩放性, 但它们中的每一个都只能被几种常用Web服务器所支持.
1997年初提出的Java Servlet API提供了一种新的解决方案. 然而, 所有这些技术都面临着同一个问题:嵌入到程序中的HTML代码. 如果你阅读过servlet的代码, 你就会发现数不清的对out. Println()的调用, 这些调用是为了输出 HTML的标记. 对于在一个简单站点上工作的个人开发者来说, 这种方式很合适, 但当几个拥有不同技能的人协同开发Web应用程序时这就变得极为艰难了.
这个问题已经成为当务之急. 当网站变得越来越复杂, 并越来越多地依靠良好的协调组织的时候, Web界面的美观性和易用性就成了最重要的东西. 新的客户端技术, 比如客户端脚本和DHTML, 可以编制更加互动的用户界面, 样式表能够让我们在全局范围内轻易地改变字体和色彩, 图片可以使界面更加具有表现力. 与此同时, 服务器端代码变得更加复杂, 对于可靠性. 性能和容错性的要求也在提高. Web应用程序日益增长的复杂性要求有一种开发模式, 可以让拥有不同技能的人在一起高效率地合作.
Java服务器页面所提供的正是这样一种开发模式. 它使得擅长图形制作. 布局和可用性的网页设计师与精通服务器端技术(例如多线程, 资源池, 数据库和高速缓存)的程序员能够协调地工作. 尽管其他一些技术也支持类似的开发模式, 例如ASP. PHP和 ColdFusion, 但它们当中没有一种能提供 JSP的所有优点.
本书的内容
本书涵盖了JSP规范的1. l版, 它是1999年末发布的.
在本书中, 你将会学到如何使用JSP的所有标准元素和特性, 包括用于访问JavaBeans组件的元素, 用于把处理过程分布到多个页面以增强可重用性和简化维护的元素, 以及用于在页面. 请求和用户间共享信息的元素. 你还会学到如何使用和开发自定义组件. 本书详细讲述了大量的自定义组件, 可用于数据库中数据的集成. 国际化. 访问控制以及条件处理等. 其中许多组件具有极好的通用性, 你可以直接在自己的程序中使用它们.
本书中的例子将引导你了解常见JSP设计问题的解决方案, 从一些基本的问题, 例如如何接收用户输入并对输入进行验证, 到更加高深的领域, 比如开发一个数据库驱动的网站, 验证用户身份, 提供个性化内容, 以及实现国际化. 本书的最后一部分将讲述如何使JSP与其他Java技术协同工作, 特别将讲述如何结合使用JSP与servlet, 并将概述如何在JZEE中运用JSP.
本书的读者
本书适用于对用JSP技术开发Web应用程序感兴趣的任何人. 本书将对下述经常参与基干ISP应用程序开发的两类人特别有帮助:
网页设计师
网页设计师主要是为应用程序设计Web界面. 这个群体使用HTML. 样式表和客户端代码来开发一个美观的用户界面. 他们需要学习如何在网页中使用JSP元素, 以便与应用程序的服务器端组件(例如数据库和EJB)进行协作.
Java程序员
Java程序员对于 Java编程语言和 Java servlet已经很熟悉了. 这个群体的志趣在于学习如何开发网页设计师们能够在页面中使用的JSP组件, 例如JSP自定义行为(custom actio)和JavaBeans, 以及如何使JSP与其他的Java服务器端技术(如servlet和EJB)协同工作.
你需要了解哪些知识
揣测读者已经掌握的知识程度向来是十分困难的. 对于本书而言, 这个任务则难上加难, 因为本书要为两类读者服务:网页设计师和程序员.
我假定本书的读者都已经掌握了HTML. 所以我将不再解释例子中用到的HTML元素. 然而, 即便你是HTML大师, 你也可能是第一次接触动态的Web内容和Web应用程序. 因此, 本书中也包含了对驱动所有Web应用程序的HTTP协议. 以及对基于JSP和servlet的 Web应用程序的概念和特性的全面介绍. 如果你想要进一步地学习 HTML, 我椎荐你阅读KHTML and XHTML:The Definitive Guideb(buck Musciano和Bill Kennedy著, 由 O’Reilly公司出版)(译注).
如果你是一名网页设计师, 那么我假定你不具备关于编程的任何知识, 尽管你可能十分熟悉客户端脚本语言, 如VBScript或Javascript(ECMAScript). 本书包括了对Java的简单介绍, 让你能够在JSP负面中使用常用的Java代码. 建议使用由Java程序员开发的Java组件, 而不是把你自己写的代码放到页面里, 这样你就不必去了解Java语言复杂难懂的细节了.
我假定阅读本书的程序员们都熟悉 Java编程. 面向对象的概念和 Java servlet. 如果你打算为网页设计师开发JSP组件, 却又不熟悉Java编程的话, 我建议你读一本介绍 Java的书, 例如 《Learning Java》(Patrick Niemeyer和 Jashua Peck著, 由O’Reilly公司出版)(译注 2). 如果你需要学习 servlet, 我推荐《Java Servlet Programming (Jaso Hunter和William Crawford著, 由O’Reilly公司出版)(译注3), 或者其他讲解servlet技术的书.
阅读关于数据库访问的一些章节需要具备一些关于SQL和数据库的知识. 我会讲解运行书中例子所需要的知识, 但如果希望开发数据库驱动的应用程序, 那么你就需要掌握得比书中所讲的更多了.
本书的结构
本书分为三个部分. 第一部分讲述HTTP(所有Web应用程序都要使用的协议)的基础知识, servlet和 JSP之间的关系, 以及如何建立一个 JSP开发环境.
第二部分的重点在干使用标准JSP元素和自定义组件来开发基于JSP的Web应用程序. 通过实际例子, 你将学到如何完成一些常见的任务, 例如验证用户输入, 访问数据库, 验证用户身份, 保护网页, 使网站本地化, 等等. 这部分内容更多地是面向网页设计师的.
在第三部分, 你将学习到如何开发你自己的自定义行为和 JavaBeans, 以及如何使JSP与其他 Java服务器端技术(比如 servlet和 EJB)协同工作. 这一部分主要面向程序员.
总地来说, 本书包括如下的17章和 5个附录.
第一部分JSP应用程序基础
第一章JSP介绍
介绍JSP在Web应用程序大家庭中的地位, 以及它与其他技术相比较的优点.
第二章HTTP和servlet基础
介绍读者必须了解的HTTP和servlet的基本概念, 以发挥出 JSP的所有潜力.
第三章JSP概览
概述JSP的特性, 以及JSP与servlet之间的相似点与不同点. 还讲述了模型一视图一控制器设计模型, 以及它在JSP上的应用.
第四章村建JSP环境
讲述从何处获得作为JSP参考实现的Apache Tomcat, 以及如何把它安装在用户的系统中. 还讲解了如何安装书中的例子.
第二部分JSP应用程序开发
第五章产生动态内容
讲解了如何使用JSP来生成动态内容, 以及如何接收并验证用户输入.
第六章使用脚本元素
对Java编程做了简单介绍, 然后讲解所有的JSP元素, 使用这些元素可以将Java代码直接嵌入到JSP页面中.
第七章错误处理和调试
讲述在开发JSP程序时会遇到的各种错误, 以及能够帮助你应付它们的策略和JSP特性.
第八章在JSP反面. 请求和用户间共享数据
讲解了一些JSP特性, 利用这些特性能把不同类型的处理过程划分到不同的页面中去, 从而简化维护, 提高开发效率. 还介绍了如何使用会话以保存关干同一个用户的一系列请求的信息, 并讲解了用干所有用户的信息是如何在整个应用程序作用域内共享的.
第九章数据库访问
对关系数据库. JDBC和SQL基础的简要概述. 介绍了一系列用于读入. 更新和删除数据库数据的常用自定义行为.
第十一章身份验证和个性化
讲述了如何使用容器提供的和应用程序控制的机制来实现身份验证和访问控制, 以及如何使用当前用户的信息来使网页个性化.
第十一章国际化
讲解国际化和本地化, 以及可以用来开发国际化应用程序的Java特性. 还介绍了一些用于实现多语言网站的自定义行为.
第十二章拾遗补缺
包含了前面各章中未涉及到的领域, 例如在 JSP中使用 XML和 XSL, JSP与客户端代码之间的协作, 通过在JSP页面中引入文件来重用JSP程序段, 对JSP页面实行预编译, 等等.
第三部分JZEE中的JSP和JSP组件开发
第十三章Web应用程序模型
JZEE以及使用JSP及其他Java技术的Web应用程序结构的概述.
第十四章将servlet和JSP组合使用
详细讲解了JSP是如何与servlet协同工作的.
第十五章开发用于JSP的JavaBeans
提供与JSP有关的JavaBeans的细节, 包括线程技术, 会话中的同步, 应用程序作用域内的JavaBeans, 以及如何用JavaBeans使向EJB结构移植变得更加简单. 在前一章中用到的JavaBeans将在本章中用作例子.
第十六章开发JSP台定义行为
讲解了JSP标记扩展机制, 以及如何使用这个机制来开发自定义行为, 将用到许多前面章节中提到的自定义行为作为例子.
第十七章开发数据库访问组作
讲述了前面章节中用到的数据库访问自定义行为, 以及如何利用内部开发的或第三方提供的连接池来使用它们. 本章还解释了如何重用用于数据库访问的beau, 来开发专用的数据库自定义行为.
第四部分附录
附录一JSP元素的语法参考
包括对所有标准JSP1. 1元素的描述.
附录二 JSP的API参考
描述了根据 servlet和 JSP API的定义在 JSP页面中可以使用的所有隐含对象, 以及标记扩展机制的所有类和接口.
附录三本书例子中的自定义行为和类的参考
包括了对例子中所用到的自定义行为. beau和工具类的描述.
附录四Web应用程序结构和配置描述符参考
包括了对标准 Web应用程序结构和 Web应用程序的配置描述符中所有元素的描述.
附录五JSP资源参考
包括了与JSP相关的产品. Web主机服务以及进一步学习所需的更多JSP知识和相关技术的站点.
如果你是一位网页设计师, 我建议你把重点放在策一和第二部分上. 你或许想要侧览一下第三部分, 以便对现象背后的事物是如何工作的有个感性认识. 但如果你并不是Java程序员的话, 就别奢望去弄懂每样东西.
如果你是一名Java程序员, 那么第三部分正是你所需要的东西. 如果你早已对HTTP和servlet了然于心, 你可能会想快速通过第一部分. 然而, 这一部分中包括了Servlet 2. 2 API中介绍的Web应用程序概念, 这些你可能并不熟悉, 尽管你可能从事编写servlet已有些时日了. 我建议你阅读第二部分来学习JSP是如何运行的, 但你可能需要不时地跳到第三部分去, 去看一看例子中用到的组件是如何实际实现的.
关于例子
本书包括50多个例子, 它们演示了关于数据库访问. 应用程序控制下的身份验证和访问控制. 国际化. XML处理等方面的有用技术. 例子中包括完整的应用程序, 比如一个在线商店站点, 一份雇员目录, 以及一个个性化的项目公告牌, 还包括许多小一些的例子和程序片段. 书中用到的标记库包含20多个自定义行为, 你可以直接把它们用在你的程序中, 或者作为你开发的起点. 所有例子和大部分自定义行为的代码都包含在了本书的正文中, 你还可以从O’Reilly的站点http://www. oreilly. com/catalog/jserverpages/上下载所有的代码. 另外, 你还可以从http://www.TheJSPBook. com上看到所有例子的真实运行状态.
所有的例子都通过了正式的JSP参考实现Apache Tomcat服务器的测试, 测试在Windows(98和 NT 40)和 Linux( Red Hat Linux 6. 2)平台上进行, 使用 Sun的Java 2 SDK(1. 22和1. 3). 如果你为了使用例子而需要更多的关于下载和安装Apache Tomcat的信息, 请阅读第四章.
本书所使用的约定
本书使用以下英文字体约定:
斜体(italic)用于说明:
路径名. 文件名. 目录名和程序名
被定义的新术语
Internet地址, 例如域名和 URL
黑体(boldface)用于说明:
计算机键盘上的特殊键
用户界面中按钮和菜单的名称
等宽字体 (Constant width)用干说明:
任何直接出现在JSP页面或Java程序中的东西, 包括关键字. 数据类型. 常量. 方法名. 变量. 类名和接口名
应该在屏幕上输入的命令行和选项
所有 JSP和 Java的代码清单
HTML文档. 标记和属性
等宽斜体(constant width italic)用干说明:
通用占位符, 表示在你的程序中这个部分应该被某个实际的值替换掉等宽黑体(constant width bold)用于说明:
在例子代码中应该由用户输入的文本
建议与评论
本书的内容都经过测试, 尽管我们做了最大的努力, 但错误和疏忽仍然是在所难免的. 如果你发现有什么错误, 或者是对将来的版本有什么建议, 请通过下面的地址告诉我们:
美国:
O’Reilly&Associates, Inc.
101 Morris Street
Sebastopol, CA 95472
中国:
100080北京市海淀区知春路49号希格玛公寓B座809宝
奥莱理软件(北京)有限公司
你还可以发送电子信息. 如果想加入我们的邮件列表或索取书目, 请发电子邮件给:
info@oreilly.com
要询问技术问题或对本书发表评论, 请发电子邮件给:
bookquestions@orellly. com
我们为本书开设了一个站点, 在那里我们放置了例子. 对勘误表以及对后续版本的计划. 你可以访问以下网址:
http://www.oreilly.com/catalog/jserverpages/
想要了解本书和其他书籍的更多信息, 请访问O’Reilly的网站:
http://www. orellly.com
http://www.orellly.com.cn
致谢
我喜欢写作, 总是想着要写一本书. 在完成了一系列关于Java servlet的文章, 以及一本关于服务器端Java的书的一些章节之后, 我的信心空前高涨, 于是我给O’Reilly& Associates发了封电子邮件, 问他们是否需要我写一本关干JSP的书. 令我极为惊讶的是(我想事后我的信』动已经不那么高昂了), 他们回答“是的!我知道, 这需要比我所想像的多得多的工作, 事实也证明的确需要付出相当的努力. 然而, 在大约一年后, 经过了无数次的撰写和重写, 这部有17章和5个附录的书稿终于摆在了我的书桌上. 剩下要做的就是向那些帮助我实现梦想的人们致以谢意了. 首先, 我要感谢我的编辑 Paula Ferguson和 Bob Eckstein. Paula是第一个接受我写书请求的人, 在我跌跌撞撞地撰写这本书的前半部分的时候, 她始终给予我帮助. 为了本书的后半部分, Bob特地从国外归来. 我真的十分感激他通读了全书并提出了许多有用的建议. 同样感谢制作插图的Rob Romano和负责协调工作的Christien Shangraw, 感谢O’Reilly的所有幕后制作人员, 是他们确保了本书得以出版. 特别感谢JSP和Servlet规范的负责人Eduardo pelegri-Llopart和Danny Coward. 他们回答了我的所有问题, 提供了反馈意见, 并阐释了规范中模棱两可或含混不清的地方. 他们给予我的帮助远远多于我所要求的. 我希望能够以我对规范的贡献作为报答. 同时感谢以其他方式帮助我改进本书的人们:Jason Hunter, 他让我使用他的连接池代码和日文例子, Craig McClanahan, Larrt Riedel, Steve Jung(Staeve想以此纪念他的父亲, Arthur H. Jung, 他于2000年3月 17日去世), Sean Rohead, Jerry Croce, Sieve Piccolo和Vikram David, 他们复审了本书, 提出了许多改进的建议, 所有致力于构建出色的JSP参考实现的Apache Tomcat的开发者们, jsp-interest邮件列表中的成员们, 他们对本书中应包括哪些内容提出了意见. 最后, 感谢每一个鼓励过我, 使我保持着高昂情绪的人:母亲. 父亲和姐姐. 他们支持我, 教会我坚持自己的信念, 我在瑞典的老朋友们, 特别是Janne Ek, Peter Hellstrom(以及他的父亲, 他帮助我翻译了德文的例子), Janne Andersson. Roger Bjarevall和Michael Rohadin, Anne Helgren, 我的写作老师, 她帮助我树立了写书的信心, 所有Vesica Pisces乐队(http. //www. vesicapisces. com)的成员们, Kelly, Brian, Adam, Bill和James:我现在真的愿意离开写作, 和你们在一起, 倾听你们的演奏.
----Hans Bergsten
2000年 9月