函数式接口作为方法的返回值类型案例

类似地,如果一个方法的返回值类型是一个函数式接口,那么就可以直接返回一个Lambda表达式。当需要通过一
个方法来获取一个java.util.Comparator 接口类型的对象作为排序器时,就可以调该方法获取。

package com.learn.demo03.LambdaTest;

import java.util.Arrays;
import java.util.Comparator;

/*
    如果一个方法的返回值类型是一个函数式接口,那么就可以直接返回一个Lambda表达式。
    当需要通过一个方法来获取一个java.util.Comparator接口类型的对象作为排序器时,就可以调该方法获取。
 */
public class Demo02Comparator {
    //定义一个方法,方法的返回值类型使用函数式接口Comparator
    public static Comparator<String> getComparator(){
        //方法的返回值类型是一个接口,那么我们可以返回这个接口的匿名内部类
        /*return new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                //按照字符串的降序排序
                return o2.length()-o1.length();
            }
        };*/

        //方法的返回值类型是一个函数式接口,所有我们可以返回一个Lambda表达式
        /*return (String o1, String o2)->{
            //按照字符串的降序排序
            return o2.length()-o1.length();
        };*/

        //继续优化Lambda表达式
        return (o1, o2)->o2.length()-o1.length();
    }

    public static void main(String[] args) {
        //创建一个字符串数组
        String[] arr = {"aaa","b","cccccc","dddddddddddd"};
        //输出排序前的数组
        System.out.println(Arrays.toString(arr));//[aaa, b, cccccc, dddddddddddd]
        //调用Arrays中的sort方法,对字符串数组进行排序
        Arrays.sort(arr,getComparator());
        //输出排序后的数组
        System.out.println(Arrays.toString(arr));//[dddddddddddd, cccccc, aaa, b]
    }

}

