
本书共分3篇,分别为Servlet篇、JSP篇及其应用篇,书中展示了Java Web开发中各种技术的应用,帮助读者快速掌握Java Web开发。在知识的讲解上,本书采用理论与实践相结合的方式,从程序运行的内部机制进行分析讲解,并通过大量的实例和实验来验证并运用本书的知识。大部分章节都提供了多个例子,而且很多例子都是目前Web开发中经常使用的,具有相当高的实用价值。本书不仅可以作为Java Web开发的学习用书,还可以作为从事Java Web开发的程序员的参考用书和必备手册。
前 言 随着Java语言的流行,Java在网站和企业级应用的开发上应用得越来越普遍,Java Web开发已经成为Java企业级解决方案中不可或缺的组成部分。 本书遵照Servlet和JSP 规范,系统、完整地介绍了Java Web开发中的各种技术,从知识的讲解→知识的运用→实际问题的解决,一步一步地引导读者掌握Java Web开发的知识体系结构。 本书面向的读者 本书面向的读者群包括: ? 毫无Web经验的初学者。 ? 有一定的Web经验,但没有从事过Web开发的读者。 ? 具有其他脚本语言Web开发经验,想要快速转向Java Web开发的程序员。 ? 正在从事Java Web开发的初、中级程序员。 本书的内容组织 全书共分3篇,包括Servlet篇、JSP篇和应用篇。前两篇相对独立,但在内容上又有递进的关系。最后一个部分综合应用前两个部分的知识,讲解了一些高级应用,并结合实际开发中要解决的问题,给出了很多具有实用价值的实例程序。 附录作为本书不可或缺的部分,对HTML和HTTP协议进行了介绍,缺少Web经验的读者可以从这部分内容中学到Web开发的必备知识。此外,附录还提供了server.xml和web.xml文件的介绍,可以作为读者从事Java Web开发的参考。 本书在内容的编排上独具匠心,将知识的连贯性和学习规律有机地组织在一起。本书首先介绍了Servlet技术及其应用,并介绍了Tomcat服务器的体系结构和相关配置。在第一篇中,包括了下面的主题: ? Servlet与Tomcat ? Servlet技术 ? Web应用程序的部署 ? 数据库访问 ? 会话跟踪 ? Servlet的异常处理机制 ? 开发线程安全的Servlet 读者如果掌握了这部分的内容,就可以开始Web应用程序的开发了。 本书第二篇是JSP篇,包括了与JSP相关的各种技术。主要内容有JSP技术、JSP与JavaBean、JSP开发的两种架构模型、自定义标签库、表达式语言、JSTL、标签文件。JSP是建立在Servlet规范提供的功能之上的动态网页技术,读者看完第1篇介绍的Servlet,自然也就能理解JSP了。第二篇的内容细致全面,不但可以作为学习资料使用,而且可以作为以后工作中的参考手册。 本书第三篇是应用篇,结合前2篇介绍的知识,讲解了一些高级应用,给出了很多具有实用价值的实例程序。主要内容有: ? Servlet监听器 ? 过滤器在Web开发中的应用 ? 中文乱码问题与国际化 ? Web应用程序安全 ? 避免表单重复提交等实例 ? 使用Eclipse开发Web应用程序 ? Servlet 3.0新特性详解 这部分内容从应用开发的角度帮助读者提升Java Web开发技能。 本书的实例程序 笔者在编写本书时,使用的操作系统是Windows 8.1专业版,JDK版本是1.8.0_192,Web容器是Tomcat 9.0.14,开发工具是Eclipse IDE for Enterprise Java Developers(版本2018-12),数据库是MySQL 8.0.13。本书所有的实例程序都在上述环境中运行正常。 本书绝大部分的例子程序,都没有放在Tomcat安装目录的webapps目录下,而是单独放在自定义的一个目录中。读者要运行这些程序,有两种方式:一种方式是直接将网站上下载的例子程序目录复制到Tomcat的webapps目录下运行;另一种方式是配置Web应用程序的运行目录,在%CATALINA_HOME%confCatalinalocalhost目录下(%CATALINA_ HOME%表示Tomcat的安装目录),建立chXX.xml(XX表示每章的序号,例如第5章是ch05.xml,第13章是ch13.xml)文件。例如,要配置第5章的例子程序,可以在%CATALINA_HOME%confCatalinalocalhost目录下创建ch05.xml文件,编辑这个文件,输入下面的内容: <Context docBase="F:JSPLessonch05" reloadable="true"/> 将“F:JSPLessonch05”替换为读者机器上对应章节的Web应用程序所在的目录。 此外,在每章例子程序的开发步骤中也给出了详细的配置过程,读者按照步骤操作,会发现配置非常容易。 当采用数据源的方式来访问数据库时,你需要将MySQL的JDBC驱动复制到Tomcat安装目录的lib子目录中。 学习建议 作者针对三种不同类型的读者,提出下面的学习建议。 (1)对HTML和HTTP协议不是很了解的读者,建议从附录A、附录B开始学习,然后再从第1章开始学习。在学习第1篇的Servlet时,要结合附录B,随时参照,以加深对HTTP Servlet的理解。 (2)对HTML和HTTP协议比较清楚的读者,可以直接从第1章开始学习,按照章节的顺序一步一步进行下去。 (3)有Java Web开发经验的读者,可以有选择性地学习本书的内容,并在开发过程中,以本书作为参考用书。 最后,衷心地祝愿读者能够从此书获益,从而实现自己的开发梦想。由于本书的内容较多、牵涉的技术较广,错误和疏漏之处在所难免,欢迎广大技术专家和读者指正。作者的联系方式是csunxin@sina.com。
目 录 Servlet篇 第1章 Servlet与Tomcat 1 1.1 Web技术的发展 1 1.2 Servlet与Servlet容器 3 1.3 Servlet容器的分类 4 1.4 Tomcat简介 5 1.5 Tomcat的安装与配置 6 1.5.1 Tomcat的目录结构 8 1.5.2 运行Tomcat 9 1.5.3 Tomcat启动分析 13 1.6 Tomcat的体系结构 15 1.7 Tomcat的管理程序 17 1.8 小结 19 第2章 Servlet技术 20 2.1 Servlet API 20 2.1.1 Servlet接口 21 2.1.2 ServletRequest和ServletResponse 22 2.1.3 ServletConfig 25 2.1.4 一个简单的Servlet 25 2.1.5 GenericServlet 33 2.1.6 HttpServlet 34 2.1.7 HttpServletRequest和HttpServletResponse 35 2.2 几个实例 38 2.2.1 实例一:WelcomeServlet 38 2.2.2 实例二:OutputInfoServlet 44 2.2.3 实例三:LoginServlet 48 2.3 Servlet异常 53 2.3.1 ServletException类 53 2.3.2 UnavailableException类 53 2.4 Servlet生命周期 54 2.5 Servlet上下文 56 2.5.1 ServletContext接口 56 2.5.2 页面访问量统计实例 58 2.6 请求转发 62 2.6.1 RequestDispatcher接口 62 2.6.2 得到RequestDispatcher对象 63 2.6.3 请求转发的实例 63 2.6.4 sendRedirect()和forward()方法的区别 70 2.7 小结 71 第3章 Web应用程序的部署 72 3.1 配置任意目录下的Web应用程序 72 3.2 WAR文件 75 3.3 与Servlet配置相关的元素 78 3.3.1 <servlet>元素及其子元素 78 3.3.2 <servlet-mapping>元素及其子元素 80 3.4 一个实例 82 3.5 小结 86 第4章 数据库访问 87 4.1 JDBC驱动程序的类型 88 4.1.1 JDBC-ODBC桥 88 4.1.2 部分本地API、部分Java驱动程序 89 4.1.3 JDBC网络纯Java驱动程序 89 4.1.4 本地协议的纯Java驱动程序 89 4.2 安装数据库 90 4.3 下载MySQL JDBC驱动 94 4.4 JDBC API 95 4.4.1 加载并注册数据库驱动 96 4.4.2 建立到数据库的连接 99 4.4.3 访问数据库 100 4.4.4 事务处理 129 4.4.5 可滚动和可更新的结果集 138 4.5 JDBC数据源和连接池 140 4.6 小结 145 第5章 会话跟踪 146 5.1 用于会话跟踪的技术 147 5.1.1 SSL会话 147 5.1.2 Cookies 148 5.1.3 URL重写 149 5.2 Java Servlet API的会话跟踪 149 5.2.1 HttpSession接口 150 5.2.2 Session的生命周期 151 5.2.3 Cookie的应用 165 5.2.4 Session和Cookie的深入研究 173 5.3 Session的持久化 175 5.4 小结 176 第6章 Servlet的异常处理机制 177 6.1 声明式异常处理 178 6.1.1 HTTP错误代码的处理 178 6.1.2 Java异常的处理 182 6.2 程序式异常处理 185 6.2.1 在try-catch语句中处理异常 185 6.2.2 使用RequestDispatcher来处理异常 188 6.3 小结 191 第7章 开发线程安全的Servlet 192 7.1 多线程的Servlet模型 192 7.2 线程安全的Servlet 193 7.2.1 变量的线程安全 193 7.2.2 属性的线程安全 202 7.3 SingleThreadModel接口 206 7.4 小结 206 JSP篇 第8章 JSP技术 207 8.1 JSP简介 207 8.2 JSP的运行机制 208 8.3 JSP的语法 213 8.3.1 指令元素(directive element) 213 8.3.2 脚本元素(scripting element) 218 8.3.3 动作元素(action element) 220 8.3.4 注释 228 8.4 JSP的隐含对象 229 8.4.1 pageContext 229 8.4.2 out 230 8.4.3 page 231 8.4.4 exception 231 8.5 对象和范围 232 8.6 留言板程序 235 8.7 留言板管理程序 244 8.8 JSP文档 250 8.8.1 JSP文档的标识 251 8.8.2 JSP文档中的元素语法 251 8.9 小结 255 第9章 JSP与JavaBean 256 9.1 JavaBean简介 256 9.1.1 属性的命名 257 9.1.2 属性的类型 259 9.2 在JSP中使用JavaBean 259 9.2.1 <jsp:useBean> 260 9.2.2 <jsp:setProperty> 261 9.2.3 <jsp:getProperty> 262 9.2.4 示例 262 9.3 网上书店程序 267 9.4 小结 291 第10章 JSP开发的两种模型 292 10.1 模型1 292 10.2 模型2 296 10.3 MVC模式的实现总结 303 10.4 小结 303 第11章 标签库(Tag Library) 304 11.1 标签库API 304 11.1.1 标签的形式 304 11.1.2 Tag接口 306 11.1.3 IterationTag接口 307 11.1.4 BodyTag接口 309 11.2 标签库描述符 310 11.2.1 <taglib>元素 311 11.2.2 <validator>元素 312 11.2.3 <listener>元素 313 11.2.4 <tag>元素 313 11.2.5 <tag-file>元素 316 11.2.6 <function>元素 316 11.3 传统标签的开发 318 11.3.1 实例一:<hello>标签 318 11.3.2 实例二:<max>标签 321 11.3.3 实例三:<greet>标签 323 11.3.4 实例四:<switch>标签 326 11.3.5 实例五:<iterate>标签 331 11.4 简单标签的开发 337 11.4.1 SimpleTag接口 337 11.4.2 实例一:<welcome>标签 339 11.4.3 实例二:<max_ex>标签 341 11.5 自定义标签开发总结 343 11.6 小结 343 第12章 表达式语言(EL) 344 12.1 语法 344 12.1.1 “[ ]”和“.”操作符 344 12.1.2 算术操作符 345 12.1.3 关系操作符 346 12.1.4 逻辑操作符 346 12.1.5 Empty操作符 346 12.1.6 条件操作符 346 12.1.7 圆括号 346 12.1.8 操作符的优先级 346 12.2 隐含对象 347 12.3 命名变量 348 12.4 保留的关键字 349 12.5 函数 349 12.6 小结 351 第13章 JSP标准标签库(JSTL) 352 13.1 JSTL简介 352 13.2 配置JSTL 353 13.3 Core标签库 354 13.3.1 一般用途的标签 354 13.3.2 条件标签 358 13.3.3 迭代标签 361 13.3.4 URL相关的标签 364 13.4 I18N标签库 369 13.4.1 国际化标签 369 13.4.2 格式化标签 375 13.5 SQL标签库 384 13.5.1 <sql:setDataSource> 384 13.5.2 <sql:query> 385 13.5.3 <sql:param> 389 13.5.4 <sql:dateParam> 390 13.5.5 <sql:update> 390 13.5.6 <sql:transaction> 392 13.6 XML标签库 393 13.6.1 核心操作 394 13.6.2 流程控制 397 13.6.3 转换操作 401 13.7 Functions标签库 404 13.7.1 fn:contains 404 13.7.2 fn:containsIgnoreCase 405 13.7.3 fn:startsWith 405 13.7.4 fn:endsWith 406 13.7.5 fn:indexOf 407 13.7.6 fn:replace 407 13.7.7 fn:substring 408 13.7.8 fn:substringBefore 409 13.7.9 fn:substringAfter 410 13.7.10 fn:split 410 13.7.11 fn:join 411 13.7.12 fn:toLowerCase 412 13.7.13 fn:toUpperCase 413 13.7.14 fn:trim 413 13.7.15 fn:escapeXml 414 13.7.16 fn:length 414 13.8 小结 415 第14章 标签文件(Tag Files) 416 14.1 标签文件的语法 416 14.2 一个简单的标签文件 416 14.3 标签文件的隐含对象 420 14.4 标签文件的指令 421 14.4.1 tag指令 421 14.4.2 attribute指令 423 14.4.3 variable指令 423 14.5 标签文件实例讲解 425 14.5.1 实例一:<welcome>标签 425 14.5.2 实例二:<toHtml>标签 426 14.6 <jsp:invoke>动作元素 428 14.7 <jsp:doBody>动作元素 428 14.8 小结 429 应用篇 第15章 Servlet监听器 430 15.1 监听器接口 430 15.2 ServletContextListener接口 431 15.3 HttpSessionBindingListener接口 433 15.4 在线人数统计程序 434 15.5 小结 441 第16章 Filter在Web开发中的应用 442 16.1 过滤器概述 442 16.2 Filter API 443 16.2.1 Filter接口 444 16.2.2 FilterConfig接口 444 16.2.3 FilterChain接口 445 16.3 过滤器的部署 445 16.4 过滤器的开发 448 16.5 对用户进行统一验证的过滤器 450 16.6 对请求和响应数据进行替换的过滤器 456 16.7 对响应内容进行压缩的过滤器 467 16.8 小结 474 第17章 中文乱码问题与国际化 475 17.1 中文乱码问题产生的由来 475 17.1.1 常用字符集 475 17.1.2 对乱码产生过程的分析 478 17.2 中文乱码问题的解决方案 480 17.3 使用过滤器解决中文问题 482 17.4 让Tomcat支持中文文件名 487 17.5 国际化与本地化 488 17.5.1 Locale 488 17.5.2 资源包 490 17.5.3 消息格式化 492 17.5.4 编写国际化的Web应用程序 493 17.6 小结 498 第18章 开发安全的Web应用程序 499 18.1 概述 499 18.2 理解验证机制 501 18.2.1 HTTP Basic Authentication 501 18.2.2 HTTP Digest Authentication 502 18.2.3 HTTPS Client Authentication 502 18.2.4 Form Based Authentication 502 18.3 声明式安全 503 18.3.1 <security-constraint>元素 503 18.3.2 多个安全约束的联合 506 18.3.3 <login-config>元素 507 18.3.4 基本验证的实现 508 18.3.5 基于表单验证的实现 510 18.3.6 使用数据库保存用户名和密码 513 18.4 程序式安全 517 18.5 SQL注入攻击的防范 520 18.6 小结 522 第19章 避免表单的重复提交 523 19.1 在客户端避免表单的重复提交 523 19.2 在服务器端避免表单的重复提交 526 19.3 小结 534 第20章 使用Eclipse开发Web应用 535 20.1 Eclipse介绍 535 20.1.1 下载并安装Eclipse 535 20.1.2 Eclipse开发环境介绍 536 20.1.3 配置Eclipse 540 20.2 文件的上传 544 20.2.1 基于表单的文件上传 544 20.2.2 文件上传格式分析 545 20.2.3 commons-fileupload组件 546 20.2.4 文件上传实例 548 20.3 文件的下载 561 20.4 给图片添加水印和文字 570 20.5 小结 574 第21章 Servlet 3.0新特性详解 576 21.1 新增的注解 577 21.1.1 @WebServlet注解 577 21.1.2 @WebFilter注解 579 21.1.3 @WebInitParam注解 580 21.1.4 @WebListener注解 581 21.1.5 @MultipartConfig注解 582 21.2 异步处理 582 21.2.1 实例:计算斐波那契数列 585 21.2.2 AsyncListener 588 21.3 动态添加和配置Web组件 590 21.3.1 实例一:实现ServletContextListener接口来添加Servlet 592 21.3.2 实例二:实现ServletContainerInitializer接口来添加组件 593 21.4 Web片段和可插性支持 596 21.4.1 Web模块开发 597 21.4.2 解决Web模块加载顺序的问题 599 21.5 HttpServletRequest 对文件上传的支持 601 21.6 总结 605 附录A 快速掌握HTML 606 A.1 WWW简介 606 A.2 快速掌握HTML 608 A.2.1 HTML(Hypertext Markup Language) 608 A.2.2 HTML元素的四种形式 608 A.2.3 第一个页面 608 A.2.4 第二个页面 609 A.2.5 与段落控制相关的标签 610 A.2.6 控制文本的显示 611 A.2.7 如何输入特殊的字符 613 A.2.8 注释 615 A.2.9 列表 615 A.2.10 表格 619 A.2.11 HTML交互式表单 622 A.2.12 其他常用标签 629 A.2.13 框架 633 A.3 小结 634 附录B 解析HTTP 635 B.1 概述 635 B.2 HTTP URL 636 B.3 HTTP请求 637 B.3.1 请求行 637 B.3.2 消息报头 638 B.3.3 请求正文 638 B.4 HTTP响应 639 B.4.1 状态行 639 B.4.2 消息报头 641 B.4.3 响应正文 641 B.5 HTTP消息 642 B.6 实验 647 B.7 小结 649 附录C server.xml文件 650 C.1 顶层元素 651 C.1.1 Server元素 651 C.1.2 Service元素 651 C.2 连接器 652 C.2.1 HTTP连接器 652 C.2.2 AJP连接器 654 C.3 容器 654 C.3.1 Engine元素 654 C.3.2 Host元素 655 C.3.3 Context元素 656 C.4 小结 657 附录D web.xml文件 658 D.1 <description>元素 659 D.2 <display-name>元素 659 D.3 <icon>元素 660 D.4 <distributable>元素 660 D.5 <context-param>元素 660 D.6 <filter>元素 660 D.7 <filter-mapping>元素 661 D.8 <listener>元素 662 D.9 <servlet>元素 662 D.10 <servlet-mapping>元素 664 D.11 <session-config>元素 664 D.12 <mime-mapping>元素 664 D.13 <welcome-file-list>元素 665 D.14 <error-page>元素 665 D.15 <jsp-config>元素 665 D.16 <security-constraint>元素 667 D.17 <login-config>元素 668 D.18 <security-role>元素 669 D.19 <env-entry>元素 669 D.20 <ejb-ref>元素 670 D.21 <ejb-local-ref>元素 670 D.22 <resource-ref>元素 671 D.23 <resource-env-ref>元素 671 D.24 <locale-encoding-mapping-list>元素 671 D.25 小结 672