008-Spring MVC ViewResolver视图解析器

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对象的方式响应给前端请求。我们将在下一章介绍。

上一篇:007-Spring MVC 参数验证3-自定义验证
下一篇:009-Spring MVC Json返回

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值