前 言 尽管许多人并没有意识到,但实际上大多数人每天都在使用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应用开发。你可以从头到尾按顺序阅读本书的所有章节,也可以挑选其中一些感兴趣的章节进行阅读,将本书作为参考书使用。尽管某些章节可能会引用到之前章节中的例子,但本书已经努力使各章内容变得更加独立。所有的样例代码都可以从网站和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下载网站 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的网址为。 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的网址为。 由于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同等版本花费的一小部分。教育机构可以获得免费许可用于正式的教学使用,开源组织也可以获得免费许可用于项目开发。在这里,你可以从/下载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中打开、编译和执行。所有的示例都可以从代码下载网站和http://www.tupwk.com.cn/downpage获得。请访问网址并单击Download Code选项卡。你可以将所有代码示例下载为单个ZIP文件或者将每章的示例单独下载为一个ZIP文件。在每章的示例中,可以找到每个示例的两个版本:一个IntelliJ IDEA项目和一个Eclipse项目。使用自己选择的IDE对应的版本即可。如果你使用的不是这两种IDE中的某一个,那么你的IDE应该能够将IntelliJ IDEA项目作为简单的Maven项目导入。 在本书的初始部分,你可以直接在IDE中创建这些示例,而无须从代码网站下载(如果你愿意的话)。不过当示例变得越来越复杂时,这种方式就不可取了。最重要的代码在书中已经打印了出来,但打印出每一行代码是不实际的。另外,大部分省略的代码都是重复的。例如,从第Ⅱ部分到第Ⅳ部分的大多数示例项目中的Spring Framework配置基本是一致的。在这种情况下,只显示出配置中与之前章节的不同部分才是合理的,而不是重新打印出完整的配置。出于这个原因,如果你希望执行并测试这些示例的话,就需要从代码下载网站下载大多数样例代码。 在每章的首页,你将会看到一块标题为“本章需要从下载的代码”的区域。该部分列出了本章将使用的所有样例代码的名字,并提醒你下载这些代码示例的链接。其中一些章节未包含代码示例下载,但大多数都包含。 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的网站/,并使用搜索框寻找该书名。搜索ISBN是最快的方式。在本书的首页,单击勘误表的链接。在这里你可以看到所有由读者提交并由Wrox编辑验证过的错误。如果你无法解决自己发现的错误,请访问Wrox的技术支持页面并填写报告问题的表单。在我们验证该错误并修正之后,我们将把它发布到本书的勘误页面,并在未来的版本中解决该问题。