(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>
相关推荐
nice_lcj5204 分钟前
【从零理解 Spring AI · 03】Spring AI 在 Spring 生态里的位置
java·spring boot·大模型·spring ai·ai应用开发
码农小河6610 小时前
基于SSM+JSP的高校专业信息管理系统【附源码+数据库】
java·开发语言·数据库
风若飞12 小时前
Spring Ai 入门遇到问题1
java·后端·spring
Nuanyt13 小时前
LeetCode Hot 100 链表专题(五)· 2 题(Java)
java·算法·leetcode·链表
黑马程序员毕设13 小时前
基于 Java 的餐饮点餐系统设计与应用报告
java·开发语言
SL_staff13 小时前
从文档工具到知识中枢:基于JVS数字底座构建企业级统一内容管理平台的技术实践
java·开源·全栈
SL_staff13 小时前
从‘连得上’到‘管得好’:JVS-IOT双引擎驱动设备运维闭环
java·物联网·产品
w_zero_one16 小时前
递归算法(一)
java·开发语言·算法
SL_staff16 小时前
私有化低代码不是减配版开发:JVS双模式建模如何重建IT交付信任
java·低代码·spring cloud
墨着染霜华17 小时前
Redocly 生成 OpenAPI 接口文档踩坑实录|Node 版本兼容 + 接口地址错误问题解决
java