精通Spring MVC 4(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-06 11:58:13

点击下载

作者:[美]Geoffroy Warin

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

精通Spring MVC 4

精通Spring MVC 4试读:

前言

作为Web开发人员,我愿意创建新的东西,将它们快速上线,然后将注意力转移到下一个新的想法上。

如今,所有的应用都互相连接在了一起,我们需要与社交媒体进行交互,促进产品和复杂系统的发展,为用户提供更大的价值。

直到现在,这些对于Java开发人员来说都非常遥远和复杂。随着Spring Boot的诞生和云平台的平民化,我们可以在有限的时间内创建精彩的应用并让所有的人来访问,而这个过程不需要花一分钱。

在本书中,我们将会从头开始构建一个有用的Web应用。这个应用有很多很棒的特性,如国际化、表单校验、分布式会话与缓存、社交登录、多线程编程等。

同时,我们还会对其进行完整的测试。

在本书结束之前,我们还会将这个小应用部署到云端,使它能够通过Web进行访问。

如果你觉得这挺有意思的话,那么就别浪费时间了,马上开始着手编码吧!本书所涵盖的内容

第1章“快速搭建Spring Web应用”能够让我们非常快速地开始使用Spring Boot。本章介绍了让我们更具生产效益的工具,如Spring Tool Suite和Git,本章还会帮助我们搭建应用的主体框架,并见识Spring Boot背后的魔力。

第2章“精通MVC架构”指导我们创建一个小的Twitter搜索引擎,同时,本章还涵盖了Spring MVC和Web架构的基础知识。

第3章“处理表单和复杂的URL映射”帮助你理解如何创建用户基本信息表单,本章介绍如何在服务端和客户端校验数据,并且让我们的应用支持多语言访问。

第4章“文件上传与错误处理”将会指导你为基本信息表单添加文件上传功能,它阐述了如何在Spring MVC中恰当地处理错误并展示自定义的错误页面。

第5章“创建RESTful应用”阐述了RESTful架构的理念,它还帮助我们创建了一个可以通过HTTP调用的用户管理API,这个过程中会看到帮助我们设计API的工具,并且会讨论如何很简便地实现文档化。

第6章“保护应用”将会指导我们如何保护应用,包括如何使用基本HTTP认证保护RESTful API,以及如何保护登录页之后的Web页面,它阐述了如何通过Twitter进行登录以及如何将会话保存在Redis中,从而允许我们的应用进行扩展。

第7章“单元测试与验收测试”帮助我们对应用进行测试。它讨论了测试与TDD,介绍了如何对控制器进行单元测试,如何使用现代的库设计端到端的测试。最后,介绍了Groovy如何提升测试的生产效率和可读性。

第8章“优化请求”对应用进行了优化。它包括缓存控制和Gzip,本章将教会我们如何把Twitter搜索结果缓存到内存和Redis中,以及如何对搜索实现多线程执行。除此之外,还会介绍如何实现Etag和使用WebSocket。

第9章“将Web应用部署到云中”会指导我们对应用进行部署,通过对比,阐述了不同PaaS解决方案的差异。然后,介绍了如何将应用部署到Cloud Foundry和Heroku中。

第10章“超越Spring Web”在整体上讨论了Spring生态系统,介绍了现代Web应用的组成部分以及后续的发展方向。阅读本书所需的前提条件

尽管我们将要构建的是一个很高级的应用,但是并不需要你安装很多的东西。

我们将要构建的应用需要Java 8。

我们并不强制你使用Git,不过你绝对应该使用Git来对自己的应用进行版本控制。如果你希望将应用部署到Heroku上,那么会需要用到它。另外,借助Git可以非常容易地回顾你的工作,通过查看代码的差异和历史来了解其演进过程。在第1章中包含了很多开始使用Git的资源。

我还推荐你使用一个好的IDE。我们会看到如何使用Spring Tool Suite(免费)和IntelliJ Idea(一个月的免费试用)实现快速起步。

如果你使用Mac的话,应该了解一下Homebrew(http://brew.sh)。通过使用这个包管理器,你可以安装本书中提到的所有工具。本书为谁而作

本书最适合已经熟悉Spring编程基础知识并迫切希望扩展其Web技能的开发人员。建议你事先掌握一些Spring框架的知识。约定

在本书中,你会看到多种样式的文本,它们用来区分不同类型的信息。如下是这些风格的样例以及对它们的描述。

文本中的代码、数据库表名、文件夹的名称、文件名、文件扩展名、路径名称、伪URL(dummy URL)、用户输入以及Twitter如下所示。“你会在目录build/libs中找到JAR文件”。

代码片段如下所示:public class ProfileForm { private String twitterHandle; private String email; private LocalDate birthDate; private List tastes = new ArrayList<>(); // getters and setters}

如果希望你关注特定的代码片段,那么相关的行或条目会粗体显示:public class ProfileForm { private String twitterHandle; private String email; private LocalDate birthDate; private List tastes = new ArrayList<>(); // getters and setters}

命令行的输入和输出会按照如下所示进行编写:$ curl https://start.spring.io

新术语和关键字会粗体显示。在屏幕、菜单或对话框中看到的内容将会按照如下的样例显示:“转到新建项目菜单并选择Spring Initializr项目类型”。 警告或关键的提示按照这种方式显示。 小技巧或窍门按照这种方式显示。读者反馈

我们欢迎读者的反馈。请告诉我们你觉得这本书怎么样——你喜欢什么,不喜欢什么。读者的反馈是非常重要的,这将有助于我们开发出读者得到真正想要的图书。

如果是一般的反馈,只需发送邮件到feedback@packtpub.com即可,并在邮件的主题中包含本书的名称。

如果对于某个话题,你有专业的知识,并且愿意编写一本书或者为某本书做出贡献,那么可以参考我们的读者指南:www.packtpub.com/authors 。客户支持

如果你购买了Packt图书,那么我们会从很多方面为你提供帮助,尽可能最大化你的购买所带来的价值。示例代码下载

你可以通过账号,在http://www.packtpub.com下载所有你所购买的Packt图书的示例代码文件。如果你是在其他途径购买的本书,那么可以访问http://www.packtpub.com/support并进行注册 ,这些文件会直接邮件发送给你。

对于本书的样例代码,你也可以通过https://github.com/Mastering-Spring-MVC-4/mastering- spring-mvc4进行下载。版权

在互联网上,版权材料的盗版问题在任何的媒体形式中都普遍存在。在Packt出版社,我们非常重视版权和许可证问题,如果你在互联网上遇到关于我们图书的任何形式的非法拷贝版本,请立即告诉我们相应的网址或Web站点名称。

如果遇到涉嫌盗版的内容,请将它的链接发送至copyright@packtpub.com。

我们非常感谢你对作者们的保护,这也是对我们提供有价值内容能力的保护。答疑

如果你对本书有任何的问题,可以通过questions@packtpub.com联系我们,我们将尽全力为你解答。作者简介

Geoffroy Warin从10岁就开始编程了,是软件匠艺(Software Craftsmanship)运动的坚定信奉者和开源的倡导者,他跟随自己的内心选择成为一名开发人员并对其坚定不移。在职业生涯中,他一直致力于使用Java和JavaScript语言开发企业级的Web应用。

Geoffroy在前端和后端方面都游刃有余,他非常关注代码整洁和可测试性。他深信开发人员应该尽其所能编写出可读性更强的代码,这样的代码能够持续地为用户交付价值。

在推动测试驱动开发和创建伟大的软件设计方面,他的核心工具就是结对编程和导师制。

他还讲授Java Web技术栈的课程,是Groovy和Spring的狂热支持者。

最近,他还担任《Learning Spring Boot》和《Spring Boot Cookbook》等书的审阅者,这两本书都是由Packt出版社所出版,涵盖了Spring生态系统中新增的主要内容。

如果想学习最新的Spring和JavaScript编程技巧,请查阅Geoffroy的博客(http://geowarin. github.io)和他的Twitter账号(https://twitter.com/geowarin)。技术审校者简介

Raymundo Armendariz是有超过10年经验的软件开发人员,他之前主要致力于为Java和.NET平台构建软件,但是现在他投身于JavaScript。

他还是一本JavaScript微框架图书的作者。

在他的职业生涯中,大部分的工作都是与汽车行业相关,他曾经就职的公司包括Autozone、Alldata、TRW和1A Auto。

他是《Getting Started with Backbone Marionette》(Packt出版社)一书的作者,这本书可以在https://www.packtpub.com/web-development/getting-started-backbone-marionette找到。我要感谢朋友们对我的支持和帮助。——Raymundo

Abu Kamruzzaman是纽约城市大学的Web程序员和数据库分析师。在过去的10多年以来,他所开发和维护的Web应用作为班级教学和注册课程,用于高校的教学。从2014年11月开始,他担任CUNY总部的PeopleSoft开发专家,目前,他所从事的项目是与商业智能团队(Business Intelligence)一起使用OBIEE为CUNY构建数据仓库。在加入总部之前,自2001年以来,他曾经在CUNY的各个校区工作过,还讲授研究生和本科生的IT课程,指导学生们使用他所开发的应用。从2001年开始,他所讲授的课程包括J2EE、DBMS、数据仓库、面向对象编程、Web设计以及Web编程。他是柏鲁克学院(Baruch College)杰克林商学院(Zicklin School of Business)计算机信息系统系的教员之一。他非常热心于教育事业,对开源项目也有着极大的热情,如Hadoop、Hive、Pig、NoSQL数据库、Java、云计算以及移动应用开发。他从布鲁克林学院(Brooklyn College)/CUNY获得了硕士学位,从宾厄姆顿大学(Binghamton University)/SUNY计算机科学专业获得了学士学位。他的Web站点地址:http://faculty.baruch.cuny.edu/akamruzzaman/。我要感谢美丽的妻子Nicole Woods,感谢她对我所从事

事业的耐心、支持以及鼓励。感谢我的父母,感谢他们的祝

福和祈祷。感谢本书的作者和Packt出版团队能够给我参与

本书的机会。——Abu

Jean-Pol Landrain是软件工程专业的学士,从1998年开始就主要从事面向网络、实时和分布式计算的工作。他逐渐成为一名软件架构师,具有超过17年的面向对象编程经验,尤其擅长C++、Java/JEE、各种应用服务器、操作系统(Windows和Linux)以及相关的技术。

他目前就职于Agile Partner,这是一家位于卢森堡的IT咨询公司,从2006年以来一直致力于敏捷方法论的推广、教育和应用。在过去的5年中,他参与了针对欧洲议会(European Parliament)开发团队的工具与技术方案的选择与验证。

他与Packt出版社协作,审校了《HornetQ Messaging Developer’s Guide》,与Manning出版社合作,审校了《Docker in Action》《Git in Practice》《ActiveMq in Action》以及《Spring in Action》(第一版)。首先,我要感谢我的妻子Marie Smets以及9岁的女儿

Phoebe,感谢他们理解我对技术的热爱以及在这上面所花

费的时间。我还要感谢在Agile Partner的朋友和同事,如果

一个人单枪匹马地投身于技术会非常乏味的,感谢他们所增

添的乐趣。很不幸的是,在这本书制作期间,我失去了我的祖父

André Landrain和祖母Hélène Guffens,我非常悲痛。因为

这些私人的事件导致了一些延迟,非常感谢Packt出版社编

辑团队的耐心,尤其要感谢该项目的协调者Nidhi Joshi和本

书的作者GeoffroyWarin。他们做得非常棒,我完全信任本

书的品质。在Spring MVC方面,这是市面上很好的一本

书。——Jean-Pol

Wayne Lund是Pivotal的PaaS和现场工程师。在企业级软件开发和分布式环境方面具有超过25年的经验,主要的方向是Spring、企业级Java、Groovy和Grails,并将这些技术扩展至使用Smalltalk和C++的系统,他非常热衷于个性化和新兴的技术。他的目标是继续享受下一代的技术,这就是PaaS以及新的Spring工具集,这包括构建在Spring Boot、Spring Cloud和Spring XD技术上的原生云应用,这样的技术方案能够启用快数据(Fast Data)、大数据、社交以及移动等特性。

目前,他就职于Pivotal,关注云、数据以及敏捷的结合,之前曾经在一家财富500强的医疗保健公司和一家全球性的大型咨询公司工作多年。

他还参与出版了Packt出版社的《Learning Spring Application Development》一书。第1章快速搭建Spring Web应用

在本章中,我们将会直接接触代码并搭建一个Web应用,本书的其他章节将会基于该应用进行讲解。

在这里,我们将会使用Spring Boot的自动配置功能来构建应用,这样的话,就能完全避免使用样板式的配置文件。

本书将会从整体上介绍Spring Boot是如何运行的以及该如何对其进行配置,共有4种方式来开启一个Spring项目:● 使用Spring Tool Suite生成Starter代码;● 使用IntelliJ IDEA 14.1,它对Spring Boot提供了良好的支持;● 借助Spring站点,从http://start.Spring.io上下载可配置的ZIP文件;● 使用到http://start.Spring.io站点的curl命令来达到相同的效果。

本书中将会使用Gradle和Java 8,但是也不必为此感到担心。如果你还在使用Maven和更早版本的Java的话,相信你会发现这些技术也是很易于使用的。

很多官方的Spring教程同时提供了Gradle构建和Maven构建,因此,如果你决定继续使用Maven的话,也能很容易地找到样例。Spring 4完全兼容Java 8,如果你不采用Lambda表达式来简化代码库的话,那真的是很遗憾的事情。

本书同时还会为你展示一些Git命令。笔者认为,跟踪工作进展并在稳定的状态进行提交是一件好事。另外,这样还能很容易地将你的工作成果与本书提供的源码进行对比。

本书第9章将借助Heroku部署我们的应用,建议从一开始就使用Git对代码进行版本管理。在本章中,关于如何开始使用Git,我会给出一些建议。1.1 Spring Tool Suite简介

如果要开始学习Spring并使用Spring社区所提供的指南和Starter项目的话,那么最好的起步方式之一就是下载Spring Tool Suite(STS)。STS是一个自定义版本的Eclipse,它被用来与各种Spring项目进行协作,它同时还包括Groovy和Gradle功能。即便如此,你可能像我一样,还会使用其他的IDE,但是,我强烈建议你给STS一个机会,因为它通过“Getting Started”项目,能够让你快速地了解Spring广阔的生态系统。

所以,你可以访问https://Spring.io/tools/sts/all,并下载STS的最新发布版。在生成第一个Spring Boot项目之前,首先需要安装Gradle对STS的支持。在Dashboard中,可以看到“Manage IDE Extensions”按钮,然后,需要在“Language and framework tooling”区域中选择下载“Gradle Support”。

还推荐你下载“Groovy Eclipse”以及“Groovy 2.4 compiler”,如图1-1所示,在本书的后文中,介绍使用geb构建验收测试时会用到它们。图1-1

现在,在起步阶段,提供两种可选方案。 下载示例代码通过你的账号,可以在http://www.packtpub.com站点下

载购买的所有Packt书籍的示例代码文件。如果你通过其他

途径购买本书的话,那么可以访问http://www.packtpub.com/

support并进行注册,这些文件就能通过Email直接发送给你

了。也可以直接通过https://github.com/ Mastering-Spring-

MVC-4/mastering-spring-mvc4下载本书的示例代码。

第一个方案是使用“File | New | Spring Starter Project”导航菜单,如图1-2的截屏所示。这里的可选项是与http://start.Spring.io相同的,只不过嵌入到了IDE中。图1-2

通过使用顶部菜单中的“File | New | Import Getting Started Content”,我们可以看到http://spring.io上所有的可配置项,这里可以选择使用Gradle或Maven,如图1-3所示。 可以下载Starter代码,并按步骤学习本书中的内容,也

可以直接下载完整的代码。图1-3

在“Getting Started Content”中有很多有意思的内容,建议读者自行对其进行一下探索。它阐述了如何将Spring与各种读者可能感兴趣的技术进行集成。

此时,将会生成一个Web项目,如图1-3所示,这是一个Gradle应用,会生成JAR文件并使用Java 8。

表1-1是我们想要使用的配置。表1-1属性值masterSpringMvcNameTypeGradle projectPackagingJarJava version1.8LanguageJavaGroupmasterSpringMvcmasterSpringMvcArtifactVersion0.0.1-SNAPSHOTDescriptionBe creative!PackagemasterSpringMvc

在第2个界面中,将会询问你想要使用的Spring Boot版本以及想要添加进工程的依赖。

在编写本书的时候,Spring Boot的最新版本是1.2.5,请确保你始终选择最新的版本。

当你阅读本书的时候,可以使用最新的快照版本。如果到那时Spring Boot1.3还没有发布的话,那么你可以试一下快照版本。你可以参考https://spring.io/blog/2015/06/17/devtools-in-spring-boot-1-3来了解更多细节。

在配置窗口的底部会有一些复选框,代表各种Spring Boot starter库。它们是可以添加到构建文件中的依赖项,针对各种Spring项目,它们提供了自动配置功能。

现在只关心Spring MVC,所以只选中Web这个复选框。 为Web应用生成一个JAR文件?将Web应用打包为JAR

文件,这一点你们可能会觉得有些诡异。尽管仍然可以将其

打包为WAR,但这并不是推荐的实践。在默认情况下,

Spring Boot将会创建一个胖JAR包(fat JAR),这个JAR包

中包含了应用所有的依赖,提供了通过“java-jar”命令便

捷启动Web应用的方法。我们的应用将会打包为JAR文件,如果你想创建WAR文

件的话,可以参考http://spring.io/ guides/gs/convert-jar-to-

war/。

你点击了“Finish”按钮了吗?如果已经点击了的话,将会得到如图1-4所示的项目结构。图1-4

可以看到主类MasterSpringMvcApplication及其测试类MasterSpringMvc ApplicationTests,还可以看到两个空的文件夹——static和templates,它们分别用来存放静态Web资源(图片、样式文件等)和模板(jsp、freemarker或Thymeleaf)。最后一个文件是空的application.properties,它是Spring Boot默认的配置文件。这是一个很便利的文件,在本章中,将会看到Spring Boot如何使用它。

对于构建文件build.gradle,稍后将会详细介绍。

如果你觉得已经准备就绪,那么运行应用的主方法,这样就能会启动一个Web服务器。

要做到这一点,切换至应用的主方法,然后右键点击该类,并在工具栏中导航至“Run as | Spring Application”,或者点击工具栏上绿色的Play按钮。

遵循上面的步骤,并导航至http://localhost:8080,此时会产生一个错误,不必担心,请继续往下阅读。

接下来将为读者展示如何不使用STS来生成相同的项目,然后再回过头来看这些文件。1.2 IntelliJ简介

IntelliJ IDEA是在Java开发人员中非常流行的一个工具。在过去的几年中,因为这个很棒的编辑器,我非常心甘情愿地为Jetbrains支付了年费。

IntelliJ也有快速创建Spring Boot项目的方法。

如图1-5所示,进入新建项目菜单,默认的择“Spring Initializr”项目。图1-5

这将会出现与STS相同的配置选项,所以请参照之前的小节来了解详细的配置。 你可能需要将Gradle项目导入到IntelliJ之中。推荐你首

先生成Gradle包装器(参考1.5.1节)。如果需要的话,通过再次打开项目的build.gradle文件,

可以重新导入该项目。1.3 start.Spring.io简介

请导航至http://start.Spring.io站点来开始使用start.Spring.io,对于这个类似于Bootstrap的站点,你可能会感到很熟悉。如果进入上述的链接,那么看到的内容会如图1-6的截屏所示。图1-6

在这里所看到的配置选项与STS中是相同的,点击“Generate Project”按钮后将会下载一个ZIP文件,这个文件中会包含我们的Stater项目。1.4 命令行方式简介

对于钟情于控制台的读者来说,可以采用“curl http://start.Spring.io”的方式。采用这种方式的话,将会需要一些指令,帮助我们组织curl请求。

例如,要生成与之前相同的项目,那么可以输入如下的命令:$ curl http://start.Spring.io/starter.tgz \-d name=masterSpringMvc \-d dependencies=web \-d language=java \-d JavaVersion=1.8 \-d type=gradle-project \-d packageName=masterSpringMvc \-d packaging=jar \-d baseDir=app | tar -xzvf -% Total % Received % Xferd Average Speed Time Time TimeCurrentDload Upload Total Spent Left Speed100 1255 100 1119 100 136 1014 123 0:00:01 0:00:01 --:--:-- 1015x app/x app/src/x app/src/main/x app/src/main/Java/x app/src/main/Java/com/x app/src/main/Java/com/geowarin/x app/src/main/resources/x app/src/main/resources/static/x app/src/main/resources/templates/x app/src/test/x app/src/test/Java/x app/src/test/Java/com/x app/src/test/Java/com/geowarin/x app/build.Gradlex app/src/main/Java/com/geowarin/AppApplication.Javax app/src/main/resources/application.propertiesx app/src/test/Java/com/geowarin/AppApplicationTests.Java

现在,我们不离开控制台就能开始使用Spring了,美梦变成了现实。 可以考虑为上述的命令创建一个别名(alias),这样的

话,就能快速地创建Spring项目的原型了。1.5 那就正式开始吧

现在Web应用已经准备就绪,先看一下它是如何编写的。在进一步学习之前,我们可以将工作的成果保存到Git上。

如果你还不了解Git的话,我推荐下面的两个教程:● https://try.github.io,这是一个很好的交互式教程,可以引导你一

步步地学习基础的Git命令;● http://pcottle.github.io/learnGitBranching,这是一个很棒的教程,

它将Git以类似于树形的结构进行了可视化,它同时展现了Git的

基本和高级功能。 安装Git在Windows下,需要安装Git bash,这可以在https://

msysgit.github.io找到。在Mac下,如果你使用homebrew的

话,很可能已经安装过Git了,否则的话,使用brew install

git命令来进行安装。如果有疑问的话,请查阅https://git-

scm.com/book/en/v2/Getting-Started-Installing-Git上的文档。

如果要使用Git版本化我们的工作内容,那么可以在控制台中输入如下的命令:$ cd app$ git init

使用IntelliJ的话,要忽略自动生成的文件,即“.idea”和“*.iml”。使用Eclipse的话,应该将“.classpath”文件和“.settings”文件夹提交上去。不管是哪种情况,都要忽略“.gradle”文件夹和build文件夹。

创建一个包含如下文本内容的“.gitignore“文件:# IntelliJ project files.idea*.iml# gradle.gradlebuild

现在,我们可以将其他文件添加到Git中:$ git add .$ git commit -m "Generated with curl start.Spring.io"[master (root-commit) eded363] Generated with curl start.Spring.io4 files changed, 75 insertions(+)create mode 100644 build.Gradlecreate mode 100644 src/main/Java/com/geowarin/AppApplication.Javacreate mode 100644 src/main/resources/application.propertiescreate mode 100644 src/test/Java/com/geowarin/AppApplicationTests.Java1.5.1 Gradle构建

如果你还不熟悉Gradle的话,那么可以将其视为Maven的继任者,它是一个现代化的构建工具。与Maven类似,它会使用约定,例如如何组织Java应用的结构。我们的源码依然会放在“src/main/java”之中,Web应用的代码放到“src/main/webapp”之中,诸如此类。与Maven类似,我们可以使用Gradle插件来处理各种构建任务。但是,Gradle真正的闪光点在于,它允许我们使用Groovy DSL编写自己的构建任务。默认库使得管理文件、声明任务之间的依赖以及增量执行job都变得非常容易。 安装Gradle如果你使用OS X的话,那么可以通过brew install gradle

命令,借助brew来安装Gradle。在任意的*NIX的系统下(包

括Mac),都可以使用gvm(http://gvmtool.net/)来进行安装。

另外,也可以在https://Gradle.org/downloads下获取二进制

分发包。

使用Gradle创建应用的第一个最佳实践就是生成Gradle包装器(wrapper)。Gradle包装器是一个小的脚本,它能够在你的代码中进行共享,从而确保会使用相同版本的Gradle来构建你的应用。

生成包装器的命令是gradle wrapper:$ gradle wrapper:wrapperBUILD SUCCESSFULTotal time: 6.699 secs

如果我们看一下新创建的文件,可以看到有两个脚本和两个目录:$ git status -s?? .gradle/?? gradle/?? gradlew?? gradlew.bat

在“.gradle”目录中包含了Gradle二进制文件,我们不希望将其添加到版本控制之中。

前面已经忽略了这个文件和构建目录,所以可以安全地对其他内容执行git add操作:$ git add .$ git commit -m "Added Gradle wrapper"

gradle 目录包含了如何得到二进制文件的信息。另外两个文件是脚本:用于 Windows的批处理脚本(gradlew.bat)以及用于其他系统的shell脚本。

我们可以使用Gradle运行应用,替换借助IDE来执行应用的方式:$ ./gradlew bootrun

执行上面的命令将会运行一个嵌入式的Tomcat,应用会位于它里面!

如图1-7所示,日志提示服务器运行在8080端口上,我们检查一下。图1-7

可以想象到你内心的失望,因为应用还没有为完全公开做好准备。

换句话说,在工程中,这两个文件所完成的工作内容还是很让人振奋的。我们来看一下。

首先是Gradle构建文件,也就是build.gradle:buildscript { ext { springBootVersion = '1.2.5.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") classpath("io.spring.gradle:dependency-management-plugin:0.5.1.RELEASE") }}apply plugin: 'java'apply plugin: 'eclipse'apply plugin: 'idea'apply plugin: 'spring-boot'apply plugin: 'io.spring.dependency-management'jar { baseName = 'masterSpringMvc' version = '0.0.1-SNAPSHOT'}sourceCompatibility = 1.8targetCompatibility = 1.8repositories { mavenCentral()}dependencies { compile("org.springframework.boot:spring-boot-starter-web") testCompile("org.springframework.boot:spring-boot-starter-test")}eclipse { classpath { containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER') containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8' }}task wrapper(type: Wrapper) { gradleVersion = '2.3'}

在这里,都看到了什么呢?● 对Spring Boot插件的依赖,它分布在Maven中央仓库中。● 我们的项目是Java工程。Gradle可以为IntelliJ或Eclipse生成IDE

工程文件。● 该应用将会生成JAR文件。● 我们的项目的依赖是托管在Maven中央仓库中的。● 类路径在生产环境下包含spring-boot-starter-web,在测试环境

中,还包含spring- boot-starter-test。● 针对Eclipse的一些额外配置。● Gradle包装器的版本是2.3。

Spring Boot插件将会产生一个胖(fat)JAR文件,其中包含了项目的所有依赖。要构建的话,只需输入:./gradlew build

我们将会在“build/libs”目录下找到这个JAR文件。该目录下会包含两个文件,其中一个为胖JAR包,名为masterSpringMvc-0.0.1-SNAPSHOT.jar,另外一个是普通的JAR文件,名为masterSpringMvc-0.0.1-SNAPSHOT. jar.original,这个文件不包含任何的依赖。 可运行的JARSpring Boot主要的一个优势在于将应用所需的所有内容

都放到一个易于重发布的JAR文件中,其中包含了Web服务

器。如果你运行java jar masterSpringMvc-0.0.1-

SNAPSHOT.jar的话,Tomcat将会在8080端口上启动,就像

在开发期一样。如果要将其部署到生产环境或云中,这都是

相当便利的。

在这里,主要的依赖是spring-boot-starter-web,Spring Boot提供了很多的Starter,它们会对应用的很多方面进行自动化配置,这是通过提供典型的依赖和Spring配置来实现的。

例如,spring-boot-starter-web将会包含对tomcat-embedded和Spring MVC的依赖。它会自动运行Spring MVC最为常用的配置并提供一个分发器(dispatcher),使其监听“/”根路径,还会提供错误处理页面,就像之前所看到的404页面那样。除此之外,还有一个典型的视图解析器(view resolver)配置。

稍后,我们将会看到更多的内容,首先从下一节开始吧!1.5.2 让我们看一下代码

这里将会展现运行应用的所有代码,它是一个经典的main函数,这种方式有很大的优势,因为我们可以在IDE中像运行其他程序那样运行这个应用。我们可以对其进行调试,并且不需要插件就能实现一些类的重新加载。

在开发模式下,当我们在Eclipse中保存文件或者在IntelliJ中点击“Make Project”就会触发重新加载的过程。只有JVM支持切换至新编译版本的类文件时,它才是可行的,如果修改静态变量或配置文件的话,我们必须要重新加载应用。

主类如下所示:package masterSpringMvc;import org.Springframework.boot.SpringApplication;import org.Springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class AppApplication { public static void main(String[] args) { SpringApplication.run(AppApplication.class, args); }}

需要注意的是@SpringBootApplication注解,如果看一下这个注解的代码的话,就会发现它实际上组合了3个其他的注解,也就是@Configuration、@EnableAutoConfiguration和@ComponentScan:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@Configuration@EnableAutoConfiguration@ComponentScanpublic @interface SpringBootApplication { /** * Exclude specific auto-configuration classes such that they willnever be applied. */ Class[] exclude() default {};}

如果你之前使用Java代码配置过Spring应用的话,那么你应该对@Configuration非常熟悉。它表明我们的这个类将会处理Spring的常规配置,如bean的声明。

@ComponentScan也是一个比较经典的注解,它会告诉Spring去哪里查找Spring组件(服务、控制器等)。在默认情况下,这个注解将会扫描当前包以及该包下面的所有子包。

在这里,比较新颖的是@EnableAutoConfiguration注解,它会指导Spring Boot发挥其魔力。如果你将其移除掉的话,就无法从Spring Boot的自动配置中收益了。

使用Spring Boot来编写MVC应用的第一步通常是在代码中添加控制器。将控制器放到controller子包中,这样它就能够被@ComponentScan注解所发现:package masterSpringMvc.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;@Controllerpublic class HelloController { @RequestMapping("/") @ResponseBody public String hello() { return "Hello, world!"; }}

现在,如果打开浏览器并访问http://localhost:8080的话,就能看到我们钟爱的“Hello, world!”被输出了出来(见图1-8)。图1-81.6 幕后的Spring Boot

如果你之前搭建过Spring MVC应用,那么可能已经习惯于编写相关的XML文件或Java注解配置类。

一般来讲,初始的步骤如下所示:

1.初始化Spring MVC的DispatcherServlet;

2.搭建转码过滤器,保证客户端请求进行正确地转码;

3.搭建视图解析器(view resolver),告诉Spring去哪里查找视图,以及它们是使用哪种方言编写的(JSP、Thymeleaf模板等);

4.配置静态资源的位置(CSS、JS);

5.配置所支持的地域以及资源bundle;

6.配置multipart解析器,保证文件上传能够正常工作;

7.将Tomcat或Jetty包含进来,从而能够在Web服务器上运行我们的应用;

8.建立错误页面(如404)。

不过,Spring Boot为我们处理了所有的事情。因为这些配置一般是与应用相关的,所以你可以无限制地将它们进行组合。

在一定程度上来讲,Spring Boot是带有一定倾向性的Spring项目配置器。它基于约定,并且默认会在你的项目中使用这些约定。1.6.1 分发器和multipart配置

接下来,让我们看一下在幕后到底发生了什么。

我们使用默认生成的Spring Boot配置文件,并将其设置为debug模式。在src/main/resources/ application.properties中添加下面这一行:debug=true

现在,如果重新启动应用的话,就能看到Spring Boot的自动配置报告。它分为两部分:一部分是匹配上的(positive matches),列出了应用中,所有的自动配置,另一部分是没有匹配上的(negative matches),这部分是应用在启动的时候,需求没有满足的Spring Boot自动配置:=========================AUTO-CONFIGURATION REPORT=========================Positive matches:----------------- DispatcherServletAutoConfiguration - @ConditionalOnClass classes found: org.Springframework.web.servlet.DispatcherServlet (OnClassCondition) - found web application StandardServletEnvironment(OnWebApplicationCondition) EmbeddedServletContainerAutoConfiguration - found web application StandardServletEnvironment(OnWebApplicationCondition) ErrorMvcAutoConfiguration - @ConditionalOnClass classes found: javax.servlet.Servlet,org.springframework.web.servlet.DispatcherServlet (OnClassCondition) - found web application StandardServletEnvironment(OnWebApplicationCondition) HttpEncodingAutoConfiguration - @ConditionalOnClass classes found: org.springframework.web.filter.CharacterEncodingFilter (OnClassCondition) - matched (OnPropertyCondition)

仔细看一下DispatcherServletAutoConfiguration:/*** {@link EnableAutoConfiguration Auto-configuration} for the Spring* {@link DispatcherServlet}. Should work for a standalone applicationwhere an embedded* servlet container is already present and also for a deployableapplication using* {@link SpringBootServletInitializer}.** @author Phillip Webb* @author Dave Syer*/@Order(Ordered.HIGHEST_PRECEDENCE)@Configuration@ConditionalOnWebApplication@ConditionalOnClass(DispatcherServlet.class)@AutoConfigureAfter(EmbeddedServletContainerAutoConfiguration.class)public class DispatcherServletAutoConfiguration { /* * The bean name for a DispatcherServlet that will be mapped to theroot URL "/" */ public static final String DEFAULT_DISPATCHER_SERVLET_BEAN_NAME ="dispatcherServlet"; /* * The bean name for a ServletRegistrationBean for theDispatcherServlet "/" */ public static final String DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME = "dispatcherServletRegistration"; @Configuration @Conditional(DefaultDispatcherServletCondition.class) @ConditionalOnClass(ServletRegistration.class) protected static class DispatcherServletConfiguration { @Autowired private ServerProperties server; @Autowired(required = false) private MultipartConfigElement multipartConfig; @Bean(name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME) public DispatcherServlet dispatcherServlet() { return new DispatcherServlet(); } @Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME) public ServletRegistrationBean dispatcherServletRegistration(){ ServletRegistrationBean registration = newServletRegistrationBean( dispatcherServlet(), this.server.getServletMapping()); registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME); if (this.multipartConfig != null) { registration.setMultipartConfig(this.multipartConfig); } return registration; } @Bean @ConditionalOnBean(MultipartResolver.class) @ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) public MultipartResolver multipartResolver(MultipartResolverresolver) { // Detect if the user has created a MultipartResolver butnamed it incorrectly return resolver; } } @Order(Ordered.LOWEST_PRECEDENCE - 10) private static class DefaultDispatcherServletCondition extendsSpringBootCondition { @Override public ConditionOutcome getMatchOutcome(ConditionContextcontext, AnnotatedTypeMetadata metadata) { ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); ConditionOutcome outcome = checkServlets(beanFactory); if (!outcome.isMatch()) { return outcome; } return checkServletRegistrations(beanFactory); } }}

这是一个典型的Spring Boot配置类。● 与其他的Spring配置类相同,它使用了@Configuration注解;● 一般会通过@Order注解来声明优先等级,可以看到

DispatcherServletAutoConfiguration需要优先进行配置;● 其中也可以包含一些提示信息,如@AutoConfigureAfter或

@AutoConfigureBefore,从而进一步细化配置处理的顺序;● 它还支持在特定的条件下启用某项功能。通过使用

@ConditionalOnClass (DispatcherServlet.class)这个特殊的配

置,能够确保我们的类路径下包含DispatcherServlet,这能够很

好地表明Spring MVC位于类路径中,用户当前希望将其启动起

来。

这个文件中还包含了Spring MVC分发器Servlet和multipart解析器的典型配置。整个Spring MVC配置被拆分到了多个文件之中。

另外,值得一提的是,这些bean会遵循特定的规则,以此来检查是否处于激活状态。在@Conditional(DefaultDispatcherServletCondition.class)条件满足的情况下,ServletRegistrationBean函数才会启用,这有些复杂,但是能够检查在你的配置中,是否已经注册了分发器Servlet。

只有在满足@ConditionalOnMissingBean(name=DispatcherServlet.MULTIPART_RESOLVER_ BEAN_NAME)条件的情况下,

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载