下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922
读书 > 编程语言 >Java > Java Web高级编程——涵盖WebSockets、Spring Framework、JPA Hibernate和Spring Security

Java Web高级编程——涵盖WebSockets、Spring Framework、JPA Hibernate和Spring Security

综合评级:★★★★★

定价:99.80

作者:(美) 威廉斯 著,王肖 译

出版社:清华大学出版社

出版日期:2015年6月

页数:797

字数:1389000

ISBN:9787302400950

书籍介绍

提升Java编码技能

 Java成为世界上编程语言之一是有其优势的。熟悉Java SE的程序员可以轻松地进入到Java EE开发中,构建出安全、可靠和具有扩展性的企业级应用程序。编写《Java Web高级编程——涵盖WebSockets、Spring Framework、JPA Hibernate和Spring Security》一书的目的正是如此。

  本书面向的读者是已经了解Java SE、SQL和基本的HTML,准备将他们的Java编码技能提升到更高水平的程序员。软件开发者可以按顺序阅读本书或者在遇到特定的编程问题时将某个章节用作参考。

主要内容

◆ 为企业级Web应用的Java编码提供了自我指导、自我学习的方法

◆ 帮助Web应用架构师在开发团队的项目中或者开发过程中应用新的概念

◆ 对Java EE平台7和其中的许多技术提供了详细的介绍

◆ 讲解了Servlet、JSP、WebSockets、Spring Framework、AMQP、JPA和O/RM、Spring Data、全文搜索、Apache Lucene和Hibernate Search、Spring Security和OAuth

◆ 重点介绍Java SE 8中新增加的常用功能,如lambda表达式和新的JSR 310 Java 8 Date and Time API等

相关课程
目录
目 录

第Ⅰ部分 创建企业级应用程序

第1章 介绍java EE平台 3

1.1 Java平台时间线 3

1.1.1 起始 3

1.1.2 企业级Java的诞生 4

1.1.3 Java SE和Java EE共同发展 5

1.1.4 了解最新的平台特性 7

1.1.5 持续发展 11

1.2 了解基本的Web应用程序结构 11

1.2.1 Servlet、过滤器、监听器和JSP 11

1.2.2 目录结构和WAR文件 12

1.2.3 部署描述符 13

1.2.4 类加载器架构 14

1.2.5 企业级应用程序归档文件 14

1.3 小结 15

第2章 使用Web容器 17

2.1 选择Web容器 17

2.1.1 Apache Tomcat 18

2.1.2 GlassFish 19

2.1.3 JBoss和WildFly 19

2.1.4 其他容器和应用服务器 20

2.1.5 本书使用Tomcat的原因 20

2.2 在个人计算机中安装Tomcat 21

2.2.1 将Tomcat安装为Windows服务 21

2.2.2 将Tomcat安装为命令行应用程序 21

2.2.3 配置自定义的JSP编译器 23

2.3 在Tomcat中部署和卸载应用程序 24

2.3.1 手动部署和卸载 24

2.3.2 使用Tomcat管理器 25

2.4 通过IDE调试Tomcat 26

2.4.1 使用IntelliJ IDEA 27

2.4.2 使用Eclipse 30

2.5 小结 34

第3章 创建第一个Servlet 35

3.1 创建Servlet类 36

3.1.1 选择要继承的Servlet类 36

3.1.2 使用初始化方法和销毁方法 38

3.2 配置可部署的Servlet 39

3.2.1 向描述符中添加Servlet 39

3.2.2 将Servlet映射到URL 40

3.2.3 运行和调试Servlet 42

3.3 了解doGet、doPost和其他方法 44

3.3.1 在service方法执行的过程中 44

3.3.2 使用HttpServletRequest 44

3.3.3 使用HttpServletResponse 47

3.4 使用参数和接受表单提交 49

3.5 使用初始化参数配置应用程序 53

3.5.1 使用上下文初始化参数 53

3.5.2 使用Servlet初始化参数 54

3.6 通过表单上传文件 56

3.6.1 介绍客户支持项目 56

3.6.2 配置Servlet支持文件上传 56

3.6.3 接受文件上传 59

3.7 编写多线程安全的应用程序 60

3.7.1 理解请求、线程和方法执行 60

3.7.2 保护共享资源 61

3.8 小结 62

第4章 使用JSP显示页面内容 63

4.1 使用

