(8)SpringMVC中的视图类型及其特点,以及视图控制器view-controller的配置

SpringMVC的视图

转发和重定向的区别及其原理,参考文章

视图类型及特点

视图的作用就是将Model中的数据渲染到页面上并展示给用户,SpringMVC中视图对应的View接口有三种实现类对应三种视图解析器

  • 默认有转发视图InternalResourceView重定向视图RedirectView以及ThymeleafView视图,当工程引入jstl的依赖转发视图会自动转换为JstlView
java 复制代码
// 视图接口
View view; 
// 获取视图名称
String viewName = mv.getViewName();
if (viewName != null) {
    // 解析视图名称,根据视图名称创建对应的视图解析器
    view = resolveViewName(viewName, mv.getModelInternal(),locale,request);
}

ThymeleafView视图

当控制器方法返回或在ModelView对象中设置的视图名称没有任何前缀时,此时的视图名称会被SpringMVC配置文件中所配置的ThymeleafView视图解析器解析

  • ThymeleafView视图解析器会给视图名称拼接上视图前缀和视图后缀得到页面的物理地址,然后解析页面中的Thymeleaf语法渲染数据并通过转发的方式实现跳转
html 复制代码
<a th:href="@{/testThymeleafView}">测试ThymeleafView</a><br>
java 复制代码
@RequestMapping("/testThymeleafView")
public String testThymeleafView(){
    return "success";
}

转发视图

当控制器方法返回或在ModelView对象中所设置的视图名称以"forward:"为前缀时,此时的视图名称会被InternalResourceView视图解析器解析

  • InternalResourceView视图解析器会将前缀"forward:"去掉,剩余部分作为最终请求路径转发到某个请求或页面(可以解析jsp页面中的语法)
html 复制代码
<a th:href="@{/testForward}">测试InternalResourceView</a><br>		
java 复制代码
@RequestMapping("/testForward")
public String testForward(){
    // 这种方式转发到的页面中如果有ThymeleafView语法是不会被解析的
    return "forward:/testThymeleafView";
}																	

重定向视图

当控制器方法返回或在ModelView对象中所设置的视图名称以"redirect:"为前缀时,此时的视图名称会被RedirectView视图解析器解析

  • RedirectView视图解析器会将前缀"redirect:"去掉,如果剩余部分以/开始则会自动拼接上下文路径作为最终请求路径重定向到某个请求或页面
html 复制代码
<a th:href="@{/testRedirect}">测试RedirectView</a><br>
java 复制代码
@RequestMapping("/testRedirect")
public String testRedirect(){
    //redirect:/会自动加上下文路径
    return "redirect:/testThymeleafView";
}

配置视图控制器view-controller

在控制器方法中只需要实现页面跳转(只设置页面视图名称)功能而没有其他业务,此时可以在SpringMvc的配置文件中使用view-controller标签表示控制器方法

  • 首先要引入mvc的命名空间及其约束文件
  • 只要在SpringMvc的配置文件中设置了view-controller标签,此时只有视图控制器配置的请求才会生效,其他控制器方法中配置的请求映射将全部失效
  • 开启MVC的注解驱动mvc:annotation-driven,可以保证视图控制器设置的请求和控制器方法设置的请求全部都会被前端控制器处理
属性 功能
path 设置处理的请求地址即请求映射RequestMapping
view-name 设置请求地址所对应的视图名称即控制器方法返回值,依然遵守视图解析器的流程

需求: WEB-INF目录下的资源是受保护的即不能通过路径在浏览器中直接访问

html 复制代码
<!DOCTYPE html>
<!--引入thymeleaf的命名空间,使用thymeleaf标签-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <h1>Hello SpringMvc</h1>
</body>
</html>

单独定义一个控制器方法跳转到首页

java 复制代码
@Controller
public class HelloController {
    // 处理http://localhost:8080/SpringMvc/请求
    @RequestMapping("/")
    public String index() {
        // 返回逻辑视图名称,对应页面的物理地址为/WEB-INF/templates/index.html
        return "index";
    }
}

在SpringMvC的核心配置文件中使用视图控制器标签跳转到首页

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 					http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd 					http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--自动扫描控制层组件-->
    <context:component-scan base-package="com.atguigu.mvc.controller"></context:component-scan>
    <!--配置Thymeleaf视图解析器-->
    <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
    </bean>
    <!--视图控制器,设置请求对应的视图名称实现页面的跳转-->
    <mvc:view-controller path="/" view-name="index"></mvc:view-controller>
    <!--开启MVC的注解驱动,保证视图控制器设置的请求和控制器方法设置的请求全部都会被前端控制器处理-->
    <mvc:annotation-driven />
</beans>
相关推荐
Zzzzmo_7 分钟前
Spring MVC
java·spring·mvc·cookie/session
cfm_291410 分钟前
Spring核心设计模式
java·spring·设计模式
Java小白笔记11 分钟前
Java 实现阿里云 OSS 文件上传链路:普通上传、秒传、分片与断点续传
java·开发语言·数据库·spring·阿里云
2333!!!!!16 分钟前
rocket新手一些常见问题
java·开发语言
骇客野人22 分钟前
Springboot 的 配置文件 application.yml 和 bootrap.yml 的由来和作用
java·spring boot·后端
wuminyu26 分钟前
JVM锁膨胀与Futex源码解析
java·linux·c语言·jvm·c++
CoderYanger34 分钟前
A.每日一题:3622. 判断整除性
java·程序人生·算法·leetcode·面试·职场和发展·蓝桥杯
吴声子夜歌38 分钟前
ApacheCommons——commons-lang3(Java 基础语言增强)(二)
java·开发语言·apache
xcl092539 分钟前
幼儿托管系统开发实战:从需求分析到部署上线全指南
java·spring boot·需求分析
我不会起名字3221 小时前
一天一道算法题(26):栈的简单应用
java·数据结构·python·算法·leetcode·golang·