这篇文章,主要介绍SpringMVC框架中的几种视图解析器。
目录
一、视图解析器
1.1、什么是视图解析器
1.2、InternalResourceViewResolver
1.3、UrlBasedViewResolver
1.4、FreeMarkerViewResolver
1.5、ThymeleafViewResolver
1.6、RedirectView
一、视图解析器
1.1、什么是视图解析器
视图解析器(ViewResolver),是SpringMVC框架中的一个组件,它的主要作用是:根据对应的视图名称,找到具体的视图模板对象。
视图,是MVC三层结构里面的V表现层,用于向客户端展现数据的,常见的视图有:html、jsp、thymeleaf、freemarker等等。
SpringMVC框架里面给我们提供了多种视图解析器,并且还可以引入第三方的视图解析模板,例如:thymeleaf、freemarker。
下面介绍一下SpringMVC框架中的几种视图解析器。
1.2、InternalResourceViewResolver
【InternalResourceViewResolver】叫做内部视图解析器,它是实际开发过程里面,使用最多的视图解析器。内部视图解析通过事先配置好【视图前缀】和【试图后缀】信息,然后拼接上【视图名称】,找到具体的视图模板。
具体拼接格式:【视图前缀】+【视图名称】+【视图后缀】。
- 在【spring-mvc.xml】配置文件里面,添加【InternalResourceViewResolver】的配置。
- 然后我们需要在【webapp】目录下,创建【视图前缀】目录路径,上面配置的是【/WEB-INF/pages】。
- 之后,我们所有的【jsp】页面都需要放在【pages】目录下面,才能够被SpringMVC的视图解析器获取到。
查看【InternalResourceViewResolver】源码,发现它是继承自【UrlBasedViewResolver】类的,【UrlBasedViewResolver】类是一个通过【URL】拼接来实现的视图解析器。
继续查看【InternalResourceViewResolver】源码,里面有一个【buildView】方法,这个方法作用就是根据【视图名称】,创建具体的视图对象,它返回的是一个【InternalResourceView】类型的对象。
以上,就是【InternalResourceViewResolver】视图解析器的大致源码。
1.3、UrlBasedViewResolver
【UrlBasedViewResolver】视图解析器,就是一个通过拼接【URL】的视图解析器,使用这种视图解析器,不但需要设置【视图前缀】和【视图后缀】,还需要额外设置一个【视图类】对象,因为【UrlBasedViewResolver】需要根据具体的视图类【viewClass】来创建视图对象,如果没有设置,那么启动时候就会抛出异常。
- 通过【UrlBasedViewResolver】配置视图解析器。
- 通过上面的配置,我搭建的工程启动时候报错了,报错提示是:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'viewClass' threw exception; nested exception is java.lang.IllegalArgumentException: Given view class [org.springframework.web.servlet.view.InternalResourceViewResolver] is not of type [org.springframework.web.servlet.view.AbstractUrlBasedView]
- 大致意思是:给定的viewClass类型不匹配,需要【AbstractUrlBasedView】类型的。
- 我去查看源码,发现是如下地方进行类型转换时候,报错的。
- 然后,我查看了【InternalResourceViewResolver】类的继承关系图,发现确实没有【AbstractUrlBasedView】类型的。
具体没有解决,我知道是springMVC的版本问题,还是其他什么原因,我使用的版本是:【spring-webmvc-5.1.15.RELEASE】。
如果有朋友知道什么原因,可以评论区告诉我一下,谢谢。
1.4、FreeMarkerViewResolver
【FreeMarkerViewResolver】也是【UrlBasedViewResolver】的子类,也是根据拼接【URL】进行视图解析的。要使用【FreeMarkerViewResolver】必须引入【FreeMarker】的依赖,因为【FreeMarker】是第三方的依赖。
- 引入【freemarker】和【spring-context-support】依赖。
org.freemarker freemarker2.3.28 org.springframework spring-context-support5.2.15.RELEASE
- 在【spring-mvc.xml】配置freemarker视图解析器。
UTF-8
- 在【WEB-INF】目录下,创建【templates】目录,用于存放freemarker文件,并且新增一个【fm_free.ftl】文件。
- 为什么需要添加【fm_】呢???因为我们配置了前缀是【fm_】,所以文件名称必须添加上这个前缀。
视图解析器
${data}
- 创建测试控制器类。
@Controller
public class FreeMarkerController {
@RequestMapping("/freemarker")
public String freemarker(Model model) {
// 跳转到 fm_free.ftl 页面
model.addAttribute("data", "采用Freemarker视图解析器");
return "free";
}
}
- 浏览器访问。
1.5、ThymeleafViewResolver
SpringMVC框架里面,没有给我们提供ThymeleafViewResolver视图解析器,我们需要引入第三方依赖【thymeleaf】如下所示。
- 引入【thymeleaf】和【thymeleaf-spring5】依赖(使用哪个版本的spring,就引入哪个版本)。
org.thymeleaf thymeleaf3.0.11.RELEASE org.thymeleaf thymeleaf-spring53.0.11.RELEASE
- 在【spring-mvc.xml】中配置thymeleaf视图解析器。
- 在【WEB-INF】目录下,创建【thymeleaf】目录,新增一个【thymeleaf.html】文件。
- 新增一个【thymeleaf.html】文件。
Thymeleaf视图解析器
- 创建测试控制器类。
@Controller
public class ThymeleafController {
@RequestMapping("/thymeleaf")
public String thymeleaf(Model model) {
// 跳转到 fm_free.ftl 页面
model.addAttribute("data", "采用Thymeleaf视图解析器");
return "thymeleaf";
}
}
- 浏览器访问结果如下。
1.6、RedirectView
SpringMVC框架中,还提供了重定向视图,顾名思义,就是当重定向的时候,会创建的视图类型。我们在SpringMVC框架中,返回的视图名称之前添加【redirect:】时候,此时调用的就是RedirectView重定向视图。下面看个案例。
- 编写一个重定向控制器。
@Controller
public class RedirectController {
@RequestMapping("/index")
public String index() {
// 跳转到 index.jsp 页面
return "index";
}
@RequestMapping("/redirect")
public String redirect() {
// 重定向到 /index 路径
return "redirect:/index";
}
}
- 打开浏览器,访问【http://localhost:8080/springmvc/redirect】。
- SpringMVC框架里面,它会从视图名称里面解析【redirect:】,如果存在【redirect:】前缀,那么就会创建一个【RedirectView】对象,然后执行重定向的操作。源代码如下所示:
以上,就是重定向时候创建的视图对象。
综上,这篇文章结束了,主要介绍了SpringMVC中几种常用的视图解析器。
【源代码地址:https://gitee.com/zhuyoubin/ssm_code/tree/master/spring-mvc/springmvc-demo04】。



