第1章 我们做错了什么:Web反模式解释 1
1.1 本书主要内容 2
1.2 本章主要内容 3
1.3 Web应用程序开发面临的挑战 4
1.3.1 企业服务 5
1.3.2 应用服务 6
1.4 模式和反模式介绍 7
1.4.1 Web应用程序反模式 8
1.4.2 Concern Slush 9
1.4.3 Tier Leakage 11
1.4.4 Hardwired 13
1.4.5 Validation Confusion 15
1.4.6 Tight-Skins 17
1.4.7 Data Madness 18
1.5 反模式、JOS框架以及经济学 20
1.6 小结 24
第2章 Struts基础 25
2.1 JavaEdge应用程序架构 26
2.1.1 设计 26
2.1.2 使用Struts实现MVC模式 28
2.1.3 起步:JavaEdge源代码树 30
2.1.4 Command模式的作用 40
2.2 构造表示层 44
2.2.1 JavaEdge主页 45
2.2.2 Bean标签 48
2.2.3 逻辑标签 57
2.2.4 迭代式标签 58
2.2.5 条件式标签 58
2.2.6 移动式标签 61
2.3 小结 62
第3章 使用Struts的表单表示和验证机制 64
3.1 表单验证的问题 64
3.2 使用Struts进行表单验证 65
3.3 使用Struts实现表单验证 67
3.3.1 struts-config.xml文件 68
3.3.2 Struts ActionForm类 69
3.3.3 使用数据预先填充ActionForm 75
3.3.4 其他预先填充技术 78
3.3.5 正确地预先填充表单 79
3.3.6 验证表单数据 80
3.4 Struts HTML标签库 88
3.4.1 建立Struts HTML表单 90
3.4.2 使用文本和文本域输入字段 92
3.4.3 下拉列表、复选框和单选框 93
3.4.4 创建更加动态的ActionForm 95
3.4.5 ActionForm和业务逻辑 101
3.5 小结 106
第4章 使用Struts管理业务逻辑 107
4.1 业务逻辑反模式和Struts 107
4.1.1 Concern Slush和Struts 108
4.1.2 Tier Leakage和Struts 113
4.1.3 分离业务逻辑和Struts 115
4.2 实现设计模式 117
4.2.1 实现Business Delegate模式 117
4.2.2 实现Service Locator模式 122
4.2.3 继续研究服务定位器 130
4.2.4 EJB和Struts 134
4.3 处理Action类中的异常 140
4.3.1 Struts 1.0.x的异常处理 141
4.3.2 Struts 1.1和以后版本的异常处理 143
4.3.3 重新编写ApplicationException类 143
4.3.4 设置struts-config.xml文件 144
4.3.5 编写定制的ExceptionHandler 146
4.4 小结 149
第5章 使用ObjectRelational Bridge实现数据访问层的架构 151
5.1 开发数据访问策略 152
5.1.1 JavaEdge应用程序的数据访问模型 153
5.1.2 值对象 158
5.1.3 JavaEdge值对象 159
5.1.4 使用O/R映射工具 162
5.1.5 设置对象/关系映射 165
5.1.6 使用哪个序列管理器 174
5.2 使用OJB 180
5.2.1 数据检索:一个简单的例子 185
5.2.2 数据检索:一个更复杂的范例 187
5.2.3 使用OJB存储数据 189
5.2.4 使用OJB删除数据 190
5.3 集成前面的代码 191
5.4 小结 194
第6章 使用Tiles框架创建灵活的前端应用 196
6.1 Tiles框架是什么 197
6.2 启用Struts 1.1版本以使用Tiles 198
6.2.1 配置Tiles插件 199
6.2.2 tiles-defs.xml文件 201
6.2.3 添加Tiles TLD 201
6.2.4 第一个Tiles模板 201
6.3 Tiles定义是什么 204
6.4 Tiles定义:基于JSP的方法 205
6.4.1 覆写Tiles定义的属性值 207
6.4.2 在Tiles定义中使用哑值 207
6.4.3 JSP Tiles定义的劣势 208
6.4.4 分析tiles-defs.xml文件 209
6.4.5 使用Tiles定义的继承性 209
6.4.6 扩展Tiles定义 212
6.4.7 修改template.jsp文件 213
6.4.8 给tiles-defs.xml文件添加一个新的定义 214
6.4.9 修改.homePage定义 215
6.5 把Tiles定义映射到Action Forwards 216
6.6 小结 219
第7章 动态表单和Struts验证框架 221
7.1 动态表单简介 222
7.1.1 定义postStoryForm Struts表单bean 222
7.1.2 实现postStoryDynaForm.java类 223
7.1.3 关于BeanUtils和上述代码的思考 228
7.2 Jakarta Commons Validator框架 231
7.2.1 Validator框架设置 231
7.2.2 实现必填字段验证 232
7.2.3 maxlength验证规则 235
7.3 在Acti onForm类中使用Validator框架 237
7.3.1 编写自己的验证规则 239
7.3.2 实现粗俗性规则 239
7.3.3 向validator-rules.xml文件添加粗俗性检查规则 243
7.3.4 Struts验证和潜在的长期后果 245
7.3.5 在表单中实现粗俗性规则 246
7.3.6 不使用Java的ActionForm 247
7.3.7 何时使用Validator框架 247
7.4 小结 248
第8章 使用XDoclet加速Struts开发 250
8.1 安装XDoclet 251
8.2 XDoclet到底是什么 252
8.2.1 从XDoclet到源代码及其之间的步骤 255
8.2.2 可用的XDoclet标签 256
8.2.3 分析一个XDoclet标签 257
8.3 集成Ant和XDoclet 258
8.4 XDoclet和Struts 262
8.4.1 声明Struts表单bean 262
8.4.2 声明Struts动作 263
8.4.3 XDoclet和Java继承 264
8.4.4 声明应用程序异常 264
8.4.5 使用<webdocl et.../>构建struts-config.xml文件 266
8.4.6 XDoclet和Validator框架 267
8.4.7 从Ant生成Validator标签 270
8.5 小结 272
第9章 日志和调试 274
9.1 为什么使用日志 275
9.2 简单的Web应用程序日志 276
9.2.1 ServletContext提供的日志 276
9.2.2 使用Commons Logging 277
9.3 Java 1.4日志API 281
9.3.1 Apache log4j 284
9.3.2 使用log4j和Cmmons Logging 285
9.3.3 日志继承 289
9.3.4 日志性能 292
9.3.5 日志最佳实践 292
9.3.6 JBoss和log4j 296
9.3.7 在JavaEdge应用程序中集成日志 297
9.3.8 Web层的日志 303
9.3.9 使用JBoss和Eclipse调试Struts应用程序 305
9.3.10 调试JavaEdge应用程序 306
9.3.11 快速部署能力 307
9.3.12 调试Struts框架 308
9.4 小结 308
第10章 Velocity模板引擎 309
10.1 模板引擎是什么 309
10.2 开始行动 310
10.2.1 Velocity类和VelocityContext类 311
10.2.2 Velocity引擎语言 312
10.2.3 变量 313
10.2.4 访问变量 313
10.2.5 变量值 313
10.2.6 JavaBean属性 318
10.2.7 算术 318
10.2.8 指令 319
10.2.9 宏 327
10.2.10 Struts和Velocity 328
10.3 使用Velocity的最佳实践 335
10.3.1 使用宏 335
10.3.2 知道何时使用#parse指令,何时使用#include指令 335
10.3.3 使用JavaBean属性名称 335
10.4 小结 335
第11章 扩展Struts框架 336
11.1 扩展Action和ActionForm 336
11.1.1 向自己的动作提供通用服务 337
11.1.2 干涉动作执行 341
11.2 扩展RequestProcessor 343
11.2.1 创建RequestProcessor 343
11.2.2 使用RequestProcessor,而不使用Filter 344
11.2.3 使用RequestProcessor验证本地访问 347
11.3 创建配置Bean 347
11.4 再次研究RequestProcessor 349
11.5 创建一个插件 353
11.5.1 新闻列表服务基础 353
11.5.2 NewsletterManager 353
11.5.3 NewsletterTask 357
11.5.4 NewsletterPlugIn 358
11.5.5 配置插件 361
11.6 小结 362
第12章 Struts和Ajax 363
12.1 Ajax解密 363
12.1.1 在Google中使用Ajax 363
12.1.2 在Yahoo中使用Ajax 364
12.2 在哪些地方应该使用Ajax 364
12.2.1 Ajax和Web 20 364
12.2.2 Ajax和SOA 364
12.3 Ajax内部机制 365
12.3.1 Ajax请求-答复循环 365
12.3.2 XMLHttpRequest对象 366
12.4 Ajax和Struts 367
12.4.1 Cities.jsp文件 367
12.4.2 GetCitiesNamesAction 370
12.4.3 CitiesDA0 371
12.5 小结 372
附录A JavaEdge设置和安装 373
附录B Struts开发工具 380
附录C Struts和Strecks 407