在002-Spring MVC流程解析中我们提到Spring Boot中默认添加了如下的视图解析器。
既然是多个,那么肯定是有顺序的。所有的ViewResolver都实现了Ordered接口,在Spring中实现了这个接口的类都是可以排序的。在ViewResolver中是通过order属性来指定顺序的,默认都是最大值。值越大,排序在越后。
我们知道ViewResolver返回View对象,ViewResolver按顺序执行,如果返回的View为null,则执行下一个ViewResolver,如果不为null,则不再往下执行。如果所有ViewResolver都执行完,但View还是为null则抛出异常。所以在某些情况下,类似的ViewResolver处理器,排在后面的将不会生效。
AbstractCachingViewResolver
该抽象类有个setCache方法,用于设置是否缓存视图。(缓存视图可以提高应用的响应效率)。默认是true。但某些时候缓存会造成问题,比如开发阶段,我们需要禁用缓存。
UrlBasedViewResolver
此视图解析器中包含几个重要的概念
- “redirect:”:重定向
- “forward:”:请求转发
package com.yyoo.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/demo1")
public class Demo1Controller {
@RequestMapping("/redirect")
public String redirect(){
// 会跳转到我们上一篇文章的地址,而且浏览器的url地址也变为下面的地址了
return "redirect:https://blog.csdn.net/forlinkext/article/details/119354262";
}
@RequestMapping("/forward")
public String forward(){
// 会跳转到我们的Application中定义的地址,最后页面返回HelloWorld,而且浏览器url地址不变
return "forward:/";
}
}
关于redirect和forward的区别,相信大家在学习servlet的时候就了解了。示例中只有大概的说明。
InternalResourceViewResolver
解析JSP 和 JSTL视图
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>\
<property name="contentType" value="text/html;charset=UTF-8"></property>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
Spring Boot环境下InternalResourceViewResolver是默认加入的视图解析器,在application.properties设置如下属性即可
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.jsp
注意你的jsp文件要放在webapp目录下。目录结构如下:
FreeMarkerViewResolver
本文不深入讲解FreeMarker,需要的可以查FreeMarker官网https://freemarker.apache.org/
pom文件中引入如下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
我们示例是用的spring boot,直接配置一下内容即可
# 模板文件放置的位置
spring.freemarker.template-loader-path=classpath:/webapp/
# 模板文件的后缀
spring.freemarker.suffix=.ftl
template-loader-path的默认值为classpath:/templates/
注意Freemarker的模板文件地址如下图:
Controller代码如下:
@RequestMapping("freemarkerPage")
public String freemarkerPage(Model model, @RequestParam String name){
Map<String,String> data = new HashMap<>();
data.put("name",name);
model.addAllAttributes(data);
return "freemarkerPage";
}
model用于设置模板数据,返回值是String类型,表示模板文件的路径。
我们也可以返回ModelAndView对象。实际上最终都是返回ModelAndView对象。
freemarkerPage.ftl模板页面内容
<h1>freemarker页面:${name}</h1>
访问页面
访问如下链接http://localhost:8080/demo1/freemarkerPage?name=%E5%BC%A0%E4%B8%89
ThymeleafViewResolver
本文不深入讲解Thymeleaf,需要的可以查Thymeleaf官网https://www.thymeleaf.org/documentation.html
pom文件中引入如下依赖
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
由于我们的spring是spring5,所以引入的是thymeleaf-spring5。
properties配置
# thymeleaf模板配置
spring.thymeleaf.prefix=classpath:/webapp/
spring.thymeleaf.suffix=.html
template-loader-path的默认值为classpath:/templates/
Controller方法
@RequestMapping("thymeleafPage")
public String thymeleafPage(Model model, @RequestParam String name){
Map<String,String> data = new HashMap<>();
data.put("name",name);
model.addAllAttributes(data);
return "thymeleafPage";
}
thymeleafPage.html模板内容
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>thymeleaf page</title>
</head>
<body>
<p th:text="${name}">Welcome to our grocery store!</p>
</body>
</html>
访问测试页面
访问如下链接http://localhost:8080/demo1/thymeleafPage?name=%E4%B8%AD%E6%96%87
结果如下:
我们示例中同时使用了多种模板引擎,而且模板文件地址都一样,如果要区分,我们在配置模板地址的时候可以使用不同的文件夹来区分即可。
除了jsp、freemarker、thymeleaf以外,老牌的模板引擎还有velocity。以上都是SpringMVC直接返回相应页面的情况。
本文介绍了Spring MVC直接返回Html页面的情况,这是在没有前后端分离的时候,常见的视图处理方式。但我们目前常使用的方式是前后端分离,通过json对象的方式响应给前端请求。我们将在下一章介绍。