JSP(JavaServer Pages)是目前热门的跨平台动态Web应用开发技术。本书由经验丰富的开发人员撰写,主要介绍高级的JSP知识以及Web服务器软件开发技术,包括动态Web内容生成、国际化和本地化、JSP调试技术、Web框架、Struts、Tiles、JSF、安全、性能及最佳实践。书中给出了许多实际的代码示例,并对一些实例做了深入分析,这些内容为读者展示了JSP 2.x的许多新特性,并强调了Web开发的一些最佳实践。本书配有习题和综合项目,非常适合作为相关院校JSP程序设计课程的教材。
第1章 高级动态Web内容生成 1\r\n1.1 Web应用中的数据验证 1\r\n1.1.1 服务器端验证和资源的高效使用 2\r\n1.1.2 客户端数据验证 3\r\n1.1.3 服务器端验证的必要性 4\r\n1.1.4 常见的客户端数据验证 4\r\n1.1.5 客户端验证的操作 4\r\n1.1.6 动态生成客户端JavaScript代码 14\r\n1.1.7 使用JSP动态生成XML 21\r\n1.2 小结 25\r\n习题 26\r\n\r\n第2章 国际化和本地化 27\r\n2.1 关于支持国际化的应用 27\r\n2.2 国际化和本地化 28\r\n2.3 利用Java平台的国际化功能 30\r\n2.3.1 本地化环境的概念 30\r\n2.3.2 维护本地化环境信息 31\r\n2.4 小结 56\r\n习题 57\r\n\r\n第3章 JSP调试技术 58\r\n3.1 调试科学 58\r\n3.2 编译时捕获bug 60\r\n3.3 使用调试系统与生产系统 63\r\n3.4 使用System.out.println()测量代码 64\r\n3.5 使用日志系统 66\r\n3.5.1 通过servlet容器记录日志 66\r\n3.5.2 利用 JDK 日志记录器记录日志 68\r\n3.5.3 用Log4j记录日志 74\r\n3.5.4 使用标记库记录日志 79\r\n3.6 使用工具进行调试 82\r\n3.6.1 设置断点 82\r\n3.6.2 检查变量和设置观察点 84\r\n3.6.3 单步跟踪代码 85\r\n3.6.4 远程调试 86\r\n3.7 在生产环境中调试代码 87\r\n3.7.1 预编译JSP的调试 87\r\n3.7.2 在负载情况下调试 87\r\n3.7.3 向日志文件增加上下文信息 88\r\n3.7.4 增加日志过滤器 90\r\n3.8 查找间歇问题 91\r\n3.8.1 增加信息作为响应注释 91\r\n3.8.2 侦查应用 91\r\n3.9 避免并发问题 95\r\n3.10 小结 95\r\n习题 95\r\n\r\n第4章 JSP在Web应用领域的角色 96\r\n4.1 什么是Web应用? 96\r\n4.2 Web应用的目录结构 96\r\n4.3 部署描述文件 97\r\n4.4 使用Web归档文件 105\r\n4.5 开发和部署策略 105\r\n4.6 Tomcat的打包和部署 106\r\n4.7 小结 110\r\n习题 110\r\n\r\n第5章 Web框架 112\r\n5.1 什么是框架? 113\r\n5.2 框架的好处 113\r\n5.3 框架类型 114\r\n5.3.1 应用框架 114\r\n5.3.2 持久性框架 115\r\n5.3.3 工具框架 115\r\n5.4 WebWork 116\r\n5.5 Spring框架 126\r\n5.5.1 Spring MVC的主要组件 127\r\n5.5.2 使用Spring的示例 128\r\n5.6 小结 145\r\n习题 146\r\n\r\n第6章 Struts框架 147\r\n6.1 Struts介绍 147\r\n6.1.1 Struts简介 148\r\n6.1.2 控制器:动作和表单 149\r\n6.1.3 模型 157\r\n6.1.4 视图 157\r\n6.1.5 示例应用 174\r\n6.2 小结 188\r\n习题 188\r\n\r\n第7章 使用Tiles的布局管理 189\r\n7.1 Tiles介绍 189\r\n7.1.1 什么是Tiles框架? 189\r\n7.1.2 Tiles术语 191\r\n7.1.3 安装Tiles 191\r\n7.2 tile作用域 195\r\n7.3 定义 195\r\n7.4 Tiles标记 197\r\n7.4.1 insert 197\r\n7.4.2 definition 198\r\n7.4.3 put 198\r\n7.4.4 putList 199\r\n7.4.5 add 199\r\n7.4.6 get 199\r\n7.4.7 getAsString 199\r\n7.4.8 useAttribute 200\r\n7.4.9 importAttribute 200\r\n7.4.10 initComponentDefinitions 200\r\n7.5 向Tiles传递参数 201\r\n7.6 高级Tiles 202\r\n7.6.1 定义和继承 202\r\n7.6.2 嵌套tile 205\r\n7.7 Tiles和Struts 211\r\n7.7.1 使用Struts配置Tiles 211\r\n7.7.2 作为动作转发的Tiles定义 211\r\n7.7.3 从Struts向Tiles传递值 213\r\n7.8 小结 217\r\n习题 218\r\n\r\n第8章 JSF 219\r\n8.1 配置JSF项目 219\r\n8.2 JSF入门 220\r\n8.2.1 使用支撑bean 222\r\n8.2.2 托管bean 223\r\n8.2.3 控制导航 224\r\n8.2.4 防止直接访问Faces JSP文件 226\r\n8.3 JSF生命周期 226\r\n8.3.1 恢复视图 227\r\n8.3.2 应用请求值 227\r\n8.3.3 处理验证 228\r\n8.3.4 更新模型值 228\r\n8.3.5 调用应用 228\r\n8.3.6 呈现响应 228\r\n8.4 验证数据 228\r\n8.4.1 使用标准验证器 231\r\n8.4.2 创建自己的验证器 232\r\n8.5 转换数据 239\r\n8.5.1 标准转换器 244\r\n8.5.2 实现转换器接口 246\r\n8.6 用监听者处理事件 248\r\n8.7 JSF与Struts 250\r\n8.8 小结 251\r\n习题 251\r\n\r\n第9章 J2EE中的JSP 252\r\n9.1 J2EE概述 252\r\n9.1.1 什么是J2EE? 252\r\n9.1.2 容器的功能 254\r\n9.2 J2EE技术 254\r\n9.2.1 J2EE API 254\r\n9.2.2 J2EE平台体系结构 256\r\n9.2.3 JSP开发情况 257\r\n9.3 结合JSP使用J2EE组件 258\r\n9.3.1 servlet 259\r\n9.3.2 JNDI 263\r\n9.3.3 JDBC 266\r\n9.4 EJB 269\r\n9.4.1 EJB的好处 269\r\n9.4.2 EJB的限制 269\r\n9.4.3 EJB类型 270\r\n9.4.4 会话bean 271\r\n9.4.5 实体bean 271\r\n9.4.6 消息驱动bean 272\r\n9.4.7 Timer服务 272\r\n9.5 小结 273\r\n习题 273\r\n\r\n第10章 安全 274\r\n10.1 安全领域 274\r\n10.1.1 认证 275\r\n10.1.2 授权 276\r\n10.1.3 数据完整性 278\r\n10.1.4 机密性 278\r\n10.2 数据完整性和机密性 278\r\n10.3 认证 283\r\n10.3.1 HTTP基本认证 283\r\n10.3.2 基于表单的认证 288\r\n10.3.3 客户端证书认证 293\r\n10.4 授权 297\r\n10.4.1 容器 297\r\n10.4.2 编程式授权 297\r\n10.5 小结 301\r\n习题 301\r\n\r\n第11章 性能 302\r\n11.1 性能概念 302\r\n11.1.1 度量的内容 302\r\n11.1.2 用户的角度 303\r\n11.1.3 如何度量性能 303\r\n11.1.4 性能测试后的工作 305\r\n11.2 使用JMeter测试性能 306\r\n11.2.1 安装JMeter 306\r\n11.2.2 JMeter概念 306\r\n11.3 性能调优技巧 311\r\n11.3.1 开发时的措施 311\r\n11.3.2 部署时的措施 314\r\n11.4 小结 319\r\n\r\n第12章 最佳实践和工具 321\r\n12.1 开发方法 321\r\n12.1.1 瀑布和迭代方法 321\r\n12.1.2 统一开发过程 323\r\n12.1.3 极限编程 323\r\n12.1.4 测试驱动开发 324\r\n12.1.5 特性驱动开发 324\r\n12.2 开发工具 325\r\n12.2.1 版本控制工具 325\r\n12.2.2 构建工具 325\r\n12.2.3 测试工具 325\r\n12.2.4 日志工具 326\r\n12.2.5 保证编码标准的工具 326\r\n12.3 Apache Ant 326\r\n12.3.1 安装Ant 327\r\n12.3.2 Ant概念 327\r\n12.3.3 其他资源 335\r\n12.4 CVS 335\r\n12.4.1 安装CVS 335\r\n12.4.2 CVS概念 336\r\n12.4.3 连接到CVS服务器 336\r\n12.4.4 登记代码 337\r\n12.4.5 检查代码 338\r\n12.4.6 比较多个修订之间的修改 338\r\n12.4.7 其他资源 338\r\n12.5 JUnit 338\r\n12.5.1 安装JUnit 339\r\n12.5.2 JUnit概念 339\r\n12.5.3 其他资源 344\r\n12.6 HttpUnit 344\r\n12.6.1 安装HttpUnit 344\r\n12.6.2 HttpUnit概念 345\r\n12.6.3 其他资源 348\r\n12.7 Web开发的最佳实践 348\r\n12.7.1 遵循好的JSP编码实践 348\r\n12.7.2 分离应用逻辑和表示 348\r\n12.7.3 在适当的时候使用设计模式 348\r\n12.7.4 使用框架开发应用 349\r\n12.7.5 早期测试和集成 349\r\n12.8 小结 350\r\n习题 350\r\n\r\n第13章 JSP项目:购物车应用 351\r\n13.1 书店项目 351\r\n13.1.1 项目特点 351\r\n13.1.2 用例 352\r\n13.1.3 初始分析 352\r\n13.2 应用设计 353\r\n13.2.1 数据库设计 353\r\n13.2.2 定义关键实体对象 355\r\n13.3 开发环境和配置 373\r\n13.3.1 目录结构 373\r\n13.3.2 Tomcat 374\r\n13.3.3 Ant 374\r\n13.3.4 数据库 379\r\n13.3.5 Hibernate 379\r\n13.3.6 Struts、Validator和Tiles 384\r\n13.3.7 web.xml 385\r\n13.4 应用 386\r\n13.4.1 应用布局:Tiles 386\r\n13.4.2 购物车状态 388\r\n13.4.3 显示种类列表 389\r\n13.4.4 显示图书列表 391\r\n13.4.5 向购物车增加一本书 394\r\n13.4.6 管理购物车 396\r\n13.4.7 结账 402\r\n13.5 小结 413\r\n习题 413\r\n\r\n附录A JSP语法参考 414\r\n附录B JSP表达式语言参考 428\r\n附录C JSTL参考 437
本书是《JSP程序设计》一书的提高篇,《JSP程序设计》侧重于JSP的基础知识,本书强调更高级的概念和技术。
如果你只想轻松地迈入JSP世界,《JSP程序设计》再合适不过了。在简洁明了地介绍相关概念之后,该书通过丰富的例子巩固你的理解,使你对JSP编程有实际的认识,而不只是纸上谈兵。如果你已经对JSP有了初步的了解,想学习更高级的JSP开发技术,如动态Web内容生成、国际化和本地化、Web框架、Struts、Tiles、JSF等,本书将是理想的选择。
本书完全秉承《JSP程序设计》的风格,带领你深入JSP世界;大量的练习机会将使你欣喜地发现,这些高级技术并非遥不可及,完全可以在自己的应用中很好地加以使用。
如果说《JSP程序设计》的重点是教你如何正确地编写代码,本书则会教你怎么把代码写得更好。作者花了大量笔墨来讨论设计模式、测试、框架技术,以及对软件工程有深远影响的重要概念。这里汇集了作者积累的大量实战经验和智慧结晶;尽早地了解这些知识,对你的开发水平甚至职业生涯都有重大的意义。
不过有一点需要说明,尽管本书提供了许多示例代码,但这些例子的目的是让你更具体、更深入地理解相关概念和技术,而不鼓励只把书中的示例代码剪切下来,生搬硬套地使用。读完《JSP程序设计》,有一定的JSP基础之后再阅读本书,会让你成为一名更专业的开发人员,对开发方法和原则的体会也会更深。
根据我们的理解,在阅读本书时,可以分为5个部分。
第一部分包括第1章到第3章,涉及《JSP程序设计》没有涵盖的JSP基础知识。相对《JSP程序设计》来说,这一部分介绍的内容更为深入,包括高级动态Web内容生成、国际化和本地化内容以及JSP调试技术。
第二部分包括第4章到第8章,主要介绍在Web应用领域中JSP的使用。这部分不仅谈到如何创建和部署Web应用,还介绍了WebWork和Spring框架、Struts框架、Tiles框架以及JSF,并特别强调如何实际应用。
第三部分包括第9章到第12章,可以说这一部分在具体应用方面更上了一个层次,介绍了使用JSP时所需的重要J2EE组件,讨论了安全和性能等问题,而且详细介绍了开发时可用的一些最佳实践和方法。这里总结的经验很值得借鉴。
第四部分只有一章,即第13章,这是一个大型的实用案例,展示了如何开发一个在线Web应用。通过这个项目可以巩固前面介绍的多个概念,特别强调了Struts和Tiles。
第五部分是附录,分别提供了JSP语法、JSP EL、JSTL的速查参考手册。
希望我们的这种理解能帮助你整理学习本书的思路。上述各个部分之间并没有太紧密的关系;如果你对某一部分更感兴趣,可以不按书中编排的顺序来阅读,而直接跳到你想了解的部分。不过,第二部分最好按顺序阅读,这样才能有一个完整的认识。
全书主要翻译工作由朱涛江、张文静担任,江健、徐阳、张野、任岗、刘鑫、蔡洪亮等负责检查术语,王恒、刘晓兵、陈波、荆涛、伊瑞海、杨明、王小振等提供技术问题支持,杨健康、张雷生、林琪完成全书的审校。在大家的努力下共同完成了本书的翻译工作。
我们还要深深地感谢家人和朋友。在翻译过程中,他们给予了我们莫大的关心、支持和帮助。
由于时间仓促,且译者的水平有限,译文中难免会出现一些错误,请读者批评指正。如果有问题,请与译者联系:su_mouse@sina.com。
译 者
2005.11
Vivek Chopra作为软件开发人员、架构师以及开发小组主管已经有十余年,在Web服务、J2EE和中间件技术方面经验极其丰富。他曾经供职于硅谷多家公司,拥有多项有关Web服务的专利(有的还在申请中)。Vivek是活跃的技术作家,曾与人合作撰写了6本有关开源软件、Java、XML和Web服务的著作。他还积极从事开源软件开发,曾经开发了uddi4j库的一部分(这是一个面向DDI的开源Java API)。
JSP(JavaServer Pages)问世于1999年,此后出版了许多相关图书。本书的目标是用一种全新的方式介绍JSP,与现有的同类书都不相同。
在过去5年中,开发界已经在Web应用开发方面积累了许多好的实践经验,并且知道应当避免哪些糟糕的做法。很多东西都是开发人员从痛苦的经历中获得的,其间付出了许多代价:一些网站具有性能很差或无法维护的代码。技术还算新的时候,这还是可以理解的;但是今天,初学JSP的开发人员就不应该再重复这些错误了。
本书面向已经具备JSP开发经验的开发人员,他们应该熟悉Java语言,对Web开发本身有较多了解。本书不是哪一本JSP书的第2版或第3版,而是一本完全从头编写的新书,由经验丰富的开发人员执笔,他们希望能与读者分享他们的心得体会。
本书涵盖了JSP 2.0和2.1(这是JSP规范的最新版本)的一些高级知识,另外还介绍了JSP与其他企业级Java技术如何交互。JSP 2.x引入了许多新的特性,这些特性有助于实现Web开发的一些最佳实践,本书将会非常详细地介绍这些内容。
Web开发的正确方法
本书将非常详细地介绍JSP开发技术,不过,全书的主旨还是强调正确的Web开发方法。这些思想都是广泛认可的“最佳实践”,而且凝聚了作者们在这个领域的经验。其中一些实践经验如下:
JSP是一种表示技术:JSP应当只用于表示,而不应在其中混杂控制流和应用逻辑的代码。本书将强调这样的JSP开发最佳实践。
有效地使用正确的工具:使用工具来帮助你完成Web开发任务,这些工具诸如开发和调试环境、构建和部署工具、版本控制工具以及性能分析工具。本书将对每个Web开发人员都应该配备的一些工具提供入门性介绍。
在适当的情况下使用设计模式:作为一名软件开发人员,你解决的许多问题可能以前其他人早就已经遇到过。不要翻来覆去老是重新实现针对某一类问题的解决方案,更明智的做法是使用一种久经考验的解决方案。设计模式是对一类问题的解决方案。在适当的地方,本书会展示Web应用中如何使用一些常用的设计模式,如模型—视图—控制器(Model View Controller,MVC)、前端控制器、数据访问对象等。
使用框架开发应用:框架为开发人员面对的一些常见问题提供了通用的解决方案。使用框架可以让开发人员把重点放在具体的业务问题上,而不是针对每个应用都重新实现一种解决方案。本书介绍了很多框架,如MVC(Struts、Spring、WebWork、JSF)、持久存储(Hibernate)、测试(jUnit、HttpUnit)、日志(log4j、Java Logging API)和模板(Tiles)。
迭代式开发方法:这涉及许多不同的技术,不过,主旨很明确,就是在开发周期中尽早编写测试用例(甚至在编写实际代码之前就要编写测试用例),在开发过程中要经常测试,要尽早完成构建和集成周期,以及要对代码进行重构(refactoring)。
如果你现在对上述一些概念还不太熟悉,不要担心,读完本书,你自然会了解的!
方法
我们认为,最好的学习方法——特别是对初学者来说——是先阅读概念,了解它如何实现,然后再编写一些代码。
本书就遵从这种方法,每一章都先介绍一些重要的概念,然后在“实验”中提供一些实用的例子来展示这些概念,“实验”后面是“实验解析”,对这些例子进行详细的解释。
在每一章的最后,我们都留了一些编程习题,读者可以自己尝试着练一练。这些习题都是以前面各章中介绍的例子为基础,有助于加深对概念的理解。这些习题的答案可以到图灵网站(www.turingbook.com)下载。
本书的结构
本书主要介绍更高级的JSP知识以及Web服务器软件开发技术,包括动态Web内容生成、国际化和本地化、JSP调试技术、Web框架、Struts、Tiles、JSF、安全、性能及最佳实践,最后通过一个实际项目来展示如何应用学到的JSP知识。利用这个项目巩固书中解释过的一些概念,你还能亲手尝试一下。
每章后都附有习题,并提供了习题答案。
附录提供了JSP语法、JSP EL、JSTL的参考手册。
第1章,“高级动态Web内容生成”,强调JSP除了生成HTML外所提供的扩展功能。JSP可以用于为客户端脚本元素和XML等生成动态内容。
第2章,“国际化和本地化”,解释了国际化概念,并说明如何使用JSP来生成本地化Web页面。
第3章,“JSP调试技术”,介绍了日志机制以及调试器所支持的技术。这一章还讨论了如何对生产系统调试以及线程安全问题。
第4章,“JSP在Web应用领域的角色”,介绍了Web应用的详细内容,包括如何创建和部署。
第5章,“Web框架”,在简要介绍MVC结构的基础上,讨论了什么是框架,为什么需要框架以及框架有什么作用。这一章还介绍了WebWork和Spring框架。
第6章,“Struts框架”,对当前流行的Struts框架做了详细介绍。
第7章,“使用Tiles的布局管理”,介绍了如何使用Tiles框架来管理Web页面的布局,以及如何在Struts中使用Tiles。
第8章,“JSF”,通过例子介绍了JSF 1.1。这一章还对JSF与Struts做了比较,并说明了如何在Web应用中结合使用JSF和Struts。
第9章,“J2EE中的JSP”,概述了JSP与Web应用交互所需的重要J2EE组件。
第10章,“安全”,介绍了Web应用的安全性问题,如认证、访问控制、数据完整性和秘密性。
第11章,“性能”,介绍了Web应用的有关性能概念,包括如何度量性能,还介绍了性能调优技术。
第12章,“最佳实践和工具”,详细讨论了开发时的一些最佳实践和方法,并对完成构建、版本控制和测试的一些开发工具提供了简要的说明。
第13章,“JSP项目:购物车应用”,展示了如何开发一个在线Web应用。这个项目强调了Struts和Tiles概念,能帮助你巩固Web应用中使用Hibernate实现数据库持久存储的有关概念。
附录A,“JSP语法参考”,顾名思义,这是JSP语法的一个速查手册。
附录B,“JSP表达式语言参考”,列出了JSP EL语法,并分别提供了例子。
附录C,“JSTL参考”,提供了JSTL标记库的参考手册,包括核心标记、XML标记、格式化标记和SQL标记。
本书约定
为了帮助你更充分地利用本书,并了解会出现什么情况,我们将在本书采用如下约定:
对当前讨论的主题可能有一些提示、技巧和旁注,这些都将用楷体显示。
正文中还包括以下样式:
在初次介绍重要术语时,使用楷体突出强调。
类、文件名、URL、指令、接口、工具、参数以及正文中出现的其他与代码有关的内容都以如下样式表示:WEB-INF\web.xml。
代码的表示分为两种:代码示例中,新出现的代码或重要代码用灰色背景突出显示;对当前讨论不太重要的代码,或者是前面已经出现过的代码不用灰色背景强调。
实验
在各章正文的后面都有“实验”,其中是一些需要你完成的练习。
① 一般都包括一系列步骤。
② 每一步都有一个编号。
③ 在大多数情况下,可以照着这些步骤把下载的代码实际“走”一遍。
实验解析
在每个“实验”后面是“实验解析”,将详细解释前面键入(或下载)的代码。
源代码
在使用本书中的例子时,你可以手工地键入所有代码,也可以直接使用本书随附的源代码文件。本书中用到的所有源代码文件都可以从www.wrox.com下载。访问该网站时,只要找到本书的英文书名(Beginning JavaServer Pages)[可以使用搜索(Search)框,也可以使用某个书目列表],并点击该书详细信息网页上的下载代码(Download Code)链接,就可以得到本书的所有源代码。
由于会有许多书名字雷同,最佳的方法是利用ISBN搜索,本书的ISBN是0-764- 57485-X。
下载代码之后,你只需用最习惯的压缩工具解压就可以了。
p2p.wrox.com
要与作者或其他人讨论有关问题,请加入P2P论坛(p2p.wrox.com)。这个论坛是一个基于Web的系统,你可以在此发表有关Wrox书和相关技术的消息,并与其他读者和技术用户交流。论坛提供订购功能,针对你感兴趣的主题,在论坛上新发布相关消息时,通过电子邮件通知你。Wrox作者、编辑、其他行业专家以及其他读者也会造访这些论坛。
http://p2p.wrox.com上,你会看到许多论坛,这些论坛不仅可以帮助你阅读本书,还有助于你开发自己的应用。要想加入论坛,只需遵循以下几个步骤:
① 访问p2p.wrox.com,并点击Register(注册)链接;
② 阅读使用条文,并点击Agree(同意);
③ 填写加入论坛的必要信息,如果想提供其他可选信息,也可以相应填写,点击Submit(提交);
④ 你将收到一个电子邮件,其中说明如何验证你的账户,并完成加入过程。
如果只是阅读论坛中的消息,无需加入p2p。不过,如果你想发布自己的消息,就必须加入论坛。
一旦加入,就可以发布新的消息了,还可以对其他用户发布的消息做出响应。你在任何时刻都可以在Web上阅读消息。如果希望某个论坛能通过电子邮件向你发送新发布的消息,请点击论坛列表中该论坛名旁边的Subscribe to this Forum(订购此
无封面