替代output.println("

") 64

4.1.1 使用JSP的原因 65

4.1.2 JSP在运行时的处理 66

4.2 创建第一个JSP 67

4.2.1 了解文件结构 67

4.2.2 指令、声明、脚本和表达式 69

4.2.3 注释代码 70

4.2.4 在JSP中导入类 71

4.2.5 使用指令 72

4.2.6 使用标签 75

4.3 在JSP中使用Java(以及不鼓励使用Java的原因) 76

4.3.1 使用JSP中隐式的变量 76

4.3.2 不应该在JSP中使用Java的原因 82

4.4 结合使用Servlet和JSP 82

4.4.1 配置部署描述符中的JSP属性 82

4.4.2 将Servlet中的请求转发给JSP 85

4.5 关于JSP文档(JSPX)的注意事项 89

4.6 小结 91

第5章 使用会话维持状态 93

5.1 需要会话的原因 93

5.1.1 维持状态 94

5.1.2 记住用户 94

5.1.3 启动应用程序工作流 94

5.2 使用会话cookie和URL重写 95

5.2.1 了解会话cookie 96

5.2.2 URL中的会话ID 98

5.2.3 会话的漏洞 100

5.3 在会话中存储数据 102

5.3.1 在部署描述符中配置会话 103

5.3.2 存储和获取数据 105

5.3.3 删除数据 109

5.3.4 在会话中存储更复杂的数据 111

5.4 使用会话 114

5.4.1 为客户支持应用程序添加登录功能 114

5.4.2 使用监听器检测会话的变化 118

5.4.3 维护活跃会话列表 120

5.5 将使用会话的应用程序群集化 124

5.5.1 在群集中使用会话ID 124

5.5.2 了解会话复制和故障恢复 126

5.6 小结 127

第6章 在JSP中使用表达式语言 129

6.1 了解表达式语言 129

6.1.1 表达式语言的用途 130

6.1.2 了解基本语法 130

6.1.3 添加EL表达式 132

6.2 使用EL语法 133

6.2.1 保留关键字 133

6.2.2 操作符优先级 134

6.2.3 对象属性和方法 139

6.2.4 EL函数 140

6.2.5 静态字段和方法访问 141

6.2.6 枚举 142

6.2.7 lambda表达式 142

6.2.8 集合 143

6.3 在EL表达式中使用作用域变量 144

6.3.1 使用隐式的EL作用域 145

6.3.2 使用隐式的EL变量 148

6.4 使用流API访问集合 151

6.4.1 了解中间操作 151

6.4.2 使用终结操作 153

6.4.3 使用流API 154

6.5 使用表达式语言替换Java代码 155

6.6 小结 157

第7章 使用Java标准标签库 159

7.1 JSP标签和JSTL简介 159

7.2 使用核心标签库(C命名空间) 163

7.2.1 163

7.2.2 164

7.2.3 165

7.2.4 、和166

7.2.5 167

7.2.6 168

7.2.7 168

7.2.8 169

7.2.9 和170

7.2.10 使用核心库标签 170

7.3 使用国际化和格式化标签库(FMT命名空间) 173

7.3.1 国际化和本地化组件 173

7.3.2 175

7.3.3 176

7.3.4 和176

7.3.5 177

7.3.6 和177

7.3.7 和178

7.3.8 和179

7.3.9 使用i18n和格式化库标签 180

7.4 使用数据库访问标签库(SQL命名空间) 182

7.5 使用XML处理标签库(X命名空间) 184

7.6 使用JSP标签替换Java代码 184

7.7 小结 186

第8章 编写自定义标签和函数库 189

8.1 了解TLD、标签文件和标签处理器 189

8.1.1 读取Java标准标签库TLD 190

8.1.2 比较JSP指令和标签文件指令 196

8.2 创建标签文件用作HTML模板 198

8.3 创建日期格式化标签处理器 199

8.4 创建EL函数简写字符串 203

8.5 使用自定义JSP标签替换Java代码 204

8.6 小结 210

第9章 使用过滤器改进应用程序 211

9.1 了解过滤器的目的 211

9.1.1 日志过滤器 212

9.1.2 验证过滤器 212

9.1.3 压缩和加密过滤器 212

9.1.4 错误处理过滤器 212

9.2 创建、声明和映射过滤器 213

9.2.1 了解过滤器链 213

9.2.2 映射到URL模式和Servlet名称 213

9.2.3 映射到不同的请求派发器类型 214

9.2.4 使用部署描述符 214

9.2.5 使用注解 215

9.2.6 使用编程式配置 215

9.3 过滤器排序 216

9.3.1 URL模式映射和Servlet名称映射 217

9.3.2 演示过滤器顺序 218

9.3.3 使用过滤器处理异步请求 220

9.4 调查过滤器的实际用例 224

9.4.1 添加简单的日志过滤器 225

9.4.2 使用过滤器压缩响应内容 226

9.5 使用过滤器简化认证 230

9.6 小结 231

第10章 在应用程序中使用WebSocket进行交互 233

10.1 演变:从ajax到WEBSOCKET 234

10.1.1 问题:从服务器获得新数据到浏览器 234

10.1.2 解决方案1:频繁轮询 235

10.1.3 解决方案2:长轮询 236

10.1.4 解决方案3:分块编码 237

10.1.5 解决方案4:Applet和Adobe Flash 238

10.1.6 WebSocket:一种无人知道但已经存在的解决方案 239

10.2 了解WebSocket API 242

10.2.1 HTML5(Javascript)客户端API 243

10.2.2 Java WebSocket API 245

10.3 使用WebSocket创建多人游戏 247

10.3.1 实现基本的三连棋游戏策略 247

10.3.2 创建服务器终端 248

10.3.3 编写JavaScript游戏控制台 252

10.3.4 WebSocket三连棋游戏试玩 256

10.4 在群集中使用WebSocket进行通信 257

10.4.1 使用两个Servlet实例模拟简单的群集 257

10.4.2 发送和接收二进制消息 259

10.4.3 测试模拟群集应用程序 261

10.5 在客户支持应用程序中添加“支持与客户聊天”功能 262

10.5.1 使用编码器和解码器转换消息 262

10.5.2 创建聊天服务器终端 264

10.5.3 编写JavaScript聊天应用程序 267

10.6 小结 269

第11章 使用日志监控应用程序 271

11.1 了解日志的概念 272

11.1.1 记录日志的原因 272

11.1.2 在日志中记录的内容 273

11.1.3 日志的写入方式 274

11.2 使用日志级别和分类 276

11.2.1 使用不同日志级别的原因 276

11.2.2 定义的日志级别 276

11.2.3 日志分类的工作方式 277

11.2.4 筛选的工作方式 277

11.3 选择日志框架 277

11.3.1 API和实现 278

11.3.2 性能 278

11.3.3 Apache Commons Logging和SLF4J 279

11.3.4 Log4j 2简介 280

11.4 在应用程序中集成日志 283

11.4.1 创建Log4j 2配置文件 284

11.4.2 在Web过滤器中使用鱼标签 287

11.4.3 在Java代码中编写日志语句 288

11.4.4 在JSP中使用日志标签库 290

11.4.5 客户支持应用程序中的日志 290

11.5 小结 291

第Ⅱ部分 添加Spring Framework

第12章 介绍Spring Framework 295

12.1 Spring Framework简介 296

12.1.1 反转控制和依赖注入 296

12.1.2 面向切面编程 297

12.1.3 数据访问和事务管理 297

12.1.4 应用程序消息 297

12.1.5 Web应用程序的模型-视图-控制器模式 298

12.2 使用Spring Framework的原因 298

12.2.1 逻辑代码分组 298

12.2.2 使用同一代码库的多个用户界面 298

12.3 了解应用上下文 299

12.4 启动Spring Framework 300

12.4.1 使用部署描述符启动Spring 301

12.4.2 在初始化器中使用编程的方式启动Spring 303

12.5 配置Spring Framework 306

12.5.1 创建XML配置 308

12.5.2 创建混合配置 310

12.5.3 使用@Configuration配置Spring 314

12.6 使用bean definition profile 318

12.6.1 了解profile的工作原理 319

12.6.2 考虑反模式和安全问题 321

12.7 小结 322

第13章 使用控制器替代Servlet 323

13.1 了解@RequestMapping 323

13.1.1 使用@RequestMapping特性

缩小请求匹配的范围 324

13.1.2 指定控制器方法参数 328

13.1.3 为控制器方法选择有效的返回类型 335

13.2 使用Spring Framework的模型和视图模式 337

13.2.1 使用显式的视图和视图名称 338

13.2.2 使用含有模型特性的隐式视图 340

13.2.3 返回响应实体 341

13.3 使用表单对象简化开发 346

13.3.1 在模型中添加表单对象 347

13.3.2 使用Spring Framework标签 347

13.3.3 获得被提交的表单数据 349

13.4 更新客户支持应用程序 350

13.4.1 启用Multipart支持 350

13.4.2 将Servlet转换成Spring MVC控制器 351

13.4.3 创建自定义下载视图 352

13.5 小结 353

第14章 使用服务和仓库支持控制器 355

14.1 了解模型-视图-控制器模式与控制器-服务-仓库模式 355

14.1.1 识别程序逻辑的不同类型 356

14.1.2 使用仓库提供持久化逻辑 357

14.1.3 使用服务提供业务逻辑 357

14.1.4 使用控制器提供用户界面逻辑 358

14.2 使用根应用上下文替代Web应用上下文 359

14.2.1 在多用户界面中重用根应用上下文 359

14.2.2 将业务逻辑从控制器移动到服务 360

14.2.3 使用仓库存储数据 364

14.3 使用异步和计划执行改进服务 368

14.3.1 了解执行器和调度器 369

14.3.2 配置调度器和异步支持 369

14.3.3 创建和使用@Async方法 371

14.3.4 创建和使用@Scheduled方法 372

14.4 使用WebSocket实现逻辑层分离 373

14.4.1 在Spring应用上下文中添加由容器管理的对象 373

14.4.2 使用Spring WebSocket配置器 375

14.4.3 记住:WebSocket只是业务逻辑的另一个界面 376

14.5 小结 380

第15章 使用Spring Framework i18n国际化应用程序 381

15.1 使用Spring Framework i18n的原因 381

15.1.1 使国际化变得更容易 382

15.1.2 直接本地化错误消息 382

15.2 使用基本的国际化和本地化API 382

15.2.1 了解资源包和消息格式 383

15.2.2 使用消息源进行挽救 385

15.2.3 使用消息源国际化JSP 386

15.3 在Spring Framework中配置国际化 387

15.3.1 创建消息源 387

15.3.2 了解区域设置解析器 388

15.3.3 使用处理拦截器修改区域设置 390

15.3.4 提供一个用户Profile区域设置 390

15.3.5 包含时区支持 391

15.3.6 了解主题如何改进国际化 392

15.4 国际化代码 392

15.4.1 使用标签 393

15.4.2 以更干净的方式处理应用程序错误 395

15.4.3 更新客户支持应用程序 398

15.4.4 直接使用消息源 399

15.5 小结 402

第16章 使用JSR 349、Spring Framework和Hibernate Validator执行Bean验证 403

16.1 Bean验证的概念 404

16.1.1 使用Hibernate Validator的原因 405

16.1.2 了解注解元数据模型 406

16.1.3 使用Spring Framework实现Bean验证 406

16.2 在Spring Framework容器中配置验证 406

16.2.1 配置Spring验证Bean 407

16.2.2 创建错误代码本地化 409

16.2.3 使用方法验证Bean后处理器 410

16.2.4 在Spring MVC中使用相同的验证Bean 411

16.3 在Bean中添加约束验证注解 411

16.3.1 了解内建的约束注解 411

16.3.2 了解常见的约束特性 412

16.3.3 使用约束 413

16.3.4 使用@Valid实现递归验证 415

16.3.5 使用验证组 416

16.3.6 在编译时检查约束合法性 417

16.4 为方法验证配置Spring Bean 418

16.4.1 标注接口,而非实现 418

16.4.2 在方法参数上使用限制和递归验证 419

16.4.3 验证方法返回值 420

16.4.4 表示一个类是否适用于方法验证 420

16.4.5 在Spring MVC控制器中使用参数验证 421

16.4.6 为用户显示验证错误 423

16.5 编写自己的验证约束 425

16.5.1 在自定义限制中继承其他限制 425

16.5.2 创建限制验证器 426

16.5.3 了解限制验证器的生命周期 428

16.6 在客户支持应用程序中集成验证 429

16.7 小结 431

第17章 创建RESTful和SOAP Web

服务 433

17.1 了解Web服务 433

17.1.1 最初的SOAP 434

17.1.2 RESTful Web服务提供了

一种更简单的方式 435

17.2 在Spring MVC中配置

RESTful Web服务 442

17.2.1 使用原型注解分离

控制器 442

17.2.2 创建单独的Web和REST

应用上下文 443

17.2.3 处理RESTful Web服务

中的错误条件 446

17.2.4 将RESTful请求映射到

控制器方法 449

17.2.5 使用索引终端改进发现

机制 453

17.3 测试Web服务终端 454

17.3.1 选择测试工具 454

17.3.2 请求Web服务 455

17.4 使用Spring Web Service

创建SOAP Web服务 457

17.4.1 编写契约优先的XSD和

WSDL 458

17.4.2 添加SOAP派发器Servlet

配置 460

17.4.3 创建SOAP终端 462

17.5 小结 465

第18章 使用消息传送和群集实现灵活性

和可靠性 467

18.1 识别需要消息传送和群集的

时机 467

18.1.1 应用程序消息传送的

定义 468

18.1.2 群集的定义 470

18.1.3 消息传送和群集的

协作方式 474

18.2 为应用程序添加消息传送

支持 477

18.2.1 创建应用程序事件 477

18.2.2 订阅应用程序事件 478

18.2.3 发布应用程序事件 479

18.3 在群集中分布消息传送 481

18.3.1 更新事件以支持分布 482

18.3.2 创建并配置一个自定义

事件多播器 483

18.3.3 使用WebSocket发送和

接收事件 485

18.3.4 通过多播数据包发现

节点 487

18.3.5 部署多个应用程序模拟

群集 489

18.4 使用AMQP分布事件 490

18.4.1 配置AMQP代理 491

18.4.2 创建AMQP多播器 492

18.4.3 运行使用了AMQP的

应用程序 494

18.5 小结 495

第Ⅲ部分 使用JPA和Hibernate

ORM持久化数据

第19章 介绍Java Persistence API和

Hibernate ORM 499

19.1 数据持久化的定义 499

19.1.1 平面文件实体存储 500

19.1.2 结构化文件存储 500

19.1.3 关系数据库系统 501

19.1.4 面向对象数据库 501

19.1.5 无模式数据库系统 502

19.2 对象-关系映射的定义 502

19.2.1 了解持久化实体的问题 503

19.2.2 O/RM使实体持久化

更简单 504

19.2.3 JPA提供了一种标准

O/RM API 505

19.3 使用Hibernate ORM的

原因 507

19.4 Hibernate ORM简介 507

19.4.1 使用Hibernate映射

文件 507

19.4.2 了解会话API 509

19.4.3 从SessionFactory中获得

会话 511

19.4.4 使用Spring Framework

创建SessionFactory 512

19.5 准备关系数据库 513

19.5.1 安装MySQL

MySQL Workbench 513

19.5.2 安装MySQL JDBC

驱动 515

19.5.3 在Tomcat中创建连接

资源 516

19.5.4 注意Maven依赖 517

19.6 小结 517

第20章 使用JPA注解将实体映射

到表 519

20.1 使用简单实体 520

20.1.1 创建实体并将它映射

到表 521

20.1.2 指示JPA使用实体字段的

方式 523

20.1.3 映射代理键 523

20.1.4 使用基本数据类型 529

20.1.5 指定列名和其他细节 532

20.2 创建和使用持久化单元 534

20.2.1 设计数据库表 534

20.2.2 了解持久化单元作用域 536

20.2.3 创建持久化配置 536

20.2.4 使用持久化API 539

20.3 映射复杂数据类型 543

20.3.1 使用枚举作为实体属性 543

20.3.2 了解JPA如何处理日期和时间 544

20.3.3 将大属性映射为CLOB和BLOB 546

20.4 小结 548

第21章 在Spring Framework仓库中使用JPA 549

21.1 使用Spring仓库和事务 550

21.1.1 了解事务范围 550

21.1.2 为事务和实体管理器使用线程 551

21.1.3 使用异常转换 552

21.2 在Spring Framework中配置持久化 553

21.2.1 查找数据源 553

21.2.2 在代码中创建持久化单元 554

21.2.3 创建事务管理 557

21.3 创建和使用JPA仓库 560

21.3.1 注入持久化单元 560

21.3.2 实现标准CRUD操作 561

21.3.3 为所有的实体创建一个基础仓库 563

21.3.4 在服务中标记事务范围 568

21.3.5 使用事务服务方法 572

21.4 在DTO和实体之间转换数据 573

21.4.1 为客户支持应用程序创建实体 574

21.4.2 使用BCrypt保护用户密码 578

21.4.3 在服务中将数据传输到实体中 579

21.5 小结 581

第22章 使用Spring Data JPA消除公式化的仓库 583

22.1 了解Spring Data的统一数据访问 584

22.1.1 避免代码重复 584

22.1.2 使用Stock仓库接口 587

22.1.3 为搜索实体创建查询方法 588

22.1.4 提供自定义方法实现 591

22.2 配置和创建Spring Data JPA仓库 594

22.2.1 启用仓库自动生成 595

22.2.2 编写和使用Spring Data

JPA接口 601

22.3 重构客户支持应用程序 603

22.3.1 转换现有仓库 603

22.3.2 在支持票据中添加评论 605

22.4 小结 609

第23章 使用JPA和HibernateSearch搜索数据 611

23.1 搜索介绍 612

23.1.1 了解索引的重要性 612

23.1.2 采取三种不同的方式 613

23.2 使用高级条件定位对象 614

23.2.1 创建复杂条件查询 614

23.2.2 在查询中使用OR 621

23.2.3 创建有用的索引改进性能 622

23.3 使用JPA的全文索引 623

23.3.1 在MySQL表中创建全文索引 624

23.3.2 创建和使用可搜索的仓库 625

23.3.3 使全文搜索可迁移 630

23.4 使用Apache Lucene和Hibernate Search索引任意数据 630

23.4.1 了解Lucene全文索引 631

23.4.2 使用索引元数据标注实体 632

23.4.3 结合使用Hibernate Search和JPA 634

23.5 小结 637

第24章 创建高级映射和自定义数据类型 639

24.1 JPA的相关内容 639

24.2 转换非标准数据类型 640

24.2.1 了解特性转换器 641

24.2.2 了解转换注解 642

24.2.3 创建和使用特性转换器 643

24.3 在实体中内嵌POJO 645

24.3.1 表示嵌套的类型 645

24.3.2 使属性成为可嵌入属性 645

24.3.3 覆盖可内嵌列列名 647

24.4 定义实体间的关系 648

24.4.1 了解一对一关系 648

24.4.2 使用一对多和多对一关系 650

24.4.3 创建多对多关系 653

24.5 处理其他常见的情况 654

24.5.1 使用修订和时间戳版本化实体 654

24.5.2 定义公共属性的抽象实体 655

24.5.3 映射基本的和内嵌的集合 656

24.5.4 持久化含有键值对的Map 659

24.5.5 在多个表中存储实体 660

24.6 创建编程式触发器 661

24.6.1 在CRUD操作之前或之后执行 661

24.6.2 使用实体监听器 663

24.7 简化客户支持应用程序 664

24.7.1 映射附件的集合 664

24.7.2 使用加载时织入延迟加载简单属性 666

24.8 小结 669

第Ⅳ部分 使用Spring Security保护应用程序

第25章 介绍Spring Security 673

25.1 认证的概念 673

25.1.1 集成认证 674

25.1.2 了解授权 682

25.2 选择Spring Security的原因 685

25.2.1 了解Spring Security基础 686

25.2.2 使用Spring Security的授权服务 686

25.2.3 配置Spring Security 687

25.3 小结 687

第26章 使用Spring Security验证用户 689

26.1 选择并配置认证提供者 690

26.1.1 配置用户细节提供者 690

26.1.2 使用LDAP和活动目录提供者 700

26.1.3 使用OpenID进行认证 703

26.1.4 remember-me认证 705

26.1.5 学习其他认证提供者 706

26.2 编写自己的认证提供者 707

26.2.1 以正确的顺序启动 707

26.2.2 创建和配置提供者 710

26.2.3 缓解跨站请求伪装攻击 715

26.3 小结 718

第27章 使用授权标签和注解 719

27.1 通过声明进行授权 719

27.1.1 在方法代码中检查权限 720

27.1.2 采用URL安全 722

27.1.3 使用注解声明权限 725

27.1.4 定义方法切点规则 732

27.2 了解授权决策 733

27.2.1 使用访问决策投票者 733

27.2.2 使用访问决策管理器 734

27.3 为对象安全创建访问控制列表 736

27.3.1 了解Spring Security的ACL 736

27.3.2 配置访问控制列表 738

27.3.3 为实体填充ACL 740

27.4 在客户支持应用程序中添加授权 741

27.4.1 切换到自定义用户细节 742

27.4.2 保护服务方法 746

27.4.3 使用Spring Security的标签库 750

27.5 小结 751

第28章 使用OAuth保护RESTful Web服务 753

28.1 了解Web服务安全 754

28.1.1 比较Web GUI和Web服务安全 754

28.1.2 选择认证机制 754

28.2 介绍OAuth 756

28.2.1 了解关键参与者 756

28.2.2 起始:OAuth 1.0 757

28.2.3 标准:OAuth 1.0a 757

28.2.4 演化:OAuth 2.0 762

28.3 使用Spring Security OAuth 769

28.3.1 创建OAuth 2.0提供者 769

28.3.2 创建OAuth 2.0客户端 773

28.4 完成客户端支持应用程序 775

28.4.1 生成请求随机数和签名 776

28.4.2 实现客户端服务 777

28.4.3 实现随机数服务 780

28.4.4 实现令牌服务 782

28.4.5 自定义资源服务器过滤器 785

28.4.6 重新配置SpringSecurity 787

28.5 创建OAuth客户端应用程序 791

28.5.1 自定义REST模板 792

28.5.2 配置Spring SecurityOAuth客户端 793

28.5.3 使用REST模板 795

28.5.4 同时测试提供者和客户端 796

28.6 小结 797

前言
前 言

尽管许多人并没有意识到,但实际上大多数人每天都在使用Java。它无处不在——在TV中,在蓝光播放器中,在计算机中。一些流行的智能手机也运行在基于Java的操作系统上;并且它为你每天使用的许多网站都提供了技术支持。当你想到Java时,可能自然会想象到浏览器applet或者与操作系统中其他应用程序风格不匹配的桌面应用程序。你可能甚至会想到一直通知你升级Java的、让人讨厌的系统托盘提醒。

但其实Java的应用远比你能想到的(每天可以见到的)要广泛。Java是一门强大的语言,但它的强大之处更多地体现在它的平台中。尽管Java SE平台已经提供了创建控制台、桌面和浏览器应用程序所必不可少的工具,但Java EE平台仍然对它进行了巨大的扩充,Java EE平台可以帮助创建内容丰富的强大Web应用程序。本书将对这些工具进行讲解,并向你展示如何创建现代的、有用的企业级Java Web应用程序。

0.1 本书面向的读者

本书主要面向已经具有丰富的Java语言和Java SE平台知识的软件开发者和软件工程师。本书可以通过自学完成,现有的Java开发者通过学习本书可以扩展自己Java方面的知识,提升自己的技能—— 从applet、控制台或桌面应用开发发展到企业级Web应用开发。你可以从头到尾按顺序阅读本书的所有章节,也可以挑选其中一些感兴趣的章节进行阅读,将本书作为参考书使用。尽管某些章节可能会引用到之前章节中的例子,但本书已经努力使各章内容变得更加独立。所有的样例代码都可以从wrox.com网站和http://www.tupwk.com.cn/downpage获得,当某个例子依赖于之前章节中的另一个例子时,这些样例代码可以帮助你轻松地查看示例的完整内容,而无须寻找另一章节的代码。

本书对于已经具有Java EE平台经验的开发者也是非常有用的,它可以帮助他们提升自己的技能或者学习一些最新Java EE版本中的新特性。本书对于软件架构师来说也是非常有用的,因为除了具体的工具和平台组件之外,本书还对几种不同的Web软件开发概念和模式进行了详细讲解。本书可以帮助架构师在团队的项目中应用这些新的想法。

如果你是一个软件开发团队的管理者,那么本书对于你来说也是非常有用的。毫无疑问,你每天都在努力地与团队中的开发者和工程师沟通。通过阅读本书,你可以扩展自己的知识面,理解开发者使用的工具,从而更好地进行沟通,并可以为你的团队提供解决某些问题的建议。在阅读本书之后,你也可以为自己的团队购买几本该书,帮助团队中的开发者提高技能,并在项目中应用这些概念。

最后,老师和学生们也可以将该书用于课堂中。作为教科书,它可以是宝贵的300和400级课程,它为学生讲解了实际工作中将会用到的技能,这些内容有助于他们毕业后在职场上获得成功。

0.2 本书不面向的读者

本书不适合那些没有Java经验并且从未编写或编译过Java应用程序的读者。如果你之前没有任何Java经验,那么可能会发现本书中的内容和示例都难于理解。这是因为本书未涉及Java语言语法或者Java SE平台的规范。本书假定读者都已经能够熟练编写、编译和调试Java代码,并且熟悉标准平台(Java SE)。只有一些在Java SE 8中添加的新特性和工具才会出现在本书中。

另外,读者最好了解以下技术和概念。尽管其中一些概念可能看起来很简单,但需要注意的是,如果你不熟悉其中的某些概念,在阅读本书的某些章节时,可能会感到很困难。

● Internet、TCP、HTTP协议

● 超文本标记语言(HTML),包括HTML5

● 可扩展标记语言(XML)

● JavaScript或ECMAScript,包括jQuery和浏览器调试工具

● 层叠样式表(CSS)

● 结构化查询语言(SQL)和关系数据库,尤其是MySQL(如果你熟悉其他关系数据库的话,也可以轻松地使用MySQL)

● 事务和事务概念,例如ACID(原子性、一致性、隔离性、持久性)

● 集成开发环境(IDE)的使用

● 简单命令行任务的执行(不需要精通命令行)

0.3 本书会涉及的内容

本书将对Java EE平台版本7和其中的许多技术进行详细讲解。本书首先将介绍什么是Java EE平台以及它的发展过程,接着介绍应用服务器和Servlet容器以及它们的工作原理。然后讲解Spring Framework、发布-订阅、高级消息队列协议(AMQP)、对象关系映射(O/RM)、Hibernate ORM、Spring Data、全文搜索、Apache Lucene、Hibernate Search、Spring Security和OAuth。本书还将对下列Java EE 7组件进行讲解:

● Servlets 3.1 – JSR 340

● JavaServer Pages (JSP) 2.3 – JSR 245

● Java Unified Expression Language (JUEL或仅EL) 3.0 – JSR 341

● Java API for WebSockets – JSR 356

● Bean Validation (BV) 1.1 – JSR 349

● Java Message Service (JMS) 2.0 – JSR 343

● Java Persistence API (JPA) 2.1 – JSR 338

● Java Transaction API (JTA) 1.2 — JSR 907

本书还将广泛地使用lambda表达式和新的JSR 310 Java 8 Date and Time API,它们都被添加到Java SE 8中。

第Ⅰ部分:创建企业级应用程序

本部分将对Servlet、过滤器、监听器和JavaServer Pages(JSP)进行讲解。本部分首先将讲解Servlet如何响应HTTP请求,以及过滤器如何协助它完成对请求的处理。还将讲解如何使用JSP轻松创建出强大的用户界面,以及如何通过结合使用JSP标记和全新的Expression Language 3.0,创建出不含Java代码的视图,这些视图可以由不具有Java知识的UI开发者进行维护。本部分还将讲解HTTP会话,以及如何使用它们创建出丰富的用户体验(可以跨越应用程序中的多个页面)。另外还会对一门全新的技术WebSockets进行讲解,通过它我们可以创建出更加丰富、更具有交互性的用户界面,因为它将在应用程序和客户端(例如浏览器)之间提供全双工的双向通信。最后,本部分将讲解应用程序日志的最佳实践和技术,当你创建了一个包含大量代码的复杂应用程序时,日志的使用是非常重要的。

第Ⅱ部分:添加Spring Framwork

从第Ⅱ部分开始,我们将开始使用Spring Framework和Spring MVC。该部分包含的内容有:依赖注入(DI)、反转控制(IoC)和面向切面编程(AOP)。我们将使用XML和基于注解的配置搭建高级Spring Framework项目,还将使用Spring工具实现bean验证和国际化。我们将使用Spring MVC控制器和Spring Web Services创建出RESful和SOAP Web服务,还将学习如何使用Spring Framework内建的消息传送系统。最终我们将学习高级消息队列协议(AMQP),并学习如何配置和使用RabbitMQ。

第Ⅲ部分:使用JPA和Hibernate ORM持久化数据

第Ⅲ部分将专注于数据持久化和使用不同的方式将对象存储在数据库中。在介绍了使用原生JDBC持久化实体的一些基本问题之后,该部分将开始讲解对象关系映射(O/RM)和Hibernate ORM及其API。接下来将讲解Java Persistence API,该API抽象出了一些公共API,不管底层使用的是哪种O/RM实现,我们都可以编写相同的代码。然后讲解了Spring Data,以及它如何帮助在不用编写任何持久化代码的情况下,创建持久化应用程序。最后讲解了几种搜索持久化数据的不同方法,以及如何结合使用Hibernate Search和Apache Lucene作为潜在的全文搜索工具。

第Ⅳ部分:使用Spring Security保护应用程序

本书的最后一部分介绍了认证和授权的概念,并展示了同时可用于这两种目的的几种技术。然后讲解了如何在Spring Framework应用程序中集成Spring Security。最后讲解了如何使用OAuth 1.0a和OAuth 2.0保护Web服务,以及如何创建自定义的访问令牌类型,对OAuth 2.0实现进行增强。

0.4 本书不会涉及的内容

本书不会讲解基本的Java语法或Java SE平台,尽管其中会有部分内容涉及Java SE 7和Java SE 8中新增的特性。本书也不会讲解如何编写基于Java的控制台应用程序、桌面应用程序或applet。如果你需要这方面的书籍,Wrox有许多书籍可供选择。

更重要的是,本书不会讲解如何管理Java EE应用服务器环境。现在有众多的应用服务器和Web容器可以使用,没有哪两种服务器管理方式是一样的。使用哪种应用服务器完全取决于应用程序的特性、商业需求、商业实践和服务器环境。所以讲解如何管理一些最常见的应用服务器也是不合实际的。学习如何部署和管理Java EE应用服务器或Web容器的最好方法是查询它的文档,在某些情况下,最好的方式是进行实验(因为Web容器的使用是完成本书示例的必需内容,所以第2章将对一些基本的任务进行讲解,包括安装、启动、停止以及部署应用程序到Apache Tomcat)。

参考0.2节—— 本书不包含其中列出的技术和概念方面的知识。它也不包含下面的Java EE 7组件,这些组件在大多数简单的Web容器并未得到支持,在使用Spring Framework和与它相关的项目时也不需要使用这些组件。

● Java API for RESTful Web Services (JAX-RS) 2.0 – JSR 339

● JavaServer Faces (JSF) 2.2 – JSR 344

● Enterprise JavaBeans (EJB) 3.2 – JSR 345

● Contexts and Dependency Injection (CDI) 1.1 – JSR 346

● JCache – JSR 107

● State Management – JSR 350

● Batch Applications for the Java Platform – JSR 352

● Concurrency Utilities for Java EE – JSR 236

● Java API for JSON Processing – JSR 353

0.5 需要使用的工具

完成和运行本书中的示例需要使用几种不同的工具。在开始之前,请确保你已经在计算机中安装或启用以下工具:

● Apache Maven版本3.1.1或更新的版本

● 执行特定任务的命令行以及提供了命令行读取的操作系统(换句话说,不能在智能手机或平板电脑上编译和运行示例)

● 一个强大的文本编辑器,用于完成某些任务,例如编辑配置文件。不要使用Windows Notepad或Apple TextEdit作为文本编辑器。如果需要新的文本编辑器,那么可以考虑:

? Windows — Notepad++或Sublime Text 2

? Mac OS X —TextWrangler、Sublime Text 2或Vim

? Linux — Sublime Text 2或Vim

0.5.1 支持Java SE 8的Java开发工具包

必须在计算机中安装支持Java SE 8的Java开发工具包(JDK)。Java SE 8已在2014年3月发布。可以从Oracle标准Java SE下载网站(http://www.oracle.com/technetwork/java/javase/ downloads/index.html)获得该JDK。总是使用最新版的JDK,为自己的计算机下载合适的版本和架构。如果你的计算机使用的是64位处理器和64位操作系统,那么应该下载64位的Java安装包。

0.5.2 集成开发环境

你需要一个集成开发环境或IDE,用于编译和执行样例代码以及正常的实验。IDE通常也被称为交互式开发环境,是一种包含了编码、编译、部署和调试功能的软件应用程序,软件开发者使用它创建软件。现在有许多不同的Java IDE可供选择,其中的某些IDE特别优秀。许多人觉得一种IDE比另一种好仅仅是因为个人的观点和经验—— 对于一位开发者来说非常优秀的IDE可能并不适用于另一位开发者。不过,通常包含了智能代码建议、代码补全、代码生成、语法检查、拼写检查和框架集成(Spring Framework、JPA、Hibernate ORM等)等功能的IDE都是非常有用的,相对不提供这些功能的IDE来说,这些功能会为开发者提供具有更高生产力的工作环境。

你可能已经拥有了自己经常使用的IDE,或者你只是使用文本编辑器和命令行。如果你已经有了IDE,那么它也可能无法运行本书中的示例。在选择IDE(或者评估当前使用的IDE能否满足需要)时,应该选择一个包含了智能代码补全和建议、语法检查和集成Java EE、Spring Framework、Spring Security、Spring Data、JPA和Hibernate ORM等功能的IDE。这意味着它需要能够检查Java EE、Spring、JPA和Hibernate配置,并告诉你这些配置中是否包含错误或问题。下面将介绍三种支持多种语言的IDE,并针对本书做出建议。

1. NetBeans IDE 8.0

NetBeans—— 免费的IDE—— 是一个由Oracle赞助的标准Java IDE,类似于Microsoft Visual Studio是.NET开发的标准IDE。不过它不是最流行的Java IDE。只有NetBeans IDE 8.0才支持Java SE 8和Java EE 7,之前的版本不支持。NetBeans提供了强大的特性集,并为所有Java EE特性提供了内建支持。它还支持C、C++和PHP开发。你也可以通过插件扩展NetBeans的功能,现在有支持Spring Framework和Hibernate ORM的插件。不过,NetBeans特性集不如其他IDE丰富,所以在学习本书的过程中,不推荐使用它。本书中的样例代码并未涉及NetBeans的下载格式,但如果你选择使用NetBeans,那么可以通过导入Maven项目的方式导入代码。下载NetBeans的网址为https://netbeans.org/。

2. 支持Java EE开发的Eclipse Luna IDE 4.4

Eclipse是另一个免费的IDE,并且是世界上应用最广泛的Java IDE。其中的一个强大之处在于它的可扩展性,与它支持插件的特性相比该特性要强大得多。使用Eclipse平台时,可以为特定的任务或工作流完全自定义IDE的布局。它已经包含了支持Spring Framework、Spring Data、Spring Security、Hibernate ORM等的插件和扩展。Spring社区也提供了一个Eclipse的自定义版本—— 称为Spring Tool Suite—— 非常适用于基于Spring项目的开发。不过,以作者的观点来看,Eclipse是一种很难高效使用的IDE。完成很简单的任务却需要大量的工作。从历史上看,兼容的Eclipse版本通常都在Java SE和EE发布之后发布。在编写本书时,Eclipse社区尚未发布兼容Java SE 8和Java EE 7的版本。因此,不推荐使用Eclipse运行本书中的示例。如果选择使用—— 或者继续使用—— Eclipse的话,那么需要获得支持Java EE开发的Eclipse Luna IDE 4.4,它已在2014年7月发布。下载Eclipse IDE的网址为http://www.eclipse.org/downloads/。

由于Eclipse IDE的广泛应用,本书中的样例代码可以作为Eclipse项目下载,只要Eclipse Luna 4.4能够支持它们的运行。

3. IntelliJ IDEA 13终极版

JetBrains的IntelliJ IDEA不论是社区版(免费的)还是终极版(付费的)都是具有丰富功能的Java IDE。以作者的观点来看,它是最易用也是最强大的Java IDE。它的代码建议和补全功能以及框架支持都是其他任何IDE所无法比拟的。另外,从历史上看,它对Java SE和Java EE发布之前的实验版本提供了较好的支持。例如,IntelliJ IDEA 12在2012年12月已经提供了对Java SE 8的支持—— 比Java SE 8的发布早了整整15个月,比Eclipse IDE对Java SE 8的支持早了18个月。如果你喜欢在Java SE和Java EE发布之前测试它们的新版本,并在发布之后立即使用它们,那么IntelliJ IDEA是你必然的选择。

不过它的强大是有代价的。社区版本可用于许多不同类型的Java SE项目,但不可用于Java EE项目。如果需要完整地支持Java EE、Spring项目和Hibernate ORM,那么就要购买终极版。终极版的定价是非常合理的,对于公司、个人和学生来说都是有竞争力的,它只是Microsoft Visual Studio同等版本花费的一小部分。教育机构可以获得免费许可用于正式的教学使用,开源组织也可以获得免费许可用于项目开发。在这里,你可以从http://www.jetbrains.com/idea/download/下载IntelliJ IDEA 13终极版的30天免费版,之后你可以购买一份许可(或者如果你符合条件的话,可以申请免费许可),可用在以后任何时间下载的版本中。对于本书中的所有样例代码,推荐使用IntelliJ IDEA终极版。直到Eclipse Luna 4.4能够支持本书示例的运行之前,所有的下载代码都可被用于IntelliJ IDEA项目中。

请确保下载IntelliJ IDEA的最新版本。尽管版本13.0.x是本书出版之前的最新版本,但版本13.1.x已在2014年4月发布,它将包含几个对Spring Framework和Java EE 7支持的改进,版本14.0.x已在2014年11月发布。

0.5.3 Java EE 7 Web容器

在阅读本书时最后一个需要的工具是Java EE Web容器(必须是实现了Servlet、JSP、JUEL和Java EE 7中WebSocket规范的Web容器)。第2章将对该内容进行详细的讲解,并介绍大多数流行的Web容器和应用服务器,以及如何下载、安装和使用Apache Tomcat 8.0。

0.6 本书约定

在本书中,有几种约定可用于帮助你注意某些内容或者显示代码中的某些问题。本节列出了这些约定的示例。

0.7 代码示例

作为一本软件开发书籍,该书广泛地应用了代码示例,通过它们证明我们正在讨论的主题。大多数情况下,这些示例都是完整的IDE项目,你可以在IDE中打开、编译和执行。所有的示例都可以从wrox.com代码下载网站和http://www.tupwk.com.cn/downpage获得。请访问网址http://www.wrox.com/go/projavaforwebapps并单击Download Code选项卡。你可以将所有代码示例下载为单个ZIP文件或者将每章的示例单独下载为一个ZIP文件。在每章的示例中,可以找到每个示例的两个版本:一个IntelliJ IDEA项目和一个Eclipse项目。使用自己选择的IDE对应的版本即可。如果你使用的不是这两种IDE中的某一个,那么你的IDE应该能够将IntelliJ IDEA项目作为简单的Maven项目导入。

在本书的初始部分,你可以直接在IDE中创建这些示例,而无须从代码网站下载(如果你愿意的话)。不过当示例变得越来越复杂时,这种方式就不可取了。最重要的代码在书中已经打印了出来,但打印出每一行代码是不实际的。另外,大部分省略的代码都是重复的。例如,从第Ⅱ部分到第Ⅳ部分的大多数示例项目中的Spring Framework配置基本是一致的。在这种情况下,只显示出配置中与之前章节的不同部分才是合理的,而不是重新打印出完整的配置。出于这个原因,如果你希望执行并测试这些示例的话,就需要从wrox.com代码下载网站下载大多数样例代码。

在每章的首页,你将会看到一块标题为“本章需要从wrox.com下载的代码”的区域。该部分列出了本章将使用的所有样例代码的名字,并提醒你下载这些代码示例的链接。其中一些章节未包含代码示例下载,但大多数都包含。

0.8 Maven依赖

本书中的样例代码将广泛运用第三方依赖,例如Spring Framework、Hibernate ORM和Spring Security。在下载网站的代码中包含这些依赖JAR,将使下载文件变大,你可能需要下载几百兆的文件。为了解决这个问题,样例代码将使用Apache Maven及其依赖管理功能。所有的示例项目都是Maven项目。在IDE中打开每个项目时,IDE将自动在本地Maven库中查找这些依赖,或者如果需要的话,IDE将下载它们到本地Maven库中。

在每章的首页,你将会看到一个标题为“本章新增的Maven依赖”的区域。该部分列出了本章中新增的Maven依赖。你也可以查看pom.xml文件来检查每个示例项目的依赖。某些章节未引入新的Maven依赖,但大多数章节都引入了。

每个Maven依赖都会有作用域,用于定义依赖在哪个类路径上可用。最常见的作用域——“compile”作用域—— 表示该依赖在项目的编译类路径上、单元测试编译和执行类路径上以及运行应用程序时的最终运行时类路径上可用。在Java EE Web应用程序中,这意味着依赖将被复制到所部署的应用程序中。“runtime”作用域表示依赖将在单元测试执行和运行时执行类路径上可用,但不像“compile”作用域一样在编译应用程序或者执行单元测试时也可用。一个运行时依赖将被复制到所部署的应用程序中。最后,“provided”作用域表示运行应用程序的容器将会提供该依赖。在Java EE应用程序中,这意味着依赖已经在Servlet容器或应用服务器的类路径上了,因此不需要再复制到部署的应用程序中。Maven和IDE将保证在编译应用程序和执行单元测试时,“provided”作用域的依赖是可用的。Maven还有其他类型的作用域,但在本书中将只会用到这些。

在文本和示例项目中,有一些Maven依赖将会包含排除(exclusions),用于忽略某些特定的依赖—— 它们被称为临时依赖。很多时候这些排除都是多余的,列出它们只是为了使代码更清晰。当某个依赖依赖于另一个旧版本的依赖,而不是现在正在使用的依赖时,通过排除可以更清楚地表示这里出现了矛盾,并且避免了由Maven的最近算法所引起的问题。不过,某些排除的存在是由于Java SE或Java EE的新版本已经提供了依赖,或者因为依赖ID发生了变化。当出现这种情况时,文本中会进行提示。

0.9 将安全相关的内容安排在最后的原因

坦白地说,应用程序安全会影响其他内容的学习。在产品中添加认证和授权所使用的技术将会干扰你的代码,并使学习过程变得困难。安全是第一位的,而且一直记得安全问题永远也不是错误。不过,只要使用了正确的工具,在项目完成(或基本上完成)之后为它添加验证和授权也是相当简单的一件事。本书首先将关注于如何使用工业标准工具创建出高质量、特性丰富的Web应用程序。在学会了创建强大应用程序所需的技能之后,本书的第Ⅳ部分将向你展示如何为现有的应用程序添加认证和授权,保护它不受未授权的和恶意访问的攻击。

0.10 勘误表

我们力图使本书尽可能地全面和准确,但没有人是完美的,所以书中仍然会有错误存在。本书偶尔可能会包含一些需要修正的错误。如果你发现了内容错误、拼写错误或错误代码,请告诉我们!通过您提供的反馈,可以帮助节省其他读者解决这些问题的时间和努力,同时也可以帮助改进本书未来的版本。

如果你希望阅读本书已经发现的勘误表,请访问Wrox的网站http://www.wrox.com/,并使用搜索框寻找该书名。搜索ISBN是最快的方式。在本书的首页,单击勘误表的链接。在这里你可以看到所有由读者提交并由Wrox编辑验证过的错误。如果你无法解决自己发现的错误,请访问Wrox的技术支持页面并填写报告问题的表单。在我们验证该错误并修正之后,我们将把它发布到本书的勘误页面,并在未来的版本中解决该问题。

热门图书
推荐新闻
技术文库
论坛推荐