添加依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

网页模板引擎

Thymeleaf

Thymeleaf模板引擎是SpringBoot官方强烈建议使用的模板引擎,它可以完美兼容普通html网页。使用thymeleaf模板引擎后在SpringBoot环境中是显示动态的网页内容,而以本地直接运行则是显示静态的内容(Thymeleaf模板引擎的文件后缀也是.html)。

添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

表达式

变量表达式

使用示例:

<!DOCTYPE html>
<!-- 需要添加一个文件头,声明th命名空间 -->  
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
    ${session.user.name}
    <li th:each="book : ${books}">hello spring mvc</li>
    <span th:text="${book.author.name}">hello spring boot</span>
</body>
</html>

星号表达式

URL表达式

赋值、字符串拼接

赋值操作

Thymeleaf中赋值使用th:text属性,如:

<p th:text="${message}"> description </p>
字符串拼接
方式一:
<span th:text="'Welcome to our application, ' + ${user.name} + '!'">
方式二:
<span th:text="|Welcome to our application, ${user.name}!|">

分支语句

用法示例:

<a th:if="${myself=='yes'}" > ok </a>

上面的例子中只有th:if条件成立才显示a标签内容

用法示例:

<a th:unless=${session.user != null} th:href="@{/login}" >Login</a>

th:unless 于 th:if 恰好相反,只有表达式中的条件不成立,才会显示其内容。

循环语句

用法示例:

<tr th:each="collect,iterStat : ${collects}"> 
   <th scope="row" th:text="${collect.id}">1</th>
   <td>
      <img th:src="${collect.webLogo}"/>
   </td>
   <td th:text="${collect.url}">Mark</td>
   <td th:text="${collect.title}">Otto</td>
   <td th:text="${collect.description}">@mdo</td>
   <td th:text="${terStat.index}">index</td>
</tr>

iterStat称作状态变量,属性有:

  • index:当前迭代对象的 index(从0开始计算)
    count: 当前迭代对象的 index(从1开始计算)
  • size:被迭代对象的大小
  • current:当前迭代变量
  • even/odd:布尔值,当前循环是否是偶数/奇数(从0开始计算)
  • first:布尔值,当前循环是否是第一个
  • last:布尔值,当前循环是否是最后一个

FreeMarker

JSP

SpringBoot官方建议我们使用Thymeleaf模板引擎取代JSP视图,如果我们就想使用JSP怎么办呢?可以,做好下面几步配置就可以了

修改打包方式

<project>
     ...
    <packaging>war</packaging>
     ...
</project>

添加JSP依赖

<!--配置支持jsp-->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
</dependency>

配置视图解析器

下面时yml格式的配置文件

spring:
  mvc:
    view:
      prefix: /WEB-INF/ #配置JSP文件前缀
      suffix: .jsp      #配置JSP页面后缀

如果用properties格式的配置文件,则配置如下

spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp

相信大家也已经看出来了,两种格式的配置文件都是一样的,yml格式时SpringBoot支持的格式,在Idea编辑器中yml并不比properties格式的难用,会自动转换成对应的格式(eclipse就算了,不会提示,还不会转换)。而且很显然yml格式的可以减少大量的重复性前缀(比如spring.mvc.view等等),这样可以一定程度上减少配置文件的大小。

注:
1、jsp页面必须放到webapp目录或webapp/WEB-INF/下
2、如果使用了jsp作为视图,则工程只能打成war包部署(因为jar包不会将webapp目录下的东西打进去)
3、运行时如果是开发那就还是用启动类启动而不需要用tomcat容器

返回JSON

SpringBoot默认内部已经提供了对以下三种JSON类库的支持:

  • Gson
  • Jackson
  • JSON-B

Jackson是默认的JSON转换库

要自动以Jackson转换JSON的参数,可以通过定义ObjectMapper bean来实现,如:

@Bean
public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        return mapper;
}

也可以通过设置spring.jackson.*属性实现

文件上传

SpringBoot 2.1版本解决Tomcat最大支持10M文件上传问题

@Bean
public TomcatServletWebServerFactory tomcatEmbedded() {
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
    tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
        if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
            //-1 means unlimited
            ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
        }
    });
    return tomcat;
}

SpringBoot 1.5版本解决Tomcat最大只能上传10M文件问题

@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
    TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();
    tomcatFactory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
        if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
            //-1 means unlimited
            ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
        }
    });
    return tomcatFactory;
}

放行静态资源

SpringBoot默认会将classpath:/static/作为静态资源处理, 我们可以通过下面的配置重写该参数:

#指定请求url符合什么格式时才会当成静态资源处理
spring.mvc.static-path-pattern=/** 

# 指定静态资源去哪里找
spring.resources.static-locations=classpath:/static/ 

#这个属性的默认值是:
#spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/

这两个属性其实就相当于在xml中配置的

<mvc:resources mapping="/**" location="/static/" />

这一章介绍了spring mvc的知识,而我们还是没有用到太多的配置,这其实就是spring boot的强大之处,它可以大量缩减我们之前用ssm时的配置工作量。那么spring boot的配置文件能配置那些东西呢?请看下一章的SpringBoot配置文件详解。