欢迎访问学兔兔,学习、交流 分享 !

返回首页 |

深入体验Java Web开发内幕 核心基础

收藏
  • 大小:75.39 MB
  • 语言:中文版
  • 格式: PDF文档
  • 阅读软件: Adobe Reader
资源简介
深入体验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
指点迷津:什么是配置文件 1
1.1 XML技术概述 2
1.1.1 XML的起源与作用 2
1.1.2 XML文档结构 3
1.1.3 XML与HTML的比较 4
1.1.4 XML与数据库的比较 5
1.2 XML的基本语法 6
1.2.1 文档声明 6
动手体验:加深对encoding属性的理解 7
1.2.2 元素定义 10
1.2.3 属性定义 11
1.2.4 注释 11
1.2.5 空格和换行的处理 12
1.2.6 CDATA区 12
1.2.7 特殊字符 13
动手体验:加深对特殊字符的了解 13
1.2.8 处理指令 14
动手体验:使用CSS控制XML文档的显示 14
1.3 XML的约束模式 16
1.3.1 格式良好的(Well-formed)XML 16
1.3.2 XML的约束模式 16
1.3.3 XML的约束模式语言 17
1.3.4 有效的(Valid)XML 17
1.4 DTD 18
1.4.1 对DTD的初步认识 18
1.4.2 在XML文档中引入外部DTD文件 19
1.4.3 在XML文档中直接嵌入DTD定义语句 21
1.5 DTD的语法细节 22
1.5.1 元素定义 22
1.5.2 属性定义 24
1.5.3 实体定义 29
动手体验:加深对引用实体的了解 30
1.6 XML Schema 33
1.6.1 XML Schema与DTD的比较 33
1.6.2 一个XML Schema例子 34
1.7 名称空间 36
1.7.1 名称空间的概念 36
1.7.2 名称空间声明 37
1.7.3 默认名称空间 38
1.7.4 属性的名称空间 38
1.7.5 xml:space和xml:lang属性 39
1.8 引入XML Schema文档 40
1.8.1 使用名称空间引入XML Schema文档 40
1.8.2 不使用名称空间引入XML Schema文档 42
1.9 思考与实践 43
第2章 用Tomcat构建Web站点 44
2.1 Web应用的相关知识 44
2.1.1 HTTP协议 44
2.1.2 URL 45
2.1.3 主要的Web服务器软件 45
2.1.4 网站系统的组成 45
2.2 安装Tomcat 47
2.2.1 Tomcat简介 47
2.2.2 获取Tomcat安装程序包 47
2.2.3 使用zip和tar.gz包安装Tomcat 48
2.2.4 使用exe程序安装Tomcat 49
2.3 Tomcat的启动与停止 52
2.3.1 使用Tomcat服务程序 52
多学两招:查找网络服务程序监听异常的问题 54
2.3.2 使用Tomcat程序组中的快捷菜单 55
多学两招:了解Tomcat 4.1.31的快捷启动菜单的工作原理 56
2.3.3 使用tomcat.exe程序 58
指点迷津:tomcat5.exe启动的Tomcat程序不一定是tomcat5.exe自身所在的目录 59
2.3.4 startup.bat批处理文件 60
2.3.5 catalina.bat批处理文件 64
2.3.6 使用批处理程序及查找Tomcat的启动问题 68
动手体验:练习查找Tomcat的启动错误 69
2.4 配置Web站点的虚拟目录 71
2.4.1 虚拟Web目录的映射原理 72
2.4.2 设置Web站点的根目录 73
动手体验:修改Web站点的默认根目录 74
2.4.3 设置Web站点的虚拟子目录 74
动手体验:设置Web站点的虚拟子目录 76
脚下留心:war文件的内部目录结构 77
2.4.4 部署描述符与目录的默认网页 78
动手体验:设置目录的默认网页 79
2.5 配置虚拟主机 81
2.5.1 浏览器访问Web资源的过程 81
动手体验:用Telnet程序分析浏览器访问Web资源的过程 81
多学两招:打开Telnet程序的本地回显功能 82
2.5.2 虚拟主机及实现原理 83
2.5.3 基于主机名的虚拟主机 84
动手体验:使用Tomcat建立基于主机名的虚拟主机 86
2.5.4 基于端口号的虚拟主机 88
动手体验:使用Tomcat建立基于端口号的虚拟主机 89
2.5.5 基于IP地址的虚拟主机 90
2.6 与专用Web服务器的集成 90
2.6.1 集成的考虑因素 91
2.6.2 集成技术的选择 92
2.6.3 JK插件 93
动手体验:下载JK插件 94
2.6.4 Tomcat体系结构与JK插件的工作原理 95
动手体验:查阅JK连接器的帮助文档 99
2.6.5 Tomcat与IIS服务器集成 100
2.6.6 Tomcat与Windows系统下的Apache服务器集成 105
2.6.7 与专业Web服务器集成的现实问题 107
2.7 思考与实践 107
第3章 HTTP协议详解 109
3.1 了解HTTP 109
3.1.1 HTTP简介 109
3.1.2 HTTP 1.0的会话方式 109
3.1.3 HTTP 1.1与HTTP 1.0的比较 111
3.1.4 HTTP消息的格式 112
3.1.5 HTTP消息头 113
3.2 请求行与状态行 114
3.2.1 请求行与状态行 114
动手体验:借助Telnet程序直观地体验请求行和状态行 115
3.2.2 使用GET和POST方式传递参数 117
动手体验:使用GET与POST方式传递参数 118
3.2.3 响应状态码 121
3.3 通用信息头 124
3.3.1 Cache-Control 124
3.3.2 Connection 125
动手体验:Connection头字段的作用 125
3.3.3 Date 125
3.3.4 Pragma 126
3.3.5 Trailer 126
3.3.6 Transfer-Encoding 126
3.3.7 Upgrade 126
3.3.8 Via 127
3.3.9 Warning 127
3.4 请求头 127
3.4.1 Accept 127
3.4.2 Accept-Charset 127
3.4.3 Accept-Encoding 127
3.4.4 Accept-Language 128
动手体验:Accept-Language头字段的作用 129
3.4.5 Authorization 130
3.4.6 Expect 130
3.4.7 From 130
3.4.8 Host 130
3.4.9 If-Match 131
3.4.10 If-Modified-Since 131
3.4.11 If-None-Match 132
3.4.12 If-Range 132
3.4.13 If-Unmodified-Since 132
3.4.14 Max-Forwards 132
3.4.15 Proxy-Authorization 132
3.4.16 Range 132
3.4.17 Referer 133
3.4.18 TE 133
3.4.19 User-Agent 133
3.5 响应头 134
3.5.1 Accept-Range 134
3.5.2 Age 134
3.5.3 Etag 134
3.5.4 Location 134
动手体验:Location头字段的作用 135
3.5.5 Proxy-Authenticate 135
3.5.6 Retry-After 135
3.5.7 Server 136
3.5.8 Vary 136
3.5.9 WWW-Authenticate 136
3.6 实体头 136
3.6.1 Allow 137
3.6.2 Content-Encoding 137
3.6.3 Content-Language 137
3.6.4 Content-Length 137
3.6.5 Content-Location 138
3.6.6 Content-MD5 138
3.6.7 Content-Range 138
3.6.8 Content-Type 138
动手体验:Tomcat中的文件扩展名与MIME的映射关系 139
3.6.9 Expires 141
3.6.10 Last-Modified 141
3.7 扩展头 141
3.7.1 Refresh 141
3.7.2 Content-Disposition 142
3.8 思考与实践 142
第4章 Servlet开发基础 143
4.1 Servlet的有关概念与前置知识 143
4.1.1 什么是动态网页 143
指点迷津:区分动态网页与动态HTML页面的概念 144
4.1.2 动态网页程序与引擎 144
4.1.3 Servlet技术简介 146
4.1.4 B/S系统架构与C/S系统架构 146
4.1.5 Servlet开发涉及的相关知识 149
4.2 Servlet开发入门 149
4.2.1 Servlet API介绍 149
动手体验:查看Tomcat提供的Servlet API帮助文档 150
4.2.2 编写与编译Servlet程序 151
指点迷津:如何快速入门新技术 151
动手体验:编写与编译Servlet程序的过程 152
4.2.3 Servlet的注册与运行 153
动手体验:注册与访问Servlet程序 155
照猫画虎:如何编写Web.xml文件 156
4.2.4 Servlet激活器 158
动手体验:使用Servlet激活器 159
4.2.5 缺省Servlet 159
动手体验:缺省Servlet的作用 160
4.2.6 Servlet的类装载器 160
动手体验:Tomcat如何完成类的加载 164
指点迷津:区分Servlet的编译和运行环境 167
4.2.7 编写一个自动编译工具 167
4.3 Servlet的特点及运行过程 168
4.3.1 Servlet的特点 168
4.3.2 Servlet的运行过程 169
4.3.3 Servlet的线程安全问题 174
动手体验:Servlet的并发访问与线程安全问题 174
指点迷津:哪些情况下要考虑线程安全问题 177
4.4 ServletConfig接口 177
指点迷津:Servlet的初始化参数的作用 178
多想一想:Servlet的init方法与getServletConfig方法的关系与作用 178
4.4.1 getInitParameterNames方法 179
4.4.2 getInitParameter方法 179
4.4.3 getServletName方法 179
4.4.4 getServletContext方法 180
4.4.5 GenericServlet类实现ServletConfig接口的目的 180
4.4.6 ServletConfig的应用举例 180
动手体验:ServletConfig对象的应用 181
4.5 GenericServlet与HttpServlet类 183
4.5.1 区分回调方法与工具方法 183
4.5.2 init方法 183
指点迷津:覆盖无参数的init()方法来编写初始化代码的好处 184
4.5.3 service方法 186
4.5.4 destroy方法 187
4.5.5 getServletConfig方法 187
4.5.6 getServletInfo方法 188
4.5.7 doXxx方法 188
动手体验:doGet方法与doPost方法的作用 189
指点迷津:如何理解“在自己的程序代码中不能调用回调方法” 191
4.5.8 浏览器缓存内幕与getLastModified方法 191
动手体验:揭开浏览器缓存的奥秘 194
4.6 ServletContext接口 200
4.6.1 获取Web应用程序的初始化参数 201
动手体验:Web应用程序的初始化参数的设置与应用 201
4.6.2 记录日志 203
动手体验:Web应用程序的日志记录功能 204
多学两招:JDK中提供的日志记录模块 205
4.6.3 application域范围的属性 209
4.6.4 访问资源文件 210
动手体验:在Servlet程序中使用FileInputStream类的问题 211
动手体验:使用ServletContext接口和ClassLoader类中的方法访问资源文件 213
4.6.5 获取虚拟路径所映射的本地路径 214
4.6.6 Web应用程序之间的访问 215
动手体验:访问其他Web应用程序 215
4.6.7 ServletContext接口中的其他方法 218
4.7 思考与实践 218
第5章 HttpServletResponse的应用 220
5.1 准备实验环境 220
5.2 HttpServletResponse简介 221
5.3 产生响应状态行 221
5.3.1 状态码常量 221
5.3.2 setStatus方法 222
5.3.3 sendError方法 222
5.4 构建响应消息头 223
5.4.1 addHeader与setHeader方法 223
5.4.2 addIntHeader与setIntHeader方法 224
5.4.3 addDateHeader与setDateHeader方法 224
5.4.4 setContentLength方法 224
5.4.5 setContentType方法 224
5.4.6 setCharacterEncoding方法 225
5.4.7 setLocale方法 225
5.4.8 containsHeader方法 226
5.5 响应消息头的实用案例 226
5.5.1 Servlet的中文输出问题 226
动手体验:浏览器显示网页文档时怎样选择字符集编码 227
动手体验:Servlet的中文输出问题及解决之道 229
脚下留心:注意传递给setContentType方法的参数值的大小写 233
多学两招:修改某个Servlet将导致整个Web应用程序被重新加载 234
5.5.2 让浏览器定时刷新网页或跳转至其他页面 235
动手体验:Refresh头字段的作用效果 235
5.5.3 禁止浏览器缓存当前文档内容 236
动手体验:浏览器的缓存问题和解决方案 236
5.5.4 使用标签模拟响应消息头 238
动手体验:使用标签解决浏览器显示网页时的中文乱码问题 239
多学两招:网页文档应尽量采用UTF-8编码 240
5.6 创建响应正文 241
5.6.1 getOutputStream与getWriter方法 241
5.6.2 关于getWriter方法的一些相关疑问 242
动手体验:关于getWriter方法的一些相关疑问 242
5.6.3 输出缓冲区 244
动手体验:Servlet引擎处理输出缓冲区的细节 245
5.6.4 实现动态文件内容的下载 247
动手体验:实现动态文件内容的下载 248
5.6.5 图像访问计数器 249
动手体验:使用标签实现静态HTML页面的访问次数统计和显示 252
多学两招:如何动态产生大小可变的图像 257
5.7 请求重定向与请求转发 259
5.7.1 RequestDispatcher接口 259
5.7.2 用include方法实现资源包含 260
动手体验:RequestDispatcher.include方法的应用细节 260
5.7.3 用forward方法实现请求转发 267
动手体验:RequestDispatcher.forward方法的应用细节 267
动手体验:RequestDispatcher.forward方法的相对路径问题 273
5.7.4 请求转发的运行流程 277
5.7.5 用sendRedirect方法实现请求重定向 281
动手体验:sendRedirect方法的应用 282
5.7.6 请求重定向的运行流程 283
5.7.7 请求重定向与请求转发的比较 287
5.7.8 缺省Servlet的缓存问题 289
动手体验:缺省Servlet的缓存问题 291
5.8 思考与实践 292
第6章 HttpServletRequest的应用 294
6.1 HttpServletRequest简介 294
6.2 获取请求行的相关信息 294
6.2.1 getMethod方法 294
6.2.2 getRequestURI方法 295
6.2.3 getQueryString方法 295
6.2.4 getProtocol方法 295
6.2.5 getContextPath方法 295
6.2.6 getPathInfo方法 295
6.2.7 getPathTranslated方法 296
6.2.8 getServletPath方法 296
6.2.9 获取请求行信息的综合实例 296
动手体验:与请求行信息相关的各个方法的作用 296
6.3 获取网络连接信息 298
6.3.1 getRemoteAddr方法 298
6.3.2 getRemoteHost方法 298
6.3.3 getRemotePort方法 298
6.3.4 getLocalAddr方法 298
6.3.5 getLocalName方法 298
6.3.6 getLocalPort方法 298
6.3.7 getServerName方法 298
6.3.8 getServerPort方法 298
6.3.9 getScheme方法 299
6.3.10 getRequestURL方法 299
6.4 获取请求头信息 299
6.4.1 getHeader方法 299
6.4.2 getHeaders方法 299
6.4.3 getHeaderNames方法 300
6.4.4 getIntHeader方法 300
6.4.5 getDateHeader方法 300
6.4.6 getContentType方法 300
6.4.7 getContentLength方法 300
6.4.8 getCharacterEncoding方法 300
6.4.9 获取所有请求头的编程实例 301
动手体验:获取请求消息中的所有请求头信息 301
6.4.10 利用Referer请求头阻止“盗链” 303
动手体验:利用Referer请求头阻止“盗链” 303
6.4.11 利用Referer请求头隐藏JavaScript源代码 305
动手体验:利用Referer请求头隐藏JavaScript源代码 305
6.4.12 BASE64编码及客户端身份认证 309
动手体验:BASIC验证的交互过程 311
6.5 浏览器传递参数信息的细节 315
6.5.1 使用GET方式传递参数 316
脚下留心:不要使用GET方式提交包含口令的FORM表单 316
6.5.2 使用POST方式传递参数 316
6.5.3 提交、重置、普通按钮的参数传递 318
动手体验:了解提交、重置、普通按钮的参数传递细节 318
6.5.4 单行与多行文本输入框如何传送参数 319
动手体验:了解单行与多行文本输入框的参数传递细节 319
6.5.5 单选按钮与复选框如何传送参数 320
动手体验:了解单选按钮与复选框的参数传递细节 320
6.5.6 隐藏表单字段与图像字段如何传送参数 321
动手体验:了解隐藏表单字段元素与图像字段元素的参数传递细节 321
6.5.7 列表框的参数传递 322
动手体验:了解列表框的参数传递细节 322
6.5.8 使用JavaScript防止重复提交表单 323
动手体验:使用JavaScript防止重复表单提交 323
6.6 获取请求参数 325
6.6.1 getParameter方法 325
6.6.2 getParameterValues方法 326
6.6.3 getParameterNames方法 326
6.6.4 getParameterMap方法 326
6.6.5 获取请求参数的编程实例 326
动手体验:获取请求消息中的所有参数 326
6.6.6 一次性处理多个列表项的实用案例 329
动手体验:一次性处理多个列表项 329
6.6.7 单选列表框的处理经验 333
6.7 获取请求消息的实体内容 333
6.7.1 getInputStream与getReader方法 334
多学两招:使用ServletInputStream对象读取文本格式的实体内容 334
6.7.2 分析文件上传的请求消息结构 334
动手体验:分析文件上传的请求消息结构 334
6.8 利用请求域属性传递信息 343
6.8.1 setAttribute方法 343
6.8.2 getAttribute方法 344
6.8.3 removeAttribute方法 344
6.8.4 getAttributeNames方法 344
6.8.5 请求域属性的编程实例 344
动手体验:请求域属性的应用 345
多想一想:请求域属性与URL参数的应用区别 348
6.9 请求参数的中文读取问题 348
6.9.1 了解中文字符的URL编码 349
动手体验:中文字符的URL编码和解码 349
6.9.2 浏览器怎样进行URL编码 350
动手体验:浏览器怎样对FORM表单内容进行URL编码 351
6.9.3 getCharacterEncoding方法 352
6.9.4 setCharacterEncoding方法 352
6.9.5 getParameter方法的中文问题 352
动手体验:解决使用getParameter方法读取请求参数时的中文乱码问题 353
6.9.6 一些参考经验 365
6.10 思考与实践 366
第7章 会话与状态管理 367
7.1 Web应用中的会话与会话状态 367
7.1.1 会话与会话状态简介 367
7.1.2 如何实现有状态的会话 367
7.2 Cookie 368
7.2.1 什么是Cookie 368
7.2.2 Set-Cookie2响应头字段 370
7.2.3 Cookie请求头字段 372
7.3 在Servlet程序中使用Cookie 373
7.3.1 Cookie类 373
7.3.2 HttpServletResponse.addCookie方法 375
7.3.3 HttpServletRequest.getCookies方法 375
7.3.4 Cookie的综合实例 375
动手体验:Cookie的工作细节 375
7.4 Session 386
7.4.1 什么是Session 386
7.4.2 Session的跟踪机制 387
7.4.3 Session的超时管理 387
7.4.4 HttpSession接口中的方法 388
7.4.5 HttpServletRequest接口中的Session方法 390
多想一想:什么情况下该调用request.getSession(false)方法 391
7.4.6 application域与session域属性的比较 391
动手体验:application域和session域范围的属性的差异 393
7.4.7 利用Cookie实现Session跟踪 396
动手体验:如何利用Cookie实现Session跟踪 397
7.4.8 利用URL重写实现Session跟踪 399
动手体验:利用URL重写实现Session跟踪 400
7.5 Session的典型案例 401
7.5.1 使用Session实现购物车 401
动手体验:使用Session实现购物车功能 402
7.5.2 利用Session防止表单重复提交 407
多学两招:MD5算法及其应用 408
动手体验:利用Session防止表单重复提交 409
7.5.3 利用Session实现一次性验证码 415
动手体验:利用Session实现一次性验证码 416
多学两招:用时间间隔限制用户连续发帖 420
7.5.4 跟踪用户上次访问站点的时间及Cookie中文问题 420
7.6 Session的持久化管理 423
7.6.1 Session的持久化 423
7.6.2 Tomcat中的Session持久化管理 423
动手体验:Tomcat的Session持久化 424
7.7 思考与实践 428
第8章 JSP 430
8.1 JSP入门 430
8.1.1 建立对JSP的直观认识 430
动手体验:编写最基本的JSP程序 431
8.1.2 JSP的运行原理 434
多学两招:让JSP引擎不检测JSP页面是否发生修改 435
8.1.3 分析JSP所生成的Servlet代码 437
指点迷津:out.print语句与out.write语句的区别 441
8.1.4 JSP隐式对象 441
多学两招:使用JSP页面学习Servlet API 443
8.1.5 注册与配置JSP页面的访问路径 444
8.1.6 JSP与JavaScript的综合应用 444
动手体验:JSP与JavaScript的综合应用 445
多学两招:降低代码的嵌套层次,提高程序的易读性 447
8.1.7 JSP与Servlet的应用比较 452
8.2 JSP基本语法 453
8.2.1 JSP模板元素 454
8.2.2 JSP表达式 454
8.2.3 JSP脚本片断 454
8.2.4 JSP声明 456
8.2.5 EL表达式 459
动手体验:EL表达式将null输出为空字符串("")的好处 460
8.2.6 JSP注释 461
动手体验:JSP注释与JSP页面中的Java注释和HTML注释的区别 461
8.2.7 特殊字符序列的转义处理 462
8.2.8 如何查找JSP页面中的错误 464
动手体验:查找JSP页面中的错误 464
8.3 JSP指令 467
8.3.1 JSP指令简介 467
8.3.2 page指令 467
动手体验:JSP页面中的异常处理 472
多学两招:在web.xml文件中设置全局错误处理 474
多学两招:如何识别web.xml文件所遵循的Servlet规范版本 475
8.3.3 include指令 476
动手体验:include指令的特性 477
8.4 out对象 479
动手体验:out对象的应用特性 479
指点迷津:将请求转发给静态HTML页面的实验现象为何不稳定 482
8.5 pageContext对象 482
8.5.1 pageContext对象简介 482
8.5.2 获得其他隐式对象 483
8.5.3 引入和跳转到其他资源 483
动手体验:PageContext.forward方法的应用细节 484
8.5.4 访问各个域范围中的属性 485
动手体验:存储在pageContext对象中的属性的作用域 487
8.5.5 pushBody方法与popBody方法 488
8.6 JSP标签 490
8.6.1 标签 491
动手体验:标签的特性 492
8.6.2 标签 494
动手体验:标签的特性 494
8.6.3 标签 495
8.6.4 标签 495
8.6.5 脚本元素标签 497
8.6.6 指令标签 497
8.6.7 标签 497
8.6.8 完全使用标签编写JSP页面 497
8.7 JSP的中文乱码问题 498
8.7.1 JSP中文乱码的根源 498
8.7.2 JSP引擎翻译JSP页面时的中文乱码问题 500
动手体验:JSP引擎翻译JSP页面时的中文乱码问题 501
8.7.3 静态引入时的中文乱码问题 507
动手体验:静态引入时的中文乱码问题 507
8.7.4 标签传递中文参数时的问题 509
动手体验:标签传递中文参数时的问题 509
8.8 思考与实践 511
第9章 JavaBean在JSP中的应用 513
9.1 JavaBean简介 513
9.2 JavaBean的属性 513
9.1.1 JavaBean的属性简介 513
9.1.2 简单属性 514
9.1.3 Indexed属性 515
9.3 JavaBean在JSP中的应用 516
9.3.1 在JSP中如何使用JavaBean 516
9.3.2 标签 517
动手体验:带标签体的标签的执行情况 520
9.3.3 标签 521
动手体验:标签的应用 522
多学两招:利用JSP表达式对JavaBean的特殊类型的属性进行赋值 525
9.3.4 标签 525
9.3.5 使用JavaBean的注意事项 526
9.4 JSP开发模式 526
9.4.1 MVC设计模式 526
9.4.2 JSP开发模式 527
9.4.3 用模式一实现用户登录功能 529
动手体验:用JSP模式一实现用户登录功能 530
9.4.4 用模式二实现用户注册功能 537
动手体验:用JSP模式二实现用户注册功能 538
多学两招:在MVC模式中应用标签的type属性 548
9.5 思考与实践 548
下载地址