1 Struts的来龙去脉 7
1.1 木匠的寓言 7
1.2 Struts是什么? 8
1.2.1 框架 8
1.2.2 Web应用 9
1.2.3 Struts框架中的组件 10
1.3 Struts的状况:发展现状 12
1.3.1 Struts版本 12
1.3.2 其他可以和Struts一同使用的应用 12
1.4 代码背后的面孔:Struts的开发 13
1.4.1 核心开发者 13
1.5 Struts将走向何处 14
1.5.1 集成JSTL 14
1.5.2 集成JavaServer Faces 14
1.5.3 Struts将会被更广泛地接受 14
1.6 结论 15
2 Model-View-Controller设计模式:'Model 2' JSP开发 17
2.1 Model-View-Controller设计模式 18
2.2 Model 1与Model 2的起源 20
2.2.1 JSP规范0.92版 20
2.2.2 JavaWorld, 1999 21
2.2.3 时至Craig McClanahan, Jakarta Tomcat, 以及Struts 21
2.3 Struts如何实现Model 2模式 21
2.3.1 用于Web应用的MVC架构 22
2.3.2 Model组件 23
2.3.3 View组件 24
2.3.4 Controller组件 25
2.4 结论 25
3 Hello World! 第一个Struts应用 27
3.1 Hello World! 应用的需求 28
3.2 应用Model-View-Controller模式 28
3.3 View组件:HTML表单以及表单Bean 29
3.4 MessageResources和Application.properties文件 33
3.5 Struts表单Bean:HelloForm.java 33
3.6 数据验证以及ActionError 36
3.7 Controller组件:HelloAction.java 38
3.7.1 Action类是如何工作的 40
3.7.2 在MessageResources中访问特定Locale的文本 41
3.7.3 业务逻辑级验证 42
3.7.4 与Model组件交互 42
3.7.5 向View组件传递数据 43
3.7.6 跳转到合适的View组件 44
3.8 Model组件(HelloModel.java) 44
3.9 通过使用属性向View传递数据:Constants.java 46
3.10 将所有部分整合到一起:struts-config.xml文件 47
3.11 结论 49
4 HTTP协议: Web应用的通信与控制 51
4.1 HTTP协议以及请求/响应循环 52
4.2 控制信息:HTTP头和HTTP响应码 55
4.2.1 HTTP响应码 55
4.2.2 HTTP请求和响应头 57
4.3 HTTP Cookies和会话/用户管理 60
4.4 结论 63
5 JSP, 标记库和JSTL: 使用Java扩充页面 65
5.1 Servlets和JSP 65
5.1.1 JSP的威力 67
5.2 JSP中的对象作用范围 70
5.2.1 除会话范围之外的其它对象范围 71
5.2.2 从JSP中存取范围对象 72
5.3 使用Bean来隐藏业务逻辑 73
5.4 JSP自定义标记库 78
5.5 Web应用部署 81
5.5.1 WAR文件 83
5.6 JSTL:标准标记库 84
5.6.1 通用目的操作 85
5.6.2 条件操作 85
5.6.3 迭代操作 85
5.6.4 URL相关的操作 85
5.6.5 国际化操作 85
5.6.6 格式化操作 85
5.6.7 SQL操作 86
5.6.8 XML操作 86
5.6.9 表达式语言 86
5.7 JSP与J2EE:一幅宏图 86
5.8 J2EE与Struts 88
5.9 结论 88
6 简单的应用: 财务投资管理 89
6.1 需求:从头到脚覆盖需求 89
6.2 从线框(Wireframes)开始 90
6.2.1 主页面 90
6.2.2 创建账号页面 91
6.2.3 交易条目(Transaction Entry) 91
6.3 开发用况(Use Cases) 94
6.3.1 用况:初始页面 95
6.3.2 用况:账号创建页面 95
6.3.3 用况:已登录用户的主页面 96
6.3.4 用况:添加交易页面 96
6.4 数据源与存储 98
6.5 选择技术 99
6.5.1 Torque 99
6.6 结论 105
7 View组件: 最终用户之所见 107
7.1 ActionForm 107
7.2 JSP文件:Alpha与Omega 116
7.3 自动类型转换的危险 123
7.4 html:errors标记 127
7.5 国际化 127
7.6 结论 130
8 Controller: 导引Action 131
8.1 Action类 131
8.2 访问会话和其它表单Bean 136
8.3 用户验证和Struts 150
8.4 在应用内部和外部转移控制 152
8.5 结论 153
9 Model组件: 业务建模 155
9.1 设计良好的Model 156
9.2 更多增强独立性的技术 159
9.3 结论 165
10 struts-config.xml文件: 整合所有部件 167
10.1 struts-config的DTD 167
10.1.1 数据源 168
10.1.2 表单Bean 171
10.1.3 全局异常(Global Exceptions) 172
10.1.4 全局转发(Global Forwards) 174
10.1.5 Action映射 175
10.1.6 Controller 177
10.1.7 消息资源 178
10.1.8 Plug-in 179
10.1.9 动态地访问和改变配置 180
10.2 config文件的前生后世 180
10.3 结论 181
11 Struts标记库是如何工作的: 内部探察 183
11.1 回顾JSP标记库 184
11.2 理解Struts标记如何工作:<bean:page>标记 184
11.2.1 <bean:page>标记的Java代码 185
11.2.2 Struts Bean 标记库描述文件(struts-bean.tld) 190
11.2.3 使用<bean:page>标记:整合所有部件 191
11.3 与Java标准标记库相比较 192
11.4 结论 194
12 Struts HTML标记: 页面构造和表单处理 195
12.1 Struts标记、JSP自定义标记以及Java Scriptlets:什么是正确的平衡 196
12.2 使用Struts HTML标记渲染HTML基本元素 197
12.2.1 <html:html>标记 202
12.2.2 <html:base>标记 202
12.2.3 <html:link>和<html:rewrite>标记 203
12.2.4 <html:img>标记 207
12.3 基本的表单处理 208
12.3.1 表单的基本知识:<html:form>标记 212
12.3.2 <html:text>标记 213
12.3.3 <html:cancel>标记 213
12.3.4 <html:reset>标记 215
12.3.5 <html:submit>标记 216
12.3.6 <html:hidden>标记 216
12.4 复选框和单选框 217
12.4.1 <html:checkbox>标记 223
12.4.2 <html:multibox>标记 224
12.4.3 <html:radio>标记 225
12.5 下拉和选取/选项列表 225
12.5.1 <html:select>标记 231
12.5.2 <html:option>标记 232
12.5.3 <html:options>标记 233
12.5.4 <html:optionsCollection>标记 235
12.6 输入验证与<html:errors> 236
12.6.1 <html:errors>标记 240
12.6.2 错误处理是如何工作的 241
12.6.3 为错误文本指定资源包,并对文本进行本地化 242
12.6.4 指定全局的错误消息,相对于字段相关 243
12.6.5 使用参数定制错误消息 243
12.7 使用<html:file>上传文件 244
12.7.1 <html:file>标记 249
12.7.2 在JSP文件中使用<html:file> 249
12.7.3 在表单中指定私有的FormFile属性 250
12.7.4 在Action类中处理文件上传 250
12.8 结论 251
13 Struts Bean标记: 保存与传输数据 253
13.1 使用Struts Bean标记来访问Servlet上下文的有关内容 253
13.1.1 <bean:cookie>标记 257
13.1.2 <bean:header>标记 257
13.1.3 <bean:parameter>标记 257
13.1.4 <bean:page>标记 258
13.2 使用Struts Bean标记来访问Java资源 258
13.2.1 <bean:message>标记 261
13.2.2 <bean:resource>标记 262
13.2.3 <bean:struts>标记 263
13.2.4 <bean:include>标记 263
13.3 使用Struts Bean标记来访问Bean属性 263
13.3.1 <bean:define>标记 266
13.3.2 <bean:size>标记 267
13.3.3 <bean:write>标记 267
13.4 结论 268
14 Struts逻辑标记: 条件性表达逻辑 269
14.1 使用Struts逻辑标记进行基于值的条件显示 270
14.1.1 <logic:equal>和<logic:notEqual>标记 282
14.1.2 <logic:lessThan>和<logic:greaterThan>标记 282
14.1.3 <logic:lessEqual>和<logic:greaterEqual>标记 283
14.2 使用Struts逻辑标记进行子串匹配 283
14.2.1 <logic:match>与<logic:noMatch>标记 285
14.3 使用Struts逻辑标记来迭代 285
14.3.1 <logic:iterate>标记 287
14.4 使用Struts逻辑标记来检测值是否存在 288
14.4.1 <logic:empty>和<logic:notEmpty>标记 291
14.4.2 <logic:present>和<logic:notPresent>标记 292
14.4.3 <logic:messagesPresent>和<logic:messagesNotPresent>标记 292
14.5 使用Struts逻辑标记来转移控制 292
14.5.1 <logic:forward>标记 292
14.5.2 <logic:redirect>标记 293
14.6 结论 293
15 Struts嵌套与模板标记库: 子属性处理与内容插入处理 295
15.1 使用Struts嵌套标记 296
15.2 使用Struts模板标记 304
15.3 结论 309
16 Struts Tiles标记库: 创建主文档模板 311
16.1 Tiles总览 311
16.2 启用Tiles 312
16.3 定义之配置文件(Definitions Configuration File) 312
16.4 为Tiles编写JSP文件 313
16.5 修改Action 316
16.6 把所有部分整合到一起 317
16.7 Tiles的其它方面 317
16.8 结论 318
17 DynaForm和验证器 319
17.1 DynaForm:不使用Java的表单 319
17.2 DynaBean和Struts 320
17.2.1 <form-property>标记 326
17.3 验证器:自动字段检验 328
17.3.1 为NewUserAddress添加Validator 332
17.3.2 最新的validator相关新闻 335
17.3.3 定义新的验证 336
17.4 结论 340
18 结合EJB使用Struts 341
18.1 EJB适配Model组件 341
18.2 EJB技术的快速回顾 342
18.2.1 EJB存活在EJB容器中 342
18.2.2 EJB剖析 343
18.3 结合Struts使用不同的EJB类型 344
18.3.1 Entity Bean 344
18.3.2 无状态会话Bean(Stateless Session Bean) 345
18.3.3 有状态会话Bean(Stateful Session Bean) 346
18.3.4 消息驱动Bean(Message-Driven Bean) 346
18.3.5 结合EJB使用Struts的规则总结 347
18.3.6 Struts和EJB的未来方向 347
18.4 Struts/EJB应用示例 348
18.4.1 应用示例:更新用户信息 348
18.4.2 配置和建立应用 349
18.4.3 检视示例应用的源文件 358
18.5 结论 374
19 结合Web服务使用Struts 375
19.1 Web适配Struts的Model组件 376
19.2 快速回顾Web服务技术 377
19.2.1 Web服务通信如何工作 377
19.2.2 比较EJB和Web服务方法 378
19.2.3 剖析Web服务 379
19.3 如何结合Web服务使用Struts 380
19.4 Struts/Web服务的应用示例 381
19.4.1 应用:更新客户信息 381
19.4.2 安装示例应用文件 382
19.4.3 在构建环境中配置Axis 388
19.5 结论 415
20 构建、部署和测试Struts应用 417
20.1 集成和渐增式的构建/测试循环:It’s Extreme! 417
20.2 使用Jakarta Ant来构建和部署Struts应用 418
20.2.1 推荐的开发目录结构 419
20.2.2 被部署的应用(以及.war文件)所需的目录结构 420
20.3 编写build.xml文件来使用Ant构建Struts应用 421
20.4 使用集成和即时测试的Struts极限开发 429
20.4.1 测试方法和工具的概述 429
20.4.2 JUnit:驱动即时测试(Ongoing Testing)的引擎 430
20.4.3 Cactus:一个容器内测试框架 430
20.4.4 StrutsTestCase:用于测试Struts应用的JUnit扩展 431
20.5 使用JUnit、StrutsTestCase和Ant进行模拟对象测试 431
20.5.1 配置你的系统以运行模拟对象测试 433
20.5.2 运行模拟测试用例并查看结果 436
20.5.3 在模拟测试用例中测试附加的Struts功能 437
20.5.4 运行模拟测试用例并查看结果 439
20.6 使用Cactus、JUnit、StrutsTestCase和Ant进行容器内测试 440
20.6.1 修改测试用例,以使用Cactus进行容器内测试 441
20.6.2 修改你的系统配置来使用Cactus进行容器内测试 442
20.6.3 运行容器内测试并查看结果 446
20.7 结论 447
附录A 从CD中安装Struts和示例应用 449
A.1 附带CD-ROM中包含的软件列表 449
A.2 第1步:安装JDK和Tomcat 450
A.3 第2步:安装MySQL 450
A.4 将WAR文件拷贝到Tomcat的webapps目录中 451
A.5 重新启动Tomcat 452
索引 453