在002-Spring MVC流程解析中我们提到Spring Boot中默认添加了如下的视图解析器。
既然是多个,那么肯定是有顺序的。所有的ViewResolver都实现了Ordered接口,在Spring中实现了这个接口的类都是可以排序的。在ViewResolver中是通过order属性来指定顺序的,默认都是最大值。值越大,排序在越后。
AbstractCachingViewResolver我们知道ViewResolver返回View对象,ViewResolver按顺序执行,如果返回的View为null,则执行下一个ViewResolver,如果不为null,则不再往下执行。如果所有ViewResolver都执行完,但View还是为null则抛出异常。所以在某些情况下,类似的ViewResolver处理器,排在后面的将不会生效。
该抽象类有个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:/";
}
}
InternalResourceViewResolver关于redirect和forward的区别,相信大家在学习servlet的时候就了解了。示例中只有大概的说明。
解析JSP 和 JSTL视图
Spring Boot环境下InternalResourceViewResolver是默认加入的视图解析器,在application.properties设置如下属性即可
spring.mvc.view.prefix=/ spring.mvc.view.suffix=.jsp
FreeMarkerViewResolver注意你的jsp文件要放在webapp目录下。目录结构如下:
本文不深入讲解FreeMarker,需要的可以查FreeMarker官网https://freemarker.apache.org/
pom文件中引入如下依赖
org.springframework.boot spring-boot-starter-freemarker
我们示例是用的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 data = new HashMap<>();
data.put("name",name);
model.addAllAttributes(data);
return "freemarkerPage";
}
model用于设置模板数据,返回值是String类型,表示模板文件的路径。
freemarkerPage.ftl模板页面内容我们也可以返回ModelAndView对象。实际上最终都是返回ModelAndView对象。
访问页面freemarker页面:${name}
访问如下链接http://localhost:8080/demo1/freemarkerPage?name=%E5%BC%A0%E4%B8%89
本文不深入讲解Thymeleaf,需要的可以查Thymeleaf官网https://www.thymeleaf.org/documentation.html
pom文件中引入如下依赖
org.thymeleaf thymeleaf-spring5
properties配置由于我们的spring是spring5,所以引入的是thymeleaf-spring5。
# thymeleaf模板配置 spring.thymeleaf.prefix=classpath:/webapp/ spring.thymeleaf.suffix=.html
Controller方法template-loader-path的默认值为classpath:/templates/
@RequestMapping("thymeleafPage")
public String thymeleafPage(Model model, @RequestParam String name){
Map data = new HashMap<>();
data.put("name",name);
model.addAllAttributes(data);
return "thymeleafPage";
}
thymeleafPage.html模板内容
thymeleaf page
Welcome to our grocery store!
访问测试页面
访问如下链接http://localhost:8080/demo1/thymeleafPage?name=%E4%B8%AD%E6%96%87
结果如下:
我们示例中同时使用了多种模板引擎,而且模板文件地址都一样,如果要区分,我们在配置模板地址的时候可以使用不同的文件夹来区分即可。
除了jsp、freemarker、thymeleaf以外,老牌的模板引擎还有velocity。以上都是SpringMVC直接返回相应页面的情况。
本文介绍了Spring MVC直接返回Html页面的情况,这是在没有前后端分离的时候,常见的视图处理方式。但我们目前常使用的方式是前后端分离,通过json对象的方式响应给前端请求。我们将在下一章介绍。
上一篇:006-Spring MVC参数验证2-分组验证
下一篇:待续



