栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【SpringMVC笔记05】SpringMVC中的视图解析器

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【SpringMVC笔记05】SpringMVC中的视图解析器

这篇文章,主要介绍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
  freemarker
  2.3.28




  org.springframework
  spring-context-support
  5.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
  thymeleaf
  3.0.11.RELEASE




  org.thymeleaf
  thymeleaf-spring5
  3.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】。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/980828.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号