简介
2006年,WebWork与Struts这两个优秀的Java Web框架的开发团队,开始合作开发一个新的、结合了WebWork与Struts的优点,并且更加优雅、扩展性更强的框架,命名为“Struts 2”,并于2007年上半年推出了Struts 2的正式版本。本书讲解的是Struts 2中号称“最佳可用”的2.0.11版本。
本书最大的特点就是深入、详尽、解惑。
深入 本书深入剖析了Struts 2内部的运行机制,在知识的讲解上,结合了Web程序的运行机制与Struts 2框架的内部工作机制,以帮助读者更深入地掌握基于Struts 2的Web开发。
详尽 本书内容详尽,几乎涵盖了Struts 2中所有的知识点。本书力求在每一个知识点的讲解上都清晰明了,而不是简单地一带而过,让读者对所学的知识理解得更为透彻。
解惑 本书秉承作者一贯的让读者知其然而知其所以然的写作风格,在知识的讲解上,不光让读者知道怎么用这个知识,还让读者知道为什么要这么用。在问题的分析解决上,从根源入手,帮助读者了解问题发生的根本原因,培养读者发现问题、分析问题、解决问题的能力。
本书语言生动、通俗易懂、讲解细致,手把手地教你学习完成示例程序。全书给出了大量的示例,相信通过这些示例的学习,读者一定可以更好、更快地掌握Struts 2的应用开发。
本书介绍了Struts 2最新的注解(Annotation)配置方式,这在国内外的同类图书中尚属首次。本书修正了Struts 2官方文档中的不少错误,并针对Struts 2本身的一些Bug提供了解决方案。
本书可以作为Struts 2的学习用书,也可以作为从事Struts 2开发的程序员的参考用书和必备手册,还可以作为Struts 2官方文档的有益补充。
目录
第1章 认识Struts 2. 1
1.1 什么是Web框架 1
1.1.1 模型1 2
1.1.2 模型2和MVC 5
1.1.3 Web框架的诞生 9
1.2 从Struts 1到Struts 2 11
1.2.1 其他Web框架 11
1.2.2 Struts 1的缺点 12
1.2.3 市场与技术的结合——Struts 2的诞生 14
1.3 准备开发环境 14
1.4 小结 23
第2章 Struts 2初体验 24
2.1 下载和安装Struts 2 24
2.2 使用Subversion来获取
2.2 Struts 2的源代码 25
2.3 Hello World程序 28
2.4 Struts 2项目开发总结 38
2.5 小结 38
第3章 由“登录”开始 39
3.1 使用领域对象接收用户输入 39
3.2 使用ModelDriven action 44
3.3 使用action的属性接收用户输入 46
3.4 访问request、session和application对象 47
3.4.1 与Servlet API解耦的访问方式 47
3.4.2 与Servlet API耦合的访问方式 52
3.5 小结 56
第4章 Struts 2架构剖析 57
4.1 XWork 2——Struts 2的基础 57
4.2 Struts 2的体系结构 58
4.3 Struts 2框架的调用流程 61
4.4 小结 62
第5章 Struts 2配置详解 63
5.1 Struts 2的配置文件 63
5.1.1 web.xml 64
5.1.2 struts.properties 65
5.1.3 struts-default.xml 69
5.1.4 struts.xml 70
5.1.5 struts-plugin.xml 74
5.1.6 静态内容 75
5.2 struts.xml配置详解 75
5.2.1 Bean配置 75
5.2.2 常量(Constant)的配置 76
5.2.3 包(Package)配置 78
5.2.4 名称空间(Namespace)配置 80
5.2.5 包含(Include)配置 81
5.2.6 拦截器(Interceptor)配置 83
5.2.7 Action配置 86
5.2.8 Result配置 86
5.2.9 异常(Exception)配置 86
5.3 配置Action 86
5.3.1 Action映射 86
5.3.2 使用method属性 87
5.3.3 动态方法调用 90
5.3.4 模拟Struts 1的
3.4.1 ForwardAction 90
5.3.5 默认的action 91
5.3.6 通配符映射 92
5.4 配置Result 95
5.4.1 结果映射 95
5.4.2 结果类型 97
5.4.3 常用结果类型 99
5.4.3.1 dispatcher结果类型 99
5.4.3.2 redirect结果类型 100
5.4.3.3 redirectAction结果类型 101
5.4.3.4 plainText结果类型 103
5.4.4 全局结果 103
5.4.5 动态结果 104
5.4.6 在结果配置中使用参数 106
5.5 异常处理 107
5.6 使用注解配置Action 110
5.6.1 与Action配置相关的注解 111
5.6.2 使用注解配置Action的注意事项 112
5.6.3 使用注解配置Action的实例 113
5.7 小结 115
第6章 准备用户注册程序 116
6.1 创建数据库表 116
6.2 编写用户注册程序 118
6.3 解决中文乱码问题 129
6.4 Struts 2对依赖注入的支持 130
6.4.1 Spring插件 130
6.4.2 在用户注册程序中集成Spring 134
6.5 小结 136
第7章 Struts 2中的OGNL 137
7.1 为什么使用OGNL 137
7.2 OGNL基础 138
7.3 OGNL表达式 141
7.3.1 常量 141
7.3.2 操作符 142
7.3.3 访问JavaBean的属性 143
7.3.4 调用方法 143
7.3.5 调用静态方法和静态字段 143
7.3.6 调用构造方法 144
7.3.7 索引访问 144
7.3.7.1 数组和列表索引 144
7.3.7.2 JavaBean的索引属性 144
7.3.7.3 OGNL对象索引属性 145
7.3.8 对集合进行操作 145
7.3.8.1 创建集合 145
7.3.8.2 集合的伪属性 146
7.3.8.3 投影(projection) 147
7.3.8.4 选择(selection) 147
7.3.9 lambda表达式 148
7.4 OGNL的类型转换 148
7.5 Struts 2在OGNL基础上的增强 149
7.5.1 值栈(ValueStack) 149
7.5.2 [N]语法 150
7.5.3 top关键字 151
7.5.4 访问静态成员 151
7.5.5 值栈中的Action实例 151
7.5.6 Struts 2中的命名对象 151
7.6 与JSP 2.1的冲突 152
7.7 OGNL表达式的综合应用 152
7.8 小结 165
第8章 Struts 2的标签库 166
8.1 引用Struts 2的标签库 167
8.2 标签的语法 167
8.3 通用标签 168
8.3.1 数据标签 168
8.3.1.1 property标签 168
8.3.1.2 set标签 169
8.3.1.3 push标签 170
8.3.1.4 param标签 172
8.3.1.5 bean标签 173
8.3.1.6 action标签 174
8.3.1.7 include标签 177
8.3.1.8 url标签 178
8.3.1.9 i18n和text标签 181
8.3.1.10 date标签 184
8.3.1.11 debug标签 186
8.3.2 控制标签 187
8.3.2.1 if/elseif/else标签 188
8.3.2.2 iterator标签 189
8.3.2.3 append标签 191
8.3.2.4 merge标签 192
8.3.2.5 generator标签 194
8.3.2.6 subset标签 197
8.3.2.7 sort标签 199
8.4 UI标签 200
8.4.1 模板和主题 201
8.4.1.1 Struts 2支持的模板引擎 201
8.4.1.2 加载模板 201
8.4.1.3 选择主题 202
8.4.1.4 创建定制的主题 203
8.4.1.5 Struts 2内置的4种主题 203
8.4.2 表单标签 206
8.4.2.1 表单标签的公共属性 206
8.4.2.2 表单标签的name和value属性 208
8.4.2.3 ID名分配 209
8.4.2.4 form标签 209
8.4.2.5 textfield标签 210
8.4.2.6 password标签 211
8.4.2.7 textarea标签 211
8.4.2.8 select标签 212
8.4.2.9 optgroup标签 217
8.4.2.10 radio标签 218
8.4.2.11 checkbox标签 219
8.4.2.12 checkboxlist标签 220
8.4.2.13 doubleselect标签 221
8.4.2.14 combobox标签 226
8.4.2.15 optiontransferselect标签.. 228
8.4.2.16 updownselect标签 231
8.4.2.17 hidden标签 233
8.4.2.18 submit标签 233
8.4.2.19 reset标签 235
8.4.2.20 label标签 235
8.4.2.21 token标签 236
8.4.2.22 file标签 236
8.4.2.23 head标签 236
8.4.3 非表单标签 237
8.4.3.1 component标签 237
8.4.3.2 a标签 240
8.4.3.3 actionerror、actionmessage和fielderror标签 240
8.5 使用Struts 2的表单标签改写用户注册程序中的注册页面 242
8.6 小结 247
第9章 国际化 248
9.1 国际化与本地化 248
9.1.1 Locale 249
9.1.2 资源包 251
9.1.3 消息格式化 253
9.2 Struts 2对国际化的支持 254
9.2.1 Struts 2资源包的组织和加载方式 255
9.2.2 在消息文本中使用参数 255
9.2.3 访问国际化消息 256
9.3 将用户注册程序国际化 258
9.4 错误消息的国际化 262
9.5 Struts 2设定访问用户的locale的流程 265
9.6 为用户注册程序添加英文版本 266
9.7 小结 269
第10章 拦截器 271
10.1 拦截器的工作方式 271
10.2 编写拦截器类 272
10.3 Struts 2自带的拦截器 274
10.4 配置拦截器 281
10.5 PreResultListener接口 282
10.6 开发执行安全验证的拦截器 285
10.7 使用拦截器注解 290
10.8 小结 294
第11章 类型转换 295
11.1 传统的数据处理过程 296
11.2 Struts 2对类型转换的支持 296
11.2.1 使用OGNL表达式命名参数 297
11.2.2 Struts 2内置的类型转换器 297
11.2.3 null属性的处理 298
11.2.4 对List、Map和Set的支持 298
11.2.4.1 使用List来保存图书信息的实例 298
11.2.4.2 使用Map来保存图书信息的实例 303
11.2.5 使用Set来保存图书信息的实例 307
11.3 创建自定义的类型转换器 311
11.4 类型转换错误的处理 318
11.5 使用类型转换注解 321
11.5.1 TypeConversion注解 321
11.5.2 Conversion注解 322
11.5.3 Element注解 323
11.5.4 Key注解 323
11.5.5 KeyProperty注解 324
11.5.6 CreateIfNull注解 324
11.6 小结 324
第12章 对输入数据进行验证 325
12.1 手动验证 326
12.1.1 在Action的execute()方法中进行验证 326
12.1.2 在validateXxx()方法中进行验证 328
12.1.3 在validate()方法中进行验证 330
12.2 使用验证框架 332
12.2.1 什么是验证器 332
12.2.2 注册验证器 332
12.2.3 开启验证 333
12.2.4 定义验证规则 333
12.2.5 验证文件的查找顺序 335
12.2.6 Struts 2内置的验证器 336
12.2.7 在用户注册程序中使用验证框架 345
12.2.8 确认密码的验证 349
12.2.9 短路验证 350
12.2.10 开发自己的验证器 353
12.2.11 使用visitor字段验证器复用验证 363
12.2.12 同时使用验证框架和手动验证 367
12.2.13 客户端JavaScript验证 368
12.3 使用验证注解 369
12.3.1 与验证相关的注解 369
12.3.2 在用户注册程序中使用验证注解 379
12.4 小结 383
第13章 使用FreeMarker作为表现层 384
13.1 FreeMarker简介 385
13.1.1 FreeMarker是什么 385
13.1.2 为什么要使用FreeMarker 386
13.2 FreeMarker的工作原理 386
13.2.1 模板+数据模型=输出 386
13.2.2 数据模型 388
13.2.2.1 scalar变量 391
13.2.2.2 hash和sequence变量 392
13.2.2.3 方法变量 392
13.2.2.4 宏变量 392
13.2.3 模板 392
13.3 FreeMarker的语法和操作 393
13.3.1 准备工作 393
13.3.2 表达式 395
13.3.2.1 直接指定值 395
13.3.2.2 访问变量 397
13.3.2.3 字符串操作 399
13.3.2.4 序列操作 400
13.3.2.5 散列操作 400
13.3.2.6 算术运算 400
13.3.2.7 比较操作 401
13.3.2.8 逻辑操作 402
13.3.2.9 内置函数 402
13.3.2.10 方法调用 403
13.3.2.11 缺少值处理操作符 403
13.3.2.12 操作符优先级 405
13.3.3 插值(interpolation) 406
13.3.4 指令 407
13.3.4.1 if/elseif/else指令 408
13.3.4.2 switch/case/default/break指令 409
13.3.4.3 list/break指令 411
13.3.4.4 include指令 412
13.3.4.5 import指令和名称空间 414
13.3.4.6 assign指令 418
13.3.4.7 global指令 419
13.3.4.8 local指令 420
13.3.4.9 setting指令 420
13.3.4.10 macro、nested和return指令 421
13.3.4.11 function和return指令 425
13.3.4.12 noparse指令 426
13.3.4.13 escape和noescape指令 427
13.3.5 内置函数 429
13.3.5.1 操作字符串 429
13.3.5.2 操作数字 437
13.3.5.3 操作日期 439
13.3.5.4 操作布尔值 441
13.3.5.5 操作序列 441
13.3.5.6 操作散列 446
13.3.6 在模板中定义变量 447
13.4 Struts 2对FreeMarker的支持 449
13.4.1 FreeMarker标签 449
13.4.2 在FreeMarker标签中
13.4.2 使用动态属性 450
13.4.3 JSP标签支持 450
13.4.4 变量解析与内置变量 451
13.4.5 访问Servlet/JSP范围对象 451
13.4.6 类型转换与本地化 453
13.5 在用户注册程序中使用FreeMarker来实现表现层 453
13.6 小结 459
第14章 使用SiteMesh控制页面布局 461
14.1 SiteMesh简介 462
14.2 下载并安装SiteMesh 462
14.3 感受SiteMesh 464
14.4 SiteMesh的工作原理 467
14.5 SiteMesh的标签库 468
14.5.1 decorator标签库 469
14.5.2 page标签库 470
14.6 在装饰器中获取原始页面的内容 470
14.7 装饰器的组合应用 471
14.8 装饰器映射器 475
14.9 Struts 2对SiteMesh的支持 479
14.10 在用户注册程序中使用SiteMesh进行页面布局 480
14.10.1 使用JSP作为表现层 480
14.10.2 使用FreeMarker作为表现层 484
14.11 小结 488
第15章 避免表单重复提交与等待页面 489
15.1 避免表单重复提交 489
15.1.1 避免表单重复提交的实现原理 490
15.1.2 Struts 2的实现方式 490
15.1.3 使用TokenInterceptor 491
15.1.4 使用TokenSessionStoreInterceptor 493
15.2 自动显示等待页面 493
15.2.1 ExecuteAndWaitInterceptor 的工作机制 494
15.2.2 使用ExecuteAndWaitInterceptor 495
15.3 小结 497
第16章 文件上传和下载 498
16.1 文件上传 498
16.1.1 基于表单的文件上传 498
16.1.2 文件上传格式分析 499
16.1.3 Struts 2对文件上传的支持 501
16.1.4 在Struts 2中实现文件上传 502
16.1.5 对文件上传进行更多的控制 507
16.1.6 多文件上传 509
16.2 文件下载 515
16.2.1 Struts 2对文件下载的支持 515
16.2.2 在Struts 2中实现文件下载 516
16.2.3 改进下载程序 518
16.3 小结 521
第17章 在Struts 2中实现CRUD 522
17.1 准备工作 522
17.2 文章分类的CRUD操作 528
17.3 小结 533
第18章 Struts 2对Ajax的支持 535
18.1 Ajax快速入门 535
18.1.1 Ajax简介 536
18.1.2 DOM 537
18.1.3 XMLHttpRequest 539
18.2 Ajax应用开发 540
18.2.1 使用XML作为数据的载体 541
18.2.2 使用JSON串作为数据的载体 551
18.2.2.1 理解JSON 552
18.2.2.2 下载JSON的Java实现 554
18.2.2.3 下载JSON的JavaScript脚本 555
18.2.2.4 使用JSON作为图书信息的数据
18.2.2.2 格式 555
18.2.3 使用Dojo简化Ajax应用的开发 561
18.2.3.1 Dojo概述 561
18.2.3.2 下载Dojo工具包 565
18.2.3.3 在ch18 Web程序中使用Dojo 565
18.3 在Struts 2中使用JSON插件 570
18.3.1 JSON插件 570
18.3.1.1 JSON插件概述 571
18.3.1.2 定制序列化和反序列化 571
18.3.1.3 下载JSON插件 572
18.3.2 使用JSON插件的实例 573
18.4 Struts 2的Ajax标签 578
18.4.1 Ajax标签的基础知识 579
18.4.1.1 共同的属性 579
18.4.1.2 等待指示符 579
18.4.1.3 事件发布/订阅模型 580
18.4.1.4 URL 580
18.4.1.5 阻止请求 580
18.4.2 使用Ajax标签前的准备工作 581
18.4.3 div标签 583
18.4.4 submit标签 593
18.4.5 a标签 597
18.4.6 tabbedPanel标签 599
18.4.7 autocompleter标签 604
18.4.7.1 autocompleter标签简介 604
18.4.7.2 准备工作 605
18.4.7.3 autocompleter标签用法详析 608
18.4.8 tree和treenode标签 614
18.4.8.1 用tree和treenode标签构建静态树 614
18.4.8.2 用tree标签构建动态树 617
18.5 Struts 2对DWR的支持 623
18.6 小结 630
第19章 集成Hibernate和Spring 631
19.1 Hibernate简介 632
19.2 Hibernate的下载和安装 632
19.3 Hibernate快速入门 633
19.3.1 配置文件 633
19.3.2 主要接口和类 635
19.3.3 总结 638
19.4 在Struts 2中集成Hibernate 638
19.5 集成Spring 647
19.6 小结 651
第20章 在Struts 2中开发Struts 1的Web应用 652
20.1 Struts 1插件 652
20.1.1 Struts 1插件的工作原理 652
20.1.2 使用Struts 1插件 653
20.2 用户注册实例 656
20.2.1 准备工作 656
20.2.2 阶段1:简单的Struts 1 Action 658
20.2.3 阶段2:带有ActionForm的Struts 1 Action 660
20.2.4 阶段3:添加手动验证 664
20.2.5 阶段4:使用CommonsValidator验证框架 665
20.3 小结 670
附录A Struts 1与Struts 2的对比 671
附录B WebWork 2与Struts 2的对比 673
附录C 从WebWork 2移植到Struts 2... 675
1.1 什么是Web框架 1
1.1.1 模型1 2
1.1.2 模型2和MVC 5
1.1.3 Web框架的诞生 9
1.2 从Struts 1到Struts 2 11
1.2.1 其他Web框架 11
1.2.2 Struts 1的缺点 12
1.2.3 市场与技术的结合——Struts 2的诞生 14
1.3 准备开发环境 14
1.4 小结 23
第2章 Struts 2初体验 24
2.1 下载和安装Struts 2 24
2.2 使用Subversion来获取
2.2 Struts 2的源代码 25
2.3 Hello World程序 28
2.4 Struts 2项目开发总结 38
2.5 小结 38
第3章 由“登录”开始 39
3.1 使用领域对象接收用户输入 39
3.2 使用ModelDriven action 44
3.3 使用action的属性接收用户输入 46
3.4 访问request、session和application对象 47
3.4.1 与Servlet API解耦的访问方式 47
3.4.2 与Servlet API耦合的访问方式 52
3.5 小结 56
第4章 Struts 2架构剖析 57
4.1 XWork 2——Struts 2的基础 57
4.2 Struts 2的体系结构 58
4.3 Struts 2框架的调用流程 61
4.4 小结 62
第5章 Struts 2配置详解 63
5.1 Struts 2的配置文件 63
5.1.1 web.xml 64
5.1.2 struts.properties 65
5.1.3 struts-default.xml 69
5.1.4 struts.xml 70
5.1.5 struts-plugin.xml 74
5.1.6 静态内容 75
5.2 struts.xml配置详解 75
5.2.1 Bean配置 75
5.2.2 常量(Constant)的配置 76
5.2.3 包(Package)配置 78
5.2.4 名称空间(Namespace)配置 80
5.2.5 包含(Include)配置 81
5.2.6 拦截器(Interceptor)配置 83
5.2.7 Action配置 86
5.2.8 Result配置 86
5.2.9 异常(Exception)配置 86
5.3 配置Action 86
5.3.1 Action映射 86
5.3.2 使用method属性 87
5.3.3 动态方法调用 90
5.3.4 模拟Struts 1的
3.4.1 ForwardAction 90
5.3.5 默认的action 91
5.3.6 通配符映射 92
5.4 配置Result 95
5.4.1 结果映射 95
5.4.2 结果类型 97
5.4.3 常用结果类型 99
5.4.3.1 dispatcher结果类型 99
5.4.3.2 redirect结果类型 100
5.4.3.3 redirectAction结果类型 101
5.4.3.4 plainText结果类型 103
5.4.4 全局结果 103
5.4.5 动态结果 104
5.4.6 在结果配置中使用参数 106
5.5 异常处理 107
5.6 使用注解配置Action 110
5.6.1 与Action配置相关的注解 111
5.6.2 使用注解配置Action的注意事项 112
5.6.3 使用注解配置Action的实例 113
5.7 小结 115
第6章 准备用户注册程序 116
6.1 创建数据库表 116
6.2 编写用户注册程序 118
6.3 解决中文乱码问题 129
6.4 Struts 2对依赖注入的支持 130
6.4.1 Spring插件 130
6.4.2 在用户注册程序中集成Spring 134
6.5 小结 136
第7章 Struts 2中的OGNL 137
7.1 为什么使用OGNL 137
7.2 OGNL基础 138
7.3 OGNL表达式 141
7.3.1 常量 141
7.3.2 操作符 142
7.3.3 访问JavaBean的属性 143
7.3.4 调用方法 143
7.3.5 调用静态方法和静态字段 143
7.3.6 调用构造方法 144
7.3.7 索引访问 144
7.3.7.1 数组和列表索引 144
7.3.7.2 JavaBean的索引属性 144
7.3.7.3 OGNL对象索引属性 145
7.3.8 对集合进行操作 145
7.3.8.1 创建集合 145
7.3.8.2 集合的伪属性 146
7.3.8.3 投影(projection) 147
7.3.8.4 选择(selection) 147
7.3.9 lambda表达式 148
7.4 OGNL的类型转换 148
7.5 Struts 2在OGNL基础上的增强 149
7.5.1 值栈(ValueStack) 149
7.5.2 [N]语法 150
7.5.3 top关键字 151
7.5.4 访问静态成员 151
7.5.5 值栈中的Action实例 151
7.5.6 Struts 2中的命名对象 151
7.6 与JSP 2.1的冲突 152
7.7 OGNL表达式的综合应用 152
7.8 小结 165
第8章 Struts 2的标签库 166
8.1 引用Struts 2的标签库 167
8.2 标签的语法 167
8.3 通用标签 168
8.3.1 数据标签 168
8.3.1.1 property标签 168
8.3.1.2 set标签 169
8.3.1.3 push标签 170
8.3.1.4 param标签 172
8.3.1.5 bean标签 173
8.3.1.6 action标签 174
8.3.1.7 include标签 177
8.3.1.8 url标签 178
8.3.1.9 i18n和text标签 181
8.3.1.10 date标签 184
8.3.1.11 debug标签 186
8.3.2 控制标签 187
8.3.2.1 if/elseif/else标签 188
8.3.2.2 iterator标签 189
8.3.2.3 append标签 191
8.3.2.4 merge标签 192
8.3.2.5 generator标签 194
8.3.2.6 subset标签 197
8.3.2.7 sort标签 199
8.4 UI标签 200
8.4.1 模板和主题 201
8.4.1.1 Struts 2支持的模板引擎 201
8.4.1.2 加载模板 201
8.4.1.3 选择主题 202
8.4.1.4 创建定制的主题 203
8.4.1.5 Struts 2内置的4种主题 203
8.4.2 表单标签 206
8.4.2.1 表单标签的公共属性 206
8.4.2.2 表单标签的name和value属性 208
8.4.2.3 ID名分配 209
8.4.2.4 form标签 209
8.4.2.5 textfield标签 210
8.4.2.6 password标签 211
8.4.2.7 textarea标签 211
8.4.2.8 select标签 212
8.4.2.9 optgroup标签 217
8.4.2.10 radio标签 218
8.4.2.11 checkbox标签 219
8.4.2.12 checkboxlist标签 220
8.4.2.13 doubleselect标签 221
8.4.2.14 combobox标签 226
8.4.2.15 optiontransferselect标签.. 228
8.4.2.16 updownselect标签 231
8.4.2.17 hidden标签 233
8.4.2.18 submit标签 233
8.4.2.19 reset标签 235
8.4.2.20 label标签 235
8.4.2.21 token标签 236
8.4.2.22 file标签 236
8.4.2.23 head标签 236
8.4.3 非表单标签 237
8.4.3.1 component标签 237
8.4.3.2 a标签 240
8.4.3.3 actionerror、actionmessage和fielderror标签 240
8.5 使用Struts 2的表单标签改写用户注册程序中的注册页面 242
8.6 小结 247
第9章 国际化 248
9.1 国际化与本地化 248
9.1.1 Locale 249
9.1.2 资源包 251
9.1.3 消息格式化 253
9.2 Struts 2对国际化的支持 254
9.2.1 Struts 2资源包的组织和加载方式 255
9.2.2 在消息文本中使用参数 255
9.2.3 访问国际化消息 256
9.3 将用户注册程序国际化 258
9.4 错误消息的国际化 262
9.5 Struts 2设定访问用户的locale的流程 265
9.6 为用户注册程序添加英文版本 266
9.7 小结 269
第10章 拦截器 271
10.1 拦截器的工作方式 271
10.2 编写拦截器类 272
10.3 Struts 2自带的拦截器 274
10.4 配置拦截器 281
10.5 PreResultListener接口 282
10.6 开发执行安全验证的拦截器 285
10.7 使用拦截器注解 290
10.8 小结 294
第11章 类型转换 295
11.1 传统的数据处理过程 296
11.2 Struts 2对类型转换的支持 296
11.2.1 使用OGNL表达式命名参数 297
11.2.2 Struts 2内置的类型转换器 297
11.2.3 null属性的处理 298
11.2.4 对List、Map和Set的支持 298
11.2.4.1 使用List来保存图书信息的实例 298
11.2.4.2 使用Map来保存图书信息的实例 303
11.2.5 使用Set来保存图书信息的实例 307
11.3 创建自定义的类型转换器 311
11.4 类型转换错误的处理 318
11.5 使用类型转换注解 321
11.5.1 TypeConversion注解 321
11.5.2 Conversion注解 322
11.5.3 Element注解 323
11.5.4 Key注解 323
11.5.5 KeyProperty注解 324
11.5.6 CreateIfNull注解 324
11.6 小结 324
第12章 对输入数据进行验证 325
12.1 手动验证 326
12.1.1 在Action的execute()方法中进行验证 326
12.1.2 在validateXxx()方法中进行验证 328
12.1.3 在validate()方法中进行验证 330
12.2 使用验证框架 332
12.2.1 什么是验证器 332
12.2.2 注册验证器 332
12.2.3 开启验证 333
12.2.4 定义验证规则 333
12.2.5 验证文件的查找顺序 335
12.2.6 Struts 2内置的验证器 336
12.2.7 在用户注册程序中使用验证框架 345
12.2.8 确认密码的验证 349
12.2.9 短路验证 350
12.2.10 开发自己的验证器 353
12.2.11 使用visitor字段验证器复用验证 363
12.2.12 同时使用验证框架和手动验证 367
12.2.13 客户端JavaScript验证 368
12.3 使用验证注解 369
12.3.1 与验证相关的注解 369
12.3.2 在用户注册程序中使用验证注解 379
12.4 小结 383
第13章 使用FreeMarker作为表现层 384
13.1 FreeMarker简介 385
13.1.1 FreeMarker是什么 385
13.1.2 为什么要使用FreeMarker 386
13.2 FreeMarker的工作原理 386
13.2.1 模板+数据模型=输出 386
13.2.2 数据模型 388
13.2.2.1 scalar变量 391
13.2.2.2 hash和sequence变量 392
13.2.2.3 方法变量 392
13.2.2.4 宏变量 392
13.2.3 模板 392
13.3 FreeMarker的语法和操作 393
13.3.1 准备工作 393
13.3.2 表达式 395
13.3.2.1 直接指定值 395
13.3.2.2 访问变量 397
13.3.2.3 字符串操作 399
13.3.2.4 序列操作 400
13.3.2.5 散列操作 400
13.3.2.6 算术运算 400
13.3.2.7 比较操作 401
13.3.2.8 逻辑操作 402
13.3.2.9 内置函数 402
13.3.2.10 方法调用 403
13.3.2.11 缺少值处理操作符 403
13.3.2.12 操作符优先级 405
13.3.3 插值(interpolation) 406
13.3.4 指令 407
13.3.4.1 if/elseif/else指令 408
13.3.4.2 switch/case/default/break指令 409
13.3.4.3 list/break指令 411
13.3.4.4 include指令 412
13.3.4.5 import指令和名称空间 414
13.3.4.6 assign指令 418
13.3.4.7 global指令 419
13.3.4.8 local指令 420
13.3.4.9 setting指令 420
13.3.4.10 macro、nested和return指令 421
13.3.4.11 function和return指令 425
13.3.4.12 noparse指令 426
13.3.4.13 escape和noescape指令 427
13.3.5 内置函数 429
13.3.5.1 操作字符串 429
13.3.5.2 操作数字 437
13.3.5.3 操作日期 439
13.3.5.4 操作布尔值 441
13.3.5.5 操作序列 441
13.3.5.6 操作散列 446
13.3.6 在模板中定义变量 447
13.4 Struts 2对FreeMarker的支持 449
13.4.1 FreeMarker标签 449
13.4.2 在FreeMarker标签中
13.4.2 使用动态属性 450
13.4.3 JSP标签支持 450
13.4.4 变量解析与内置变量 451
13.4.5 访问Servlet/JSP范围对象 451
13.4.6 类型转换与本地化 453
13.5 在用户注册程序中使用FreeMarker来实现表现层 453
13.6 小结 459
第14章 使用SiteMesh控制页面布局 461
14.1 SiteMesh简介 462
14.2 下载并安装SiteMesh 462
14.3 感受SiteMesh 464
14.4 SiteMesh的工作原理 467
14.5 SiteMesh的标签库 468
14.5.1 decorator标签库 469
14.5.2 page标签库 470
14.6 在装饰器中获取原始页面的内容 470
14.7 装饰器的组合应用 471
14.8 装饰器映射器 475
14.9 Struts 2对SiteMesh的支持 479
14.10 在用户注册程序中使用SiteMesh进行页面布局 480
14.10.1 使用JSP作为表现层 480
14.10.2 使用FreeMarker作为表现层 484
14.11 小结 488
第15章 避免表单重复提交与等待页面 489
15.1 避免表单重复提交 489
15.1.1 避免表单重复提交的实现原理 490
15.1.2 Struts 2的实现方式 490
15.1.3 使用TokenInterceptor 491
15.1.4 使用TokenSessionStoreInterceptor 493
15.2 自动显示等待页面 493
15.2.1 ExecuteAndWaitInterceptor 的工作机制 494
15.2.2 使用ExecuteAndWaitInterceptor 495
15.3 小结 497
第16章 文件上传和下载 498
16.1 文件上传 498
16.1.1 基于表单的文件上传 498
16.1.2 文件上传格式分析 499
16.1.3 Struts 2对文件上传的支持 501
16.1.4 在Struts 2中实现文件上传 502
16.1.5 对文件上传进行更多的控制 507
16.1.6 多文件上传 509
16.2 文件下载 515
16.2.1 Struts 2对文件下载的支持 515
16.2.2 在Struts 2中实现文件下载 516
16.2.3 改进下载程序 518
16.3 小结 521
第17章 在Struts 2中实现CRUD 522
17.1 准备工作 522
17.2 文章分类的CRUD操作 528
17.3 小结 533
第18章 Struts 2对Ajax的支持 535
18.1 Ajax快速入门 535
18.1.1 Ajax简介 536
18.1.2 DOM 537
18.1.3 XMLHttpRequest 539
18.2 Ajax应用开发 540
18.2.1 使用XML作为数据的载体 541
18.2.2 使用JSON串作为数据的载体 551
18.2.2.1 理解JSON 552
18.2.2.2 下载JSON的Java实现 554
18.2.2.3 下载JSON的JavaScript脚本 555
18.2.2.4 使用JSON作为图书信息的数据
18.2.2.2 格式 555
18.2.3 使用Dojo简化Ajax应用的开发 561
18.2.3.1 Dojo概述 561
18.2.3.2 下载Dojo工具包 565
18.2.3.3 在ch18 Web程序中使用Dojo 565
18.3 在Struts 2中使用JSON插件 570
18.3.1 JSON插件 570
18.3.1.1 JSON插件概述 571
18.3.1.2 定制序列化和反序列化 571
18.3.1.3 下载JSON插件 572
18.3.2 使用JSON插件的实例 573
18.4 Struts 2的Ajax标签 578
18.4.1 Ajax标签的基础知识 579
18.4.1.1 共同的属性 579
18.4.1.2 等待指示符 579
18.4.1.3 事件发布/订阅模型 580
18.4.1.4 URL 580
18.4.1.5 阻止请求 580
18.4.2 使用Ajax标签前的准备工作 581
18.4.3 div标签 583
18.4.4 submit标签 593
18.4.5 a标签 597
18.4.6 tabbedPanel标签 599
18.4.7 autocompleter标签 604
18.4.7.1 autocompleter标签简介 604
18.4.7.2 准备工作 605
18.4.7.3 autocompleter标签用法详析 608
18.4.8 tree和treenode标签 614
18.4.8.1 用tree和treenode标签构建静态树 614
18.4.8.2 用tree标签构建动态树 617
18.5 Struts 2对DWR的支持 623
18.6 小结 630
第19章 集成Hibernate和Spring 631
19.1 Hibernate简介 632
19.2 Hibernate的下载和安装 632
19.3 Hibernate快速入门 633
19.3.1 配置文件 633
19.3.2 主要接口和类 635
19.3.3 总结 638
19.4 在Struts 2中集成Hibernate 638
19.5 集成Spring 647
19.6 小结 651
第20章 在Struts 2中开发Struts 1的Web应用 652
20.1 Struts 1插件 652
20.1.1 Struts 1插件的工作原理 652
20.1.2 使用Struts 1插件 653
20.2 用户注册实例 656
20.2.1 准备工作 656
20.2.2 阶段1:简单的Struts 1 Action 658
20.2.3 阶段2:带有ActionForm的Struts 1 Action 660
20.2.4 阶段3:添加手动验证 664
20.2.5 阶段4:使用CommonsValidator验证框架 665
20.3 小结 670
附录A Struts 1与Struts 2的对比 671
附录B WebWork 2与Struts 2的对比 673
附录C 从WebWork 2移植到Struts 2... 675
Struts 2深入详解
- 名称
- 类型
- 大小
光盘服务联系方式: 020-38250260 客服QQ:4006604884
云图客服:
用户发送的提问,这种方式就需要有位在线客服来回答用户的问题,这种 就属于对话式的,问题是这种提问是否需要用户登录才能提问
Video Player
×
Audio Player
×
pdf Player
×
亲爱的云图用户,
光盘内的文件都可以直接点击浏览哦
无需下载,在线查阅资料!
