Spring Boot 入门教程(二)——Configure Starter

Spring Boot 是一个构建在Spring Framework 之上的一个快速应用框架。你可以在我的博客 Spring Boot系列教程 中获取其他章节的教程信息。

1.目标

在本章节中,将创建一个问题报告Web应用。用户通过此应用可以提交他们在网站上发现的问题。

2.配置

第一章的示例代码基础上,我们需要将一些必要的依赖项添加到项目中。添加的依赖如下:

  • Freemarker
    Freemarker是Spring框架中一个强大的模板处理引擎。
  • Spring Boot Devtools
    Spring Boot Devtools提供了一系列非常有用的工具,它可以大大的增强开发体验。比如保存源代码时自动编译、自动刷新等等。
  • Spring Data JPA
    Spring Data JPA 可以轻松实现基于JPA的存储库,并构建基于Spring驱动的数据库访问应用程序。
  • H2
    H2是一个Java SQL数据库。它是一个可以在内存中运行轻量级数据库系统。

要将以上的的依赖项添加到项目中,只需要打开项目根目录文件夹下的pom.xml文件,将以下内容添加到依赖项部分。然后保存文件并更新项目即可(关于如何配置及使用Maven在这里不再累赘)。

<dependencies>
<!-- other dependencies...  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
</dependencies>

3.验证依赖配置

启动你的应用程序,在你的应用程序上右击鼠标 > Run As > Spring Boot App 。由于我们已经将devtools依赖项添加到项目中,因此我们可以使用它提供的实时重载功能。无需任何进一步的配置,当项目每次在保存文件时都会重新加载应用程序。你可以在控制台中看到类似下面的日志信息:

2019-01-11 05:44:59.183  INFO 9820 --- [  restartedMain] o.s.w.s.v.f.FreeMarkerConfigurer         : ClassTemplateLoader for Spring macros added to FreeMarker configuration
2019-01-11 05:44:59.186  WARN 9820 --- [  restartedMain] o.s.b.a.f.FreeMarkerAutoConfiguration    : Cannot find template location(s): [classpath:/templates/] (please add some templates, check your FreeMarker configuration, or set spring.freemarker.checkTemplateLocation=false)
2019-01-11 05:44:59.212  INFO 9820 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2019-01-11 05:44:59.263  INFO 9820 --- [  restartedMain] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2019-01-11 05:44:59.276  INFO 9820 --- [  restartedMain] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2019-01-11 05:44:59.278  INFO 9820 --- [  restartedMain] com.ramostear.example.DemoApplication    : Started DemoApplication in 0.918 seconds (JVM running for 83.506)

你可以在控制台输出中发现带有 “restartedMain” 字样的记录,证明devtools配置已经生效。

4.使用 @Controller 注解创建一个Web控制器

在src/main/java文件夹中创建一个名为com.ramostear.example.controller的包,并在包中创建一个名为IssueController的类。该类负责处理前端页面传入到后端的web请求。
为了让Spring识别IssueController是一个控制器,需要使用@Controller注解对类进行注释。将此注解放在类声明的顶部,并添加 “import org.springframework.stereotype.Controller;”语句。

package com.ramostear.example.controller;

import org.springframework.stereotype.Controller;

@Controller
public class IssueController {

}

4.1.创建控制器方法

在IssueController类中,创建以下方法:

@GetMapping("/issuereport")
@ResponseBody
public String getReport() {
  return "issues/issuereport_form";
}

此方法稍后将返回基本表单模板,用户可以在其中提交他们找到的问题。现在它值返回一个字符串,稍后将会添加该功能。

@GetMapping 注解将会给 Spring Core 一个处理信号,被它标注的此方法只能处理GET请求。

由于getReport()方法仅负责将所需要的HTML文件发送给用户,因此还需要一个处理用户提交问题的方法:

@PostMapping("/issuereport")
@ResponseBody
public String submitReport() {
  return "issues/issuereport_form";
}

提交表单后,此方法将负责处理用户输入。当接收和处理数据(例如:添加到数据库)时,此方法从第一个控制器方法返回相同的issuereport模板。

@PostMapping 注解,被此注解标注的方法只能处理Post请求。

下一个方法将处理列表视图的HTML模板,其中可以查看所有的请求。

@GetMapping("/issues")
@ResponseBody
public String getIssues() {
  return "issues/issuereport_list";
}

此方法将返回一个模板,其中包含已提交的所有报告的列表。

@ResponseBody 注解在后续步骤中将会去除掉。但现在需要此标签帮助我们将模板名称(issues/issuereport_form)输出到HTML页面中。如果现在去除此标签,框架将会因为找不到具有给定名称的模板而报错。

4.2.验证代码

该IssueController现在应该是如下的样子:

package com.ramostear.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class IssueController {

    @GetMapping("/issuereport")
    @ResponseBody
    public String getReport() {
        return "issues/issuereport_form";
    }

    @PostMapping("/issuereport")
    @ResponseBody
    public String submitReport() {
        return "issues/issuereport_form";
    }

    @GetMapping("/issues")
    @ResponseBody
    public String getIssues() {
        return "issues/issuereport_list";
    }
}

由于我们在项目中添加了devtools依赖项,当保存好代码后,项目将会被重新编译和运行。我们只需要刷新浏览器,并将访问地址导航到localhost:8080/issuereport, 你将看到如下的文本信息:

issuereport_form

本章节中,你一学习到如何配置Spring Boot的依赖项以及编写一个控制器类来验证配置是否生效;在下一章中我们将学习创建实体数据类和Freemarker模板引擎的使用