第1章 Java EE初体验 1
1.1 学习Java的巨大优势 2
1.1.1 排名第一的编程语言 2
1.1.2 良好的就业前景 2
1.2 探讨Java EE体系 3
1.2.1 Java EE的分层模型 3
1.2.2 Java EE应用的组件 4
1.3 为什么使用Java EE 5
1.4 Java EE企业级开发四步走完全攻略 6
1.5 Java EE的主要框架 6
1.5.1 Struts 6
1.5.2 Spring 7
1.5.3 Hibernate 8
1.5.4 Swing 8
1.5.5 本书的内容 8
1.6 开发前的准备 9
1.6.1 安装JDK 9
1.6.2 设置环境变量 13
1.6.3 JRE和JDK是有区别的 13
1.6.4 困扰初学者的环境变量问题 14
1.7 安装并配置Tomcat服务器 15
1.7.1 获取Tomcat 15
1.7.2 配置Tomcat的服务端口 18
1.7.3 列出Web应用根路径下的所有页面 18
1.7.4 登录控制台 19
1.7.5 设置虚拟目录 21
第2章 Struts 2基础 23
2.1 MVC思想 24
2.1.1 什么是MVC思想 24
2.1.2 MVC思想及其优势 25
2.1.3 Struts的MVC思想 25
2.2 下载与安装Struts 2 26
2.2.1 下载并设置Struts 2 26
2.2.2 在Eclipse中使用Struts 2 28
2.2.3 开发Struts 2应用的基本步骤 29
2.3 配置Struts 2 31
2.3.1 配置常量 31
2.3.2 包含其他配置文件 35
2.4 实现Action 36
2.4.1 基础知识 36
2.4.2 标准Action类 37
2.4.3 ActionSupport基类 38
2.4.4 访问Servlet API 42
2.4.5 直接访问Servlet API 47
2.4.6 用ServletActionContext访问Servlet API 48
2.5 配置Action 51
2.5.1 命名空间和包 51
2.5.2 基本配置 54
2.5.3 使用Action的动态方法调用 55
2.5.4 为Action配置method属性 58
2.5.5 使用通配符映射方式 59
2.6 处理结果 59
2.6.1 配置处理结果 59
2.6.2 处理结果类型 60
2.6.3 动态返回结果 60
2.7 初学者应该明白的几个问题 64
2.7.1 MVC思想和观察者模式 64
2.7.2 Action处理用户请求 64
2.7.3 Struts 2的工作流程 64
2.7.4 一份完整struts.xml文件的常量配置骨架 65
第3章 Struts 2核心 69
3.1 异常处理机制 70
3.2 Struts 2的国际化 73
3.2.1 为什么需要国际化 73
3.2.2 认识Struts国际化组件 74
3.2.3 访问资源包的方式 75
3.2.4 输出带占位符的国际化消息 78
3.3 OGNL表达式 80
3.3.1 OGNL的优势 80
3.3.2 OGNL的语法 80
3.3.3 OGNL的集合操作 83
3.3.4 Lambda表达式 83
3.4 Struts 2的标签库 84
3.4.1 五类标签库 84
3.4.2 控制标签 84
3.4.3 数据标签 92
3.4.4 主题和模板 98
3.4.5 Struts 2的内建主题 99
3.4.6 Struts 2的表单标签 100
3.5 类型转换 107
3.5.1 Struts 2的类型转换机制 107
3.5.2 Struts 2内建的类型转换 108
3.5.3 基于OGNL的类型转换 108
3.5.4 指定集合元素的类型 112
3.5.5 自定义类型转换器(1) 114
3.5.6 注册类型转换器 116
3.5.7 自定义类型转换器(2) 117
3.5.8 处理Set集合 118
3.6 初学者应该明白的几个问题 122
3.6.1 创建自己的主题 122
3.6.2 Action处理用户请求 123
第4章 Struts 2进阶 125
4.1 输入验证 126
4.1.1 编写验证规则文件 126
4.1.2 国际化提示 129
4.1.3 客户端验证 130
4.1.4 配置校验规则 131
4.1.5 内置校验器 132
4.1.6 输入验证 141
4.2 文件上传 146
4.2.1 Struts 2文件上传的机理 146
4.2.2 实现简单的文件上传 147
4.2.3 实现文件过滤 150
4.3 文件下载 153
4.3.1 一个误区 153
4.3.2 Struts 2实现文件下载 154
4.4 拦截器 157
4.4.1 拦截器的原理 157
4.4.2 配置拦截器〈interceptors〉 160
4.4.3 使用拦截器 162
4.4.4 自定义拦截器类 163
4.4.5 使用拦截器 164
4.4.6 使用拦截方法的拦截器 165
4.4.7 拦截器的执行顺序 167
4.4.8 Struts 2中拦截结果的监听器 170
4.4.9 覆盖拦截器栈里特定拦截器的参数 172
4.4.10 实现未登录拦截和权限控制 173
4.5 在Struts 2中使用Ajax 174
4.6 初学者应该明白的几个问题 177
4.6.1 剖析短路校验器 177
4.6.2 拦截器的机理 178
第5章 Hibernate基础 183
5.1 Hibernate基础 184
5.1.1 Hibernate概述 184
5.1.2 Hibernate API简介 184
5.1.3 Hibernate的核心接口 185
5.1.4 Hibernate的体系结构 186
5.2 Hibernate的下载和安装 186
5.2.1 下载Hibernate 186
5.2.2 为Eclipse安装插件 188
5.3 认识几种简单配置Hibernate的方式 189
5.3.1 配置数据源 189
5.3.2 配置c3p0连接池 190
5.3.3 配置Proxool连接池 191
5.3.4 MySQL连接配置 192
5.3.5 SQL Server连接配置 193
5.3.6 Oracle连接配置 193
5.4 Hibernate配置 194
5.4.1 持久化操作实例 194
5.4.2 创建Configuration对象 198
5.4.3 Hibernate的JDBC连接 200
5.4.4 数据库方言 201
5.4.5 与Hibemate相关的常用属性 202
5.5 SessionFactory接口 204
5.6 Session接口 205
5.6.1 save()方法 205
5.6.2 get()方法 206
5.6.3 load()方法 207
5.6.4 update()方法 207
5.6.5 delete()方法 208
5.7 Transaction接口 208
5.8 Query接口 209
5.9 Criteria接口 210
5.10 持久化对象 210
5.10.1 持久化类的规则 211
5.10.2 持久化的状态 211
5.10.3 改变持久化对象状态 212
5.11 初学者应该明白的几个问题 213
5.11.1 尽量使用数据源方式 213
5.11.2 何时使用Hibernate作为持久化框架 214
5.11.3 分析集合性能 214
第6章 Hibernate映射 215
6.1 Hibernate映射文件 216
6.1.1 映射文件结构 216
6.1.2 主键映射 218
6.1.3 普通属性映射 219
6.1.4 映射引用属性 220
6.1.5 映射Set集合属性 225
6.1.6 映射List集合属性 227
6.1.7 其他属性 227
6.2 组件映射 228
6.2.1 组件属性 228
6.2.2 集合属性的元素为组件 231
6.2.3 组件作为Map的索引 233
6.2.4 组件作为复合标识符 236
6.2.5 动态组件 237
6.2.6 多列映射成联合主键 238
6.3 关联关系映射 239
6.3.1 关联关系基础 240
6.3.2 单向N-1的关系映射 241
6.3.3 单向1-1的关系映射 244
6.3.4 单向1-N的关联 246
6.3.5 单向N-N的关联 249
6.3.6 双向1-N的关联 250
6.3.7 双向N-N的关联 251
6.3.8 双向1-1的关联 254
6.3.9 基于复合主键的关联关系 258
6.3.10 传播性持久化 261
6.4 继承映射 262
6.4.1 继承关系中每个具体类对应一个表 262
6.4.2 基类(根类)对应一个表 263
6.4.3 每个类对应一个表 264
6.5 初学者应该明白的几个问题 265
6.5.1 三种映射方式的比较和选择 265
6.5.2 使用Hibernate的场合 265
6.5.3 两边指定值 266
第7章 Hibernate进阶 267
7.1 批量处理 268
7.1.1 认识批量处理 268
7.1.2 批量插入 268
7.1.3 批量更新 270
7.1.4 StatelessSession(无状态会话)接口 270
7.1.5 DML(数据操纵语言)风格的操作 271
7.2 HQL查询 273
7.2.1 HQL的基本语法 273
7.2.2 实体对象与动态实例化对象查询 274
7.2.3 条件查询与别名的使用 274
7.2.4 HQL语句的动态赋值 275
7.2.5 对象导航查询 275
7.2.6 排序查询 276
7.2.7 聚合函数 276
7.2.8 分组操作 277
7.2.9 对日期时间的处理 277
7.2.10 联合查询 278
7.2.11 子查询 279
7.3 条件查询(Criteria Query) 279
7.3.1 Criteria对象 279
7.3.2 动态关联 282
7.3.3 离线查询和子查询 283
7.4 Hibernate的数据过滤查询 284
7.5 Hibernate事务控制 287
7.5.1 Session和事务范围 288
7.5.2 数据库事务声明 291
7.6 乐观并发控制 294
7.6.1 应用程序级别的版本检查 294
7.6.2 悲观锁定 296
7.7 初学者应该明白的几个问题 297
7.7.1 Hibernate的性能技巧 297
7.7.2 Criteria和DetachedCriteria的区别 298
第8章 Spring技术 299
8.1 Spring技术介绍 300
8.1.1 Spring的优点 300
8.1.2 Spring将改变Java EE 300
8.2 下载并安装Spring 300
8.2.1 获取Spring压缩包 300
8.2.2 在Eclipse中使用Spring 302
8.2.3 在Web项目中使用Spring 305
8.3 依赖注入 308
8.3.1 依赖注入基础 308
8.3.2 设置注入 309
8.3.3 代码升级游刃有余 311
8.3.4 构造注入 312
8.4 Spring容器 313
8.4.1 Spring的IoC容器 314
8.4.2 BeanFactory对IoC容器的功能定义 315
8.4.3 XmlBeanFactory的工作原理 316
8.4.4 ApplicationContext的国际化 318
8.4.5 详解ApplicationContext的事件机制 320
8.4.6 Bean获取Spring容器 324
8.5 Spring中的Bean 326
8.5.1 定义Bean 326
8.5.2 Spring中的Bean的作用域 328
8.5.3 配置依赖 330
8.5.4 属性值注入 331
8.5.5 注入field值 334
8.5.6 注入方法返回值 335
8.6 Java配置管理 338
8.7 初学者应该明白的几个问题 340
8.7.1 代码升级游刃有余 340
8.7.2 抽象Bean和子Bean的必要性 341
8.7.3 Spring中Bean的继承与Java中继承的区别 341
第9章 Spring核心 343
9.1 与容器交互 344
9.1.1 工厂Bean简介与配置 344
9.1.2 FactoryBean接口 346
9.2 Bean的生命周期 347
9.2.1 定制Bean的生命周期行为 348
9.2.2 协调不同步的Bean 351
9.3 Bean的继承 353
9.3.1 使用abstract属性 353
9.3.2 定义子Bean 355
9.4 零配置 358
9.4.1 搜索Bean类 358
9.4.2 使用@Resource配置依赖 361
9.4.3 使用@PostConstruct和@PreDestroy定制生命周期行为 362
9.5 后处理器 363
9.5.1 Bean后处理器 363
9.5.2 容器后处理器 367
9.6 Spring资源访问 370
9.6.1 URL类和Resource接口 370
9.6.2 Resource的实现类 371
9.6.3 使用Resource作为属性 375
9.6.4 在ApplicationContext中使用资源 376
9.7 初学者应该明白的几个问题 377
9.7.1 Spring 3.0新增的Annotation 377
9.7.2 Bean后处理器的用处 378
第10章 Spring进阶 379
10.1 AOP 380
10.1.1 AOP的相关概念 380
10.1.2 AOP的作用 381
10.1.3 Spring AOP的本质 383
10.1.4 使用AspectJ 384
10.1.5 基于Annotation的“零配置”方式 390
10.2 事务管理 396
10.2.1 Spring事务抽象 397
10.2.2 事务策略 398
10.2.3 编程式事务管理 400
10.2.4 声明式事务管理 402
10.3 Spring+Struts 2整合 403
10.3.1 启动Spring容器 404
10.3.2 Spring管理Struts 2的控制器 405
10.4 Spring+Hibernate整合 407
10.4.1 DAO支持 407
10.4.2 管理Hibernate的SessionFactory 413
10.4.3 Spring对Hibernate的简化 414
10.4.4 使用HibernateTemplate 416
10.4.5 Hibernate的DAO实现 420
10.5 初学者应该明白的几个问题 423
10.5.1 Spring AOP的功能 423
10.5.2 Spring中的AOP代理 423
10.5.3 基于XML配置文件的管理方式 424
10.5.4 确定是否需要应用服务器管理事务 424
10.5.5 编程式还是声明式事务管理的选择 425
10.5.6 BeanNameAutoProxyCreator是另一种声明方式 425
10.5.7 如果没有Spring框架该怎么办 427
10.5.8 Spring的异常处理 428
10.5.9 Spring管理Hibernate的SessionFactory多种配置方法 429
第11章 开始步入经典级Java EE开发 433
11.1 经典级需要什么技术 434
11.1.1 JSP、Servlet和JavaBean 434
11.1.2 JSF 434
11.1.3 EJB 435
11.2 JBoss的下载和安装 436
11.2.1 下载和安装JBoss服务器 436
11.2.2 配置JBoss的客户端 438
11.2.3 核心管理概念 442
11.2.4 管理任务 455
11.2.5 JVM设置 463
11.2.6 子系统配置 464
11.2.7 在Eclipse中集成JBoss 7 467
11.2.8 在JBoss 7中建立MySQL数据源 470
11.2.9 JBoss 7配置Oracle 10g数据源 472
11.3 下载并安装WebLogic 473
11.3.1 WebLogic的特色优势 473
11.3.2 下载并安装WebLogic 474
11.3.3 创建域 479
11.3.4 发布应用程序 483
11.3.5 配置服务 486
11.4 使用NetBeans 492
11.4.1 下载NetBeans 492
11.4.2 安装NetBeans 493
11.4.3 使用NetBeans新建项目 495
11.5 初学者应该明白的几个问题 497
11.5.1 用脚本启动和停止JBoss 7 498
11.5.2 使用JBoss-native提高处理静态文件的速度 498
11.5.3 防止重启WebLogic时JSP重编译 499
11.5.4 总结WebLogic的配置技巧 499
第12章 JSF介绍 501
12.1 JSF简介 502
12.2 下载并安装JSF 503
12.2.1 配置JSF 503
12.2.2 JSF的环境配置 507
12.3 详解JSF配置文件的说明和常用配置元素 509
12.3.1 在web.xml文件中配置FacesServlet核心控制器 510
12.3.2 JSF的配置文件faces-config.xml 511
12.4 使用JSF 511
12.5 导航 515
12.5.1 静态导航 515
12.5.2 动态导航 516
12.5.3 通配符 521
12.5.4 使用from-action 522
12.6 JSF的核心标签 522
12.6.1 JSF核心标签概述 522
12.6.2 JSF HTML标签 524
12.6.3 表单 530
12.6.4 文本字段和文本区域 531
12.6.5 按钮和链接 532
12.7 数据转换和数据验证 534
12.7.1 Faces转换器系统 534
12.7.2 DateTimeConverter 536
12.7.3 NumberConverter 536
12.7.4 Faces验证系统 536
12.8 初学者应该明白的几个问题 538
12.8.1 解决JSF冗余代码和管理混乱的问题 538
12.8.2 在JSF框架中使用的设计模式 539
12.8.3 使用JSF的原则和技巧 540
第13章 JTA事务处理 541
13.1 事务的基本概念 542
13.1.1 Java中事务处理的由来 542
13.1.2 事务的几个特性 544
13.1.3 Java EE中的事务管理器 545
13.2 分布式事务处理 546
13.2.1 基本概念 547
13.2.2 两阶段提交 547
13.2.3 XA规范 548
13.2.4 为什么使用分布式事务 548
13.3 全局事务和局部事务 549
13.4 在同一事务中JTA实现Oracle、SQL Server 550
13.5 在WebLogic服务器用JTA实现多种数据库的一致性 557
13.6 EJB 3.0的事务管理 561
13.6.1 容器管理事务 561
13.6.2 Bean管理事务 563
13.7 初学者应该明白的几个问题 564
13.7.1 关于分布式事务必须清楚的几点 564
13.7.2 使用JTA和JDBC 565
13.7.3 如何选择最好的JTA方式 565
13.7.4 在JavaBean中用JDBC方式处理事务 566
第14章 JNDI接口 567
14.1 JNDI基础 568
14.1.1 命名服务和目录服务 568
14.1.2 为什么会有JNDI 569
14.2 JNDI的工作原理 570
14.3 目录操作 574
14.4 分析主流服务器对JNDI的支持 577
14.4.1 WebLogic对JNDI的支持 577
14.4.2 JBoss对JNDI的支持 583
14.5 初学者应该明白的几个问题 586
14.5.1 在Tomcat中配置JNDI对象 586
14.5.2 在Servlet中访问TomcatJNDI资源 587
14.5.3 在JSP中访问Tomcat JNDI资源 591
第15章 使用JavaMail发送邮件 593
15.1 JavaMail介绍 594
15.2 邮件协议介绍 594
15.2.1 SMTP协议 594
15.2.2 POP协议 595
15.2.3 IMAP协议 595
15.2.4 MIME协议 595
15.2.5 NNTP和其他协议 595
15.3 JavaMail基础 596
15.3.1 JavaMail简介 596
15.3.2 安装JavaMail 596
15.4 JavaMail核心类详解 598
15.4.1 java.util.Properties类 598
15.4.2 javax.mail.Session类 599
15.4.3 javax.mail.Authenticator类 600
15.4.4 javax.mail.Message类 602
15.4.5 javax.mail.Address类 604
15.4.6 javax.mail.Transport类 605
15.4.7 javax.mail.Store类和javax.mail.Folder类 606
15.5 使用JavaMail API 606
15.5.1 发送消息 607
15.5.2 获取消息 607
15.5.3 删除消息和标志 609
15.5.4 自我验证 609
15.5.5 回复消息 610
15.5.6 转发消息 610
15.5.7 操作附件 611
15.5.8 处理HTML消息 613
15.5.9 用SearchTerm搜索 614
15.6 JavaMail的常见应用 614
15.6.1 Gmail收发信 615
15.6.2 JavaMail收取邮件属性配置 617
15.6.3 JavaMail发送邮件 619
15.6.4 GmailFetch收取Gmail邮件 623
15.6.5 Gmail Sender发送Gmail邮件 624
15.7 初学者应该明白的几个问题 625
15.7.1 JavaMail中的常见中文乱码问题与解决办法 625
15.7.2 如何配置JavaMail通过代理服务器工作 627
15.7.3 授予特殊的权限 627
第16章 会话EJB 629
16.1 EJB 3.0介绍 630
16.1.1 长久以来对EJB的误区 630
16.1.2 EJB的现状 631
16.1.3 EJB的优势 631
16.2 无状态的Session Bean 633
16.2.1 开发远程调用的无状态Session Bean 634
16.2.2 开发本地调用的无状态Session Bean 639
16.3 发布Session Bean 642
16.4 编写有状态的Session Bean 642
16.5 使用Session Bean的本地接口 644
16.6 Session Bean中的标注方法 645
16.7 使用配置文件发布Session Bean 646
16.8 编写一个实体Bean程序 647
16.8.1 配置JBoss的数据库连接池 648
16.8.2 编写实体Bean 648
16.8.3 配置persistence.xml文件 649
16.8.4 在Session Bean中调用实体Bean 649
16.8.5 客户端调用Session Bean 650
16.9 实现Entity Bean的一对一映射 650
16.10 实现Entity Bean的一对多映射 654
16.11 EJB拦截器 656
16.12 初学者应该明白的几个问题 658
16.12.1 总结Session Bean的编程规则 659
16.12.2 Spring与EJB 3.0的对比 659
16.12.3 如何在Spring中访问EJB 664
第17章 消息驱动EJB 667
17.1 消息服务基础 668
17.1.1 JMS模型 668
17.1.2 JMS编程模型 669
17.1.3 分析Queue类型的发送和接收流程 671
17.1.4 分析topic类型的消息发送和接收流程 675
17.1.5 实现Java消息服务(JMS) 678
17.2 MDB基础 682
17.2.1 Queue消息的发送与接收(PTP消息传递模型) 683
17.2.2 Topic消息的发送与接收(Pub/Sub消息传递模型) 683
17.2.3 消息选择器 684
17.3 使用消息驱动Bean 686
17.4 使用NetBeans开发EJB 3会话Bean 690
17.5 初学者应该明白的几个问题 695
17.5.1 理解JMS和EJB的关系 696
17.5.2 利用Spring实现EJB 696
17.5.3 实现EJB与Spring的集成 698
第18章 学校餐费管理系统 699
18.1 功能模块划分 700
18.1.1 需求分析 700
18.1.2 系统功能模块 700
18.2 系统分析和设计 701
18.2.1 分析、设计数据库 701
18.2.2 设计业务逻辑层和DAO层 702
18.2.3 规划系统包 703
18.2.4 构建系统的MVC结构 703
18.3 配置开发环境 705
18.3.1 在Eclipse中配置Struts 705
18.3.2 在Eclipse中配置Spring 706
18.3.3 在Eclipse中配置Hibernate 706
18.3.4 在Eclipse中配置HibernateSynchronizer 707
18.4 具体编码 707
18.4.1 建立视图 707
18.4.2 建立JSP页面 709
18.4.3 设置固定部分 710
18.4.4 实现国际化 711
18.4.5 设置可变部分 712
18.4.6 建立控制部分 713
18.4.7 自定义的Action 716
18.4.8 错误处理 717
18.4.9 建立模型部分 718
18.4.10 建立业务逻辑类 719
18.4.11 建立DAO类 720
18.4.12 装配组件 722
18.5 项目调试 724
参考文献 726