本书全面介绍了学习Java EE企业级发所需要的技术以及知识,技术包括Maven、Tomcat、Jetty、Servlet、JDBC、Spring、Spring Web MVC、Spring Security、MyBatis、MySQL、Thymeleaf、Bootstrap、Jersey、Spring Boot、Spring Cloud等源技术栈,知识涉及数据库、IoC、AOP、单元测试、集成测试、事务管理、MVC、安全认证、数据持久化、REST、WebSocket、消息通信、Email发送、任务执行与调度、缓存、微服务治理等。 本书内容丰富,案例新颖,由浅深,层层推,理论联系实际,具有较强的实操性和先性,所讲的知识既能满足当前企业级应用的发需求,又可以大幅度减轻发者的负担。
售 价:¥
纸质售价:¥109.80购买纸书
温馨提示:数字商品不支持退换货,不提供源文件,不支持导出打印
为你推荐
封面页
书名页
版权页
内容简介
作者简介
前言
目录
第1章 Java EE概述
1.1 Java EE发展简史
1.1.1 Java平台发展简史
1.1.2 Java EE现状
1.2 传统企业级应用技术的不足
1.2.1 规范太重
1.2.2 学习成本太高
1.2.3 不够灵活
1.2.4 发展缓慢
1.3 轻量级Java EE的技术特点
1.3.1 轻量级架构
1.3.2 符合二八定律
1.3.3 基于开源技术
1.3.4 支持微服务
1.3.5 可用性和扩展性
1.3.6 支撑大型互联网应用
1.4 开发环境搭建
1.4.1 安装JDK
1.4.2 Maven安装
1.4.3 安装Eclipse
1.4.4 安装IntelliJ IDEA
1.4.5 安装Apache Tomcat
1.5 总 结
1.6 习 题
第2章 项目管理——Maven
2.1 Maven概述
2.1.1 Maven的主要功能
2.1.2 创建Maven项目
2.1.3 探索Maven项目
2.1.4 构建Maven项目
2.2 理解Maven构建生命周期
2.2.1 Maven阶段
2.2.2 完整的生命周期阶段
2.2.3 生命周期阶段在命令行中的调用
2.2.4 使用构建生命周期来设置项目
2.3 理解POM
2.3.1 Super POM
2.3.2 最小化POM
2.4 实战:使用Eclipse创建Maven应用
2.4.1 创建Maven应用
2.4.2 运行Maven应用
2.4.3 导入Maven应用
2.4.4 相关问题解决
2.5 实战:使用IntelliJ IEDA创建Maven应用
2.5.1 创建Maven应用
2.5.2 运行Maven应用
2.5.3 导入Maven应用
2.5.4 相关问题解决
2.6 总 结
2.7 习 题
第3章 Web应用的基石——Servlet
3.1 Servlet概述
3.1.1 Servlet架构
3.1.2 Servlet生命周期
3.1.3 常用方法
3.2 Servlet容器
3.2.1 常用Servlet容器
3.2.2 Tomcat和Jetty的相同点
3.2.3 Tomcat和Jetty的不同点
3.2.4 总结
3.3 过滤器
3.3.1 什么是过滤器
3.3.2 过滤器生命周期
3.3.3 包装请求和响应
3.3.4 过滤器环境
3.3.5 Web应用中过滤器的配置
3.3.6 过滤器和请求分派器
3.4 请 求
3.4.1 HTTP协议参数
3.4.2 属性
3.4.3 请求头
3.4.4 请求路径元素
3.4.5 路径转换方法
3.4.6 请求数据编码
3.5 Servlet上下文
3.5.1 ServletContext接口作用域
3.5.2 初始化参数
3.5.3 配置方法
3.5.4 上下文属性
3.5.5 资源
3.6 响 应
3.6.1 缓冲
3.6.2 头
3.6.3 方法
3.7 监听器
3.7.1 事件类型和监听器接口
3.7.2 部署描述符示例
3.7.3 监听器实例和线程
3.7.4 监听器异常
3.7.5 分布式容器
3.7.6 会话事件
3.8 会 话
3.8.1 会话跟踪机制
3.8.2 创建会话
3.8.3 会话范围
3.8.4 绑定属性到会话
3.8.5 会话超时
3.8.6 最后访问时间
3.8.7 线程问题
3.8.8 分布式环境
3.8.9 客户端语义
3.9 实战:创建基于Servlet的Web应用
3.9.1 创建动态Web项目
3.9.2 创建Servlet实现类
3.9.3 编译应用
3.9.4 运行应用
3.10 Tomcat服务器概述
3.10.1 Tomcat目录结构
3.10.2 Tomcat主要组件
3.10.3 Tomcat处理HTTP请求的过程
3.11 实战:在应用里面内嵌Tomcat容器
3.11.1 安装tomcat7-maven-plugin
3.11.2 运行应用
3.11.3 访问应用
3.12 Jetty服务器概述
3.12.1 高性能Servlet容器
3.12.2 可拔插
3.12.3 Jetty常用配置
3.13 实战:在应用里面内嵌Jetty容器
3.13.1 Maven插件形式
3.13.2 编程方式
3.14 总 结
3.15 习 题
第4章 流行的开源关系型数据库——MySQL
4.1 MySQL概述
4.1.1 MySQL名字的由来
4.1.2 MySQL的发展历程
4.1.3 MySQL的特点
4.2 MySQL的安装
4.2.1 下载安装包
4.2.2 解压安装包
4.2.3 创建my.ini
4.2.4 初始化安装
4.2.5 启动和关闭MySQL Server
4.3 使用MySQL客户端
4.4 MySQL基本操作
4.5 总 结
4.6 习 题
第5章 Java操作数据库——JDBC
5.1 JDBC概述
5.2 JDBC的核心概念
5.2.1 建立连接
5.2.2 执行SQL并操作结果集
5.2.3 两层模型
5.2.4 三层模型
5.2.5 JDBC与Java EE平台的关系
5.3 使用PreparedStatement
5.3.1 创建PreparedStatement对象
5.3.2 为什么使用PreparedStatement
5.4 事务管理
5.4.1 事务边界和自动提交
5.4.2 关闭自动提交模式
5.4.3 事务隔离级别
5.4.4 性能考虑
5.4.5 保存点
5.5 实战:使用JDBC操作数据库
5.5.1 初始化数据库
5.5.2 建表
5.5.3 初始化应用
5.5.4 创建测试类
5.6 理解连接池技术
5.7 实战:使用数据库连接池DBCP
5.7.1 添加DBCP依赖
5.7.2 编写数据库工具类
5.7.3 理解DbUtil的配置化
5.7.4 编写测试用例
5.8 总 结
5.9 习 题
第6章 一站式应用框架——Spring
6.1 Spring概述
6.1.1 Spring的广义与狭义
6.1.2 Spring框架总览
6.1.3 Spring框架常用模块
6.1.4 Spring设计模式
6.2 IoC
6.2.1 依赖注入与控制反转
6.2.2 IoC容器和Bean
6.2.3 配置元数据
6.2.4 实例化容器
6.2.5 使用容器
6.2.6 Bean的命名
6.2.7 实例化bean的方式
6.2.8 注入方式
6.2.9 实战:依赖注入的例子
6.2.10 依赖注入的详细配置
6.2.11 使用depends-on
6.2.12 延迟加载bean
6.2.13 自动装配
6.2.14 方法注入
6.2.15 bean scope
6.2.16 singleton bean与prototype bean
6.2.17 理解生命周期机制
6.2.18 基于注解的配置
6.2.19 基于注解的配置与基于XML的配置
6.3 AOP
6.3.1 AOP概述
6.3.2 AOP核心概念
6.3.3 Spring AOP
6.3.4 AOP代理
6.3.5 实战:使用@AspectJ的例子
6.3.6 基于XML的AOP
6.3.7 实战:基于XML的AOP的例子
6.4 资源处理
6.4.1 常用资源接口
6.4.2 内置资源接口实现
6.4.3 ResourceLoader
6.4.4 ResourceLoaderAware
6.4.5 资源作为依赖
6.5 表达式语言SpEL
6.5.1 表达式接口
6.5.2 对于bean定义的支持
6.5.3 实战:使用SpEL的例子
6.6 总 结
6.7 习 题
第7章 Spring测试
7.1 测试概述
7.1.1 传统的测试所面临的问题
7.1.2 如何破解测试面临的问题
7.1.3 测试类型
7.1.4 测试范围及比例
7.2 Mock对象
7.2.1 Environment
7.2.2 JNDI
7.2.3 Servlet API
7.3 测试工具类
7.3.1 测试工具
7.3.2 测试Spring Web MVC
7.4 测试相关的注解
7.4.1 @BootstrapWith
7.4.2 @ContextConfiguration
7.4.3 @WebAppConfiguration
7.4.4 @ContextHierarchy
7.4.5 @ActiveProfiles
7.4.6 @TestPropertySource
7.4.7 @DirtiesContext
7.4.8 @TestExecutionListeners
7.4.9 @Commit
7.4.10 @Rollback
7.4.11 @BeforeTransaction
7.4.12 @AfterTransaction
7.4.13 @Sql
7.4.14 @SqlConfig
7.4.15 @SqlGroup
7.4.16 Spring JUnit 4注解
7.4.17 Spring JUnit Jupiter注解
7.5 Spring TestContext框架
7.5.1 Spring TestContext框架概述
7.5.2 核心抽象
7.5.3 引导TestContext
7.5.4 TestExecutionListener配置
7.5.5 上下文管理
7.5.6 测试夹具的注入
7.5.7 如何测试request bean和session bean
7.5.8 事务管理
7.5.9 执行SQL脚本
7.6 Spring MVC Test框架
7.6.1 服务端测试概述
7.6.2 选择测试策略
7.6.3 设置测试功能
7.6.4 执行请求
7.6.5 定义期望
7.6.6 注册过滤器
7.6.7 脱离容器的测试
7.6.8 实战:服务端测试Spring Web MVC的例子
7.7 总 结
7.8 习 题
第8章 Spring事务管理
8.1 事务管理概述
8.1.1 Spring事务管理优势
8.1.2 全局事务与本地事务
8.1.3 Spring事务模型
8.2 通过事务实现资源同步
8.2.1 高级别的同步方法
8.2.2 低级别的同步方法
8.2.3 TransactionAwareDataSourceProxy
8.3 声明式事务管理
8.3.1 声明式事务管理
8.3.2 实战:声明式事务管理的例子
8.3.3 事务回滚
8.3.4 配置不同的事务策略
8.3.5 @Transactional详解
8.3.6 事务传播机制
8.4 编程式事务管理
8.4.1 TransactionTemplate
8.4.2 PlatformTransactionManager
8.4.3 声明式事务管理和编程式事务管理
8.5 总 结
8.6 习 题
第9章 MVC模式的典范——Spring Web MVC
9.1 Spring Web MVC概述
9.2 DispatcherServlet
9.2.1 DispatcherServlet概述
9.2.2 上下文层次结构
9.2.3 处理流程
9.2.4 拦截
9.3 过滤器
9.3.1 HTTP PUT表单
9.3.2 转发头
9.3.3 ShallowEtagHeaderFilter
9.3.4 CORS
9.4 控制器
9.4.1 声明控制器
9.4.2 请求映射
9.4.3 处理器方法
9.4.4 模型方法
9.4.5 绑定器方法
9.5 异常处理
9.5.1 @ExceptionHandler
9.5.2 框架异常处理
9.5.3 REST API异常
9.5.4 注解异常
9.5.5 容器错误页面
9.6 CORS处理
9.6.1 @CrossOrigin
9.6.2 全局CORS配置
9.6.3 自定义
9.6.4 CORS过滤器
9.7 HTTP缓存
9.7.1 缓存控制
9.7.2 静态资源
9.7.3 控制器缓存
9.8 MVC配置
9.8.1 启用MVC配置
9.8.2 类型转换
9.8.3 验证
9.8.4 拦截器
9.8.5 内容类型
9.8.6 消息转换器
9.8.7 视图控制器
9.8.8 视图解析器
9.8.9 静态资源
9.8.10 DefaultServletHttpRequestHandler
9.8.11 路径匹配
9.9 实战:基于Spring Web MVC的JSON类型的处理
9.9.1 接口设计
9.9.2 系统配置
9.9.3 后台编码实现
9.9.4 应用配置
9.9.5 运行应用
9.10 实战:基于Spring Web MVC的XML类型的处理
9.10.1 接口设计
9.10.2 系统配置
9.10.3 后台编码实现
9.10.4 应用配置
9.10.5 运行应用
9.11 总 结
9.12 习 题
第10章 全能安全框架——Spring Security
10.1 基于角色的权限管理
10.1.1 角色的概念
10.1.2 基于角色的访问控制
10.1.3 哪种方式更好
10.1.4 真实的案例
10.2 Spring Security概述
10.2.1 Spring Security的认证模型
10.2.2 Spring Security的安装
10.2.3 模块
10.2.4 Spring Security 5的新特性及高级功能
10.3 实战:基于Spring Security安全认证
10.3.1 添加依赖
10.3.2 添加业务代码
10.3.3 配置消息转换器
10.3.4 配置Spring Security
10.3.5 创建应用配置类
10.3.6 创建内嵌Jetty的服务器
10.3.7 应用启动器
10.3.8 运行应用
10.4 总 结
10.5 习 题
第11章 轻量级持久层框架——MyBatis
11.1 MyBatis概述
11.1.1 安装MyBatis
11.1.2 MyBatis功能架构
11.1.3 MyBatis的优缺点
11.2 MyBatis四大核心组件
11.2.1 SqlSessionFactoryBuilder
11.2.2 SqlSessionFactory
11.2.3 SqlSession
11.2.4 Mapper
11.3 生命周期及作用域
11.3.1 SqlSessionFactoryBuilder
11.3.2 SqlSessionFactory
11.3.3 SqlSession
11.3.4 Mapper实例
11.4 总 结
11.5 习 题
第12章 MyBatis的高级应用
12.1 配置文件
12.1.1 properties
12.1.2 settings
12.1.3 typeAliases
12.1.4 typeHandlers
12.1.5 objectFactory
12.1.6 plugins
12.1.7 environments
12.1.8 transactionManager
12.1.9 dataSource
12.1.10 databaseIdProvider
12.1.11 mappers
12.2 Mapper映射文件
12.2.1 select
12.2.2 insert、update和delete
12.2.3 处理主键
12.2.4 sql
12.2.5 参数
12.2.6 结果映射
12.2.7 自动映射
12.2.8 缓存
12.3 动态SQL
12.3.1 if
12.3.2 choose、when和otherwise
12.3.3 trim、where和set
12.3.4 foreach
12.3.5 bind
12.3.6 多数据库支持
12.4 常用API
12.4.1 SqlSessionFactoryBuilder
12.4.2 SqlSessionFactory
12.4.3 SqlSession
12.4.4 注解
12.5 常用插件
12.5.1 MyBatis Generator
12.5.2 PageHelper
12.6 实战:使用MyBatis操作数据库
12.6.1 初始化表结构
12.6.2 添加依赖
12.6.3 编写业务代码
12.6.4 编写配置文件
12.6.5 编写测试用例
12.6.6 运行测试用例
12.7 总 结
12.8 习 题
第13章 模板引擎——Thymeleaf
13.1 常用Java模板引擎
13.1.1 关于性能
13.1.2 为什么选择Thymeleaf而不是JSP
13.1.3 什么是Thymeleaf
13.1.4 Thymeleaf处理模板
13.1.5 标准方言
13.2 Thymeleaf标准方言
13.2.1 Thymeleaf标准表达式语法
13.2.2 消息表达式
13.2.3 变量表达式
13.2.4 表达式基本对象
13.2.5 表达式工具对象
13.2.6 选择表达式
13.2.7 链接表达式
13.2.8 分段表达式
13.2.9 字面量
13.2.10 算术运算
13.2.11 比较与相等
13.2.12 条件表达式
13.2.13 默认表达式
13.2.14 无操作标记
13.2.15 数据转换及格式化
13.2.16 表达式预处理
13.3 Thymeleaf设置属性值
13.3.1 设置任意属性值
13.3.2 设置值到指定的属性
13.3.3 同时设置多个值
13.3.4 附加和添加前缀
13.3.5 固定值布尔属性
13.3.6 默认属性处理器
13.3.7 支持对HTML 5友好的属性及元素名称
13.4 Thymeleaf迭代器与条件语句
13.4.1 迭代器
13.4.2 条件语句
13.5 Thymeleaf模板片段
13.5.1 定义和引用片段
13.5.2 Thymeleaf片段规范语法
13.5.3 不使用th:fragment
13.5.4 th:insert、th:replace和th:include三者的区别
13.6 Thymeleaf表达式基本对象
13.6.1 基本对象
13.6.2 Web上下文命名空间用于request/session属性等
13.6.3 Web上下文对象
13.7 实战:基于Thymeleaf的Web应用
13.7.1 添加依赖
13.7.2 编写控制器
13.7.3 应用配置
13.7.4 编写Thymeleaf模板
13.8 总 结
13.9 习 题
第14章 锦上添花——Bootstrap
14.1 Bootstrap概述
14.1.1 HTML 5 Doctype
14.1.2 响应式meta标签
14.1.3 Box-Sizing
14.1.4 Normalize.css
14.1.5 模板
14.2 Bootstrap核心概念
14.2.1 Bootstrap的网格系统
14.2.2 媒体查询
14.2.3 网格选项
14.2.4 移动设备及桌面设备
14.3 实战:基于Bootstrap的Web应用
14.3.1 引入Bootstrap库的样式
14.3.2 引入Bootstrap库的脚本
14.3.3 添加Bootstrap样式类
14.3.4 运行应用
14.4 总 结
14.5 习 题
第15章 REST客户端
15.1 RestTemplate
15.1.1 初始化
15.1.2 URI
15.1.3 请求头
15.1.4 消息体
15.2 WebClient
15.2.1 retrieve()方法
15.2.2 exchange()方法
15.2.3 请求体
15.2.4 生成器选项
15.2.5 过滤器
15.3 实战:基于RestTemplate的天气预报服务
15.3.1 添加依赖
15.3.2 后台编码实现
15.3.3 运行
15.4 实战:基于WebClient的文件上传和下载
15.4.1 添加依赖
15.4.2 文件上传的编码实现
15.4.3 文件下载的编码实现
15.4.4 运行
15.5 总 结
15.6 习 题
第16章 REST服务框架——Jersey
16.1 REST概述
16.1.1 REST的基本概念
16.1.2 REST设计原则
16.1.3 成熟度模型
16.1.4 REST API管理
16.1.5 常用技术
16.2 实战:基于Jersey的REST服务
16.2.1 创建一个新项目
16.2.2 探索项目
16.2.3 运行项目
16.3 JAX-RS核心概念
16.3.1 根资源类(Root Resource Classes)
16.3.2 参数注解(@*Param)
16.3.3 子资源
16.4 实战:基于SSE构建实时Web应用
16.4.1 发布-订阅模式
16.4.2 广播模式
16.5 总 结
16.6 习 题
第17章 全双工通信——WebSocket
17.1 WebSocket概述
17.1.1 HTTP与WebSocket对比
17.1.2 理解WebSocket的使用场景
17.2 WebSocket常用API
17.2.1 WebSocketHandler
17.2.2 WebSocket握手
17.2.3 部署
17.2.4 配置
17.2.5 跨域处理
17.3 SockJS
17.3.1 SockJS概述
17.3.2 启用SockJS
17.3.3 心跳
17.3.4 客户端断开连接
17.3.5 CORS处理
17.3.6 SockJsClient
17.4 STOMP
17.4.1 STOMP概述
17.4.2 启用STOMP
17.4.3 消息流程
17.4.4 处理器方法
17.4.5 发送消息
17.4.6 内嵌broker
17.4.7 外部broker
17.4.8 连接到broker
17.4.9 认证
17.4.10 用户目的地
17.4.11 事件和拦截
17.4.12 STOMP客户端
17.4.13 WebSocket Scope
17.4.14 性能优化
17.5 实战:基于STOMP的聊天室
17.5.1 聊天室项目的概述
17.5.2 设置broker
17.5.3 服务端编码
17.5.4 客户端编码
17.5.5 运行
17.6 总 结
17.7 习 题
第18章 消息通信——JMS
18.1 JMS概述
18.1.1 常用术语
18.1.2 使用场景
18.1.3 JMS规范优势
18.1.4 常用技术
18.2 Spring JMS
18.2.1 JmsTemplate
18.2.2 连接管理
18.2.3 目的地管理
18.2.4 消息监听器容器
18.2.5 事务管理
18.3 发送消息
18.3.1 使用消息转换器
18.3.2 回调
18.4 接收消息
18.4.1 同步接收
18.4.2 异步接收
18.4.3 SessionAwareMessageListener
18.4.4 MessageListenerAdapter
18.4.5 处理事务
18.5 基于注解的监听器
18.5.1 启用基于注解的监听器
18.5.2 编程式端点注册
18.5.3 基于注解的端点方法签名
18.5.4 响应管理
18.6 JMS命名空间
18.7 实战:基于JMS的消息发送和接收
18.7.1 项目概述
18.7.2 配置
18.7.3 编码实现
18.7.4 运行
18.8 总 结
18.9 习 题
第19章 消息通知——Email
19.1 Email概述
19.1.1 Email的起源
19.1.2 Spring框架对于Email的支持
19.2 实现发送Email
19.2.1 MailSender和SimpleMailMessage的基本用法
19.2.2 JavaMailSender和MimeMessagePreparator的用法
19.3 使用MimeMessageHelper
19.3.1 发送附件和内联资源
19.3.2 使用模板创建Email内容
19.4 实战:实现Email服务器
19.4.1 项目概述
19.4.2 Email服务器编码实现
19.4.3 格式化Email内容
19.4.4 运行
19.5 总 结
19.6 习 题
第20章 任务执行与调度
20.1 任务执行与调度概述
20.2 TaskExecutor
20.2.1 TaskExecutor类型
20.2.2 使用TaskExecutor
20.3 TaskScheduler
20.3.1 Trigger接口
20.3.2 实现
20.4 任务调度及异步执行
20.4.1 启用调度注解
20.4.2 @Scheduled
20.4.3 @Async
20.4.4 @Async的异常处理
20.4.5 命名空间
20.5 使用Quartz Scheduler
20.5.1 使用JobDetailFactoryBean
20.5.2 使用MethodInvokingJobDetailFactoryBean
20.6 实战:基于Quartz Scheduler天气预报系统
20.6.1 项目概述
20.6.2 后台编码实现
20.6.3 运行
20.7 总 结
20.8 习 题
第21章 高性能之道——缓存
21.1 缓存概述
21.2 声明式缓存注解
21.2.1 @Cacheable
21.2.2 @CachePut
21.2.3 @CacheEvict
21.2.4 @Caching
21.2.5 @CacheConfig
21.2.6 启用缓存
21.2.7 使用自定义缓存
21.3 JCache
21.3.1 JCache注解概述
21.3.2 与Spring缓存注解的差异
21.4 基于XML的声明式缓存
21.5 配置缓存存储
21.5.1 基于JDK的缓存
21.5.2 基于Ehcache的缓存
21.5.3 基于Caffeine的缓存
21.5.4 基于GemFire的缓存
21.5.5 基于JSR-107的缓存
21.6 实战:基于缓存的天气预报系统
21.6.1 项目概述
21.6.2 后台编码实现
21.6.3 缓存配置
21.6.4 运行
21.7 总 结
21.8 习 题
第22章 微服务基石——Spring Boot
22.1 从单块架构到微服务架构
22.1.1 单块架构的概念
22.1.2 单块架构的优缺点
22.1.3 如何将单块架构进化为微服务
22.2 微服务设计原则
22.2.1 拆分足够微
22.2.2 轻量级通信
22.2.3 领域驱动原则
22.2.4 单一职责原则
22.2.5 DevOps及两个比萨
22.2.6 不限于技术栈
22.2.7 可独立部署
22.3 Spring Boot概述
22.3.1 Spring Boot产生的背景
22.3.2 Spring Boot的目标
22.3.3 Spring Boot与其他Spring应用的关系
22.3.4 Starter
22.4 实战:开启第一个Spring Boot项目
22.4.1 通过Spring Initializr初始化一个Spring Boot原型
22.4.2 用Maven编译项目
22.4.3 探索项目
22.4.4 编写REST服务
22.5 总 结
22.6 习 题
第23章 微服务治理框架——Spring Cloud
23.1 Spring Cloud概述
23.1.1 什么是Spring Cloud
23.1.2 Spring Cloud与Spring Boot的关系
23.2 Spring Cloud入门配置
23.2.1 Maven配置
23.2.2 Gradle配置
23.2.3 声明式方法
23.3 Spring Cloud子项目介绍
23.4 实战:实现微服务的注册与发现
23.4.1 服务发现的意义
23.4.2 如何集成Eureka Server
23.4.3 如何集成Eureka Client
23.4.4 实现服务的注册与发现
23.5 总 结
23.6 习 题
附录 本书所涉及的技术及相关版本
参考文献
买过这本书的人还买过
读了这本书的人还在读
同类图书排行榜