本书由浅入深地介绍了当今流行的Java Web框架Spring MVC的方方面面,从基础的环境搭建到微服务设计与架构,再到持久化、REST API构建、认证与测试……涵盖了Spring MVC诸多重要且常用的特性。值得一提的是,本书针对Spring MVC的每一项特性都提供了完整可运行的示例代码,可以帮助读者更好地掌握这项技术。
无论是Spring MVC的初学者,还是拥有一定经验的开发人员,都能够从本书中获得启发,更好地理解Spring MVC这一Web开发“利器”。
超过40个实战案例
基于Spring MVC创建云就绪Java Web应用程序
译者序
毋庸置疑, Spring现在已经成为 Java企业级开发事实上的标准。同时, Spring也早已从最初的单一 IoC与 AOP框架发展成为一站式的开发平台,例如流行的 Spring Batch、Spring Boot、Spring Cloud、Spring Data、Spring Security及 Spring Kafka等。围绕着 Spring的生态圈也异常繁荣。在 Spring所提供的诸多基础项目中, Spring MVC可谓一枝独秀。虽然相较于 Struts、JSF等 Java Web框架与标准,Spring MVC出现时间较晚,但凭借着 Spring强大的社区与开发者的支持, Spring MVC现已在全世界各大互联网公司与传统企业中得到了极为广泛的应用,其发展势头要远远超过其他先行者。这与 Spring MVC向开发者所提供的各项“开箱即用”特性、对于 Web开发的强有力支持以及与 Spring框架的天然整合是密不可分的。
本书是一本专门介绍 Spring MVC的专著,由浅入深地介绍了 Spring MVC方方面面的功能与特性,从一开始的环境搭建到微服务设计与架构,再到持久化、 REST API构建、认证、对 WebSockets与 STOMP的支持以及测试……详尽介绍了 Spring MVC在软件开发各个领域的应用与实现。
全书共分为 9章,每章都单独讲述一个主题,因此并不要求读者按照顺序逐章阅读;相反,读者可以根据自身情况选择感兴趣的章节阅读并学习。对于缺乏 Spring MVC经验的开发者来说,建议从第 1章开始按照顺序学习,以实现最好的学习效果。
Spring MVC本身是个庞杂的主题,这是因为框架本身涉及了太多的领域与设计理念,对于初学者来说难免陷入具体细节而无法脱身。本书独辟蹊径,从功能角度对全书章节进行划分,每章讲解 Spring MVC所支持的一个重要概念与领域。通过这种方式,学习者可以有针对性地学习 Spring MVC所提供的方方面面的特性。此外,本书的另一个特色是示例代码丰富,每个主题均提供相关可运行的示例代码供读者学习与参考,这是一种非常棒的学习方式。而且,很多章节最后还提供了延伸内容供学习者进一步提升水平。相信通过循序渐进的学习,当阅读完本书并实现书中所提供的各项示例代码后,读者会完全掌握 Spring MVC的各项功能特性并能投入到实际的项目开发中。值得一提的是,除了 Spring MVC之外,本书还对其他相关的技术领域进行了较为详尽的介绍,例如 Angular、Bootstrap、WebSockets、测试等,这些都是使用 Spring MVC进行项目开发时或多或少会使用到的一些技术与框架。相信通过对这些技术的学习,读者所掌握的技能将会超越 Spring MVC本身。翻译技术图书是一项艰苦的劳动,这不仅涉及大量脑力的付出,还有体力上的消耗。作为译者,我们最大的心愿就是为读者提供准确的翻译,为读者带来切实的帮助。这个目标也在翻译过程中不断提醒着我们,要对得起原书作者的倾情创作,要对得起各位读者的信任。因此,我们在整个翻译过程中,丝毫不敢懈怠,目的就是为了保证译稿的质量。本书由张龙、丁涛、李哲与覃璐共同翻译完成,张龙完成了最后的统稿与校对工作。这里要特别感谢电子工业出版社的张春雨老师与刘舫老师,二位老师在专业素养与团队协作方面展现出了极高的专业性,确保了本书的翻译工作能够顺利完成。每次与二位老师沟通都非常顺畅,同时进一步确保了译稿的质量。虽已尽心尽力,奈何技术与文字水平有限;虽已校对多次,但依然不敢保证全书没有任何错误。因此,读者在阅读本书的过程中如果发现任何问题都请不吝赐教。可以通过邮箱 zhanglong217@163.com与译者联系,以期图书再版时改进。最后,衷心期望本书能给希望系统学习 Spring MVC的读者朋友们带来切实的帮助,帮助大家快速掌握这一流行的 Java Web开发框架。
张龙2017-02-15于北京
致谢
首先,我要对与本书直接相关的所有人表示感谢,这包括所有审校者、内容编辑、技术与组稿编辑等。
我想到了曾经就读的法语工程学院以及在那里遇到的人们,他们对于技术展现出了浓厚的热情。
非常高兴能从事 IT行业。感谢身边支持我在这个方向发展的所有人和物。当我在这个领域的兴趣不断增长时,我真的没想到自己会从事这个职业。
编写这本书是一个旷日持久的项目。必须要提一下我的搭档 Helena,感谢她在这几个月的时间内的耐心以及对我的支持;我的家人与朋友们不断鼓励我;我的父亲则是我的灵感之源。
最深的感谢要献给出版社,感谢他们出版了这本书并认可这个项目。感谢来自于 Pivotal Software, Inc与 Spring社区的工程师们所给出的专家建议,感谢他们提供的易读的文档与官方参考。
最后,我想要感谢正在阅读这些文字并且可能已经购买了本书的你们,我希望这本书能给你们带来切实的帮助。
关于审校者
David Mendoza是一位软件工程师,他从 1999年就开始从事 Java Web开发了。他的开发之路始于 JSP与 Servlet,并创建了自定义的 Web框架。后来他发现了 AppFuse,这将其带入 Spring与 Struts的世界。接下来,他又转向了 Spring MVC并且再也不想回到过去了。作为一名 Java顾问, David的足迹遍及墨西哥、美国、加拿大、委内瑞拉、西班牙等国家,与荷兰国际银行、花旗集团及西班牙电信公司都有过合作。他目前供职于西南复临大学,这是一家位于得克萨斯州达拉斯南部的私立大学,他主要负责整个 Web平台的建设工作。
前言
欢迎阅读这本独一无二的《Spring MVC实战》,希望你已经为本书的探索之旅做好了准备,本书会带你畅游现代 Spring Web开发实践。本书作者已经创建了 cloudstreetmarket.com网站,这是一个带有社交功能的股票交易平台,本书将会带领你探索网站开发过程的每一步。
1 企业级 Spring应用的搭建
本章介绍了业界的一套标准实践,从配置 Eclipse IDE以对 Java 8、Tomcat 8、GIT与 Maven提供更优化的支持,到理解 Maven作为一个构建自动化工具以及作为一个依赖管理工具的认识,阅读本章后你将会了解如何在一个坚实的基础上部署 Spring框架。
无论一个项目旨在成为一个能够获得丰厚利润的产品,抑或仅仅是一个练习,都是从相同的企业级模式开始的。
本章并不仅仅是开发 Cloud Street Market应用的第一个阶段,还为面向企业级 Spring应用的开发者提供了大量的标准化实践。
2 使用 Spring MVC设计微服务架构
本章内容有些多,介绍了 Spring MVC的核心原则,比如请求流与 DispatcherServlet的中心角色,还介绍了如何通过与控制器相关的注解来配置 Spring MVC控制器与控制器方法处理器。
在微服务架构的搭建过程中,我们在各个模块与 Web项目中安装了 Spring与 Spring MVC,用于构建易于部署且可伸缩的功能性单元。从这个视角来看,我们通过一个 Web模块来构建应用,该模块负责提供一个 Twitter Bootstrap模板,同时与另一个专门用作 REST Web Services的 Web模块搭配使用。
本章将介绍如何通过 JSTL将模型从控制器传递给 JSP视图,以及如何通过 AngularJS来设计 JavaScript MVC模式。
3 Java持久化与实体
本章介绍了持久化相关的内容。在这个阶段,了解如何在 Spring生态圈以及 Spring MVC应用中处理持久化数据很有必要。该章将介绍如何在 Spring中通过 dataSource与 entityManagerFactory来配置 JPA持久化提供者( Hibernate)。你将学习如何从 EJB3实体来构建好处极多的 JPA对象关系映射,接下来会学习如何通过 Spring Data JPA来查询仓库。
4 为无状态架构构建 REST API
本章揭示了如何将 Spring MVC作为 REST Web Services引擎。我们将会看到框架对此所提供的令人惊叹的支持,只需为抽象的与 Web相关的逻辑的方法处理器提供几个注解即可,这样我们就可以将主要精力放在业务上了。这个原则也用在了请求绑定(参数、 URL路径与头信息绑定等)与响应编排注解方面,同时在 Spring Data的集成支持上也用到了。
本章还介绍了如何创建作为 Spring MVC一部分的异常处理器来将预定义的异常类型转换为通用的错误响应。你将学到如何配置内容协商(这是 REST APIs的重要内容),最后还将学习如何通过 Swagger与 Swagger UI来公开并文档化 REST端点信息。
5 使用 Spring MVC进行认证
本章介绍了如何在控制器与服务层对 HTTP BASIC与 OAuth2等标准协议配置认证。你将学习与 Spring Security相关的几个概念与实践,例如过滤器链、 命名空间、认证管理器,以及角色与用户的管理等。我们的 OAuth2流是个客户端实现。我们在用户首次使用第三方提供者 Yahoo! 时在应用中对其进行认证。这些 Yahoo! 的认证与连接信息稍后会被用于从 Yahoo! Finance中拉取最新的财经数据。借助于 Spring Social库,我们可以在后台对 OAuth2实现完全的抽象化。
6 实现 HATEOAS
本章介绍了如何将 RESTful Spring MVC API更进一步。超媒体驱动的应用为每个单独的请求资源都提供了链接,这些链接反映了相关资源的 URL。它们向客户端(无论是何种类型的客户端)提供了实时的导航选择—精确的文档,同时也是实际的实现。该章将会介绍如何通过 JPA实体关联或控制器层来构建这种链接。
7 开发 CRUD操作与校验
本章介绍更加高级的 Spring MVC概念,通过认识支持交互式 HTTP方法( PUT、POST 与 DELETE)的工具与技术,我们将学习如何使用 HTTP1/1规范( RFC 7231语义与内容)来返回恰当的响应状态码与头信息。
本章通过 Spring Validator与 ValidationUtils辅助类的搭配使用来提供与验证相关的 JSR-303和 JSR-349规范的兼容实现。该章的最后一节将会介绍消息与内容的国际化( I18N)。我们还通过 AngularJS提供了一个客户端实现,使用了已发布的国际化 Web Services。
8 通过 WebSocket与 STOMP进行通信
本章将会聚焦于“冉冉升起”的 WebSocket技术,并为我们的应用构建面向消息的中间件。该章提供了一个大家很少会见到的示例,通过 Spring实现了关于 WebSockets的大部分内容,从默认的嵌入式 WebSocket消息代理的使用,到特性完备的外部代理(借助于 STOMP与 AMQP协议)。我们将会了解如何向多个客户端广播消息,以及如何通过优秀的可伸缩特性推迟耗时任务的执行。
通过本章你还将学到如何动态创建私有队列,以及如何获取认证客户端并通过这些私有队列与其收发消息。
为了实现 WebSocket认证与消息认证,我们将 API置为有状态的。对于有状态来说,我们要知道的是 API将会使用 HTTP会话在多个请求间保持用户的认证状态。借助于 Spring Session与高度集群化的 Redis服务器的支持,会话将可以在多个 Web应用间共享。
9 测试与故障排除
本章介绍了一套用于维护、调试与改进应用状态的工具与一般做法。作为本书的最后一部分内容,我们将会学习如何通过 Flyway Maven Plugin将数据库模式从一个应用版本升级为另一个,并将其作为 Maven构建的一部分。我们还会学习如何编写自动化单元测试(借助于 Maven Sure.re与 Mockito)与集成测试(使用一套库,例如 Cargo、Rest-assured与 Maven Failsafe)。
该章的最后一节介绍了将 Log4j2作为全局日志框架的做法,无论什么环境,我们都可以通过这一日志解决方案来高效排错。
书中多个章节都列出了系统需要具备的硬件与软件条件。而且,学习本书经常需要访问互联网资源,有不少扩展内容都给出了链接,或者需要下载必备软件。此外更加重要的是,本书使用 Git版本系统来管理每章的代码基,本地的 Git仓库需要对应于项目的远程仓库(位于 GitHub上),要能够访问这个远程仓库。
前言
本书的示例支持三种操作系统: MS Windows、Linux与 Mac OS X。对于硬件平台,推荐使用主流、高性能的工作站,最低 2 GB内存, 500 MB以上空闲硬盘空间。
在编写本书时,作者的一个目标就是一方面尽量保持内容的可读性,另一方面则尽量多地向读者介绍现代 Web开发的实践。
我们相信,对 Spring MVC感兴趣的大多数读者的主要目的在于寻求一个入门套件和工具箱,来开发现代、基于 Spring的 Web应用。我们还相信,大多数读者都倾向于通过实践而非理论来强化对概念的理解。当下,我们都知道人们具有不同的学习习惯与方式。
鉴于此,本书的各个章节都是逐步推进的,从直观的第 1章到更具挑战性的第 8章。相比后面的章节来说,前几章更适合大多数 Java开发者。
话虽如此,本书却几乎包含了你所要的一切!本书配套的示例应用已经处于运行状态,等待着你的探索,理解其工作方式。
一般来说,我们假定你是一名具有 Web开发经验的 Java开发者。此外,我们期望你对学习 Spring Web技术拥有浓厚的兴趣。
图中左上cloudstreetmarket-parent下面缺cloudstreetmarket-core
Name:CloudStreetMarket parent
应为
Name:CloudStreetMarket Parent
zipcloud -parent
应为
zipcloud-parent
ZipCloud Parent 和 ZipCloudCore
应为
ZipCloud Business Parent 和 ZipCloud Factory Core Business
执行
Maven|Install
命令时,需要在Webapp和API项目里面webapp目录下面添加WEB-INF文件夹及web.xml文件才能执行成功。