第1章 Java基础 1
1.1 认识Java 2
1.1.1 Java语言的特点 2
1.1.2 Java程序运行环境 3
1.2 Java语法 4
1.2.1 数据类型 4
1.2.2 数组 5
1.2.3 运算符和表达式 6
1.2.4 流程控制 9
1.2.4.1 选择结构 9
1.2.4.2 循环结构 11
1.2.4.3 跳转结构 13
1.2.5 关键字 14
1.3 Java语言的对象性 14
1.3.1 类和包 15
1.3.2 类的继承 17
1.3.3 抽象类和接口 19
1.4 总结 20
第2章 Java进阶 21
2.1 Java内存管理 22
2.1.1 垃圾收集原理 22
2.1.2 对象引用的类型 24
2.2 “栈”和“堆”的区别 28
2.2.1 变量比较 28
2.2.2 变量复制 29
2.2.3 引用传递和值传递 30
2.3 异常机制 32
2.3.1 异常的原理 32
2.3.2 发生异常时的程序流程 33
2.3.3 巧妙利用异常 35
2.4 集合框架 36
2.4.1 集合框架概述 36
2.4.2 按键值自动排序的Map 38
2.4.3 元素位置固定的Map 39
2.4.4 线程安全的容器 40
2.4.5 存放弱引用的容器 40
2.5 其他方面 40
2.5.1 改进的诊断能力 41
2.5.2 Annotation 41
2.5.3 泛型 43
2.5.4 自动装/拆箱 43
2.5.5 静态引入 44
2.5.6 格式化输入/输出 44
2.5.7 参数数量可变 45
2.5.8 并行工具包 46
2.6 实用工具 46
2.6.1 程序注释 46
2.6.2 Java类包管理工具 48
2.6.2.1 可执行的JAR文件 49
2.6.2.2 JAR文件的索引 50
2.6.3 Java虚拟机启动参数 52
2.6.4 Java程序调试工具 55
2.6.5 Java进程监控平台 57
2.6.6 JVM内存分析工具 60
2.7 总结 61
第3章 第一个Java程序 62
3.1 搭建开发环境 63
3.1.1 下载并安装JDK 6.0 63
3.1.1.1 在Windows平台上安装JDK 6.0 63
3.1.1.2 在Linux平台上安装JDK 6.0 64
3.1.2 设置环境变量 66
3.2 实战“Hello World”程序 67
3.2.1 控制台版的Hello World 67
3.2.2 图形界面版的Hello World 68
3.3 总结 69
第4章 文件系统 70
4.1 Java输入输出概述 71
4.2 文件的顺序读写 72
4.2.1 字节流方式读写 72
4.2.1.1 字节输入流 72
4.2.1.2 字节输出流 75
4.2.2 字符流方式读写 78
4.2.2.1 字符输入流 78
4.2.2.2 字符输出流 81
4.3 文件的随机读写 82
4.4 文件系统实用例程 83
4.4.1 创建文件和目录 83
4.4.2 删除文件和目录 84
4.4.3 复制文件和目录 86
4.4.4 移动文件和目录 90
4.4.5 操作文件属性 90
4.4.6 获取可用空间 91
4.4.7 获取目录占用的空间 92
4.5 总结 93
第5章 网络通信基础 94
5.1 TCP基础 95
5.1.1 TCP开发简介 95
5.1.1.1 理解TCP Socket 95
5.1.1.2 TCP通信API 96
5.1.2 TCP开发实例——多线程服务器 99
5.1.3 TCP开发实例——连接池 104
5.1.3.1 连接池的原理 104
5.1.3.2 连接池的实现 105
5.2 UDP基础 109
5.2.1 UDP开发简介 109
5.2.1.1 理解UDP Socket 109
5.2.1.2 UDP通信API 110
5.2.2 UDP开发实例 111
5.2.3 多播套接字 113
5.2.3.1 多播套接字简介 113
5.2.3.2 多播套接字开发实例 113
5.3 NIO(New I/O)基础 115
5.3.1 NIO简介 115
5.3.2 NIO开发实例 116
5.4 总结 119
第6章 输入输出综合 120
6.1 Java I/O回顾 121
6.1.1 字节类API 121
6.1.1.1 字节输入流 121
6.1.1.2 字节输出流 122
6.1.2 字符类API 122
6.1.2.1 字符输入流 122
6.1.2.2 字符输出流 123
6.1.3 对象类API 123
6.1.3.1 对象输入流 123
6.1.3.2 对象输出流 124
6.2 对象序列化 124
6.2.1 对象序列化原理 124
6.2.2 修改默认的序列化机制 126
6.3 HTTP开发 128
6.3.1 HTTP通信原理 128
6.3.2 HTTP开发API 131
6.3.3 获取HTTP网络资源 132
6.3.4 登录需要认证的站点 134
6.3.5 利用HttpUnit保持状态 136
6.4 大文件传输 139
6.4.1 旨在降低风险的方案——分包传输 140
6.4.2 旨在控制风险的方案——可靠传输 149
6.5 字符集问题 153
6.6 Java I/O经典范例 155
6.6.1 FTP客户端 155
6.6.2 文件切割 156
6.6.3 通用文件系统(CIFS) 160
6.6.4 重定向控制台输出 162
6.6.5 与外部进程通信 163
6.7 总结 165
第7章 Java线程 166
7.1 线程简介 167
7.1.1 什么是线程 167
7.1.2 多线程的用途 167
7.1.3 Java语言与多线程 169
7.2 多线程应用开发 169
7.2.1 创建和启动线程 169
7.2.1.1 获取当前线程对象 169
7.2.1.2 线程命名 170
7.2.1.3 构造和启动线程 170
7.2.1.4 线程优先级 171
7.2.1.5 守护线程 173
7.2.2 Runnable接口和Thread基类 174
7.2.2.1 实现Runnable接口 174
7.2.2.2 继承Thread基类 177
7.2.3 管理线程的状态 179
7.2.3.1 线程的状态 179
7.2.3.2 线程的等待和唤醒 180
7.2.3.3 线程的休眠和中断 186
7.2.3.4 线程的终止 187
7.2.4 为程序添加退出事件 192
7.2.5 线程组 193
7.3 线程间通信 196
7.3.1 传递二进制信息 196
7.3.2 传递字符信息 197
7.4 实战多线程下载 199
7.5 总结 204
第8章 并发情况下的多线程编程 205
8.1 线程安全 206
8.1.1 线程安全的本质 206
8.1.2 变量安全 206
8.1.2.1 并发线程导致的变量安全问题 206
8.1.2.2 变量安全问题的解决之道 208
8.1.2.3 ThreadLocal变量 212
8.1.3 线程同步 213
8.1.3.1 同步锁的必要性 213
8.1.3.2 单实例线程的同步锁 214
8.1.3.3 多实例线程的同步锁 217
8.1.3.4 线程死锁 220
8.2 实战线程池开发 221
8.2.1 服务器的工作模式 221
8.2.2 实现线程池 223
8.2.2.1 线程池一 223
8.2.2.2 线程池二 227
8.3 并发工具包 232
8.3.1 线程池的类型 232
8.3.1.1 任务计划线程池 232
8.3.1.2 固定线程池 234
8.3.1.3 缓存线程池 236
8.3.2 线程同步辅助类 237
8.3.2.1 CyclicBarrier 237
8.3.2.2 CountDownLatch 239
8.3.3 阻塞队列 241
8.3.4 返回结果的线程 246
8.3.4.1 等待单个线程 246
8.3.4.2 等待一组线程 247
8.3.5 信号量限制 249
8.4 总结 250
第9章 Java安全 251
9.1 Java安全接口概述 252
9.1.1 Java安全接口的层次 252
9.1.2 Java安全的基础设施 253
9.2 Java安全API 255
9.2.1 消息摘要 255
9.2.2 数字签名 257
9.2.3 基于密码术的加密 260
9.3 安全传输 261
9.3.1 SSL原理 261
9.3.2 底层的SSL支持——JSSE 263
9.3.3 针对HTTP的解决方案 271
9.4 访问控制框架——JAAS 276
9.5 总结 278
第10章 图形界面开发 279
10.1 图形界面开发基础 280
10.1.1 图形坐标系统 280
10.1.2 字体和颜色 280
10.1.3 绘图API 283
10.1.4 加载图形文件 288
10.2 AWT和Swing控件 290
10.3 布局管理器 292
10.3.1 FlowLayout 292
10.3.2 GridLayout 294
10.3.3 BorderLayout 295
10.3.4 CardLayout 296
10.3.5 GridBagLayout 296
10.4 事件模型 298
10.4.1 事件类 299
10.4.2 事件监听器 299
10.4.3 事件适配器 300
10.5 在JBuilder中开发图形界面应用 301
10.6 JDK 6.0的桌面API 307
10.6.1 资源关联 307
10.6.2 桌面集成 310
10.6.2.1 Splash屏幕 310
10.6.2.2 系统托盘 310
10.7 总结 313
第11章 Applet、JavaWebStart、SWT与JavaFX 314
11.1 Applet 315
11.1.1 Applet简介 315
11.1.1.1 Applet的基础概念 315
11.1.1.2 运行Applet 316
11.1.1.3 运行Applet的潜在问题 318
11.1.2 为Applet签名 321
11.1.2.1 Java的权限体系 321
11.1.2.2 启用数字签名获取运行权限 323
11.1.3 用JavaScript操作Applet 325
11.2 JavaWebStart 327
11.2.1 JavaWebStart简介 327
11.2.2 下载无须签名的应用程序 327
11.2.3 下载需要签名的应用程序 330
11.3 SWT 332
11.3.1 SWT简介 332
11.3.2 SWT简单应用实例 333
11.3.3 可视化编辑器SWT Designer 337
11.3.4 分发SWT应用程序 348
11.4 JavaFX 348
11.4.1 JavaFX简介 348
11.4.2 在Eclipse中开发JavaFX应用 350
11.4.3 运行JavaFX应用 353
11.4.4 JavaFX与Java的结合 354
11.5 总结 355
第12章 数据库存取 356
12.1 JDBC基础 357
12.1.1 JDBC简介 357
12.1.2 JDBC驱动程序 359
12.1.2.1 Derby 359
12.1.2.2 其他数据库 362
12.1.2.3 自动加载驱动程序 363
12.1.3 JDBC基础开发 364
12.1.3.1 查询数据 364
12.1.3.2 增删改数据 365
12.1.3.3 调用存储过程 366
12.1.4 元数据 369
12.1.4.1 数据库元数据 369
12.1.4.2 结果集元数据 374
12.1.5 JDBC异常 376
12.2 JDBC开发专题 376
12.2.1 数据集的二次处理 376
12.2.1.1 JDBC提供的ResultSet 377
12.2.1.2 JDBC提供的RowSet 382
12.2.1.3 DataExpress提供的DataSet 389
12.2.2 RowId 397
12.2.3 动态游标 397
12.2.4 预编译执行计划 399
12.2.5 批处理 400
12.2.5.1 基于Statement 400
12.2.5.2 基于PreparedStatement 401
12.2.6 操作大二进制数据 403
12.2.6.1 写入BLOB数据 403
12.2.6.2 读出BLOB数据 404
12.2.7 事务 405
12.2.7.1 简单事务 406
12.2.7.2 SavePoint 407
12.3 数据库之外的持久化手段——Preferences API 409
12.4 Java目录服务——JNDI 410
12.5 总结 413
第13章 开源数据库产品 414
13.1 O/R Mapping框架——Hibernate 415
13.1.1 Hibernate配置 415
13.1.2 Hibernate对象操作 423
13.1.2.1 会话工厂与会话 423
13.1.2.2 延迟加载 424
13.1.2.3 级联新增 427
13.1.2.4 级联删除 428
13.1.2.5 级联修改 429
13.1.3 Hibernate HQL操作 432
13.2 O/R Mapping框架——iBatis 432
13.2.1 iBatis配置 432
13.2.2 iBatis对象操作 435
13.3 嵌入式数据库——文件数据库BerkeleyDB 439
13.3.1 BerkeleyDB简介 439
13.3.2 创建数据库 441
13.3.3 数据基本操作 442
13.3.4 游标 444
13.4 嵌入式数据库——内存数据库StelsEngine 447
13.5 总结 449
第14章 分布式计算 450
14.1 鸟瞰分布式组件技术 451
14.2 RMI 451
14.2.1 RMI架构 451
14.2.2 RMI实例 453
14.2.3 简化RMI的部署实施 456
14.3 CORBA 459
14.3.1 CORBA简介 459
14.3.1.1 什么是CORBA 459
14.3.1.2 ORB原理 459
14.3.1.3 CORBA与Java的关系 461
14.3.1.4 使用CORBA的优点 462
14.3.2 接口定义语言IDL 463
14.3.3 使用JDK开发CORBA应用 464
14.3.3.1 简单的CORBA应用 464
14.3.3.2 传递复杂数据类型的CORBA应用 468
14.4 总结 476
第15章 Java本地调用 477
15.1 JNI原理 478
15.2 调用C程序 479
15.2.1 在Windows平台上调用C函数 479
15.2.2 在Linux平台上调用C函数 482
15.2.2.1 gcc简介 482
15.2.2.2 简单例程 484
15.2.2.3 传递字符串 485
15.2.2.4 传递整型数组 486
15.2.2.5 传递字符串数组 487
15.2.2.6 传递对象数组 489
15.3 调用Delphi程序 490
15.3.1 简单例程 491
15.3.2 关闭窗口实用程序 492
15.4 总结 496
第16章 反射机制及其应用 497
16.1 反射机制概述 498
16.1.1 反射的原理 498
16.1.2 反射的简单实例 500
16.2 Annotation 501
16.2.1 Annotation的原理 501
16.2.1.1 定义Annotation类型 502
16.2.1.2 使用Annotation类型 503
16.2.1.3 内置的Annotation类型 504
16.2.2 Annotation的简单实例 504
16.2.3 用Annotation开发Web Services 507
16.3 动态代理 511
16.3.1 代理机制 512
16.3.2 Hibernate拦截器 514
16.3.3 Spring AOP 516
16.3.4 实现一个动态代理框架 519
16.4 操作JavaBeans 524
16.5 总结 528
第17章 Java动态编程 529
17.1 用Compiler API创建类文件 530
17.1.1 基础应用 530
17.1.2 高级应用 532
17.2 用Instrumentation构建代理 535
17.2.1 Instrumentation原理 535
17.2.2 基础应用 536
17.2.3 转换类文件字节码 537
17.3 用Javassist转换类文件 540
17.3.1 Javassist原理 540
17.3.2 基础应用 541
17.4 用Spring替换类方法 545
17.5 用ClassEditor修改类文件 548
17.6 总结 550
第18章 与动态语言的结合 551
18.1 Java与JavaScript的结合 552
18.1.1 支持脚本语言的意义 552
18.1.2 Java对JavaScript的支持 552
18.1.2.1 执行脚本语言 553
18.1.2.2 调用脚本语言的方法 553
18.1.2.3 脚本语言使用Java的变量 554
18.1.2.4 脚本语言使用Java的类 555
18.1.2.5 脚本语言实现Java的接口 556
18.1.3 测试脚本的工具 557
18.2 Java与Ruby的结合 558
18.2.1 JRuby的安装 558
18.2.2 在Ruby中调用Java类 559
18.3 Java与PHP的结合 559
18.3.1 PHP-Java-Bridge的安装 560
18.3.2 在PHP中调用Java类 561
18.4 Java与Python的结合 561
18.4.1 Jython的安装 562
18.4.2 在Java中执行Python语句 562
18.4.3 在Python中调用Java类 564
18.4.4 把Python程序编译成Java类 564
18.5 Groovy简介 564
18.6 内嵌HTTP Server 566
18.7 总结 567
第19章 JMX资源管理容器 568
19.1 JMX概述 569
19.1.1 JMX简介 569
19.1.2 JMX的层次结构 569
19.2 MBean的分类 571
19.2.1 标准MBean 571
19.2.2 动态MBean 574
19.2.3 开放MBean 579
19.2.4 模型MBean 579
19.3 JMX管理界面 579
19.4 JMX通知服务 581
19.5 总结 584
第20章 XML开发 585
20.1 XML简介 586
20.1.1 XML文档规则 586
20.1.2 常用概念 586
20.1.3 第一个XML文档 587
20.2 XML解析 588
20.2.1 DOM 588
20.2.2 DOM4J 592
20.2.3 SAX 593
20.2.3.1 用SAX解析XML 593
20.2.3.2 用SAX同步解析XML数据流 597
20.2.4 StAX 601
20.3 XML编辑 603
20.3.1 用DOM创建XML 603
20.3.2 用JDOM修改XML 606
20.4 XML转换 608
20.4.1 XSLT简介 608
20.4.2 客户端转换 609
20.4.3 服务端转换 613
20.5 XML校验 616
20.5.1 DTD简介 616
20.5.2 XML Schema简介 617
20.5.3 用XDK校验XML 619
20.6 XML映射 621
20.6.1 XML属性文件 621
20.6.2 用JAXB 2.0映射对象 623
20.6.2.1 对象映射 624
20.6.2.2 对象集合映射 628
20.7 总结 630
第21章 常用工具包 631
21.1 日志工具包Log4J 632
21.1.1 简单实例 632
21.1.2 原理分析 633
21.1.3 专业化应用 635
21.1.4 一个启示 637
21.2 日程工具 639
21.2.1 日程工具类Timer 639
21.2.2 日程工具包Quartz 640
21.2.2.1 常规应用 640
21.2.2.2 持久化任务 644
21.3 ZIP工具类 648
21.3.1 JDK提供的ZIP工具类 648
21.3.2 Apache提供的ZIP工具类 651
21.4 Excel文档存取工具包POI 653
21.5 将Java程序封装成NT Service 657
21.6 与COM组件互操作 664
21.7 把POJO发布成Web Services 666
21.7.1 编写服务程序 666
21.7.2 编写客户程序 669
21.7.2.1 根据服务接口 669
21.7.2.2 根据WSDL 670
21.8 Velocity模板引擎 671
21.9 性能监视工具 673
21.10 总结 675
附录A 在XMLSpy中编写DTD 676
附录B 在XMLSpy中编写XML Schema 679
附录C HTTP1.1状态代码及其含义 684