第1篇 基础知识 1
第1章 Java EE应用和开发环境 1
1.1 Java EE应用概述 2
1.1.1 Java EE应用的分层模型 2
1.1.2 Java EE应用的组件 3
1.1.3 Java EE应用结构和优势 4
1.1.4常用的Java EE服务器 4
1.2轻量级Java EE应用相关技术 5
1.2.1 JSP、 Servlet和JavaBean及替代技术 5
1.2.2 Struts 2.1及替代技术 5
1.2.3 Hibernate 3.2及替代技术 6
1.2.4 Spring 2.5及替代技术 6
1.3 Tomcat的下载和安装 7
1.3.1安装Tomcat服务器 7
1.3.2配置Tomcat的服务端口 9
1.3.3进入控制台 9
1.3.4部署Web应用 11
1.3.5配置Tomcat的数据源 12
1.4 Jetty的下载和安装 13
1.4.1 Jetty的下载和安装 14
1.4.2 Jetty的基本配置 15
1.4.3部署Web应用 16
1.4.4配置JNDI绑定 17
1.5 Eclipse的安装和使用 19
1.5.1 Eclipse的下载和安装 20
1.5.2在线安装Eclipse插件 20
1.5.3手动安装Eclipse插件 21
1.5.4安装MyEclipse插件 22
1.5.5使用Eclipse开发Java EE应用 25
1.5.6导入Eclipse项目 28
1.5.7导入非Eclipse项目 29
1.6 Ant的安装和使用 30
1.6.1 Ant的下载和安装 30
1.6.2使用Ant工具 31
1.6.3定义生成文件 32
1.6.4 Ant的任务(task) 37
1.7使用CVS进行协作开发 39
1.7.1安装CVS服务器 40
1.7.2配置CVS资源库 42
1.7.3安装CVS客户端 43
1.7.4发布项目到服务器 44
1.7.5从服务器下载项目 46
1.7.6同步(Update)本地文件 47
1.7.7提交(Commit)修改 48
1.7.8添加文件和目录 48
1.7.9删除文件和目录 50
1.7.10查看文件的版本变革 51
1.7.11提取文件以前版本的内容 51
1.7.12从以前版本重新开始 52
1.7.13创建标签 52
1.7.14创建分支 53
1.7.15沿着分支开发 54
1.7.16使用Eclipse作为CVS客户端 55
1.8本章小结 58
第2章JSP相关技术详解 59
2.1 Web应用和web.xml文件 60
2.1.1构建Web应用 60
2.1.2配置描述符web.xml 61
2.2 JSP的基本原理 62
2.3 JSP注释 66
2.4 JSP声明 67
2.5输出JSP表达式 68
2.6 JSP脚本 69
2.7 JSP的3个编译指令 72
2.7.1 page指令 72
2.7.2 include指令 76
2.8 JSP的7个动作指令 77
2.8.1 forward指令 77
2.8.2 include指令 79
2.8.3 useBean、setProperty、getProperty指令 81
2.8.4 plugin指令 84
2.8.5 param指令 86
2.9 JSP脚本中的9个内置对象 86
2.9.1 application对象 88
2.9.2 config对象 94
2.9.3 exception对象 96
2.9.4 out对象 98
2.9.5 pageContext对象 99
2.9.6 request对象 101
2.9.7 response对象 108
2.9.8 session对象 112
2.10 Servlet介绍 114
2.10.1 Servlet的开发 114
2.10.2 Servlet的配置 116
2.10.3 Servlet的生命周期 117
2.10.4 load-on-startup Servlet 117
2.10.5访问Servlet的配置参数 118
2.10.6使用Servlet作为控制器 120
2.11 JSP2的自定义标签 125
2.11.1开发自定义标签类 126
2.11.2建立TLD文件 126
2.11.3使用标签库 127
2.11.4带属性的标签 128
2.11.5带标签体的标签 132
2.12 Filter介绍 135
2.12.1创建Filter类 135
2.12.2配置Filter 136
2.13 Listener介绍 139
2.13.1创建Listener类 139
2.13.2配置Listener 141
2.14 JSP 2特性 141
2.14.1配置JSP属性 142
2.14.2表达式语言 144
2.14.3 Tag File支持 152
2.15本章小结 155
第2篇 整合开发 156
第3章 Struts 2的基本用法 156
3.1 MVC思想概述 157
3.1.1传统Model 1和Model 2 157
3.1.2 MVC思想及其优势 158
3.2 Struts 2的下载和安装 159
3.2.1为Web应用增加Struts 2支持 159
3.2.2在Eclipse中使用Struts 2 161
3.2.3增加登录处理 161
3.3 Struts 2的流程 165
3.3.1 Struts 2应用的开发步骤 165
3.3.2 Struts 2的流程 166
3.4 Struts 2的常规配置 167
3.4.1常量配置 167
3.4.2包含其他配置文件 173
3.5实现Action 173
3.5.1 Action接口和ActionSupport基类 175
3.5.2 Action访问Servlet API 177
3.5.3 Action直接访问Servlet API 180
3.6配置Action 182
3.6.1包和命名空间 182
3.6.2 Action的基本配置 185
3.6.3使用Action的动态方法调用 186
3.6.4指定method属性及使用通配符 189
3.6.5配置默认Action 195
3.7配置处理结果 195
3.7.1理解处理结果 195
3.7.2配置结果 196
3.7.3 Struts 2支持的结果类型 198
3.7.4 plainText结果类型 199
3.7.5 redirect结果类型 201
3.7.6 redirect-action结果类型 202
3.7.7动态结果 203
3.7.8 Action属性值决定物理视图资源 204
3.7.9全局结果 206
3.8 Struts 2的“零配置”支持 207
3.8.1自动搜索Action 207
3.8.2使用Annotation指定命名空间、父包和结果映射 208
3.9配置Struts 2的异常处理 211
3.9.1 Struts 2的异常处理机制 211
3.9.2声明式异常捕捉 212
3.9.3输出异常信息 214
3.10使用Struts 2的国际化 216
3.10.1 Struts 2中加载全局资源文件 216
3.10.2访问国际化消息 216
3.10.3输出带占位符的国际化消息 219
3.10.4加载资源文件的方式 221
3.10.5加载资源文件的顺序 225
3.11使用Struts 2的标签库 226
3.11.1 Struts 2标签库概述 226
3.11.2使用Struts 2标签 227
3.11.3 Struts 2的OGNL表达式语言 227
3.11.4 OGNL中的集合操作 230
3.11.5 Lambda(λ)表达式 231
3.11.6控制标签 231
3.11.7数据标签 242
3.11.8主题和模板 252
3.11.9自定义主题 254
3.11.10表单标签 255
3.11.11非表单标签 270
3.12本章小结 273
第4章 深入使用Struts 2 274
4.1详解Struts 2的拦截器机制 275
4.1.1拦截器在Struts 2中的作用 275
4.1.2 Struts 2内建的拦截器 276
4.1.3配置拦截器 277
4.1.4使用拦截器 279
4.1.5配置默认拦截器 280
4.1.6实现拦截器类 282
4.1.7使用拦截器 283
4.1.8拦截方法的拦截器 285
4.1.9拦截器的执行顺序 287
4.1.10拦截结果的监听器 288
4.1.11覆盖拦截器栈里特定拦截器的参数 290
4.1.12使用拦截器完成权限控制 291
4.2详解Struts 2的类型转换 293
4.2.1 Struts 2内建的类型转换器 294
4.2.2基于OGNL的类型转换 295
4.2.3指定集合元素的类型 298
4.2.4自定义类型转换器 300
4.2.5注册类型转换器 303
4.2.6简化的自定义类型转换器 304
4.2.7处理Set集合 305
4.2.8类型转换中的错误处理 308
4.3使用Struts 2的输入校验 313
4.3.1编写校验规则文件 314
4.3.2国际化提示信息 316
4.3.3使用客户端校验 317
4.3.4字段校验器配置风格 320
4.3.5非字段校验器配置风格 321
4.3.6短路校验器 323
4.3.7校验文件的搜索规则 324
4.3.8校验顺序和短路 327
4.3.9内建校验器 327
4.3.10基于Annotation的输入校验 339
4.3.11手动完成输入校验 340
4.4使用Struts 2的Ajax支持 344
4.4.1 JSON的基本知识 345
4.4.2安装Struts 2的JSON插件 347
4.4.3实现Action逻辑 348
4.4.4实现JSP页面 349
4.5使用Struts 2控制文件上传 351
4.5.1文件上传的准备 351
4.5.2 Struts 2的文件上传 352
4.5.3实现文件上传的Action 353
4.5.4配置文件上传的Action 355
4.5.5手动实现文件过滤 358
4.5.6拦截器实现文件过滤 359
4.5.7输出错误提示 361
4.5.8文件上传的常量配置 362
4.6使用Struts 2控制文件下载 363
4.6.1实现文件下载的Action 363
4.6.2配置Action 364
4.6.3下载前的授权控制 365
4.7本章小结 366
第5章 Hibernate基本用法 268
5.1 ORM和Hibernate 369
5.1.1对象/关系数据库映射(ORM) 369
5.1.2基本映射方式 370
5.1.3流行的ORM框架简介 371
5.1.4 Hibernate概述 372
5.2 Hibernate入门 372
5.2.1 Hibernate下载和安装 372
5.2.2 Hibernate的数据库操作 373
5.2.3在Eclipse中使用Hibernate 378
5.3 Hibernate的体系结构 383
5.4深入Hibernate的配置文件 385
5.4.1创建Configuration对象 385
5.4.2 hibernate.properties文件与hibernate.cfg.xml文件 388
5.4.3 JDBC连接属性 388
5.4.4数据库方言 389
5.4.5 JNDI数据源的连接属性 390
5.4.6 Hibernate事务属性 391
5.4.7二级缓存相关属性 391
5.4.8外连接抓取属性 391
5.4.9其他常用的配置属性 392
5.5深入理解持久化对象 392
5.5.1持久化类的要求 392
5.5.2持久化对象的状态 393
5.5.3改变持久化对象状态的方法 394
5.6深入Hibernate的映射文件 397
5.6.1映射文件结构 397
5.6.2映射主键 400
5.6.3映射普通属性 402
5.6.4映射集合属性 406
5.6.5集合属性的性能分析 418
5.6.6有序集合映射 419
5.6.7映射数据库对象 422
5.7映射组件属性 424
5.7.1组件属性为集合 427
5.7.2集合属性的元素为组件 429
5.7.3组件作为Map的索引 431
5.7.4组件作为复合主键 434
5.7.5多列作为联合主键 436
5.8使用注释 438
5.9本章小结 441
第6章 深入使用Hibernate 442
6.1 Hibernate的关联映射 443
6.1.1单向N—1关联 443
6.1.2单向1—1关联 449
6.1.3单向1—N关联 452
6.1.4单向N—N关联 455
6.1.5双向1—N关联 456
6.1.6双向N—N关联 461
6.1.7双向1—1关联 464
6.1.8组件属性包含的关联实体 468
6.1.9传播性持久化 471
6.2继承映射 472
6.2.1采用subclass元素的继承映射 476
6.2.2采用joined-subclass元素的继承映射 477
6.2.3采用union-subclass元素的继承映射 480
6.3 Hibernate的批量处理 482
6.3.1批量插入 483
6.3.2批量更新 484
6.3.3 DML风格的批量更新/删除 485
6.4使用HQL查询 486
6.4.1 HQL查询 486
6.4.2 HQL查询的from子句 489
6.4.3关联和连接 489
6.4.4 HQL查询的select子句 492
6.4.5 HQL查询的聚集函数 493
6.4.6多态查询 493
6.4.7 HQL查询的where子句 494
6.4.8表达式 495
6.4.9 order by子句 497
6.4.10 group by子句 497
6.4.11子查询 498
6.4.12命名查询 499
6.5条件查询 499
6.5.1关联和动态关联 502
6.5.2投影、聚合和分组 503
6.5.3离线查询和子查询 506
6.6 SQL查询 507
6.6.1标量查询 508
6.6.2实体查询 509
6.6.3处理关联和继承 512
6.6.4命名SQL查询 512
6.6.5调用存储过程 514
6.6.6使用定制SQL 515
6.7数据过滤 517
6.8事务控制 520
6.8.1事务的概念 520
6.8.2 Hibernate的事务 520
6.8.3事务和Session 521
6.8.4上下文相关的Session 523
6.9事件机制 524
6.9.1拦截器 524
6.9.2事件系统 527
6.10本章小结 531
第7章Spring的基本用法 532
7.1 Spring的起源和背景 533
7.2 Spring的下载和安装 534
7.2.1在应用程序中使用Spring 534
7.2.2在Web应用中使用Spring 535
7.2.3在Eclipse中开发Spring应用 535
7.3 Spring的核心机制:依赖注入 541
7.3.1理解依赖注入 541
7.3.2设值注入 542
7.3.3构造注入 546
7.3.4两种注入方式的对比 547
7.4 Spring容器和被管理的Bean 548
7.4.1 Spring容器 548
7.4.2使用ApplicationContext 550
7.4.3 ApplicationContext的国际化支持 550
7.4.4 ApplicationContext的事件机制 552
7.4.5 Bean的基本定义 554
7.4.6容器中Bean的作用域 556
7.4.7 Spring的Bean和JavaBean 559
7.4.8获得容器的引用 560
7.5 Bean实例的创建方式及对应配置 562
7.5.1使用构造器创建Bean实例 562
7.5.2使用静态工厂方法创建Bean 564
7.5.3调用实例工厂方法创建Bean 567
7.6深入理解容器中的Bean 569
7.6.1使用抽象Bean 569
7.6.2使用子Bean 570
7.6.3 Bean继承与Java继承的区别 572
7.6.4定制生命周期行为 572
7.6.5协调作用域不同步的Bean 578
7.6.6容器中的工厂Bean 581
7.6.7获得Bean本身的id 583
7.7深入理解依赖关系配置 584
7.7.1配置依赖 584
7.7.2设置普通属性值 586
7.7.3配置合作者Bean 588
7.7.4组合属性名称 589
7.7.5注入嵌套Bean 589
7.7.6注入集合值 590
7.7.7注入其他Bean的属性值 594
7.7.8注入Field值 596
7.7.9注入方法返回值 598
7.7.10强制初始化Bean 601
7.7.11自动装配 602
7.7.12依赖检查 605
7.8基于XML Schema的简化配置方式 606
7.8.1使用p名称空间配置属性 607
7.8.2使用util Schema 608
7.9本章小结 610
第8章 深入使用Spring 611
8.1两种后处理器 612
8.1.1 Bean后处理器 612
8.1.2 Bean后处理器的用处 616
8.1.3容器后处理器 616
8.1.4属性占位符配置器 618
8.1.5重写占位符配置器 619
8.2 Spring的“零配置”支持 621
8.2.1搜索Bean类 621
8.2.2指定Bean的作用域 624
8.2.3使用@Resource配置依赖 624
8.2.4自动装配和精确装配 625
8.3资源访问 628
8.3.1 Resource实现类 628
8.3.2 ResourceLoader接口和ResourceLoaderAware接口 634
8.3.3使用Resource作为属性 636
8.3.4在ApplicationContext中使用资源 638
8.4 Spring的AOP 642
8.4.1为什么需要AOP 642
8.4.2使用AspectJ实现AOP 643
8.4.3 AOP的基本概念 648
8.4.4 Spring的AOP支持 649
8.4.5基于Annotation的“零配置”方式 650
8.4.6基于XML配置文件的管理方式 666
8.5 Spring的事务 673
8.5.1 Spring支持的事务策略 673
8.5.2使用TransactionProxyFactoryBean创建事务代理 679
8.5.3 Spring 2.X的事务配置策略 682
8.6 Spring整合Struts 2 687
8.6.1启动Spring容器 687
8.6.2 MVC框架与Spring整合的思考 689
8.6.3让Spring管理控制器 690
8.6.4使用自动装配 694
8.7 Spring整合Hibernate 696
8.7.1 Spring提供的DAO支持 697
8.7.2管理Hibernate的SessionFacto 698
8.7.3使用HibernateTemplate 699
8.7.4使用HibernateCallBack 703
8.7.5实现DAO组件 705
8.7.6使用IoC容器组装各种组件 707
8.7.7使用声明式事务 710
8.8本章小结 711
第3篇 应用实践 712
第9章 企业应用开发的思考与策略 712
9.1企业应用开发面临的挑战 713
9.1.1可扩展性、可伸缩性 713
9.1.2快捷、可控的开发 714
9.1.3稳定性、高效性 715
9.1.4花费最小化,利益最大化 715
9.2如何面对挑战 715
9.2.1使用建模工具 715
9.2.2利用优秀的框架 716
9.2.3选择性地扩展 718
9.2.4使用代码生成器 718
9.3常见设计模式精讲 718
9.3.1单例模式 719
9.3.2简单工厂 720
9.3.3工厂方法和抽象工厂 727
9.3.4代理模式 730
9.3.5命令模式 736
9.3.6策略模式 738
9.3.7门面模式 741
9.3.8桥接模式 745
9.3.9观察者模式 748
9.4常见的架构设计策略 751
9.4.1贫血模型 752
9.4.2领域对象模型 755
9.4.3合并业务逻辑对象与DAO对象 757
9.4.4合并业务逻辑对象和Domain Object 759
9.4.5抛弃业务逻辑层 760
9.5本章小结 761
第10章 简单工作流系统 762
10.1项目背景及系统结构 763
10.1.1应用背景 763
10.1.2系统功能介绍 763
10.1.3相关技术介绍 764
10.1.4系统结构 765
10.1.5系统的功能模块 765
10.2 Hibernate持久层 766
10.2.1设计持久化对象(PO) 766
10.2.2创建持久化类 767
10.2.3映射持久化类 772
10.3实现DAO层 777
10.3.1 DAO组件的定义 778
10.3.2实现DAO组件 784
10.3.3部署DAO层 788
10.4实现Service层 791
10.4.1业务逻辑组件的设计 791
10.4.2实现业务逻辑组件 791
10.4.3事务管理 797
10.4.4部署业务逻辑组件 798
10.5实现任务的自动调度 800
10.5.1使用Quartz 800
10.5.2在Spring中使用Quartz 804
10.6实现系统Web层 807
10.6.1 Struts 2和Spring的整合 807
10.6.2控制器的处理顺序 808
10.6.3员工登录 809
10.6.4进入打卡 811
10.6.5处理打卡 813
10.6.6进入申请 814
10.6.7提交申请 816
10.6.8使用拦截器完成权限管理 818
10.7本章小结 820