深入体验Java Web开发内幕 核心基础作者:张孝祥出版时间:2006丛编项: 核心基础内容简介 本书深入地揭示Java Web开发内幕,细致地解释许许多多来自开发第一线的一知半解的问题。阅读本书,可以为您详细地剖析Java Web开发的全过程,使您轻松地解决在使用Java进行Web应用开发遇到的各类疑难杂症。本书用途之一:许多公司的技术经理在招聘新员工开始做一个项目之前,都将本书发下去,要求员工熟读此书,以免在项目中走弯路和避免许多潜在的隐患,并对员工说:“先把细节搞得明明白白了再做,这样你我心里都踏实,免得项目做完后自己都不敢肯定有多少隐患。”本书深刻且通俗地揭示Java Web开发内幕,使您由内而外地明白使用Java进行Web应用开发的全过程——从XML基础知识到HTTP详述及相关体验,从用Tomcat配置Web站点到HttpServletResponse和HttpServletRequest的应用,以及JSP,JavaBean等Java Web开发相关方面都讲解得深入浅出、通俗易懂。本书适合所有Web应用的开发人员、Java程序员在工作和学习中参考阅读,也适合作为相关专业本科生、研究生的学习参考资料,也可作为相关培训机构的培训教材。[看更多]目录第1章 XML基础 1指点迷津:什么是配置文件 11.1 XML技术概述 21.1.1 XML的起源与作用 21.1.2 XML文档结构 31.1.3 XML与HTML的比较 41.1.4 XML与数据库的比较 51.2 XML的基本语法 61.2.1 文档声明 6动手体验:加深对encoding属性的理解 71.2.2 元素定义 101.2.3 属性定义 111.2.4 注释 111.2.5 空格和换行的处理 121.2.6 CDATA区 121.2.7 特殊字符 13动手体验:加深对特殊字符的了解 131.2.8 处理指令 14动手体验:使用CSS控制XML文档的显示 141.3 XML的约束模式 161.3.1 格式良好的(Well-formed)XML 161.3.2 XML的约束模式 161.3.3 XML的约束模式语言 171.3.4 有效的(Valid)XML 171.4 DTD 181.4.1 对DTD的初步认识 181.4.2 在XML文档中引入外部DTD文件 191.4.3 在XML文档中直接嵌入DTD定义语句 211.5 DTD的语法细节 221.5.1 元素定义 221.5.2 属性定义 241.5.3 实体定义 29动手体验:加深对引用实体的了解 301.6 XML Schema 331.6.1 XML Schema与DTD的比较 331.6.2 一个XML Schema例子 341.7 名称空间 361.7.1 名称空间的概念 361.7.2 名称空间声明 371.7.3 默认名称空间 381.7.4 属性的名称空间 381.7.5 xml:space和xml:lang属性 391.8 引入XML Schema文档 401.8.1 使用名称空间引入XML Schema文档 401.8.2 不使用名称空间引入XML Schema文档 421.9 思考与实践 43第2章 用Tomcat构建Web站点 442.1 Web应用的相关知识 442.1.1 HTTP协议 442.1.2 URL 452.1.3 主要的Web服务器软件 452.1.4 网站系统的组成 452.2 安装Tomcat 472.2.1 Tomcat简介 472.2.2 获取Tomcat安装程序包 472.2.3 使用zip和tar.gz包安装Tomcat 482.2.4 使用exe程序安装Tomcat 492.3 Tomcat的启动与停止 522.3.1 使用Tomcat服务程序 52多学两招:查找网络服务程序监听异常的问题 542.3.2 使用Tomcat程序组中的快捷菜单 55多学两招:了解Tomcat 4.1.31的快捷启动菜单的工作原理 562.3.3 使用tomcat.exe程序 58指点迷津:tomcat5.exe启动的Tomcat程序不一定是tomcat5.exe自身所在的目录 592.3.4 startup.bat批处理文件 602.3.5 catalina.bat批处理文件 642.3.6 使用批处理程序及查找Tomcat的启动问题 68动手体验:练习查找Tomcat的启动错误 692.4 配置Web站点的虚拟目录 712.4.1 虚拟Web目录的映射原理 722.4.2 设置Web站点的根目录 73动手体验:修改Web站点的默认根目录 742.4.3 设置Web站点的虚拟子目录 74动手体验:设置Web站点的虚拟子目录 76脚下留心:war文件的内部目录结构 772.4.4 部署描述符与目录的默认网页 78动手体验:设置目录的默认网页 792.5 配置虚拟主机 812.5.1 浏览器访问Web资源的过程 81动手体验:用Telnet程序分析浏览器访问Web资源的过程 81多学两招:打开Telnet程序的本地回显功能 822.5.2 虚拟主机及实现原理 832.5.3 基于主机名的虚拟主机 84动手体验:使用Tomcat建立基于主机名的虚拟主机 862.5.4 基于端口号的虚拟主机 88动手体验:使用Tomcat建立基于端口号的虚拟主机 892.5.5 基于IP地址的虚拟主机 902.6 与专用Web服务器的集成 902.6.1 集成的考虑因素 912.6.2 集成技术的选择 922.6.3 JK插件 93动手体验:下载JK插件 942.6.4 Tomcat体系结构与JK插件的工作原理 95动手体验:查阅JK连接器的帮助文档 992.6.5 Tomcat与IIS服务器集成 1002.6.6 Tomcat与Windows系统下的Apache服务器集成 1052.6.7 与专业Web服务器集成的现实问题 1072.7 思考与实践 107第3章 HTTP协议详解 1093.1 了解HTTP 1093.1.1 HTTP简介 1093.1.2 HTTP 1.0的会话方式 1093.1.3 HTTP 1.1与HTTP 1.0的比较 1113.1.4 HTTP消息的格式 1123.1.5 HTTP消息头 1133.2 请求行与状态行 1143.2.1 请求行与状态行 114动手体验:借助Telnet程序直观地体验请求行和状态行 1153.2.2 使用GET和POST方式传递参数 117动手体验:使用GET与POST方式传递参数 1183.2.3 响应状态码 1213.3 通用信息头 1243.3.1 Cache-Control 1243.3.2 Connection 125动手体验:Connection头字段的作用 1253.3.3 Date 1253.3.4 Pragma 1263.3.5 Trailer 1263.3.6 Transfer-Encoding 1263.3.7 Upgrade 1263.3.8 Via 1273.3.9 Warning 1273.4 请求头 1273.4.1 Accept 1273.4.2 Accept-Charset 1273.4.3 Accept-Encoding 1273.4.4 Accept-Language 128动手体验:Accept-Language头字段的作用 1293.4.5 Authorization 1303.4.6 Expect 1303.4.7 From 1303.4.8 Host 1303.4.9 If-Match 1313.4.10 If-Modified-Since 1313.4.11 If-None-Match 1323.4.12 If-Range 1323.4.13 If-Unmodified-Since 1323.4.14 Max-Forwards 1323.4.15 Proxy-Authorization 1323.4.16 Range 1323.4.17 Referer 1333.4.18 TE 1333.4.19 User-Agent 1333.5 响应头 1343.5.1 Accept-Range 1343.5.2 Age 1343.5.3 Etag 1343.5.4 Location 134动手体验:Location头字段的作用 1353.5.5 Proxy-Authenticate 1353.5.6 Retry-After 1353.5.7 Server 1363.5.8 Vary 1363.5.9 WWW-Authenticate 1363.6 实体头 1363.6.1 Allow 1373.6.2 Content-Encoding 1373.6.3 Content-Language 1373.6.4 Content-Length 1373.6.5 Content-Location 1383.6.6 Content-MD5 1383.6.7 Content-Range 1383.6.8 Content-Type 138动手体验:Tomcat中的文件扩展名与MIME的映射关系 1393.6.9 Expires 1413.6.10 Last-Modified 1413.7 扩展头 1413.7.1 Refresh 1413.7.2 Content-Disposition 1423.8 思考与实践 142第4章 Servlet开发基础 1434.1 Servlet的有关概念与前置知识 1434.1.1 什么是动态网页 143指点迷津:区分动态网页与动态HTML页面的概念 1444.1.2 动态网页程序与引擎 1444.1.3 Servlet技术简介 1464.1.4 B/S系统架构与C/S系统架构 1464.1.5 Servlet开发涉及的相关知识 1494.2 Servlet开发入门 1494.2.1 Servlet API介绍 149动手体验:查看Tomcat提供的Servlet API帮助文档 1504.2.2 编写与编译Servlet程序 151指点迷津:如何快速入门新技术 151动手体验:编写与编译Servlet程序的过程 1524.2.3 Servlet的注册与运行 153动手体验:注册与访问Servlet程序 155照猫画虎:如何编写Web.xml文件 1564.2.4 Servlet激活器 158动手体验:使用Servlet激活器 1594.2.5 缺省Servlet 159动手体验:缺省Servlet的作用 1604.2.6 Servlet的类装载器 160动手体验:Tomcat如何完成类的加载 164指点迷津:区分Servlet的编译和运行环境 1674.2.7 编写一个自动编译工具 1674.3 Servlet的特点及运行过程 1684.3.1 Servlet的特点 1684.3.2 Servlet的运行过程 1694.3.3 Servlet的线程安全问题 174动手体验:Servlet的并发访问与线程安全问题 174指点迷津:哪些情况下要考虑线程安全问题 1774.4 ServletConfig接口 177指点迷津:Servlet的初始化参数的作用 178多想一想:Servlet的init方法与getServletConfig方法的关系与作用 1784.4.1 getInitParameterNames方法 1794.4.2 getInitParameter方法 1794.4.3 getServletName方法 1794.4.4 getServletContext方法 1804.4.5 GenericServlet类实现ServletConfig接口的目的 1804.4.6 ServletConfig的应用举例 180动手体验:ServletConfig对象的应用 1814.5 GenericServlet与HttpServlet类 1834.5.1 区分回调方法与工具方法 1834.5.2 init方法 183指点迷津:覆盖无参数的init()方法来编写初始化代码的好处 1844.5.3 service方法 1864.5.4 destroy方法 1874.5.5 getServletConfig方法 1874.5.6 getServletInfo方法 1884.5.7 doXxx方法 188动手体验:doGet方法与doPost方法的作用 189指点迷津:如何理解“在自己的程序代码中不能调用回调方法” 1914.5.8 浏览器缓存内幕与getLastModified方法 191动手体验:揭开浏览器缓存的奥秘 1944.6 ServletContext接口 2004.6.1 获取Web应用程序的初始化参数 201动手体验:Web应用程序的初始化参数的设置与应用 2014.6.2 记录日志 203动手体验:Web应用程序的日志记录功能 204多学两招:JDK中提供的日志记录模块 2054.6.3 application域范围的属性 2094.6.4 访问资源文件 210动手体验:在Servlet程序中使用FileInputStream类的问题 211动手体验:使用ServletContext接口和ClassLoader类中的方法访问资源文件 2134.6.5 获取虚拟路径所映射的本地路径 2144.6.6 Web应用程序之间的访问 215动手体验:访问其他Web应用程序 2154.6.7 ServletContext接口中的其他方法 2184.7 思考与实践 218第5章 HttpServletResponse的应用 2205.1 准备实验环境 2205.2 HttpServletResponse简介 2215.3 产生响应状态行 2215.3.1 状态码常量 2215.3.2 setStatus方法 2225.3.3 sendError方法 2225.4 构建响应消息头 2235.4.1 addHeader与setHeader方法 2235.4.2 addIntHeader与setIntHeader方法 2245.4.3 addDateHeader与setDateHeader方法 2245.4.4 setContentLength方法 2245.4.5 setContentType方法 2245.4.6 setCharacterEncoding方法 2255.4.7 setLocale方法 2255.4.8 containsHeader方法 2265.5 响应消息头的实用案例 2265.5.1 Servlet的中文输出问题 226动手体验:浏览器显示网页文档时怎样选择字符集编码 227动手体验:Servlet的中文输出问题及解决之道 229脚下留心:注意传递给setContentType方法的参数值的大小写 233多学两招:修改某个Servlet将导致整个Web应用程序被重新加载 2345.5.2 让浏览器定时刷新网页或跳转至其他页面 235动手体验:Refresh头字段的作用效果 2355.5.3 禁止浏览器缓存当前文档内容 236动手体验:浏览器的缓存问题和解决方案 2365.5.4 使用标签模拟响应消息头 238动手体验:使用标签解决浏览器显示网页时的中文乱码问题 239多学两招:网页文档应尽量采用UTF-8编码 2405.6 创建响应正文 2415.6.1 getOutputStream与getWriter方法 2415.6.2 关于getWriter方法的一些相关疑问 242动手体验:关于getWriter方法的一些相关疑问 2425.6.3 输出缓冲区 244动手体验:Servlet引擎处理输出缓冲区的细节 2455.6.4 实现动态文件内容的下载 247动手体验:实现动态文件内容的下载 2485.6.5 图像访问计数器 249动手体验:使用标签实现静态HTML页面的访问次数统计和显示 252多学两招:如何动态产生大小可变的图像 2575.7 请求重定向与请求转发 2595.7.1 RequestDispatcher接口 2595.7.2 用include方法实现资源包含 260动手体验:RequestDispatcher.include方法的应用细节 2605.7.3 用forward方法实现请求转发 267动手体验:RequestDispatcher.forward方法的应用细节 267动手体验:RequestDispatcher.forward方法的相对路径问题 2735.7.4 请求转发的运行流程 2775.7.5 用sendRedirect方法实现请求重定向 281动手体验:sendRedirect方法的应用 2825.7.6 请求重定向的运行流程 2835.7.7 请求重定向与请求转发的比较 2875.7.8 缺省Servlet的缓存问题 289动手体验:缺省Servlet的缓存问题 2915.8 思考与实践 292第6章 HttpServletRequest的应用 2946.1 HttpServletRequest简介 2946.2 获取请求行的相关信息 2946.2.1 getMethod方法 2946.2.2 getRequestURI方法 2956.2.3 getQueryString方法 2956.2.4 getProtocol方法 2956.2.5 getContextPath方法 2956.2.6 getPathInfo方法 2956.2.7 getPathTranslated方法 2966.2.8 getServletPath方法 2966.2.9 获取请求行信息的综合实例 296动手体验:与请求行信息相关的各个方法的作用 2966.3 获取网络连接信息 2986.3.1 getRemoteAddr方法 2986.3.2 getRemoteHost方法 2986.3.3 getRemotePort方法 2986.3.4 getLocalAddr方法 2986.3.5 getLocalName方法 2986.3.6 getLocalPort方法 2986.3.7 getServerName方法 2986.3.8 getServerPort方法 2986.3.9 getScheme方法 2996.3.10 getRequestURL方法 2996.4 获取请求头信息 2996.4.1 getHeader方法 2996.4.2 getHeaders方法 2996.4.3 getHeaderNames方法 3006.4.4 getIntHeader方法 3006.4.5 getDateHeader方法 3006.4.6 getContentType方法 3006.4.7 getContentLength方法 3006.4.8 getCharacterEncoding方法 3006.4.9 获取所有请求头的编程实例 301动手体验:获取请求消息中的所有请求头信息 3016.4.10 利用Referer请求头阻止“盗链” 303动手体验:利用Referer请求头阻止“盗链” 3036.4.11 利用Referer请求头隐藏JavaScript源代码 305动手体验:利用Referer请求头隐藏JavaScript源代码 3056.4.12 BASE64编码及客户端身份认证 309动手体验:BASIC验证的交互过程 3116.5 浏览器传递参数信息的细节 3156.5.1 使用GET方式传递参数 316脚下留心:不要使用GET方式提交包含口令的FORM表单 3166.5.2 使用POST方式传递参数 3166.5.3 提交、重置、普通按钮的参数传递 318动手体验:了解提交、重置、普通按钮的参数传递细节 3186.5.4 单行与多行文本输入框如何传送参数 319动手体验:了解单行与多行文本输入框的参数传递细节 3196.5.5 单选按钮与复选框如何传送参数 320动手体验:了解单选按钮与复选框的参数传递细节 3206.5.6 隐藏表单字段与图像字段如何传送参数 321动手体验:了解隐藏表单字段元素与图像字段元素的参数传递细节 3216.5.7 列表框的参数传递 322动手体验:了解列表框的参数传递细节 3226.5.8 使用JavaScript防止重复提交表单 323动手体验:使用JavaScript防止重复表单提交 3236.6 获取请求参数 3256.6.1 getParameter方法 3256.6.2 getParameterValues方法 3266.6.3 getParameterNames方法 3266.6.4 getParameterMap方法 3266.6.5 获取请求参数的编程实例 326动手体验:获取请求消息中的所有参数 3266.6.6 一次性处理多个列表项的实用案例 329动手体验:一次性处理多个列表项 3296.6.7 单选列表框的处理经验 3336.7 获取请求消息的实体内容 3336.7.1 getInputStream与getReader方法 334多学两招:使用ServletInputStream对象读取文本格式的实体内容 3346.7.2 分析文件上传的请求消息结构 334动手体验:分析文件上传的请求消息结构 3346.8 利用请求域属性传递信息 3436.8.1 setAttribute方法 3436.8.2 getAttribute方法 3446.8.3 removeAttribute方法 3446.8.4 getAttributeNames方法 3446.8.5 请求域属性的编程实例 344动手体验:请求域属性的应用 345多想一想:请求域属性与URL参数的应用区别 3486.9 请求参数的中文读取问题 3486.9.1 了解中文字符的URL编码 349动手体验:中文字符的URL编码和解码 3496.9.2 浏览器怎样进行URL编码 350动手体验:浏览器怎样对FORM表单内容进行URL编码 3516.9.3 getCharacterEncoding方法 3526.9.4 setCharacterEncoding方法 3526.9.5 getParameter方法的中文问题 352动手体验:解决使用getParameter方法读取请求参数时的中文乱码问题 3536.9.6 一些参考经验 3656.10 思考与实践 366第7章 会话与状态管理 3677.1 Web应用中的会话与会话状态 3677.1.1 会话与会话状态简介 3677.1.2 如何实现有状态的会话 3677.2 Cookie 3687.2.1 什么是Cookie 3687.2.2 Set-Cookie2响应头字段 3707.2.3 Cookie请求头字段 3727.3 在Servlet程序中使用Cookie 3737.3.1 Cookie类 3737.3.2 HttpServletResponse.addCookie方法 3757.3.3 HttpServletRequest.getCookies方法 3757.3.4 Cookie的综合实例 375动手体验:Cookie的工作细节 3757.4 Session 3867.4.1 什么是Session 3867.4.2 Session的跟踪机制 3877.4.3 Session的超时管理 3877.4.4 HttpSession接口中的方法 3887.4.5 HttpServletRequest接口中的Session方法 390多想一想:什么情况下该调用request.getSession(false)方法 3917.4.6 application域与session域属性的比较 391动手体验:application域和session域范围的属性的差异 3937.4.7 利用Cookie实现Session跟踪 396动手体验:如何利用Cookie实现Session跟踪 3977.4.8 利用URL重写实现Session跟踪 399动手体验:利用URL重写实现Session跟踪 4007.5 Session的典型案例 4017.5.1 使用Session实现购物车 401动手体验:使用Session实现购物车功能 4027.5.2 利用Session防止表单重复提交 407多学两招:MD5算法及其应用 408动手体验:利用Session防止表单重复提交 4097.5.3 利用Session实现一次性验证码 415动手体验:利用Session实现一次性验证码 416多学两招:用时间间隔限制用户连续发帖 4207.5.4 跟踪用户上次访问站点的时间及Cookie中文问题 4207.6 Session的持久化管理 4237.6.1 Session的持久化 4237.6.2 Tomcat中的Session持久化管理 423动手体验:Tomcat的Session持久化 4247.7 思考与实践 428第8章 JSP 4308.1 JSP入门 4308.1.1 建立对JSP的直观认识 430动手体验:编写最基本的JSP程序 4318.1.2 JSP的运行原理 434多学两招:让JSP引擎不检测JSP页面是否发生修改 4358.1.3 分析JSP所生成的Servlet代码 437指点迷津:out.print语句与out.write语句的区别 4418.1.4 JSP隐式对象 441多学两招:使用JSP页面学习Servlet API 4438.1.5 注册与配置JSP页面的访问路径 4448.1.6 JSP与JavaScript的综合应用 444动手体验:JSP与JavaScript的综合应用 445多学两招:降低代码的嵌套层次,提高程序的易读性 4478.1.7 JSP与Servlet的应用比较 4528.2 JSP基本语法 4538.2.1 JSP模板元素 4548.2.2 JSP表达式 4548.2.3 JSP脚本片断 4548.2.4 JSP声明 4568.2.5 EL表达式 459动手体验:EL表达式将null输出为空字符串("")的好处 4608.2.6 JSP注释 461动手体验:JSP注释与JSP页面中的Java注释和HTML注释的区别 4618.2.7 特殊字符序列的转义处理 4628.2.8 如何查找JSP页面中的错误 464动手体验:查找JSP页面中的错误 4648.3 JSP指令 4678.3.1 JSP指令简介 4678.3.2 page指令 467动手体验:JSP页面中的异常处理 472多学两招:在web.xml文件中设置全局错误处理 474多学两招:如何识别web.xml文件所遵循的Servlet规范版本 4758.3.3 include指令 476动手体验:include指令的特性 4778.4 out对象 479动手体验:out对象的应用特性 479指点迷津:将请求转发给静态HTML页面的实验现象为何不稳定 4828.5 pageContext对象 4828.5.1 pageContext对象简介 4828.5.2 获得其他隐式对象 4838.5.3 引入和跳转到其他资源 483动手体验:PageContext.forward方法的应用细节 4848.5.4 访问各个域范围中的属性 485动手体验:存储在pageContext对象中的属性的作用域 4878.5.5 pushBody方法与popBody方法 4888.6 JSP标签 4908.6.1 标签 491动手体验:标签的特性 4928.6.2 标签 494动手体验:标签的特性 4948.6.3 标签 4958.6.4 标签 4958.6.5 脚本元素标签 4978.6.6 指令标签 4978.6.7 标签 4978.6.8 完全使用标签编写JSP页面 4978.7 JSP的中文乱码问题 4988.7.1 JSP中文乱码的根源 4988.7.2 JSP引擎翻译JSP页面时的中文乱码问题 500动手体验:JSP引擎翻译JSP页面时的中文乱码问题 5018.7.3 静态引入时的中文乱码问题 507动手体验:静态引入时的中文乱码问题 5078.7.4 标签传递中文参数时的问题 509动手体验:标签传递中文参数时的问题 5098.8 思考与实践 511第9章 JavaBean在JSP中的应用 5139.1 JavaBean简介 5139.2 JavaBean的属性 5139.1.1 JavaBean的属性简介 5139.1.2 简单属性 5149.1.3 Indexed属性 5159.3 JavaBean在JSP中的应用 5169.3.1 在JSP中如何使用JavaBean 5169.3.2 标签 517动手体验:带标签体的标签的执行情况 5209.3.3 标签 521动手体验:标签的应用 522多学两招:利用JSP表达式对JavaBean的特殊类型的属性进行赋值 5259.3.4 标签 5259.3.5 使用JavaBean的注意事项 5269.4 JSP开发模式 5269.4.1 MVC设计模式 5269.4.2 JSP开发模式 5279.4.3 用模式一实现用户登录功能 529动手体验:用JSP模式一实现用户登录功能 5309.4.4 用模式二实现用户注册功能 537动手体验:用JSP模式二实现用户注册功能 538多学两招:在MVC模式中应用标签的type属性 5489.5 思考与实践 548 上一篇: Java网络编程 影印版 第四版 [(美)Elliotte Rusty Harold(哈诺德,R.E.)著] 下一篇: Head First Javascript 深入浅出Javascript 英文版