Spring Boot教程(5) – 模板引擎

模板引擎,是用来生成动态网页内容的,一旦控制器(Controller)收集了足够的数据,就会把数据交给模板引擎来处理,模板引擎根据数据生成HTML,返回给浏览器。

Spring Boot支持多种模板引擎(可以自动配置),包括FreeMarkerThymeleafMustacheGroovy Templates。你可能也知道JSP,被很多人认为是过时的技术,虽然他仍然可以完成你大部分的需求,也可以在Spring Boot中使用,但是已经不被推荐了,具体你可以参考 为什么Spring Boot不推荐使用JSP? 。Thymeleaf现在被很多人采用,他的特点就是可以直接在浏览器中打开模板文件,方便前端开发。FreeMarker使用FreeMarker模板语言(ftl),跟使用JSP或者PHP的感觉有点相似,但是他并不是通用语言,只专注于在模板中展示数据。Mustache和Groovy Templates一句话两句话说不太清楚,大家看看例子就好。

(更多…)

继续阅读 →

Spring Boot教程(4) – 依赖管理

不管你熟悉不熟悉Gradle,build.gradle文件中的内容都是要去重新认识的。

上图是一个典型的,刚刚生成的build.gradle文件,添加了个Guava依赖。repositories{ mavenCentral() } 这段代码表示我们的依赖都是从中央仓库下载的。 比如这个Guava库,implementation后面跟上库的坐标就可以引入 ,之前我们说过,坐标由 groupId:artifactId:version 组成。奇怪的是,上面列出的第一个依赖,却没有版本号。因为这个版本号是由一个插件管着的,插件叫做 io.spring.dependency-management。

说到这儿,又要牵扯出很多东西了,容我深吸一口气。

(更多…)

继续阅读 →

Spring Boot教程(3) – 运行第一个项目

把项目运行起来是极具成就感的事情,不管是在学习新语言还是新框架的过程中。上一篇文章说明了如何使用Spring Initializr和IDE来创建项目,下面就看看项目能不能跑起来,我们通过IDE和命令行,直观地理解框架的作用。

先来一张IntelliJ IDEA的截图,为项目刚创建时候的状态。左侧为项目目录区,右侧为代码区。左边,右边和下边都有工具栏,你可以打开终端,可以查看类结构,可以查看Build时候的信息,可以查看运行时候的信息,可以查看Gradle和Maven的依赖以及任务,可以连接数据库,可以查看Spring相关的东西比如各种Bean及其关联等等。界面最上方是文件的目录以及运行相关的按钮。

(更多…)

继续阅读 →

Spring Boot教程(2) – 创建第一个项目

在准备好开发环境之后,你肯定有这样的疑惑,我如何新建一个项目?搁在以前,一般是通过IDE的“New Project”菜单,跟着引导一步一步来创建项目。现在Spring Boot提供了一种更加统一的方式,使用Spring Initializr(start.spring.io)。

Spring Initializr页面

Spring Initializr可以根据你设置的选项,生成一个新的项目,并下载到本地,你导入IDE就可以开发了。页面上第一个选项是选择构建工具,使用Maven还是Gradle。第二项选择语言,大部分用的都是Java。第三项选择使用哪个Spring Boot版本,一般来说用的都是最新的正式版,本文发布时,版本还是2.1.5。如果你需要的版本上面没有列出来,可以先生成个项目,然后再在配置文件里改成你需要的版本。

(更多…)

继续阅读 →

Spring Boot教程(1) – 准备开发环境

如果你从未运行过Spring Boot应用,那你一定很好奇这个框架到底是如何使用的,比如代码是如何组织起来的?程序从哪里开始运行?部署时候需要如何打包?在搞清楚这些问题之前,你需要搭建一个自己的开发环境,开发过程都基于这个环境。

JDK的选择

Spring Boot应用不同于以往的Spring框架应用,它可以像普通的Java程序一样以java -jar app.jar的方式运行。那么这个时候,它就是一个纯Java程序了,你的系统中只要有了Java,就可以把程序跑起来。Spring Boot最新版(2.1.5)的源码是基于Java 8的,你也可以使用Java 11或者其他高于8的版本。在选择Java版本的时候,你可以参考这篇文章。JDK的安装过程不再赘述,想必你在学习Java语法的时候就已经完成了这个过程。我推荐使用Java 11,毕竟你是在学习知识嘛,肯定选择最新的稳定版本,生产环境另说。

(更多…)

继续阅读 →

准备写个Spring Boot教程