其中直接return一个Lambda表达式即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录 01_初学者的企业用人标准寻找引言 02_socketclient_api模型的抽象_初学者应知的标准_传智扫地僧 03_本套视频总体课程简介 04_就业班课程总体简介_课堂答疑 05_初学者建立信心 06_学员学习标准_排序及问题抛出 07_数组做函数参数退化问题剖析_传智扫地僧 08_数据类型基础提高 09_数据类型引申和思考 10_变量本质剖析和内存四区模型引出_传智扫地僧 11_c的学习重理解到位_对初学者_传智扫地僧 12_直接通过内存标号操作内存空间_课堂答疑 13_中午课程回顾 14_内存四区基本原理_全局区案例理解 15_内存四区_堆栈案例理解 16_课堂答疑_理解指针的关键关键在内存 17_vs20102013上配置#系列快捷方式 18_栈的属性和buf地址增长方向是两个不同的概念 19_函数调用模型_主调函数和被调用函数 20_课堂答疑_函数调用流程入栈出栈过程 21_指针也是一种数据类型_基础 22_指针也是一种数据类型_强化_传智扫地僧 源码及文档 01_课程回顾 02_作业题强化和野指针 03_向null地址copy数据和不断改变指针指向强化 04_有关字面量 05_间接赋值从0级指针到1级指针 06_间接赋值从1级指针到2级指针_技术推演_传智扫地僧 07_间接赋值是指针存在的最大意义 08_间接赋值成立的三个条件和应用场景 09_指针学习思路应用清晰起来 10_指针强化3和指针强化4思想讲解 11_字符串的基本操作 12_数组中括号与指针关系和数组名常量指针分析 13_字符串一级指针内存模型_传智扫地僧 14_字符串copy函数技术推演 15_字符串copy函数强化训练_判断null_引入辅助指针变量_传智扫地僧 16_项目开发模型强化_strstr_while模型_重要 17_作业考试强化 源码及文档 01_上一次课程回顾 02_两头堵模型 03_字符串反转_方法1指针 04_字符串反转_方法2递归逆序(3个点)_传智扫地僧 05_考试题解答和项目开发代码书写手法 06_一级指针易错模型分析_重点 07_C语言中的const知识点总结 08_指针的输入和输出模型 09_课堂答疑_指针所指向内存释放 10_二级指针做输入_第1种内存模型 11_二级指针做输入_第2种内存模型 12_二级指针做输入_第2种内存模型_课堂答疑_多维数组名本质抛砖 13_二级指针做输入_第3种内存模型_传智扫地僧 14_二级指针三种内存模型示意图_传智扫地僧 15_玩转多级指针_传智扫地僧 16_两个辅助指针变量挖字符串测试框架搭建 18_作业 源码及文档 01_课程回顾 02_两个赋值指针变量挖字符训练_第3种内存模型_传智扫地僧 03_多级指针的野指针问题(释放问题)_传智扫地僧 04_学员作业点评_典型错误吸取教训 05_数组类型 06_数组指针类型和定义数组指针变量的3种方法 07_多维数组名本质剖析_传智扫地僧 08_多维数组的【】和多级指针星号转化推演 09_多维数组做函数参数技术推演和退化原因抛出 10_多维数组做函数参数退化总结_ 11_指针数组的应用场景01 12_指针数组自我结束能力(三种表示方法) 13_干活要知道在什么框架之下干活 14_结构体类型和变量定义及基本操作 15_结构体元素做函数参数pk结构指针做函数参数 16_结构体做函数基本操作 17_结构体做函数内存分配指针 18_结构中套一级指针 19_结构体中套二级指针_传智扫地僧 20_作业强化 21_C提高课程_day01-day04_知识体系梳理_传智扫地僧 源码及文档 01_上次课程回顾 02_二级指针三种内存模型综合训练_框架搭建 03_二级指针三种内存模型综合训练_实现 04_二级指针三种内存模型综合训练_典型错误 05_结构体作业点评 06_结构体中的深copy和浅copy 07_结构中的高级话题_偏移量 08_结构中的高级话题_偏移量强化 09_文件操作api基本概念 10_按照字符读写文件 11_按照行方式操作文件 12_按照块的方式操作文件 13_中午课程回顾 14_配置文件读写案例功能介绍 15_配置文件读写案例_接口设计 16_配置文件读写案例_集成框架搭建 17_配置文件读写案例_读配置项实现 18_配置文件读写案例_写和修改接口实现 19_文件加密案例_思路分析 20_文件加密案例_文件搬运实现 21_文件加密案例_文件加密功能集成 22_文件加密案例_文件加密实现 23_作业 24_学员二级指针代码bug调试_传智扫地僧 源码及文档 01_课程回顾 02_解密作业 03_指针用法杂项 04_再谈多级指针做输出_传智扫地僧 05_动态库的基本概念和使用 06_动态库测试环境和调试环境搭建 07_socketclient动态库函数_初始化实现wmv 08_socketclient动态库函数_发送接受释放实现wmv 09_socketclient动态库_第二套api函数_传智扫地僧 10_socketclient动态库_日志功能集成 11_项目中检索内存泄漏使用和基本原理 12_动态库基本知识和环境调试注意 13_动态库内存释放问题 源码及文档 01_上一次课程回顾 02_链表热身_结构体中套元素和指针 03_结构体数据类型的嵌套定义和函数的嵌套调用是两个不同的概念 04_静态链表及局限性 05_链表的分类和链表的辅助指针变量 06_链表api函数搭建 07_链表的创建和打印 08_链表的插入操作和辅助指针变量分析_传智扫地僧 09_链表的删除和销毁 10_链表的逆置_传智扫地僧 11_链表的逆置_课堂答疑 12_课堂答疑pheadnextnext 13_中午课程回顾 14_传统链表和非传统链表 15_链表的技术体系推演 16_通用链表库集成和测试 17_C提高课程_day05-day07_知识体系梳理_传智扫地僧 源码及文档 第二部分 C++基础目录 01_C++基础课程的安排和需要持之以恒的学习态度 02_简单的C++程序helloworld 03_用面向过程和面向对象方法求解圆形面积_类和对象的关系思考_传智扫地僧 04_类中不写成员函数易犯错误模型 05-易犯错误模型-为什么需要成员函数(补充资料)-传智扫地僧 06_课堂答疑类中写成员函数_调用的时才会执行 07_程序设计方法发展历程 08_C语言和C++语言的关系_工作经验分享 09_namespace和iotream 10_实用性加强_register增强_检测增强 11_struct关键字类型增强 12_c++类型类型检查加强 13_新增数据类型bool类型 14_中午课程回顾 15_c++中的三目运算符_传智扫地僧 16_const的基础和const符号表机制探究_传智扫地僧 17_const和#define的对比_传智扫地僧 18_引用的基础知识(定义和函数参数) 19_复杂数据类型引用做函数参数__传智扫地僧 20_引用的本质剖析_传智扫地僧 21_函数返回值是引用(当左值右值)_传智扫地僧 源码及文档 01_上一次课程复习 02_指针的引用_传智扫地僧 03_常引用 04_inline内联函数 05_函数参数相关扩展 06_函数重载 07_函数重载和函数指针在一起 08_中午课程回顾 09_c++学习路线和c++基础课程学习标准_传智扫地僧 10_类的封装和访问控制 11_struct和class关键字区别 12_类的声明和类的实现分开 13_面向过程向面向对象转变案例1 14_面向过程向面向对象转变案例2 15_面向过程向面向对象转变案例3 16_作业 17_C++基础课程day01-day02_知识体系梳理_传智扫地僧 源码及文档 01_上一次课程回顾 02_构造和析构的基础知识 03_构造和析构的用途演示 04_构造函数的调用(无参数和有参构造)_传智扫地僧 05_课堂答疑对象的初始化和对象的赋值是两个不同的概念 06_为什么需要构造和析构函数 07_copy构造函数的调用时机1和2 08_课堂答疑 09_copy构造函数调用时机3_传智扫地僧 10_copy构造函数调用时机4_函数返回值是匿名对象_传智扫地僧 11_copy构造函数调用时机4_函数返回值是匿名对象的去和留的剖析_传智扫地僧 12_构造和析构的重点整理 13_构造和析构总结 14_中午课程复习 15_构造函数的调用规则研究 16_浅拷贝问题抛出 17_浅拷贝问题分析_传智扫地僧 18_浅拷贝问题解决_深拷贝_显示编写拷贝构造函数 19_深拷贝和浅拷贝_默认的等号操作符也是浅拷贝_传智扫地僧 20_构造函数的初始化列表 21_强化训练1_构造和析构调用顺序 22_强化训练2_匿名对象生命周期 23_强化训练3_构造中调用构造(产生匿名对象)_传智扫地僧 24_new和delete的基本语法 25_new和delete的深入分析 26_静态成员变量和静态成员函数 27_C++面向对象模型初探_传智扫地僧 28_this指针 29_作业 源码及文档 01_上一次课程回顾 02_const修饰的是谁_传智扫地僧 03_this的const修饰课堂答疑 04_全局函数pk成员函数(返回元素,引用,星号this) 05_强化训练数组类_类的设计和测试程序 06_强化训练数组类_类的实现和测试 07_友元函数 08_友元类 09_运算符重载入门基础推演_传智扫地僧 10_运算符重载语法理论知识介绍 11_中午课程回顾 12_成员函数和友元函数完成二元运算符重载 13_成员函数和友元函数完成一元运算符重载(前置) 14_成员函数和友元函数完成一元运算符重载(后置) 15_友元函数实现左移右移操作符重载(函数返回值当左值需返回引用)_传智扫地僧 16_友元函数实现操作符重载知识总结 17_重载等号操作符_传智扫地僧 18_数组类小案例_操作符重载需求 19_数组类小案例_重载[]_传智扫地僧 20_数组类小案例_重载等号_传智扫地僧 21_数组类小案例_重载==和!= 22_作业 源码及文档 01_上一次课程的回顾 02_()运算符重载 03_逻辑与和逻辑或运算符重载说明 04_课堂答疑_逻辑与和逻辑或运算符重载 05_MyString类案例_构造和析构函数 06_MyString类案例_重载等号和数组操作符_传智扫地僧 07_MyString类案例_重载左移操作符 08_MyString类案例_重载双等号和不等号 操作符 09_MyString类案例_重载大于和小于操作符 10_MyString类案例_其他技巧 11_MyString类案例_重载右移操作符 12_C++基础课程day03-day05_知识体系梳理 13_作业和考试 源码及文档 01_继承的概念 02_子类可以访问父类的属性和方法 03_派生类的访问控制 04_派生类的访问控制综合训练_传智扫地僧 05_类型兼容性原则_传智扫地僧 06_继承中的构造和析构 07_继承和组合混搭下的构造和析构_传智扫地僧 08_继承中的同名成员变量和同名成员函数 09_继承的static关键字 10_多继承的基本语法 11_二义性和虚继承解决方案 12_中午课程回顾 13_多继承原理抛砖_传智扫地僧 14_多态思想引言 15_类型兼容性原则遇上还是函数重写_面向对象新需求_传智扫地僧 16_多态案例_多态的意义_多态成立的三个条件_传智扫地僧 17_多态案例丰富多彩和多态的理论知识 18_虚析构函数 19_重载重写重定义_问题抛出 20_重载重写重定义_概念分析_传智扫地僧 21_重载重写重定义_课堂答疑_传智扫地僧 文档和源码 01_上一次课程回顾 02_多态原理探究_传智扫地僧 03_证明vptr指针的存在 04_子类的vptr指针是分步初始化的_传智扫地僧 05_面试题强化_多态相关 06_父类指针的步长和子类指针的步长不一样 07_课堂答疑什么时候子类的步长和父类的步长一样 08_抽象类基本语法 09_抽象类在多继承中的应用 10_面向抽象类编程_计算程序员工资 11_中午课程回顾 12_信息系统框架集成第三方产品案例_背景和需求 13_信息系统框架集成第三方产品案例_编码实现分析_传智扫地僧 14_信息系统框架集成第三方产品案例_socket抽象类和框架搭建__传智扫地僧 15_信息系统框架集成第三方产品案例_框架实现第一个socket类厂商实现 16_信息系统框架集成第三方产品案例_第二个socket类厂商实现 17_信息系统框架集成第三方产品案例_加解密抽象类和加解密厂商类实现 18_信息系统框架集成第三方产品案例_集成测试加密厂商和socket厂商入围 19_信息系统框架集成第三方产品案例_集成框架变成类方式_传智扫地僧 20_信息系统框架集成第三方产品案例_几个重要的面向对象思想_传智扫地僧 21_作业 文档和源码 01_上一次课程回顾 02_数组指针语法梳理 03_函数指针语法梳理_传智扫地僧 04_函数指针做函数参数思想剖析_传智扫地僧 05_函数指针的正向调用案例 06_C动态库升级成框架案例_项目需求和基本思想_传智扫地僧 07_C动态库升级成框架案例_开发环境搭建 08_C动态库升级成框架案例_方法1动态库中直接添加回调函数_传智扫地僧 09_C动态库升级成框架案例_方法2把回调函数缓存到动态库_编写 10_C动态库升级成框架案例_方法2把回调函数混存到动态库_测试 11_C++基础课程day06-day08_知识体系梳理 文档和源码 第三部分 C++进阶部分目录 01_上一次课程知识点_梳理 02_函数模板为什么和函数模板语法基础 03_课堂答疑_遇到莫名其妙的问题_重新编译 04_函数模板当函数参数 05_普通函数和模板函数区别_传智扫地僧 06_函数模板和函数重载在一起(调用规则研究)_传智扫地僧 07_函数模板机制探究上 08_函数模板机制探究下_传智扫地僧 09_课堂答疑_二次编译 10_类模板语法_数据类型和算法的分离_抛砖 11_单个类模板基本语法 12_类模板_派生_普通类语法 13_类模板_派生_类模板语法 14_中午知识点梳理 15_复数类_所有函数都写在类的内部 16_复数类_所有函数都写在类的外部_上 17_复数类_所有函数都写在类的外部_下 18_复数类_所有函数都写在类的外部(h和cpp分开) 19_类模板中的static关键字 20_案例_数组模板类_需求和类的初步设计 21_案例_数组模板类_测试框架搭建 22_案例_数组模板类_类的实现和测试_传智扫地僧 23_案例_数组模板类_数组元素存储的是类对象思想抛砖_传智扫地僧 24_作业 代码 文档 01_泛型编程_知识点梳理 02_模板数组类_作业讲解和思想强化(数据类型和算法的分离)_传智扫地僧 03_类型转换_static_cast和reinterpret_cast 04_类型转换_dynamic_cast和reinterpret_cast_传智扫地僧 05_类型转换_const_cast 06_异常的基本语法 07_异常机制基本思想梳理 08_栈解旋unwinding 09_异常接口声明 10_异常类型_异常变量的生命周期上 11_异常类型_异常变量的生命周期下_传智扫地僧 12_中午知识点梳理 13_异常的层次结构_传智扫地僧 14_标准异常库 15_流类库结构 16_标准IO_输入api_上 17_标准IO_输入api_下 18_标准IO输出_api和格式控制 19_文件的读写 代码 文档 01_stl总体课程安排 02_stl容器算法迭代器三大概念入门 03_stl理论知识_基本概念串讲 04_stl的string的典型操作1_初始化_遍历_连接_和字符指针转化_查找替换传智扫地僧 05_stl的string的典型操作2_删除和插入 06_stl的string的常用算法 07_vector基本操作_对象创建_头部尾部操作元素_数组方式遍历vector 08_vector的迭代器遍历和迭代器的种类_传智扫地僧 09_vector基本操作_删除和插入_传智扫地僧 10_中午知识点回顾 11_deque容器基本操作 12_stack栈模型 13_queue模型 14_list容器模型基本操作 15_优先级队列priority_queue基本操作 16_set容器_插入_遍历_基本数据类型比较 17_set容器_自定义数据类型排序(仿函数应用)_insert判断返回值(pair的使用)_传智扫地僧_ 18_set容器_find查找_equal_range(pair的使用)_传智扫地僧_ 19_multiset容器基本操作_ 文档 源码 01_上一次课程知识点回顾 02_map容器基本操作_插入和插入结果判断_传智扫地僧 03_map容器基本操作_查找和查找的异常处理 04_multimap容器案例_按照部门_增删改查员工信息 05_容器的值拷贝语意 06_各个容器特点比较 07_stl算法设计理念_函数对象和函数对象当参数和返回值_传智扫地僧 08_stl算法设计理念_一元函数对象和一元谓词 09_中午课程知识点回顾 10_stl算法设计理念_二元函数对象和二元谓词 11_stl算法设计理念_二元谓词在set集合的应用 12_stl算法设计理念_预定义函数对象和函数适配器1_传智扫地僧 13_stl算法设计理念_预定义函数对象和函数适配器2_案例_传智扫地僧 14_stl容器算法迭代器的设计理念_重要理论思想总结_传智扫地僧 15_stl的算法概念和分类 16_stl算法_foreach和transform基本使用 17_stl算法_foreach和transform算法比较_transform算法源码追踪_传智扫地僧 文档 源码 01_上一次课程复习 02_stl常用算法_查找相关 03_stl常用算法_排序相关 04_stl常用算法_拷贝和替换相关 05_stl常用算法_算法和生成 06_stl常用算法_集合运算 07_STL案例_演讲比赛_比赛介绍和需求分析 08_STL案例_演讲比赛_搭建案例框架_传智扫地僧 09_STL案例_演讲比赛_实现思路分析_传智扫地僧 10_STL案例_演讲比赛_业务函数实现_产生选手和选手抽签 11_STL案例_演讲比赛_业务函数实现_选手比赛_传智扫地僧 12_STL案例_演讲比赛_业务函数实现_比赛晋级结果打印 13_STL课程_知识体系梳理_传智扫地僧 文档 源码 第四部分 01_数据结构课程_学习思路_学习基础 02_数据结构概念_基本概念 03_数据结构概念_逻辑关系_物理结构 04_算法基本概念和大O表示 05_算法的时间复杂度 06_算法的空间复杂度_空间换时间案例 07_课堂答疑_学员思路 08_线性表的理论知识梳理_重点在链表算法和具体数据类型的分离 09_线性表顺序存储设计和实现_环境搭建 10_线性表顺序存储设计和实现_api函数实现1 11_线性表顺序存储设计和实现_api函数实现2_插入算法 12_线性表顺序存储设计和实现_api函数实现3_get和delete 13_线性表顺序存储设计和实现_总结 14_线性表链式存储_设计与实现_框架搭建和链表技术领域推演_传智扫地僧 15_线性表链式存储_设计与实现_api实现_传智扫地僧 16_线性表链式存储_设计与实现_api实现下_传智扫地僧 17_线性表链式存储_总结 18_c++模板链表_类设计和测试框架搭建 19_c++模板链表_类实现 代码 文档 01_数据结构day01_知识点梳理 02_c++链表模板类_思想加强 03_循环链表api熟悉 04_循环链表应用_约瑟夫问题求解 05_循环链表_插入算法分析_传智扫地僧 06_循环链表_删除算法分析 07_循环链表_游标课堂答疑 08_循环链表_api串讲 09_循环链表_api熟悉 10_栈的顺序存储_设计与实现_测试框架搭建 11_中午课程回顾 12_栈模型和链表模型_顺序存储_思想分析_传智扫地僧 13_栈的顺序存储_设计与实现_api实现和调试 14_栈的顺序存储_设计与实现_课堂答疑 15_栈链式存储_设计与实现_测试框架搭建 16_栈链式存储_设计与实现_栈结点转换成链表结点_思想分析_传智扫地僧 17_栈链式存储_设计与实现_api实现_传智扫地僧 18_栈链式存储_设计与实现_内存管理 19_栈的应用案例_就近匹配 20_栈的应用案例_中缀转后缀 21_栈的应用案例_基于后缀表达式的计算_传智扫地僧 22_栈的应用案例_程序讲解 23_树模型抛砖 代码 文档 01_上一次课程_知识点回顾 02_队列顺序存储_设计与实现_测试框架 03_队列顺序存储_设计与实现_api函数的实现 04_队列链式存储_设计与实现_测试框架 05_队列链式存储_设计与实现_api函数实现 06_树的概念_定义_表示法_二叉树转换_树的存储 07_二叉树的概念_定义和性质 08_二叉树的概念_表示法_二叉树遍历 09_中午课程回顾 10_二叉树编程_遍历本质剖析和递归方式遍历_传智扫地僧 11_二叉树编程案例1_求叶子结点的数目 12_二叉树编程案例2和3_求树高度_拷贝二叉树 13_二叉树编程案例_课堂答疑 14_树非递归中序遍历_思想分析 15_树非递归中序遍历_遍历过程演示 16_树非递归中序遍历_实现(stl方式)_传智扫地僧 17_stl栈模型组合容器类对象_思想抛砖 18_创建树思想抛砖 代码 文档 01_上一次课程回顾 02_创建树_先序和中序确定树 03_学习数据结构_常用工具介绍 04_创建树_#号法 05_创建树_#号法编程实践 06_创建树_#号法课堂答疑 07_线索化_概念_过程分析 08_线索化_两个赋值指针变量线索化思想 09_线索化_线索化初始化流程 10_线索化_遍历思想 11_线索化_遍历树时,把结点插入链表中 12_中午课程总结和线索化逆序访问 13_霍夫曼树概念 14_排序_概念 15_排序_选择法 16_排序_插入法 17_排序_冒泡 18_排序_希尔排序 19_排序_希尔排序_分组很重要 20_排序_快速排序 21_排序_归并 22_数据结构课程_知识体系梳理 代码 文档 01_上一次课程知识点回顾 02_递归需要需要掌握的点补充 03_链表类_链式存储_测试 04_链表类_链式存储_api实现 05_链表类_链式存储_课堂答疑 06_栈类_链式存储_api实现 07_队列类_链式存储设计与实现_api 08_链表类_顺序存储_类设计和测试框架 09_链表类_顺序存储_类api实现 10_栈类_顺序存储_实现 11_队列类_顺序存储设计与实现 c++基础串讲复习1 c++基础串讲复习2 c++基础串讲复习3 c++基础串讲复习4 c++基础串讲复习5 代码 数据结构书籍和工具收集 文档 第四部分 C和C++与数据结构基础 01_数据结构课程_学习思路_学习基础 02_数据结构概念_基本概念 03_数据结构概念_逻辑关系_物理结构 04_算法基本概念和大O表示 05_算法的时间复杂度 06_算法的空间复杂度_空间换时间案例 07_课堂答疑_学员思路 08_线性表的理论知识梳理_重点在链表算法和具体数据类型的分离 09_线性表顺序存储设计和实现_环境搭建 10_线性表顺序存储设计和实现_api函数实现1 11_线性表顺序存储设计和实现_api函数实现2_插入算法 12_线性表顺序存储设计和实现_api函数实现3_get和delete 13_线性表顺序存储设计和实现_总结 14_线性表链式存储_设计与实现_框架搭建和链表技术领域推演_传智扫地僧 15_线性表链式存储_设计与实现_api实现_传智扫地僧 16_线性表链式存储_设计与实现_api实现下_传智扫地僧 17_线性表链式存储_总结 18_c++模板链表_类设计和测试框架搭建 19_c++模板链表_类实现 代码 文档 01_数据结构day01_知识点梳理 02_c++链表模板类_思想加强 03_循环链表api熟悉 04_循环链表应用_约瑟夫问题求解 05_循环链表_插入算法分析_传智扫地僧 06_循环链表_删除算法分析 07_循环链表_游标课堂答疑 08_循环链表_api串讲 09_循环链表_api熟悉 10_栈的顺序存储_设计与实现_测试框架搭建 11_中午课程回顾 12_栈模型和链表模型_顺序存储_思想分析_传智扫地僧 13_栈的顺序存储_设计与实现_api实现和调试 14_栈的顺序存储_设计与实现_课堂答疑 15_栈链式存储_设计与实现_测试框架搭建 16_栈链式存储_设计与实现_栈结点转换成链表结点_思想分析_传智扫地僧 17_栈链式存储_设计与实现_api实现_传智扫地僧 18_栈链式存储_设计与实现_内存管理 19_栈的应用案例_就近匹配 20_栈的应用案例_中缀转后缀 21_栈的应用案例_基于后缀表达式的计算_传智扫地僧 22_栈的应用案例_程序讲解 23_树模型抛砖 代码 文档 01_上一次课程_知识点回顾 02_队列顺序存储_设计与实现_测试框架 03_队列顺序存储_设计与实现_api函数的实现 04_队列链式存储_设计与实现_测试框架 05_队列链式存储_设计与实现_api函数实现 06_树的概念_定义_表示法_二叉树转换_树的存储 07_二叉树的概念_定义和性质 08_二叉树的概念_表示法_二叉树遍历 09_中午课程回顾 10_二叉树编程_遍历本质剖析和递归方式遍历_传智扫地僧 11_二叉树编程案例1_求叶子结点的数目 12_二叉树编程案例2和3_求树高度_拷贝二叉树 13_二叉树编程案例_课堂答疑 14_树非递归中序遍历_思想分析 15_树非递归中序遍历_遍历过程演示 16_树非递归中序遍历_实现(stl方式)_传智扫地僧 17_stl栈模型组合容器类对象_思想抛砖 18_创建树思想抛砖 代码 文档 01_上一次课程回顾 02_创建树_先序和中序确定树 03_学习数据结构_常用工具介绍 04_创建树_#号法 05_创建树_#号法编程实践 06_创建树_#号法课堂答疑 07_线索化_概念_过程分析 08_线索化_两个赋值指针变量线索化思想 09_线索化_线索化初始化流程 10_线索化_遍历思想 11_线索化_遍历树时,把结点插入链表中 12_中午课程总结和线索化逆序访问 13_霍夫曼树概念 14_排序_概念 15_排序_选择法 16_排序_插入法 17_排序_冒泡 18_排序_希尔排序 19_排序_希尔排序_分组很重要 20_排序_快速排序 21_排序_归并 22_数据结构课程_知识体系梳理 代码 文档 01_上一次课程知识点回顾 02_递归需要需要掌握的点补充 03_链表类_链式存储_测试 04_链表类_链式存储_api实现 05_链表类_链式存储_课堂答疑 06_栈类_链式存储_api实现 07_队列类_链式存储设计与实现_api 08_链表类_顺序存储_类设计和测试框架 09_链表类_顺序存储_类api实现 10_栈类_顺序存储_实现 11_队列类_顺序存储设计与实现 c++基础串讲复习1 c++基础串讲复习2 c++基础串讲复习3 c++基础串讲复习4 c++基础串讲复习5 代码 数据结构书籍和工具收集 文档 第5部分 C_C++与设计模式基础 01_设计模式课程安排和要求 02_UML的建模和基本概念 03_UML图_用例图_基础 04_UML图_用例图_人事管理系统案例_传智扫地僧 05_UML图_类图_基础和类关系依赖 06_UML图_类图_关联_聚合_组合_传智扫地僧 07_UML图_时序图_传智扫地僧 08_UML图_活动图_传智扫地僧 09_UML图_状态图_进程状态案例 10_UML图_协作图_包图_部署图 11_设计模式_概念和设计原则 12_中午课程回顾 13_设计模式基本原则_依赖倒转 14_设计模式基本_依赖倒置和迪米特法则 15_单例模式_懒汉式和饿汉式 16_懒汉式遇上多线程问题 17_懒汉式多线程同步优化 18_简单工厂模式 19_工厂模式_传智扫地僧 文档 源码 01_上一次课程知识点梳理 02_抽象工厂模式 03_抽象工厂课堂答疑 04_建造者模式_理论模型 05_建造者模式_实现 06_建造者模式_问题抛出 07_原型模式 08_建造模式总结 09_课堂交流从建造者模式说开去 10_厚积薄发话题 11_代理模式_传智扫地僧 12_装饰模式_传智扫地僧 13_中午课程回顾 14_适配器模式 15_桥接模式_理论模型 16_桥接模式_实现_传智扫地僧 17_组合模式_上 18_组合模式_下 19_外观模式 20_享元模式 文档 源码 01_设计模式知识体系梳理01 02_模板模式_传智扫地僧 03_命令模式_技术推演上 04_命令模式_技术推演下_传智扫地僧 05_责任链模式 06_策略模式_及题外话 07_策略模式_实现 08_中介者模式_问题抛出上 09_中介者模式_实现下 10_中午知识点回顾 11_观察者模式_传智扫地僧 12_备忘录模式 13_访问者模式_概念基本原理_案例了解 14_访问者模式_实现_传智扫地僧 15_状态模式_原理及代码串讲 16_解释器模式 17_迭代器模式_思想_传智扫地僧 18_迭代器模式_实现_传智扫地僧 19_设计模式知识体系梳理02 文档 源码
 Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。   Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升应用开发的优雅性。   《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。此外,本书重点突出了“实战性”的主题,力求使全书“从实际项目中来,到实际项目中去”。 目录 第1篇 概述 第1章 Spring概述 1.1 认识Spring 1.2 关于SpringSource 1.3 Spring带给我们什么 1.4 Spring体系结构 1.5 Spring 3.0的新功能 1.5.1 核心API更新到Java 5. 1.5.2 Spring表达式语言 1.5.3 可通过Java类提供IoC配置信息 1.5.4 通用类型转换系统和属性格式化系统 1.5.5 数据访问层新增OXM功能 1.5.6 Web层的增强 1.5.7 其他 1.6 Spring对Java版本的要求 1.7 如何获取Spring 1.8 小结 第2章 快速入门 2.1 实例功能概述 2.1.1 比Hello World更适用的实例 2.1.2 实例功能简介 2.2 环境准备 2.2.1 创建库表 2.2.2 建立工程 2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 2.3.2 UserDao 2.3.3 LoginLogDao 2.3.4 在Spring中装配DAO 2.4 业务层 2.4.1 UserService 2.4.2 在Spring中装配Service 2.4.3 单元测试 2.5 展现层 2.5.1 配置Spring MVC框架 2.5.2 处理登录请求 2.5.3 JSP视图页面 2.6 运行Web应用 2.7 小结 第2篇 IoC和AOP 第3章 IoC容器概述 3.1 IoC概述 3.1.1 通过实例理解IoC的概念 3.1.2 IoC的类型 3.1.3 通过容器完成依赖关系的注入 3.2 相关Java基础知识 3.2.1 简单实例 3.2.2 类装载器ClassLoader 3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 3.5 Bean的生命周期 3.5.1 BeanFactory中Bean的生命周期 3.5.2 ApplicationContext中Bean的生命周期 3.6 小结 第4章 在IoC容器中装配Bean 4.1 Spring配置概述 4.1.1 Spring容器高层视图 4.1.2 基于XML的配置 4.2 Bean基本配置 4.2.1 装配一个Bean 4.2.2 Bean的命名 4.3 依赖注入 4.3.1 属性注入 4.3.2 构造函数注入 4.3.3 工厂方法注入 4.3.4 选择注入方式的考量 4.4 注入参数详解 4.4.1 字面值 4.4.2 引用其他Bean 4.4.3 内部Bean 4.4.4 null值 4.4.5 级联属性 4.4.6 集合类型属性 4.4.7 简化配置方式 4.4.8 自动装配 4.5 方法注入 4.5.1 lookup方法注入 4.5.2 方法替换 4.6 <bean>之间的关系 4.6.1 继承 4.6.2 依赖 4.6.3 引用 4.7 整合多个配置文件 4.8 Bean作用域 4.8.1 singleton作用域 4.8.2 prototype作用域 4.8.3 Web应用环境相关的Bean作用域 4.8.4 作用域依赖问题 4.9 FactoryBean 4.10 基于注解的配置 4.10.1 使用注解定义Bean 4.10.2 使用注解配置信息启动Spring容器 4.10.3 自动装配Bean 4.10.4 Bean作用范围及生命过程方法 4.11 基于Java类的配置 4.11.1 使用Java类提供Bean定义信息 4.11.2 使用基于Java类的配置信息启动Spring容器 4.12 不同配置方式比较 4.13 小结 第5章 Spring容器高级主题 5.1 Spring容器技术内幕 5.1.1 内部工作机制 5.1.2 BeanDefinition 5.1.3 InstantiationStrategy 5.1.4 BeanWrapper 5.2 属性编辑器 5.2.1 JavaBean的编辑器 5.2.2 Spring默认属性编辑器 5.2.3 自定义属性编辑器 5.3 使用外部属性文件 5.3.1 使用外部属性文件 5.3.2 使用加密的属性文件 5.3.3 属性文件自身的引用 5.4 引用Bean的属性值 5.5 国际化信息 5.5.1 基础知识 5.5.2 MessageSource 5.5.3 容器级的国际化信息资源 5.6 容器事件 5.6.1 Spring事件类结构 5.6.2 解构Spring事件体系的具体实现 5.6.3 一个实例 5.7 小结 第6章 Spring AOP基础 6.1 AOP概述 6.1.1 AOP到底是什么 6.1.2 AOP术语 6.1.3 AOP的实现者 6.2 基础知识 6.2.1 带有横切逻辑的实例 6.2.2 JDK动态代理 6.2.3 CGLib动态代理 6.2.4 AOP联盟 6.2.5 代理知识小结 6.3 创建增强类 6.3.1 增强类型 6.3.2 前置增强 6.3.3 后置增强 6.3.4 环绕增强 6.3.5 异常抛出增强 6.3.6 引介增强 6.4 创建切面 6.4.1 切点类型 6.4.2 切面类型 6.4.3 静态普通方法名匹配切面 6.4.4 静态正则表达式方法匹配切面 6.4.5 动态切面 6.4.6 流程切面 6.4.7 复合切点切面 6.4.8 引介切面 6.5 自动创建代理 6.5.1 实现类介绍 6.5.2 BeanNameAutoProxyCreator 6.5.3 DefaultAdvisorAutoProxyCreator 6.6 小结 第7章 基于@AspectJ和Schema的AOP 7.1 Spring对AOP的支持 7.2 JDK 5.0注解知识快速进阶 7.2.1 了解注解 7.2.2 一个简单的注解类 7.2.3 使用注解 7.2.4 访问注解 7.3 着手使用@AspectJ 7.3.1 使用前的准备 7.3.2 一个简单的例子 7.3.3 如何通过配置使用@AspectJ切面 7.4 @AspectJ语法基础 7.4.1 切点表达式函数 7.4.2 在函数入参中使用通配符 7.4.3 逻辑运算符 7.4.4 不同增强类型 7.4.5 引介增强用法 7.5 切点函数详解 7.5.1 @annotation() 7.5.2 execution() 7.5.3 args()和@args() 7.5.4 within() 7.5.5 @within()和@target() 7.5.6 target()的this() 7.6 @AspectJ进阶 7.6.1 切点复合运算 7.6.2 命名切点 7.6.3 增强织入的顺序 7.6.4 访问连接点信息 7.6.5 绑定连接点方法入参 7.6.6 绑定代理对象 7.6.7 绑定类注解对象 7.6.8 绑定返回值 7.6.9 绑定抛出的异常 7.7 基于Schema配置切面 7.7.1 一个简单切面的配置 7.7.2 配置命名切点 7.7.3 各种增强类型的配置 7.7.4 绑定连接点信息 7.7.5 Advisor配置 7.8 混合切面类型 7.8.1 混合使用各种切面类型 7.8.2 各种切面类型总结 7.9 JVM Class文件字节码转换基础知识 7.9.1 java.lang.instrument包的工作原理 7.9.2 如何向JVM中注册转换器 7.9.3 使用JVM启动参数注册转换器的问题 7.10 使用LTW织入切面 7.10.1 Spring的LoadTimeWeaver 7.10.2 使用LTW织入一个切面 7.10.3 在Tomcat下的配置 7.10.4 在其他Web应用服务器下的配置 7.11 小结 第3篇 数据访问 第8章 Spring对DAO的支持 8.1 Spring的DAO理念 8.2 统一的异常体系 8.2.1 Spring的DAO异常体系 8.2.2 JDBC的异常转换器 8.2.3 其他持久技术的异常转换器 8.3 统一数据访问模板 8.3.1 使用模板和回调机制 8.3.2 Spring为不同持久化技术所提供的模板类 8.4 数据源 8.4.1 配置一个数据源 8.4.2 获取JNDI数据源 8.4.3 Spring的数据源实现类 8.5 小结 第9章 Spring的事务管理 9.1 数据库事务基础知识 9.1.1 何为数据库事务 9.1.2 数据并发的问题 9.1.3 数据库锁机制 9.1.4 事务隔离级别 9.1.5 JDBC对事务支持 9.2 ThreadLocal基础知识 9.2.1 ThreadLocal是什么 9.2.2 ThreadLocal的接口方法 9.2.3 一个TheadLocal实例 9.2.4 与Thread同步机制的比较 9.2.5 Spring使用ThreadLocal解决线程安全问题 9.3 Spring对事务管理的支持 9.3.1 事务管理关键抽象 9.3.2 Spring的事务管理器实现类 9.3.3 事务同步管理器 9.3.4 事务传播行为 9.4 编程式的事务管理 9.5 使用XML配置声明式事务 9.5.1 一个将被实施事务增强的服务接口 9.5.2 使用原始的 TransactionProxyFactoryBean 9.5.3 基于tx/aop命名空间的配置 9.6 使用注解配置声明式事务 9.6.1 使用@Transactional注解 9.6.2 通过AspectJ LTW引入事务切面 9.7 集成特定的应用服务器 9.7.1 BEA WebLogic 9.7.2 BEA WebLogic 9.8 小结 第10章 Spring的事务管理难点剖析 10.1 DAO和事务管理的牵绊 10.1.1 JDBC访问数据库 10.1.2 Hibernate访问数据库 10.2 应用分层的迷惑 10.3 事务方法嵌套调用的迷茫 10.3.1 Spring事务传播机制回顾 10.3.2 相互嵌套的服务方法 10.4 多线程的困惑 10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的应对 10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼 10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC数据连接泄漏 10.7.3 通过DataSourceUtils获取数据连接 10.7.4 通过DataSourceUtils获取数据连接 10.7.5 JdbcTemplate如何做到对连接泄漏的免疫 10.7.6 使用TransactionAwareDataSourceProxy 10.7.7 其他数据访问技术的等价类 10.8 小结 第11章 使用Spring JDBC访问数据库 11.1 使用Spring JDBC 11.1.1 JDBCTemplate小试牛刀 11.1.2 在DAO中使用JDBCTemplate 11.2 基本的数据操作 11.2.1 更改数据 11.2.2 返回数据库的表自增主键值 11.2.3 批量更改数据 11.2.4 查询数据 11.2.5 查询单值数据 11.2.6 调用存储过程 11.3 BLOB/CLOB类型数据的操作 11.3.1 如何获取本地数据连接 11.3.2 相关的操作接口 11.3.3 插入Lob类型的数据 11.3.4 以块数据方式读取Lob数据 11.3.5 以流数据方式读取Lob数据 11.4 自增键和行集 11.4.1 自增键的使用 11.4.2 如何规划主键方案 11.4.3 以行集返回数据 11.5 其他类型的JDBCTemplate 11.5.1 NamedParameterJDBCTemplate 11.5.2 SimpleJDBCTemplate 11.6 以OO方式访问数据库 11.6.1 使用MappingSqlQuery查询数据 11.6.2 使用SqlUpdate更新数据 11.6.3 使用StoredProcedure执行存储过程 11.6.4 SqlFunction类 11.7 小结 第12章 整合其他ORM框架 12.1 Spring整合ORM技术 12.2 在Spring中使用Hibernate 12.2.1 配置SessionFactory 12.2.2 使用HibernateTemplate 12.2.3 处理LOB类型数据 12.2.4 添加Hibernate事件监听器 12.2.5 使用原生Hibernate API 12.2.6 使用注解配置 12.2.7 事务处理 12.2.8 延迟加载的问题 12.3 在Spring中使用myBatis 12.3.1 配置SqlMapClient 12.3.2 在Spring配置myBatis 12.3.3 编写myBatis的DAO 12.5 DAO层设计 12.5.1 DAO基类的设计 12.5.2 查询接口方法的设计 12.5.3 分页查询接口设计 12.6 小结 第4篇 业务层及Web层技术 第13章 任务调度和异步执行器 13.1 任务调度概述 13.2 Quartz快速进阶 13.2.1 Quartz基础结构 13.2.2 使用SimpleTrigger 13.2.3 使用CronTrigger 13.2.4 使用Calendar 13.2.5 任务调度信息存储 13.3 在Spring中使用Quartz 13.3.1 创建JobDetail 13.3.2 创建Trigger 13.3.3 创建Scheduler 13.4 Spring中使用JDK Timer 13.4.1 Timer和TimerTask 13.4.2 Spring对JDK Timer的支持 13.5 Spring对JDK 5.0 Executor的支持 13.5.1 了解JDK 5.0的Executor 13.5.2 Spring对Executor所提供的抽象 13.6 实际应用中的任务调度 13.6.1 如何产生任务 13.6.2 任务调度对应用程序集群的影响 13.6.3 任务调度云 13.6.4 Web应用程序中调度器的启动和关闭问题 13.7 小结 第14章 使用OXM进行对象XML映射 14.1 认识XML解析技术 14.1.1 什么是XML 14.1.2 XML的处理技术 14.2 XML处理利器:XStream 14.2.1 XStream概述 14.2.2 快速入门 14.2.3 使用XStream别名 14.2.4 XStream转换器 14.2.5 XStream注解 14.2.6 流化对象 14.2.7 持久化API 14.2.8 额外功能:处理JSON 14.3 其他常见O/X Mapping开源项目 14.3.1 JAXB 14.3.2 XMLBeans 14.3.3 Castor 14.3.4 JiBX 14.3.5 总结比较 14.4 与Spring OXM整合 14.4.1 Spring OXM概述 14.4.2 整合OXM实现者 14.4.3 如何在Spring中进行配置 14.4.4 Spring OXM 简单实例 14.5 小结 第15章 Spring MVC 15.1 Spring MVC概述 15.1.1 体系结构 15.1.2 配置DispatcherServlet 15.1.3 一个简单的实例 15.2 注解驱动的控制器 15.2.1 使用@RequestMapping映射请求 15.2.2 请求处理方法签名概述 15.2.3 处理方法签名详细说明 15.2.4 使用HttpMessageConverter<T> 15.2.5 处理模型数据 15.3 处理方法的数据绑定 15.3.1 数据绑定流程剖析 15.3.2 数据转换 15.3.3 数据格式化 15.3.4 数据校验 15.4 视图和视图解析器 15.4.1 认识视图 15.4.2 认识视图解析器 15.4.3 JSP和JSTL 15.4.4 模板视图 15.4.5 Excel 15.4.6 PDF 15.4.7 输出XML 15.4.8 输出JSON 15.4.9 使用XmlViewResolver 15.4.10 使用ResourceBundle ViewResolver 15.4.11 混合使用多种视图技术 15.5 本地化解析 15.5.1 本地化概述 15.5.2 使用CookieLocaleResolver 15.5.3 使用SessionLocaleResolver 15.5.4 使用LocaleChangeInterceptor 15.6 文件上传 15.6.1 配置MultipartResolver 15.6.2 编写控制器和文件上传表单页面 15.7 杂项 15.7.1 静态资源处理 15.7.2 装配拦截器 15.7.3 异常处理 15.8 小结 第5篇 测试及实战 第16章 实战型单元测试 16.1 单元测试概述 16.1.1 为什么需要单元测试 16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2 JUnit 4快速进阶 16.2.1 JUnit 4概述 16.2.2 JUnit 4生命周期 16.2.3 使用JUnit 16.3 模拟利器Mockito 16.3.1 模拟测试概述 16.3.2 创建Mock对象 16.3.3 设定Mock对象的期望行为及返回值 16.3.4 验证交互行为 16.4 测试整合之王Unitils 16.4.1 Unitils概述 16.4.2 集成Spring 16.4.3 集成Hibernate 16.4.4 集成Dbunit 16.4.5 自定义扩展模块 16.5 使用Unitils测试DAO层 16.5.1 数据库测试的难点 16.5.2 扩展Dbunit用Excel准备数据 16.5.3 测试实战 16.6 使用unitils测试Service层 16.7 测试Web层 16.7.1 对LoginController进行单元测试 16.7.2 使用Spring Servlet API模拟对象 16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体功能结构 17.1.2 论坛用例描述 17.1.3 主要功能流程描述 17.2 系统设计 17.2.1 技术框架选择 17.2.2 Web目录结构及类包结构规划 17.2.3 单元测试类包结构规划 17.2.4 系统的结构图 17.2.5 PO的类设计 17.2.6 持久层设计 17.2.7 服务层设计 17.2.8 Web层设计 17.2.9 数据库设计 17.3 开发前的准备 17.4 持久层开发 17.4.1 PO类 17.4.2 DAO基类 17.4.3 通过扩展基类所定义DAO类 17.4.4 DAO Bean的装配 17.4.5 使用Hibernate二级缓存 17.5 对持久层进行测试 17.5.1 配置Unitils测试环境 17.5.2 准备测试数据库及测试数据 17.5.3 编写DAO测试基类 17.5.4 编写BoardDao测试用例 17.6 服务层开发 17.6.1 UserService的开发 17.6.2 ForumService的开发 17.6.3 服务类Bean的装配 17.7 对服务层进行测试 17.7.1 编写Service测试基类 17.7.2 编写ForumService测试用例 17.8 Web层开发 17.8.1 BaseController的基类 17.8.2 用户登录和注销 17.8.3 用户注册 17.8.4 论坛管理 17.8.5 论坛普通功能 17.8.6 分页显示论坛版块的主题帖子 17.8.7 web.xml配置 17.8.8 Spring MVC配置 17.9 对Web层进行测试 17.9.1 编写Web测试基类 17.9.2 编写ForumManageController测试用例 17.10 部署和运行应用 17.11 小结 以下内容详见本书配书光盘: 附录A JavaMail发送邮件 附录B 在Spring中开发Web Service
