第1章 文件上传组件的应用与编写 1
1.1 准备实验环境 1
1.2 Apache文件上传组件的应用 3
1.2.1 查看API文档 3
1.2.2 DiskFileUpload类 3
1.2.3 FileItem类 6
1.2.4 FileUploadException类 9
1.2.5 文件上传编程实例 9
动手体验:使用Apache文件上传组件 9
脚下留心 14
1.3 Apache文件上传组件的源码赏析 15
1.3.1 Apache文件上传组件的类工作关系 15
1.3.2 Apache文件上传组件的核心编程问题 17
1.3.3 MultipartStream类 20
1.3.4 DeferredFileOutputStream类 33
1.3.5 DefaultFileItem类 37
1.3.6 DefaultFileItemFactory类 44
1.3.7 DiskFileUpload类 44
第2章 Filter(过滤器) 53
2.1 准备实验环境 53
2.2 Filter应用入门 54
2.2.1 Filter的基本工作原理 54
2.2.2 Filter链 55
2.2.3 Filter接口 56
2.2.4 FilterChain接口 57
2.2.5 FilterConfig接口 57
2.2.6 编写与编译Filter程序 58
动手体验:编写与编译Filter程序 58
2.2.7 Filter的注册与运行 61
动手体验:注册与运行Filter程序 63
2.2.8 Filter的运行过程分析 67
2.2.9 用Filter实现对资源的集中访问保护 71
动手体验:用Filter程序实现静态HTML页面的访问保护 72
2.3 Filter的高级应用 76
2.3.1 在Filter程序中修改请求和响应消息的原理 77
2.3.2 HttpServletRequest Wrapper类 82
2.3.3 用Filter实现文件上传请求的透明处理 83
动手体验:包装“multipart/form-data”类型的请求消息 83
2.3.4 HttpServletResponse Wrapper类 92
2.3.5 用Filter实现响应正文的压缩 94
动手体验:查看压缩Filter程序的运行效果 105
2.3.6 Filter链的应用 107
动手体验:了解Filter链的运行过程 107
2.4 思考与实践 111
第3章 Servlet事件监听器 112
3.1 概述 112
3.2 监听域对象的创建和销毁 113
3.2.1 ServletContextListener接口 113
3.2.2 HttpSessionListener接口 114
3.2.3 ServletRequestListener接口 115
3.2.4 域对象事件监听器的综合案例 115
动手体验:域对象事件监听器 116
3.2.5 统计当前在线人数的编程实例 120
3.3 监听域对象中的属性变更 123
3.3.1 监听对象的属性事件监听器接口 123
3.3.2 域对象属性事件监听器的综合案例 124
动手体验:域对象的属性事件监听器 124
3.4 感知Session绑定的事件监听器 127
3.4.1 HttpSessionBindingListener接口 128
3.4.2 HttpSessionActivationListener接口 128
3.4.3 感知Session绑定的综合案例 128
3.5 思考与实践 132
第4章 开发国际化的Web程序 133
4.1 国际化与本地化概述 133
动手体验:建立对国际化和本地化的直观认识 133
4.2 与国际化相关的Java类 136
4.2.1 Locale类 136
动手体验:Locale类方法的应用实例 139
4.2.2 DateFormat类 140
动手体验:对日期/时间进行本地格式化 142
动手体验:对日期/时间进行本地化解析 143
4.2.3 NumberFormat类 145
动手体验:对数值进行本地格式化 147
动手体验:对数值字符串进行本地化解析 148
4.2.4 MessageFormat类 149
4.2.5 ResourceBundle类 159
动手体验:使用native2ascii程序转换字符编码 161
动手体验:从资源包中读取资源信息 163
4.2.6 ResourceBundle类的扩展应用 165
动手体验:使用自定义的ResourceBundle的子类管理资源信息 166
4.3 Web应用的国际化 171
4.3.1 获取Web应用中的本地信息 171
动手体验:获得客户端支持的本地信息 172
4.3.2 Web应用的国际化举例 173
动手体验:Web应用的国际化 173
第5章 表达式语言(EL) 176
5.1 准备实验环境 176
5.2 EL概述 176
5.3 EL的基本应用 177
5.3.1 JSP标签的属性值中使用EL表达式 177
5.3.2 JSP模板中使用EL表达式 177
5.3.3 忽略JSP页面的EL表达式 178
5.3.4 使JSP页面的脚本元素无效 179
5.4 隐含对象 179
5.4.1 隐含对象与域属性 180
5.4.2 pageContext隐含对象 181
5.4.3 代表特定域属性集合的隐含对象 182
5.4.4 代表请求参数集合的隐含对象 182
5.4.5 代表HTTP请求消息头集合的隐含对象 182
5.4.6 cookie隐含对象 182
5.4.7 initParam隐含对象 183
5.5 EL的基础语法 184
5.5.1 EL中的标识符 184
5.5.2 EL中的保留字 184
5.5.3 EL中的常量 185
5.5.4 EL中的变量 186
5.5.5 EL的处理错误机制 186
5.6 EL中的运算符 188
5.6.1 方括号运算符([])和点运算符(.) 188
多学两招 189
5.6.2 算术运算符 189
5.6.3 比较运算符 189
5.6.4 逻辑运算符 190
5.6.5 empty运算符 190
5.6.6 条件运算符 191
5.6.7 圆括号运算符 191
5.6.8 运算符的优先级 191
5.7 EL自定义函数 192
5.7.1 什么是EL自定义函数 192
5.7.2 编写用做EL自定义函数的Java方法 193
5.7.3 在标签库描述符文件中描述EL自定义函数 194
5.7.4 在JSP页面导入和使用EL自定义函数 196
5.7.5 EL自定义函数的执行流程总结 198
第6章 自定义标签的开发与使用 200
6.1 自定义标签入门 200
6.1.1 什么是自定义标签 200
6.1.2 自定义标签的应用形式 201
6.1.3 入门自定义标签的开发和调用 202
动手体验:开发用于显示客户端IP地址的自定义标签 207
多学两招:自定义标签与JavaBean的区别 208
6.1.4 自定义标签的功能及其基本原理 209
6.1.5 自定义标签API 209
6.2 自定义标签的基本应用 213
6.2.1 Tag接口 213
6.2.2 控制是否执行标签体内容 215
动手体验:显示用户信息的自定义标签 215
6.2.3 控制是否执行JSP页面的内容 217
动手体验:阻止执行JSP页面内容的自定义标签 218
6.3 自定义标签的属性 220
6.3.1 定义标签属性 220
动手体验:为自定义标签增加属性 222
6.3.2 动态属性值的应用 224
动手体验:用JSP动态元素设置标签的属性 224
6.3.3 动态属性的应用 227
动手体验:利用自定义标签的动态属性生成下拉列表框 227
6.4迭代标签 230
6.4.1 IterationTag接口 230
6.4.2 迭代标签的应用与编程原理 230
动手体验:用自定义标签迭代输出集合中的元素 231
6.5 深入自定义标签的运行原理 234
6.5.1 自定义标签的运行原理 234
多学两招 236
6.5.2 Tomcat中的自定义标签的缓存分析 237
动手体验:验证自定义标签的缓存 237
指点迷津 240
6.5.3 Tomcat中自定义标签的线程安全问题 241
动手体验:分析自定义标签的线程安全问题 241
指点迷津 244
6.6 用自定义标签定义JSP脚本变量 244
6.6.1 用自定义标签定义JSP脚本变量 244
6.6.2 在TLD文件中定义JSP脚本变量 246
动手体验:用TLD文件定义脚本变量 247
6.6.3 用TagExtraInfo类定义JSP脚本变量 250
动手体验:使用TagExtraInfo类定义脚本变量 251
多想一想:使用TLD文件和使用TagExtraInfo类定义脚本变量的区别 253
动手体验:编写功能与<jsp:usebean>标签相同的自定义标签<it315:usebean> 253
6.7 处理标签体内容 257
6.7.1 BodyTag接口 257
6.7.2 BodyContent类 258
动手体验:BodyTag接口的简单应用 260
6.7.3 解析BodyTag接口的工作原理 262
6.7.4 BodyTag接口的编程实例 264
动手体验:对HTML特殊字符进行转义的自定义标签 265
6.7.5 标签体类型 270
动手体验:理解tagdependent类型的含义 270
第7章 简单标签与标签文件 271
7.1 简单标签库开发 271
7.1.1 SimpleTag接口 271
7.1.2 JspFragment类 273
7.1.3 SimpleTagSupport类 274
7.1.4 利用简单标签控制标签体和JSP页面的执行 274
动手体验:利用简单标签控制标签体和JSP页面的执行 274
7.1.5 对数组中的元素进行迭代输出的简单标签 277
动手体验:利用简单标签对数组中的元素进行迭代输出 277
7.1.6 对标签体内容进行修改的简单标签 279
动手体验:对标签体内容进行修改的简单标签 279
多想一想:嵌套标签内使用的out对象 283
7.1.7 处理<jsp:attribute>标签设置的属性 284
动手体验:借助<jsp:attribute>标签将多个JSP代码片段传递给简单标签 284
7.1.8 简单标签与传统标签的比较总结 287
7.2 标签库的描述符和部署 288
7.2.1 标签库描述文件 288
7.2.2 标签库的引用原理 291
动手体验:将TLD文件放置到jar包 292
7.3 标签文件 293
7.3.1 标签文件开发入门 293
动手体验:体验标签文件的开发 295
7.3.2 标签文件的运行原理 296
7.3.3 标签文件的基本语法 300
7.3.4 attribute指令 300
动手体验:标签属性应用实例 301
7.3.5 variable指令 302
动手体验:variable指令的同步实验 303
7.3.6 <jsp:invoke>标签 305
动手体验:测试<jsp:invoke>标签的属性 307
7.3.7 <jsp:doBody>标签 308
7.4 标签文件的应用案例 308
7.4.1 创建可重用的显示单元 308
7.4.2 为JSP页面提供填充数据 311
第8章 标准标签库(JSTL) 315
8.1 准备实验环境 315
8.2 JSTL概述 316
8.2.1 JSTL简介 316
8.2.2 安装和测试JSTL 318
8.3 核心标签库 319
8.3.1 <c:out>标签 319
8.3.2 <c:set>标签 322
8.3.3 <c:remove>标签 325
8.3.4 <c:catch>标签 325
8.3.5 <c:if>标签 327
8.3.6 <c:choose>标签 328
8.3.7 <c:forEach>标签 329
8.3.8 <c:forTokens>标签 337
8.3.9 URL相关的标签概述 339
8.3.10 <c:param>标签 339
8.3.11 <c:url>标签 340
8.3.12 <c:import>标签 341
8.3.13 <c:redirect>标签 344
8.4 国际化标签 345
8.4.1 国际化标签库概述 345
8.4.2 <fmt:setLocale>标签 346
8.4.3 <fmt:setBundle>标签 348
8.4.4 <fmt:bundle>标签 349
8.4.5 <fmt:message>标签 350
8.4.6 <fmt:param>标签 352
8.4.7 <fmt:requestEncoding>标签 353
8.4.8 <fmt:timeZone>标签 354
8.4.9 <fmt:setTimeZone> 355
8.4.10 <fmt:formatDate>标签 356
8.4.11 <fmt:parseDate>标签 358
8.4.12 <fmt:formatNumber>标签 360
8.4.13 <fmt:parseNumber>标签 363
8.5 数据库标签 365
8.5.1 <sql:setDataSource>标签 366
8.5.2 <sql:query>标签 368
8.5.3 <sql:update>标签 370
8.5.4 <sql:transaction>标签 373
8.5.5 <sql:param>标签 375
8.5.6 <sql:dateParam>标签 376
8.6 XML标签 377
8.6.1 XML标签概述 377
8.6.2 <x:parse>标签 378
8.6.3 <x:out>标签 383
8.6.4 <x:set>标签 383
8.6.5 XML选择标签和迭代标签概述 384
8.6.6 <x:if>标签 384
8.6.7 <x:choose>标签 386
8.6.8 <x:forEach>标签 387
8.6.9 <x:transform>标签 388
8.6.10 <x:param>标签 392
8.7 JSTL函数 392
8.7.1 fn:toLowerCase函数 392
8.7.2 fn:toUpperCase函数 393
8.7.3 fn:trim函数 393
8.7.4 fn:escapeXml函数 393
8.7.5 fn:length函数 394
8.7.6 fn:split函数 394
8.7.7 fn:ioin函数 395
8.7.8 fn:indexOf函数 395
8.7.9 fn:contains函数 395
8.7.10 fn:containsIgnoreCase函数 396
8.7.11 fn:startsWith函数 396
8.7.12 fn:endsWith函数 396
8.7.13 fn:replace函数 397
8.7.14 fn:substring函数 397
8.7.15 fn:substringAfter函数 398
8.7.16 fn:substringBefore函数 398
8.8 思考与实践 399
第9章 Web安全域 400
9.1 安全域概述 400
9.1.1 安全域的实现过程 400
9.1.2 安全域的应用实例 401
9.2 设置Web资源的安全约束 404
9.2.1 在web.xml文件中配置安全约束 404
9.2.2 配置访问者的登录验证方式 406
9.3 Web服务器的安全域 412
9.3.1 Tomcat服务器中的安全域 412
9.3.2 设置Tomcat服务器的内存域 413
9.3.3 设置Tomcat服务器的JDBC域 414
第10章 Tomcat的配置和管理平台 417
10.1 安装Tomcat的系统配置和管理平台 417
10.1.1 设置Tomcat的配置和管理平台的用户权限 418
10.1.2 登录Tomcat的配置和管理平台 419
10.2 Tomcat的系统配置平台 419
10.2.1 Tomcat Server目录 420
10.2.2 Resources目录 421
10.2.3 User Definition目录 421
10.3 Tomcat的Web应用程序管理平台 421
第11章 JSP文档 424
11.1 JSP文档概述 424
11.2 JSP文档 425
11.2.1 标识JSP文档 425
11.2.2 JSP文档的语法概述 427
11.2.3 名称空间声明 428
11.2.4 JSP文档的一些执行细节 433
11.3 JSP文档元素 434
11.3.1 <jsp:root>元素 434
11.3.2 <jsp:text>元素 435
11.3.3 <jsp:output>元素 436
11.3.4 <jsp:directive.page>元素 438
11.3.5 <jsp:directive.include>元素 439
11.3.6 <jsp:element>元素 439
11.3.7 <jsp:attribute>元素 440
11.3.8 <jsp:body>元素 442
11.3.9 JSP文档的模板内容 442
11.4 JSP页面的XML视图 444
11.5 XML语法格式的标签文件 445
附录A 应用程序部署描述符 446