最近我打算写一系列Spring Boot教程,用来讲解Spring Boot基础知识和一些常见的应用场景。你可能会问,现在讲这个话题的东西这么多,写出来的意义是啥,别人会看么。我的觉得吧,一条街上很多饭店,你决定去哪个,肯定还是看谁的好吃或者服务好。我肯定得有一些不一样的地方,下面是我的思路:

  1. 首先我不打算列出长篇累牍的代码。我平常搜索文章的时候,也时常碰到有文章会连续出现整页的代码,有的缩进还是乱的,给人一种恐惧感。我会尽量把展示出来的代码压缩,减少干扰,让读者注意力集中在理解上。
  2. 其次我计划尝试用画图去说明问题。之前在学习Spring Security的时候,我脑子里充满了疑惑,搞不清楚他拦截的原理。后来搞懂了之后我脑子里就有一张图,十分清晰地表示了那一堆Filter是如何排序的,一个请求是如何被拦截处理的,如果我能把类似的容易理解的图像传递给读者,那么他们就会节省很多解惑的时间。
  3. 覆盖学习路径中可能遇见的错误。如果你照着某个教程一步一步走下去,可能遇见了bug,解决这类bug也是挺苦恼的,我尽量把这些可能发生的bug说出来。条条大路通罗马,通不到罗马的路,也需要给路人指出来,让人心里有底。
  4. 文章不会很长,专注于解决某个问题。对于想解决具体问题的人来说,他能判断出内容是否有用,对于想系统学习的人来说,文章长短倒是不太重要,一篇一篇来就是了。

我在纸上大概规划了下有哪些主题要写,随随便便就列了20多个,的确有很多要说的。如果再加上Spring Cloud的话,就更多了。如果你在内容上有什么建议,可以在下面给我留言。

我也在学习和实践Spring Boot的过程之中,同时我深知写作的过程会让我对知识的理解水平上升到高于写作内容的层次,你要教别人,就得搞清楚之前你只是会用的技能。看看我能否坚持下来吧。

继续阅读 →

数据库迁移工具Flyway

不管是在开发过程中还是在线上,数据库结构都是经常变化的,很多情况下都需要对数据库的变化做跟踪和管理,Flyway就是这样一款管理工具。

在Flyway里,每次数据库变化都称为一次迁移,每次迁移都有一个版本号。Flyway会在数据库里存储当前处在哪个版本。每当需要上线的时候,你可以手动或者自动地将代码里的多个迁移,同步到数据库当中。

迁移的规则

如图所示,文件名以V开头,后面跟上版本号,然后是两个下划线,最后是对此次迁移的描述,用下划线或者空格隔开。在每个sql文件中,都可以写多个DDL语句或者CRUD语句,根据你的需求而定。

怎么才能触发迁移呢?Flyway提供了多种方式:

(更多…)

继续阅读 →

Spring Boot为什么不推荐使用JSP?

如果你在网上搜Spring Boot的教程,会发现模板引擎清一色用的Thymeleaf,为什么很少人用JSP?因为Spring Boot官方已经不推荐使用JSP了,文档中原话这么说的:

If possible, JSPs should be avoided. There are several known limitations when using them with embedded servlet containers.

Spring Boot 文档

在内置servlet容器中运行的时候,JSP会有一些限制:

  • 我们知道Spring Boot的打包方式有两种,一种jar包,一种war包。两种打包方式可以通过命令java -jar dist.jar或者java -jar dist.war运行。war包也可以单独部署在独立的Servlet容器(比如Tomcat,Jetty)中。使用jar包的时候不支持JSP,使用war包的时候支持
  • Undertow不支持JSP,话说Undertow国内用的比较少吧
  • 自定义的error.jsp不会覆盖Spring Boot默认的错误处理页面

既然如此,你如果需要使用JSP,就得打成war包,官方的代码仓库中自带有使用JSP的样例。当你需要迁移老项目到Spring Boot的时候,肯定会派上用场。

对于新项目,我的建议是你喜欢用哪个模板引擎,就用哪个。如果没有熟悉的,那就把FreeMarker、Groovy、Thymeleaf和Mustache全都看一遍,选择最合适的。

继续阅读 →

Spring Boot要不要搞?

最近抽空学写了下Spring Boot,它旨在简化Java应用的开发。利用自动配置的特性,你可以少写很多配置代码,利用COC(Convention Over Configuration),你可以直接上手,快速投入到你业务的开发过程中。

刚开始听说Spring Boot的时候,我是拒绝的。最早学习Spring,是通过《Spring实战(第四版)》开始的,这本书覆盖了Spring开发的方方面面,是一本极好的入门书籍。然后我还写了个模板项目,配置好了一些常用的东西,比如第三方库、数据库配置、资源路径等等。当我以为自己算是踏入Java Web开发的大门的时候,发现我在github找的一些开源项目都是使用的Spring Boot,而且拉勾上很多职位都对SB有要求(说明已经被广泛应用了),再加上Spring Cloud是基于Spring Boot的,我决定上手试一试。

(更多…)

继续阅读 →