SpringBoot整合Sping MVC
添加依赖
<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配置文件详解。