第一篇 起步篇 第1章 初识Java 3 1.1 Java简介 3 1.1.1 Java的不同平台 3 1.1.2 Java发展的历程 3 1.1.3 Java的特点 4 1.2 安装开发工具包 5 1.2.1 下载JDK 5 1.2.2 安装JDK 6 1.2.3 安装后Java目录的解读 7 1.3 学会使用API 7 1.4 第一个Java程序 8 1.4.1 开发源代码 8 1.4.2 编译运行 9 1.5 小结 11 第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档注释 13 2.2 基本数据类型 14 2.2.1 整型 15 2.2.2 浮点型 17 2.2.3 char型 17 2.2.4 boolean型 18 2.3 基本数据类型值间的转换 18 2.3.1 自动转换 18 2.3.2 手动强制转换 19 2.3.3 隐含强制转换 19 2.4 标识符命名规范 20 2.4.1 正确的命名标识符 20 2.4.2 提倡的命名习惯 21 2.5 小结 21 第3章 表达式——描述行为的元素 22 3.1 不简单的算术运算符 22 3.1.1 “+”运算符 22 3.1.2 “-”运算符 24 3.1.3 “*”运算符 25 3.1.4 “/”运算符 25 3.1.5 “%”运算符 26 3.2 自增自减运算 27 3.3 关系运算 28 3.3.1 等于/不等于运算 28 3.3.2 比较大小运算 29 3.4 逻辑运算 30 3.4.1 “与”运算 30 3.4.2 “或”运算 31 3.4.3 “非”运算 32 3.5 三元运算符 32 3.6 位运算 33 3.7 移位运算 34 3.7.1 “”左移 35 3.7.2 “”右移 35 3.7.3 “”无符号右移 36 3.7.4 令人困扰的例子 37 3.8 赋值运算 37 3.8.1 普通赋值运算 37 3.8.2 运算赋值运算 38 3.9 括号及运算符间的优先级关系 38 3.10 常用数学工具包——java.lang.Math类 39 3.10.1 数学常量 39 3.10.2 常用数学函数 40 3.11 小结 41 第4章 流程控制——Java世界的航行舵手 42 4.1 if条件语句 42 4.1.1 简略形式 42 4.1.2 完全形式 43 4.1.3 语句的嵌套 43 4.2 switch多分支语句 45 4.2.1 基本语法 45 4.2.2 合法的判断表达式 46 4.2.3 合法的case表达式 47 4.2.4 详细执行流程 49 4.3 while循环语句 50 4.4 do-while循环语句 52 4.5 for循环语句 53 4.5.1 基本语法 53 4.5.2 声明的三大组成部分 54 4.5.3 复杂的for循环案例 55 4.5.4 用for实现其他循环 55 4.6 break中断语句 56 4.7 continue继续语句 57 4.8 小结 58 第5章 数组——以不变应万变的哲学 59 5.1 数组的声明及创建 59 5.1.1 声明数组引用 59 5.1.2 创建数组对象 60 5.2 Java中数组的实现机制 61 5.3 数组的初始化 63 5.3.1 默认初始化 63 5.3.2 利用循环初始化 64 5.3.3 枚举初始化 66 5.4 数组的相互赋值 67 5.4.1 基本类型数组赋值规则 67 5.4.2 引用型数组赋值规则 68 5.5 数组的常用操作 69 5.5.1 数组复制 69 5.5.2 数组排序 71 5.5.3 搜索指定元素 72 5.5.4 比较数组中的元素 73 5.6 关于args[] 73 5.7 小结 74 第二篇 基础篇 第6章 对象和类——Java世界的细胞 77 6.1 面向对象概述 77 6.1.1 面向对象程序设计思想的诞生 77 6.1.2 面向过程与面向对象思想的对比 78 6.1.3 面向对象技术的背景和特点 79 6.2 类的定义与对象的创建 80 6.3 成员变量 81 6.3.1 成员变量的开发与使用 81 6.3.2 成员变量的初始值 82 6.3.3 对象引用变量的比较 84 6.4 方法 85 6.5 变长参数 86 6.6 引用问题 87 6.6.1 调用不存在的方法或成员变量 87 6.6.2 用空引用进行调用 88 6.6.3 数组的空引用问题 89 6.7 局部变量 89 6.7.1 局部变量的作用域 89 6.7.2 局部变量的初始化 90 6.8 this预定义对象引用 92 6.9 擅用系统已有的类 94 6.9.1 Java中的Date类 94 6.9.2 Java中的GregorianCalendar类 96 6.9.3 擅用系统已有类的思想 98 6.10 小结 99 第7章 访问控制——Java世界的卫兵 100 7.1 包的使用 100 7.1.1 声明创建包 100 7.1.2 引入包内的资源 102 7.1.3 静态引入 104 7.2 类的访问控制 105 7.2.1 公有访问级别 105 7.2.2 默认访问级别 106 7.2.3 类与源代码文件的搭配 106 7.3 成员的访问控制 107 7.3.1 公共类型 107 7.3.2 私有类型 108 7.3.3 默认类型 109 7.3.4 保护类型 109 7.3.5 Java中封装的实现 110 7.4 final的变量 112 7.4.1 final的成员变量 113 7.4.2 final的局部变量 115 7.5 static关键字的使用 116 7.5.1 静态成员 116 7.5.2 静态成员的访问 117 7.5.3 静态最终成员变量 119 7.6 小结 121 第8章 继承——多态的支柱 122 8.1 继承概述 122 8.1.1 类之间的关系 122 8.1.2 面向对象中的继承性 124 8.2 类的继承 125 8.3 成员变量的继承与隐藏 126 8.3.1 成员变量的继承规则 126 8.3.2 成员变量的隐藏 129 8.4 对象引用的使用 130 8.4.1 对象引用能指向的对象类型 130 8.4.2 对象引用的强制类型转换 131 8.4.3 对象引用所能调用的成员 132 8.4.4 对象引用的赋值与比较 133 8.5 方法的继承与重写 135 8.5.1 方法的继承规则 135 8.5.2 方法重写的基本知识 136 8.5.3 构成重写的条件 137 8.5.4 返回类型的规则 138 8.5.5 访问级别的要求 140 8.5.6 重写基于继承 141 8.5.7 静态方法没有重写 141 8.5.8 通过重写扩展父类方法的功能 143 8.5.9 替代性原理 144 8.6 方法的重载 145 8.6.1 方法重载的规则 145 8.6.2 重载方法的匹配 145 8.6.3 重写与重载的区别 149 8.7 final与继承 149 8.7.1 最终的类 149 8.7.2 最终的方法 150 8.8 abstract与继承 151 8.8.1 抽象的类 151 8.8.2 抽象的方法 152 8.9 基于继承的多态 154 8.10 小结 155 第9章 接口——灵活性的基石 156 9.1 概述及其特性 156 9.2 成员变量在接口中的使用 157 9.2.1 语法规则 157 9.2.2 接口中成员变量的作用 158 9.3 方法接口中的使用 159 9.3.1 语法规则 159 9.3.2 如何实现接口 160 9.3.3 接口引用的使用 162 9.3.4 接口方法无法使用的修饰符 165 9.4 接口与抽象类 166 9.4.1 语法上的不同 167 9.4.2 具体含义的不同 167 9.5 基于接口的多态 169 9.6 接口与回调 170 9.7 instanceof的使用 172 9.7.1 基本语法与使用 172 9.7.2 不允许进行测试的情况 174 9.8 小结 175 第10章 构造器——对象制造的工厂 176 10.1 基础知识 176 10.1.1 编写构造器的语法规则 176 10.1.2 访问限制修饰符与构造器 176 10.1.3 构造器与返回类型 179 10.2 创建对象 180 10.3 重载构造器 181 10.4 级联调用的构造器 182 10.4.1 构造器的调用流程及默认构造器 182 10.4.2 自定义构造器需要注意的问题 185 10.4.3 不能继承构造器 186 10.4.4 调用兄弟构造器 187 10.5 单列模式 189 10.6 Java程序的加载过程 190 10.7 小结 192 第三篇 高级基础篇 第11章 异常处理——Java世界的医生 195 11.1 异常处理的基本知识 195 11.1.1 try和catch捕获异常 195 11.1.2 异常的传播过程 198 11.1.3 finally语句块的使用 199 11.1.4 try、catch及finally语句块之间需要注意的问题 201 11.2 异常的层次结构 203 11.2.1 捕获异常 203 11.2.2 未捕获异常 205 11.3 再次抛出异常 206 11.3.1 什么是异常的再抛出 206 11.3.2 显性再抛出 207 11.3.3 隐性再抛出 209 11.3.4 方法重写对抛出异常声明的约束 210 11.4 定义自己的异常 212 11.4.1 创建自己的异常类 212 11.4.2 使用自定义的异常类 213 11.4.3 显性再抛出作用的体现 215 11.5 异常的匹配 217 11.5.1 同时捕获多种异常 217 11.5.2 多个catch语句的先后顺序 218 11.6 断言 219 11.6.1 什么是断言 219 11.6.2 如何启用/关闭断言 220 11.6.3 防止滥用断言 222 11.7 小结 222 第12章 封装类——鸿沟之上的桥梁 223 12.1 封装类的基本知识 223 12.1.1 封装类概述 223 12.1.2 创建封装类对象 223 12.1.3 封装类对象的其他知识 225 12.2 数据转换功能 226 12.2.1 基本数据类型值转换为字符串 226 12.2.2 字符串转换为基本数据类型值 229 12.3 其他常用方法 231 12.3.1 静态工厂方法 231 12.3.2 isNaN方法 232 12.3.3 equals方法 233 12.4 自动打包/解包 -235 12.4.1 自动打包 235 12.4.2 自动解包 236 12.5 特殊的数值计算 237 12.5.1 特大整数的计算 237 12.5.2 浮点数的精确计算 239 12.6 小结 242 第13章 字符串——优异的内存组织机制 243 13.1 String类的基础知识 243 13.1.1 对象的创建 243 13.1.2 巧用构造器 244 13.1.3 String类的重要方法 245 13.2 String对象的内存机制 248 13.2.1 一段令人困惑的字符串程序 248 13.2.2 “一次投入,终身回报”的String内存机制 249 13.2.3 String对象特殊机制付出的代价 252 13.3 StringBuffer类 253 13.3.1 弥补String不足的StringBuffer类 253 13.3.2 编写方法链以及StringBuffer类的重要方法 255 13.4 StringBuilder类 258 13.5 正则表达式 259 13.5.1 正则表达式的基本语法 259 13.5.2 Pattern类简介 262 13.5.3 Matcher类简介 263 13.5.4 Pattern与Matcher类的综合应用 264 13.6 String类中正则式的应用 266 13.6.1 模式匹配检查 266 13.6.2 利用正则式进行查找替换 267 13.6.3 利用正则式对字符串进行分析 268 13.7 小结 269 第14章 集合框架——强大的对象管理器 270 14.1 Object类——所有类的超类 270 14.1.1 toString方法的重写 270 14.1.2 equals方法的意义 271 14.1.3 hashCode方法的意义 272 14.2 重写equals与hashCode方法 273 14.2.1 重写equals方法 273 14.2.2 重写hashCode方法 275 14.3 集合框架的层次结构 -277 14.4 Ordered与Sorted的接口 278 14.4.1 Ordered的排序 278 14.4.2 Sorted的排序 279 14.5 列表 279 14.5.1 列表接口——st 279 14.5.2 列表的数组实现 281 14.5.3 历史悠久的向量 282 14.5.4 列表的链接实现 284 14.5.5 依赖性倒置原理 285 14.5.6 将数组转换为列表 285 14.6 集合 286 14.6.1 Set接口及含义 286 14.6.2 HashSet类的使用 287 14.6.3 equals与hashCode方法重写规定的作用 288 14.6.4 LinkedHashSet类的使用 291 14.6.5 SortedSet接口与TreeSet类 292 14.6.6 自定义满足Sorted集合的类 293 14.6.7 定制SortedSet的排序规则 296 14.6.8 集合的遍历 298 14.6.9 使用for-each循环遍历集合 300 14.7 映射集 301 14.7.1 Map接口及含义 301 14.7.2 HashMap类的使用 302 14.7.3 Hashtable类的使用 303 14.7.4 LinkedHashMap类的使用 304 14.7.5 SortedMap接口与TreeMap类 305 14.7.6 映射的遍历 308 14.8 栈在Java中的实现 309 14.8.1 Stack类的使用 309 14.8.2 Deque接口的使用 310 14.8.3 利用栈计算数学表达式 311 14.9 集合元素的常用操作 314 14.9.1 元素排序 315 14.9.2 搜索特定元素 316 14.9.3 任意打乱元素顺序 317 14.9.4 其他的简单操作 318 14.10 小结 320 第15章 内部类——Java世界的多面手 321 15.1 非静态内部类 321 15.1.1 语法规则 321 15.1.2 外部类之内创建内部类对象 322 15.1.3 外部类之外创建内部类对象 323 15.1.4 内部类与外部类之间的成员互访 324 15.1.5 内部类与外部类的预定义对象引用this 327 15.2 局部内部类 328 15.2.1 局部内部类的定义及创建 328 15.2.2 局部变量与局部内部类 329 15.2.3 静态方法中的局部内部类 331 15.3 静态内部类 332 15.3.1 语法规则 332 15.3.2 创建静态内部类的对象 332 15.3.3 静态/非静态内部类的区别 333 15.4 匿名内部类 334 15.4.1 基于继承的匿名内部类 334 15.4.2 基于接口实现的匿名内部类 335 15.4.3 匿名内部类的初始化 337 15.4.4 匿名内部类作用的体现 337 15.5 理解内部类 339 15.6 内部接口 340 15.6.1 定义在类中的内部接口 340 15.6.2 定义在接口中的内部接口 341 15.7 小结 342 第16章 多线程——Java中的并发协作 343 16.1 线程的基本知识 343 16.1.1 多线程编程的意义 343 16.1.2 定义自己的线程 344 16.1.3 创建线程对象 345 16.1.4 启动线程 347 16.1.5 同时使用多个线程 348 16.2 线程的状态 350 16.3 线程的调度 351 16.3.1 睡眠 351 16.3.2 线程的优先级 353 16.3.3 线程的让步 355 16.3.4 守护线程 357 16.4 线程的同步 359 16.4.1 同步方法简介 359 16.4.2 简单使用同步方法 360 16.4.3 线程同步调度的方法 362 16.4.4 “生产者-消费者”案例的框架 362 16.4.5 “生产者-消费者”案例的实际运行 365 16.4.6 notify方法的使用 366 16.4.7 同步的语句块 367 16.4.8 线程的死锁 369 16.4.9 防止错误的使用wait、notify、notifyAll方法 371 16.5 获取当前正在运行的线程 372 16.6 volatile关键字的含义与使用 372 16.7 小结 373 第17章 高级线程开发 374 17.1 线程池的使用 374 17.1.1 线程池的基本思想 374 17.1.2 JavaSE 5.0中固定尺寸线程池的基本知识 374 17.1.3 自定义尺寸固定线程池的使用 375 17.1.4 单任务线程池的使用 377 17.1.5 可变尺寸线程池的使用 378 17.1.6 延迟线程池的使用 380 17.1.7 使用自定义参数的线程池 381 17.2 有返回值的线程调用 384 17.2.1 Callable接口简介 384 17.2.2 Future接口简介 384 17.2.3 Callable与Future接口的具体使用 385 17.3 资源的封锁 386 17.3.1 Lock接口与ReentrantLock类简介 386 17.3.2 ReentrantLock锁的具体使用 387 17.3.3 ReadWriteLock接口与ReentrantReadWriteLock类简介 390 17.3.4 ReentrantReadWriteLock读/写锁的具体使用 391 17.4 信号量的使用 393 17.4.1 Semaphore类简介 393 17.4.2 Semaphore类的具体使用 394 17.5 队列 396 17.5.1 Queue接口介绍 396 17.5.2 PriorityQueue类的知识与使用 397 17.5.3 BlockingQueue接口介绍 399 17.6 阻塞的栈操作 401 17.6.1 BlockingDeque接口与LinkedBlockingDeque类简介 401 17.6.2 LinkedBlockingDeque类的具体使用 402 17.7 线程安全的单变量操作 403 17.7.1 atomic包简介 403 17.7.2 atomic包中类的具体使用 404 17.8 障碍器 406 17.8.1 CyclicBarrier类简介 406 17.8.2 CyclicBarrier类的具体使用 407 17.9 小结 408 第18章 内存管理与垃圾收集——自动化的典范 409 18.1 什么是“垃圾” 409 18.1.1 对象成为“垃圾”的条件 409 18.1.2 符合条件的几种情况 409 18.2 垃圾收集器 411 18.2.1 垃圾收集器的基本介绍 411 18.2.2 申请垃圾收集器运行 412 18.3 垃圾收集前的处理工作 413 18.3.1 finalize方法的重写 414 18.3.2 finalize方法的安全问题 415 18.3.3 最终守护者模式 417 18.3.4 再谈非线程“垃圾” 418 18.3.5 再谈线程“垃圾” 419 18.4 3种特殊的引用 420 18.4.1 弱引用 421 18.4.2 软引用 422 18.4.3 幻影引用 424 18.5 小结 424 第四篇 Swing GUI篇 第19章 初识Swing 427 19.1 Swing概述 427 19.2 一个简单的Swing程序 428 19.3 Swing的过人之处 429 19.3.1 完全轻量级的控件 430 19.3.2 可插拔的感观风格 430 19.3.3 更多的控件扩展 430 19.4 Swing和AWT的对比 432 19.4.1 Swing与AWT之间的关系 432 19.4.2 Swing与AWT的控件的混用建议 432 19.5 小结 433 第20章 开始创建Swing应用程序 434 20.1 窗体——JFrame类 434 20.1.1 JFrame类简介 434 20.1.2 创建简单窗体 436 20.2 AWT1.1事件处理模型 438 20.2.1 事件的处理模型简介 438 20.2.2 事件的层次结构 439 20.2.3 窗体事件 440 20.2.4 事件适配器 442 20.3 面板——JPanel类 444 20.3.1 容器的基本知识 444 20.3.2 JPanel类简介 445 20.3.3 JPanel的简单使用 445 20.4 标签——JLabel类 446 20.4.1 JLabel类简介 446 20.4.2 使用JLabel类 448 20.5 按钮——JButton类 449 20.5.1 JButton类简介 449 20.5.2 动作事件 450 20.5.3 监听器与事件源对应关系的研究 451 20.6 小结 454 第21章 布局管理器——界面设计的利器 455 21.1 布局管理器设计思想概述 455 21.2 常用布局管理器简介 455 21.3 流布局 456 21.3.1 流布局简介 456 21.3.2 使用流布局 458 21.4 网格布局 459 21.4.1 网格布局简介 459 21.4.2 使用网格布局 460 21.5 边框布局 462 21.5.1 边框布局简介 462 21.5.2 使用边框布局 464 21.6 空布局 465 21.6.1 空布局简介 465 21.6.2 使用空布局 466 21.7 卡片布局 467 21.7.1 卡片布局简介 467 21.7.2 使用卡片布局 468 21.8 箱式布局 470 21.8.1 箱式布局简介 471 21.8.2 Box容器简介 472 21.8.3 Box容器与BoxLayout布局管理器的使用 473 21.9 弹簧布局 475 21.9.1 弹簧布局的基本思想 475 21.9.2 SpringLayout类简介 478 21.9.3 SpringLayoutConstraints内部类简介 479 21.9.4 Spring类简介 480 21.9.5 弹簧布局的简单使用 480 21.9.6 描述法弹簧布局的具体使用 482 21.10 小结 483 第22章 Swing常用基本控件 484 22.1 控件类概述 484 22.2 文本框与密码框 487 22.2.1 JTextField类简介 487 22.2.2 JPasswordField类简介 488 22.2.3 登录窗口的案例 489 22.3 Swing中的文本区 491 22.3.1 JTextArea类简介 491 22.3.2 JScrollPane类详细介绍 493 22.3.3 文本区与滚动窗口的组合使用 494 22.4 可以记录状态的开关按钮 496 22.4.1 JToggleButton类简介 496 22.4.2 开关按钮的使用 497 22.5 单选按钮与复选框 499 22.5.1 JRadioButton类简介 499 22.5.2 ButtonGroup类简介 500 22.5.3 JCheckBox类简介 500 22.5.4 ItemEvent事件 501 22.5.5 一个关于ItemEvent事件的例子 502 22.5.6 单选按钮与复选框的综合案例 504 22.6 小结 506 第23章 Swing常用高级控件 507 23.1 选项卡的相关知识与使用 507 23.1.1 JTabbedPane类简介 507 23.1.2 ChangeEvent事件 509 23.1.3 JTabbedPane实现选项卡的例子 509 23.2 分割窗格 511 23.2.1 JSplitPane类简介 511 23.2.2 分割窗格的嵌套使用 513 23.3 滑块与进度条 514 23.3.1 JSlider类简介 514 23.3.2 JProgressBar类简介 516 23.3.3 滑块与进度条的使用 518 23.4 格式化文本框 519 23.4.1 JFormattedTextField类简介 520 23.4.2 JFormattedTextField中的格式器 521 23.4.3 格式化文本框的具体使用 523 23.5 编辑器面板 525 23.5.1 JEditorPane类简介 525 23.5.2 HyperlinkEvent事件 527 23.5.3 使用JEditorPane实现简单的浏览器 527 23.6 列表框的知识与使用 529 23.6.1 JList类简介 530 23.6.2 ListSelectionEvent事件 531 23.6.3 控件MVC设计模式简介 532 23.6.4 JList类的使用 533 23.7 下拉列表框 534 23.7.1 JComboBox类简介 534 23.7.2 下拉列表框的具体使用 536 23.8 微调控制器 538 23.8.1 JSpinner类简介 538 23.8.2 微调控制器模型简介 539 23.8.3 微调控制器的具体使用 542 23.9 小结 543 第24章 菜单、工具栏与对话框 544 24.1 Swing中的菜单 544 24.1.1 Swing菜单的基本知识 544 24.1.2 JMenuBar类简介 545 24.1.3 JMenuItem类简介 546 24.1.4 JMenu类简介 549 24.1.5 JRadioButtonMenuItem类简介 550 24.1.6 JCheckBoxMenuItem类简介 551 24.1.7 菜单使用综合案例 551 24.2 Swing中的弹出式菜单 554 24.2.1 JPopupMenu类简介 554 24.2.2 弹出式菜单的显示 555 24.3 鼠标事件 555 24.3.1 鼠标事件简介 555 24.3.2 弹出式菜单的具体使用 557 24.4 工具栏的开发 559 24.4.1 JToolBar类简介 559 24.4.2 工具栏的具体使用 560 24.5 Swing中的对话框 562 24.5.1 JDialog类简介 562 24.5.2 JOptionPane类简介 563 24.5.3 JOptionPane对话框的具体使用 566 24.5.4 文件选择器 568 24.5.5 颜色选择器 571 24.5.6 文件、颜色对话框综合案例 572 24.6 小结 574 第25章 Swing中的树状列表 575 25.1 与树有关的专有名词 575 25.2 JTree类简介 576 25.2.1 JTree类构造器简介 576 25.2.2 JTree类的常用方法说明 577 25.2.3 一个简单JTree的实例 579 25.3 树模型 580 25.3.1 TreeModel接口简介 580 25.3.2 默认树模型DefaultTreeModel类 581 25.4 树的节点 582 25.4.1 TreeNode接口简介 582 25.4.2 MutableTreeNode接口简介 583 25.4.3 DefaultMutableTreeNode类简介 583 25.5 树的路径 586 25.6 树的相关事件 587 25.6.1 TreeSelectionEvent事件 587 25.6.2 TreeExpansionEvent事件 589 25.6.3 TreeModelEvent事件 589 25.7 树节点的绘制 590 25.7.1 TreeCellRenderer接口简介 590 25.7.2 DefaultTreeCellRenderer类简介 590 25.7.3 自定义绘制器案例 592 25.8 树状列表的综合案例 593 25.8.1 案例概述 593 25.8.2 搭建界面 594 25.8.3 添加信息提示功能 595 25.8.4 开发节点增删功能 597 25.8.5 添加图标更改功能 600 25.9 小结 602 第26章 Swing中的表格 603 26.1 初识表格 603 26.2 JTable类 604 26.2.1 JTable类简介 604 26.2.2 使用JTable的简单案例 606 26.3 表格的数据模型 608 26.3.1 TableModel接口简介 608 26.3.2 AbstractTableModel类简介 608 26.3.3 DefaultTableModel类简介 609 26.3.4 使用表格模型的简单案例 611 26.4 表格列 612 26.5 表格列模型 613 26.5.1 TableColumnModel接口简介 614 26.5.2 DefaultTableColumnModel类简介 614 26.6 表格的相关事件 616 26.6.1 表格相关事件简介 616 26.6.2 表格事件的示例程序 618 26.7 表格绘制器与编辑器 620 26.7.1 表格绘制器简介 620 26.7.2 表格编辑器简介 622 26.8 自定义表格编辑器与绘制器的综合案例 624 26.8.1 案例概述 624 26.8.2 界面框架的搭建 624 26.8.3 自定义表格模型的开发以及表格控件的添加 625 26.8.4 自定义绘制器的开发 627 26.8.5 添加自定义编辑器 628 26.9 表格中的排序与过滤 630 26.9.1 RowSorter类简介 631 26.9.2 DefaultRowSorter类简介 631 26.9.3 TableRowSorter类简介 632 26.9.4 RowFilter类简介 633 26.10 表格排序与过滤的综合案例 635 26.10.1 案例概述 635 26.10.2 搭建界面框架 636 26.10.3 添加表格 637 26.10.4 为表格添加排序器 638 26.10.5 添加设置过滤条件的控件 639 26.10.6 为表格设置过滤器 641 26.11 小结 643 第27章 高级Swing开发 644 27.1 Swing线程 644 27.1.1 事件分发线程简介 644 27.1.2 事件分发线程单线程模型带来的问题 644 27.1.3 解决不当使用事件分发线程引发的问题 645 27.2 Robot类的知识与应用 648 27.2.1 Robot类简介 648 27.2.2 利用Robot类实现自动演示功能 649 27.3 Desktop类的知识与应用 652 27.3.1 Desktop类简介 652 27.3.2 使用Desktop的综合案例 654 27.4 Swing应用程序的感观 656 27.4.1 UIManager类简介 657 27.4.2 MetalLookAndFeel类简介 658 27.4.3 动态切换外观风格的案例 658 27.5 系统托盘 661 27.5.1 SystemTray类简介 661 27.5.2 TrayIcon类简介 662 27.5.3 使用系统托盘的简单案例 663 27.6 应用程序的监控与管理 665 27.7 小结 666 第五篇 图形图像篇 第28章 图形绘制与动画 669 28.1 绘制简单图形 669 28.1.1 画布的相关知识 669 28.1.2 画笔的相关知识 670 28.1.3 颜色的调配 672 28.1.4 图形绘制的简单案例 673 28.2 绘制各种文本 674 28.2.1 drawString方法简介 675 28.2.2 字体的控制 675 28.2.3 文本绘制的简单案例 676 28.3 Java 2D 677 28.3.1 Graphics 2D类简介 677 28.3.2 控制线条的粗细 679 28.3.3 使用颜渐变色 680 28.3.4 图形变换 681 28.3.5 异或模式绘图 683 28.3.6 抗锯齿 685 28.4 动画的开发 685 28.4.1 动画实现的原理 685 28.4.2 Timer类简介 686 28.4.3 简单动画的案例 687 28.5 小结 689 第29章 图像处理 690 29.1 图像的加载与绘制 690 29.1.1 Image类简介 690 29.1.2 绘制Image图像 692 29.2 图标的使用 693 29.2.1 Icon接口简介 694 29.2.2 ImageIcon类简介 695 29.3 图像的编码处理 697 29.3.1 JPEG编码器简介 697 29.3.2 GifEncoder编码器简介 698 29.4 屏幕图像抓取 700 29.4.1 createScreenCapture方法简介 700 29.4.2 抓屏功能的案例 700 29.5 图像滤镜的开发 703 29.5.1 图像的灰度处理的基本知识 703 29.5.2 图像灰度处理的案例 705 29.5.3 RGB色彩通道过滤的基本知识 707 29.5.4 RGB色彩通道过滤的案例 708 29.5.5 卷积滤镜的基本知识 711 29.5.6 卷积滤镜的案例 712 29.6 小结 714 第六篇 高级应用篇 第30章 JDBC数据库开发 717 30.1 数据库应用的两种架构模型 717 30.1.1 两层结构数据库应用的架构模型 717 30.1.2 三层结构数据库应用的架构模型 718 30.2 JDBC的层次结构 718 30.3 JDBC编程基础 719 30.3.1 创建数据库 720 30.3.2 JDBC-ODBC连接桥 721 30.3.3 加载JDBC驱动 722 30.3.4 建立数据库连接 723 30.3.5 执行SQL命令 725 30.3.6 结果集 725 30.3.7 连接数据库的简单案例 726 30.3.8 预编译语句 728 30.4 访问其他数据库 730 30.4.1 访问MySQL数据库 730 30.4.2 访问Oracle数据库 732 30.5 事务 733 30.5.1 编写事务 734 30.5.2 批处理 736 30.6 可滚动结果集 738 30.6.1 获得可滚动的结果集 738 30.6.2 可滚动与不可滚动结果集的比较 739 30.6.3 控制游标移动 739 30.7 元数据 742 30.7.1 数据库元数据 742 30.7.2 结果集元数据 744 30.8 数据库综合案例——DBManager 746 30.8.1 案例概述 746 30.8.2 搭建主界面 747 30.8.3 开发输入数据库连接信息的对话框 749 30.8.4 初始化树状列表根节点 751 30.8.5 初始化树状列表表节点 753 30.8.6 初始化树状列表列节点 754 30.8.7 添加显示表数据的功能 756 30.8.8 添加显示列信息的功能 758 30.8.9 自定义树节点图标 759 30.8.10 连接其他类型数据库 761 30.8.11 案例小结 761 30.9 小结 761 第31章 Derby数据库的应用 762 31.1 Derby数据库简介 762 31.1.1 Derby的发展史及特性概述 762 31.1.2 JavaSE 6.0中Derby的目录结构 762 31.2 管理工具ij 763 31.2.1 准备工作 763 31.2.2 简单使用 764 31.3 Derby数据库的嵌入式应用 767 31.3.1 嵌入式Derby的工作原理 767 31.3.2 嵌入式Derby应用的开发步骤 767 31.3.3 使用嵌入式Derby的简单案例 768 31.4 Derby数据库的网络模式应用 770 31.4.1 网络模式Derby的工作原理 771 31.4.2 操作网络模式的Derby 771 31.4.3 开发启动Derby网络服务的程序 772 31.4.4 使用网络模式Derby的简单案例 774 31.5 小结 775 第32章 I/O流 776 32.1 I/O流的基本原理与分类 776 32.1.1 流的概念 776 32.1.2 节点流与处理流 776 32.1.3 字节流与字符流 777 32.2 节点流 780 32.2.1 常用节点流简介 780 32.2.2 使用节点流的简单案例 782 32.3 处理流 783 32.3.1 常用处理流简介 783 32.3.2 使用处理流的简单案例 785 32.4 系统输入输出 786 32.4.1 系统输入流 787 32.4.2 系统输出流 788 32.4.3 格式化输出的简单案例 790 32.4.4 系统错误流 791 32.4.5 系统输入输出重定向 792 32.5 进程控制 793 32.5.1 Process类简介 793 32.5.2 控制进程的简单案例 794 32.6 目录文件管理 795 32.6.1 File类简介 796 32.6.2 使用File的简单案例 797 32.7 I/O流综合案例——数据库图片查看器 798 32.7.1 案例概述 798 32.7.2 主界面与程序框架的搭建 799 32.7.3 添加图片功能的开发 801 32.7.4 查看图片功能的开发 804 32.7.5 删除图片功能的开发 806 32.7.6 案例小结 806 32.8 小结 806 第33章 套接字网络开发 807 33.1 TCP/IP协议简介 807 33.2 网络开发中的常用工具类 808 33.2.1 URL简介 808 33.2.2 URL类简介与使用 809 33.2.3 InetAddress类简介与使用 811 33.3 Socket编程 812 33.3.1 Socket编程简介 813 33.3.2 ServerSocket类简介 813 33.3.3 Socket类简介 814 33.3.4 C/S架构程序的简单案例 815 33.4 小结 817 第34章 反射与注解 818 34.1 反射 818 34.1.1 Class类简介 818 34.1.2 Class类的简单使用 820 34.1.3 数组与Class类 822 34.1.4 精确判断对象类型 823 34.1.5 Field类的知识与使用 824 34.1.6 Method类的知识与使用 826 34.1.7 Constructor类的知识与使用 828 34.1.8 反射与修饰符 830 34.1.9 取消访问限制 833 34.1.10 利用反射动态创建数组对象 835 34.2 程序注解 836 34.2.1 声明自己的注解 837 34.2.2 确定注解的使用目标 837 34.2.3 确定注解的使用时效 838 34.2.4 通过反射提取注解信息 839 34.2.5 标注性注解的使用 840 34.2.6 常用的系统注解 842 34.2.7 利用注解方便开发Web服务 844 34.2.8 注解与代码自动生成 845 34.3 小结 845 第35章 泛型程序设计 846 35.1 泛型简介 846 35.1.1 没有泛型的烦恼 846 35.1.2 泛型技术的好处 846 35.2 简单泛型程序的开发 847 35.2.1 泛型类或接口的声明 847 35.2.2 泛型方法的开发 849 35.2.3 类型变量的限制 850 35.3 泛型参数的继承以及通配符 851 35.3.1 泛型参数的继承问题 852 35.3.2 泛型通配符 852 35.3.3 泛型通配符使用的特殊注意 854 35.3.4 有限制的通配符 855 35.4 泛型的擦除 857 35.4.1 擦除的基本概念与规则 857 35.4.2 擦除引出的约束与局限性 858 35.5 系统提供的泛型类 859 35.6 小结 859 第36章 安全类型枚举 860 36.1 JavaSE 5.0之前的枚举 860 36.1.1 传统枚举实现方式的案例 860 36.1.2 传统实现方式带来的问题 861 36.2 JavaSE 5.0中的安全类型枚举 862 36.2.1 基本语法与简单使用 862 36.2.2 复杂的枚举类型 864 36.2.3 枚举类 866 36.3 小结 867 第37章 嵌入式脚本开发 868 37.1 基本步骤与知识 868 37.1.1 ScriptEngineManager类简介 868 37.1.2 ScriptEngineFactory接口简介 869 37.1.3 ScriptEngine接口简介 870 37.1.4 基本步骤 870 37.1.5 执行外部的脚本文件 871 37.2 其他第三方脚本引擎 872 37.2.1 引擎支持jar包的下载与安装 872 37.2.2 Ruby脚本的简单案例 873 37.2.3 Groovy脚本的简单案例 874 37.3 小结 874
 Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。   Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升应用开发的优雅性。   《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。此外,本书重点突出了“实战性”的主题,力求使全书“从实际项目中来,到实际项目中去”。 目录 第1篇 概述 第1章 Spring概述 1.1 认识Spring 1.2 关于SpringSource 1.3 Spring带给我们什么 1.4 Spring体系结构 1.5 Spring 3.0的新功能 1.5.1 核心API更新到Java 5. 1.5.2 Spring表达式语言 1.5.3 可通过Java类提供IoC配置信息 1.5.4 通用类型转换系统和属性格式化系统 1.5.5 数据访问层新增OXM功能 1.5.6 Web层的增强 1.5.7 其他 1.6 Spring对Java版本的要求 1.7 如何获取Spring 1.8 小结 第2章 快速入门 2.1 实例功能概述 2.1.1 比Hello World更适用的实例 2.1.2 实例功能简介 2.2 环境准备 2.2.1 创建库表 2.2.2 建立工程 2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 2.3.2 UserDao 2.3.3 LoginLogDao 2.3.4 在Spring中装配DAO 2.4 业务层 2.4.1 UserService 2.4.2 在Spring中装配Service 2.4.3 单元测试 2.5 展现层 2.5.1 配置Spring MVC框架 2.5.2 处理登录请求 2.5.3 JSP视图页面 2.6 运行Web应用 2.7 小结 第2篇 IoC和AOP 第3章 IoC容器概述 3.1 IoC概述 3.1.1 通过实例理解IoC的概念 3.1.2 IoC的类型 3.1.3 通过容器完成依赖关系的注入 3.2 相关Java基础知识 3.2.1 简单实例 3.2.2 类装载器ClassLoader 3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 3.5 Bean的生命周期 3.5.1 BeanFactory中Bean的生命周期 3.5.2 ApplicationContext中Bean的生命周期 3.6 小结 第4章 在IoC容器中装配Bean 4.1 Spring配置概述 4.1.1 Spring容器高层视图 4.1.2 基于XML的配置 4.2 Bean基本配置 4.2.1 装配一个Bean 4.2.2 Bean的命名 4.3 依赖注入 4.3.1 属性注入 4.3.2 构造函数注入 4.3.3 工厂方法注入 4.3.4 选择注入方式的考量 4.4 注入参数详解 4.4.1 字面值 4.4.2 引用其他Bean 4.4.3 内部Bean 4.4.4 null值 4.4.5 级联属性 4.4.6 集合类型属性 4.4.7 简化配置方式 4.4.8 自动装配 4.5 方法注入 4.5.1 lookup方法注入 4.5.2 方法替换 4.6 <bean>之间的关系 4.6.1 继承 4.6.2 依赖 4.6.3 引用 4.7 整合多个配置文件 4.8 Bean作用域 4.8.1 singleton作用域 4.8.2 prototype作用域 4.8.3 Web应用环境相关的Bean作用域 4.8.4 作用域依赖问题 4.9 FactoryBean 4.10 基于注解的配置 4.10.1 使用注解定义Bean 4.10.2 使用注解配置信息启动Spring容器 4.10.3 自动装配Bean 4.10.4 Bean作用范围及生命过程方法 4.11 基于Java类的配置 4.11.1 使用Java类提供Bean定义信息 4.11.2 使用基于Java类的配置信息启动Spring容器 4.12 不同配置方式比较 4.13 小结 第5章 Spring容器高级主题 5.1 Spring容器技术内幕 5.1.1 内部工作机制 5.1.2 BeanDefinition 5.1.3 InstantiationStrategy 5.1.4 BeanWrapper 5.2 属性编辑器 5.2.1 JavaBean的编辑器 5.2.2 Spring默认属性编辑器 5.2.3 自定义属性编辑器 5.3 使用外部属性文件 5.3.1 使用外部属性文件 5.3.2 使用加密的属性文件 5.3.3 属性文件自身的引用 5.4 引用Bean的属性值 5.5 国际化信息 5.5.1 基础知识 5.5.2 MessageSource 5.5.3 容器级的国际化信息资源 5.6 容器事件 5.6.1 Spring事件类结构 5.6.2 解构Spring事件体系的具体实现 5.6.3 一个实例 5.7 小结 第6章 Spring AOP基础 6.1 AOP概述 6.1.1 AOP到底是什么 6.1.2 AOP术语 6.1.3 AOP的实现者 6.2 基础知识 6.2.1 带有横切逻辑的实例 6.2.2 JDK动态代理 6.2.3 CGLib动态代理 6.2.4 AOP联盟 6.2.5 代理知识小结 6.3 创建增强类 6.3.1 增强类型 6.3.2 前置增强 6.3.3 后置增强 6.3.4 环绕增强 6.3.5 异常抛出增强 6.3.6 引介增强 6.4 创建切面 6.4.1 切点类型 6.4.2 切面类型 6.4.3 静态普通方法名匹配切面 6.4.4 静态正则表达式方法匹配切面 6.4.5 动态切面 6.4.6 流程切面 6.4.7 复合切点切面 6.4.8 引介切面 6.5 自动创建代理 6.5.1 实现类介绍 6.5.2 BeanNameAutoProxyCreator 6.5.3 DefaultAdvisorAutoProxyCreator 6.6 小结 第7章 基于@AspectJ和Schema的AOP 7.1 Spring对AOP的支持 7.2 JDK 5.0注解知识快速进阶 7.2.1 了解注解 7.2.2 一个简单的注解类 7.2.3 使用注解 7.2.4 访问注解 7.3 着手使用@AspectJ 7.3.1 使用前的准备 7.3.2 一个简单的例子 7.3.3 如何通过配置使用@AspectJ切面 7.4 @AspectJ语法基础 7.4.1 切点表达式函数 7.4.2 在函数入参中使用通配符 7.4.3 逻辑运算符 7.4.4 不同增强类型 7.4.5 引介增强用法 7.5 切点函数详解 7.5.1 @annotation() 7.5.2 execution() 7.5.3 args()和@args() 7.5.4 within() 7.5.5 @within()和@target() 7.5.6 target()的this() 7.6 @AspectJ进阶 7.6.1 切点复合运算 7.6.2 命名切点 7.6.3 增强织入的顺序 7.6.4 访问连接点信息 7.6.5 绑定连接点方法入参 7.6.6 绑定代理对象 7.6.7 绑定类注解对象 7.6.8 绑定返回值 7.6.9 绑定抛出的异常 7.7 基于Schema配置切面 7.7.1 一个简单切面的配置 7.7.2 配置命名切点 7.7.3 各种增强类型的配置 7.7.4 绑定连接点信息 7.7.5 Advisor配置 7.8 混合切面类型 7.8.1 混合使用各种切面类型 7.8.2 各种切面类型总结 7.9 JVM Class文件字节码转换基础知识 7.9.1 java.lang.instrument包的工作原理 7.9.2 如何向JVM中注册转换器 7.9.3 使用JVM启动参数注册转换器的问题 7.10 使用LTW织入切面 7.10.1 Spring的LoadTimeWeaver 7.10.2 使用LTW织入一个切面 7.10.3 在Tomcat下的配置 7.10.4 在其他Web应用服务器下的配置 7.11 小结 第3篇 数据访问 第8章 Spring对DAO的支持 8.1 Spring的DAO理念 8.2 统一的异常体系 8.2.1 Spring的DAO异常体系 8.2.2 JDBC的异常转换器 8.2.3 其他持久技术的异常转换器 8.3 统一数据访问模板 8.3.1 使用模板和回调机制 8.3.2 Spring为不同持久化技术所提供的模板类 8.4 数据源 8.4.1 配置一个数据源 8.4.2 获取JNDI数据源 8.4.3 Spring的数据源实现类 8.5 小结 第9章 Spring的事务管理 9.1 数据库事务基础知识 9.1.1 何为数据库事务 9.1.2 数据并发的问题 9.1.3 数据库锁机制 9.1.4 事务隔离级别 9.1.5 JDBC对事务支持 9.2 ThreadLocal基础知识 9.2.1 ThreadLocal是什么 9.2.2 ThreadLocal的接口方法 9.2.3 一个TheadLocal实例 9.2.4 与Thread同步机制的比较 9.2.5 Spring使用ThreadLocal解决线程安全问题 9.3 Spring对事务管理的支持 9.3.1 事务管理关键抽象 9.3.2 Spring的事务管理器实现类 9.3.3 事务同步管理器 9.3.4 事务传播行为 9.4 编程式的事务管理 9.5 使用XML配置声明式事务 9.5.1 一个将被实施事务增强的服务接口 9.5.2 使用原始的 TransactionProxyFactoryBean 9.5.3 基于tx/aop命名空间的配置 9.6 使用注解配置声明式事务 9.6.1 使用@Transactional注解 9.6.2 通过AspectJ LTW引入事务切面 9.7 集成特定的应用服务器 9.7.1 BEA WebLogic 9.7.2 BEA WebLogic 9.8 小结 第10章 Spring的事务管理难点剖析 10.1 DAO和事务管理的牵绊 10.1.1 JDBC访问数据库 10.1.2 Hibernate访问数据库 10.2 应用分层的迷惑 10.3 事务方法嵌套调用的迷茫 10.3.1 Spring事务传播机制回顾 10.3.2 相互嵌套的服务方法 10.4 多线程的困惑 10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的应对 10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼 10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC数据连接泄漏 10.7.3 通过DataSourceUtils获取数据连接 10.7.4 通过DataSourceUtils获取数据连接 10.7.5 JdbcTemplate如何做到对连接泄漏的免疫 10.7.6 使用TransactionAwareDataSourceProxy 10.7.7 其他数据访问技术的等价类 10.8 小结 第11章 使用Spring JDBC访问数据库 11.1 使用Spring JDBC 11.1.1 JDBCTemplate小试牛刀 11.1.2 在DAO中使用JDBCTemplate 11.2 基本的数据操作 11.2.1 更改数据 11.2.2 返回数据库的表自增主键值 11.2.3 批量更改数据 11.2.4 查询数据 11.2.5 查询单值数据 11.2.6 调用存储过程 11.3 BLOB/CLOB类型数据的操作 11.3.1 如何获取本地数据连接 11.3.2 相关的操作接口 11.3.3 插入Lob类型的数据 11.3.4 以块数据方式读取Lob数据 11.3.5 以流数据方式读取Lob数据 11.4 自增键和行集 11.4.1 自增键的使用 11.4.2 如何规划主键方案 11.4.3 以行集返回数据 11.5 其他类型的JDBCTemplate 11.5.1 NamedParameterJDBCTemplate 11.5.2 SimpleJDBCTemplate 11.6 以OO方式访问数据库 11.6.1 使用MappingSqlQuery查询数据 11.6.2 使用SqlUpdate更新数据 11.6.3 使用StoredProcedure执行存储过程 11.6.4 SqlFunction类 11.7 小结 第12章 整合其他ORM框架 12.1 Spring整合ORM技术 12.2 在Spring中使用Hibernate 12.2.1 配置SessionFactory 12.2.2 使用HibernateTemplate 12.2.3 处理LOB类型数据 12.2.4 添加Hibernate事件监听器 12.2.5 使用原生Hibernate API 12.2.6 使用注解配置 12.2.7 事务处理 12.2.8 延迟加载的问题 12.3 在Spring中使用myBatis 12.3.1 配置SqlMapClient 12.3.2 在Spring配置myBatis 12.3.3 编写myBatis的DAO 12.5 DAO层设计 12.5.1 DAO基类的设计 12.5.2 查询接口方法的设计 12.5.3 分页查询接口设计 12.6 小结 第4篇 业务层及Web层技术 第13章 任务调度和异步执行器 13.1 任务调度概述 13.2 Quartz快速进阶 13.2.1 Quartz基础结构 13.2.2 使用SimpleTrigger 13.2.3 使用CronTrigger 13.2.4 使用Calendar 13.2.5 任务调度信息存储 13.3 在Spring中使用Quartz 13.3.1 创建JobDetail 13.3.2 创建Trigger 13.3.3 创建Scheduler 13.4 Spring中使用JDK Timer 13.4.1 Timer和TimerTask 13.4.2 Spring对JDK Timer的支持 13.5 Spring对JDK 5.0 Executor的支持 13.5.1 了解JDK 5.0的Executor 13.5.2 Spring对Executor所提供的抽象 13.6 实际应用中的任务调度 13.6.1 如何产生任务 13.6.2 任务调度对应用程序集群的影响 13.6.3 任务调度云 13.6.4 Web应用程序中调度器的启动和关闭问题 13.7 小结 第14章 使用OXM进行对象XML映射 14.1 认识XML解析技术 14.1.1 什么是XML 14.1.2 XML的处理技术 14.2 XML处理利器:XStream 14.2.1 XStream概述 14.2.2 快速入门 14.2.3 使用XStream别名 14.2.4 XStream转换器 14.2.5 XStream注解 14.2.6 流化对象 14.2.7 持久化API 14.2.8 额外功能:处理JSON 14.3 其他常见O/X Mapping开源项目 14.3.1 JAXB 14.3.2 XMLBeans 14.3.3 Castor 14.3.4 JiBX 14.3.5 总结比较 14.4 与Spring OXM整合 14.4.1 Spring OXM概述 14.4.2 整合OXM实现者 14.4.3 如何在Spring中进行配置 14.4.4 Spring OXM 简单实例 14.5 小结 第15章 Spring MVC 15.1 Spring MVC概述 15.1.1 体系结构 15.1.2 配置DispatcherServlet 15.1.3 一个简单的实例 15.2 注解驱动的控制器 15.2.1 使用@RequestMapping映射请求 15.2.2 请求处理方法签名概述 15.2.3 处理方法签名详细说明 15.2.4 使用HttpMessageConverter<T> 15.2.5 处理模型数据 15.3 处理方法的数据绑定 15.3.1 数据绑定流程剖析 15.3.2 数据转换 15.3.3 数据格式化 15.3.4 数据校验 15.4 视图和视图解析器 15.4.1 认识视图 15.4.2 认识视图解析器 15.4.3 JSP和JSTL 15.4.4 模板视图 15.4.5 Excel 15.4.6 PDF 15.4.7 输出XML 15.4.8 输出JSON 15.4.9 使用XmlViewResolver 15.4.10 使用ResourceBundle ViewResolver 15.4.11 混合使用多种视图技术 15.5 本地化解析 15.5.1 本地化概述 15.5.2 使用CookieLocaleResolver 15.5.3 使用SessionLocaleResolver 15.5.4 使用LocaleChangeInterceptor 15.6 文件上传 15.6.1 配置MultipartResolver 15.6.2 编写控制器和文件上传表单页面 15.7 杂项 15.7.1 静态资源处理 15.7.2 装配拦截器 15.7.3 异常处理 15.8 小结 第5篇 测试及实战 第16章 实战型单元测试 16.1 单元测试概述 16.1.1 为什么需要单元测试 16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2 JUnit 4快速进阶 16.2.1 JUnit 4概述 16.2.2 JUnit 4生命周期 16.2.3 使用JUnit 16.3 模拟利器Mockito 16.3.1 模拟测试概述 16.3.2 创建Mock对象 16.3.3 设定Mock对象的期望行为及返回值 16.3.4 验证交互行为 16.4 测试整合之王Unitils 16.4.1 Unitils概述 16.4.2 集成Spring 16.4.3 集成Hibernate 16.4.4 集成Dbunit 16.4.5 自定义扩展模块 16.5 使用Unitils测试DAO层 16.5.1 数据库测试的难点 16.5.2 扩展Dbunit用Excel准备数据 16.5.3 测试实战 16.6 使用unitils测试Service层 16.7 测试Web层 16.7.1 对LoginController进行单元测试 16.7.2 使用Spring Servlet API模拟对象 16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体功能结构 17.1.2 论坛用例描述 17.1.3 主要功能流程描述 17.2 系统设计 17.2.1 技术框架选择 17.2.2 Web目录结构及类包结构规划 17.2.3 单元测试类包结构规划 17.2.4 系统的结构图 17.2.5 PO的类设计 17.2.6 持久层设计 17.2.7 服务层设计 17.2.8 Web层设计 17.2.9 数据库设计 17.3 开发前的准备 17.4 持久层开发 17.4.1 PO类 17.4.2 DAO基类 17.4.3 通过扩展基类所定义DAO类 17.4.4 DAO Bean的装配 17.4.5 使用Hibernate二级缓存 17.5 对持久层进行测试 17.5.1 配置Unitils测试环境 17.5.2 准备测试数据库及测试数据 17.5.3 编写DAO测试基类 17.5.4 编写BoardDao测试用例 17.6 服务层开发 17.6.1 UserService的开发 17.6.2 ForumService的开发 17.6.3 服务类Bean的装配 17.7 对服务层进行测试 17.7.1 编写Service测试基类 17.7.2 编写ForumService测试用例 17.8 Web层开发 17.8.1 BaseController的基类 17.8.2 用户登录和注销 17.8.3 用户注册 17.8.4 论坛管理 17.8.5 论坛普通功能 17.8.6 分页显示论坛版块的主题帖子 17.8.7 web.xml配置 17.8.8 Spring MVC配置 17.9 对Web层进行测试 17.9.1 编写Web测试基类 17.9.2 编写ForumManageController测试用例 17.10 部署和运行应用 17.11 小结 以下内容详见本书配书光盘: 附录A JavaMail发送邮件 附录B 在Spring中开发Web Service

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值