SpringMVC自定义视图完成步骤 和 视图解析的源码剖析

2023-11-14

自定义视图完成步骤:

7.2.1自定义视图完成步骤

1. 自定义视图**:** 创建一个 View bean, bean 需要继承自 AbstractView, 并实现

renderMergedOutputModel 方法**.**

2. 并把自定义 View 加入到 IOC 容器中

3. 自定义视图的视图处理器,使用 BeanNameViewResolver**, 这个视图处理器也需要配置**

ioc 容器

4. BeanNameViewResolver 的调用优先级需要设置一下,设置 order Integer.MAX_VAL

小的值**.** 以确保其在 InternalResourceViewResolver 之前被调用

 /**
  * 老师解读
  * 1. MyView继承了AbstractView, 就可以作为一个视图使用
  * 2. @Component(value = "myView"),该视图会注入到容器中, 名字/id是 myView
  */
 @Component(value = "hspView")
 public class MyView extends AbstractView {
     @Override
     protected void renderMergedOutputModel(Map<String, Object> model,
                                            HttpServletRequest request,
                                            HttpServletResponse response) throws Exception {
 ​
         //完成视图渲染
         //并且可以确定我们要跳转的页面 [请求转发] /WEB-INF/pages/my_view.jsp
         System.out.println("进入到自己的视图..");
 ​
         //老师解读
         //1. 下面就是进行请求转发到 /WEB-INF/pages/my_view.jsp
         //2. /WEB-INF/pages/my_view.jsp 会被springmvc解析
         //   /springmvc/WEB-INF/pages/my_view.jsp
         request.getRequestDispatcher("/WEB-INF/pages/my_view.jsp")
                 .forward(request, response);
 ​
     }
 }
 <!--
     老师解读
     1. 配置自定义视图解析器BeanNameViewResolver
     2. BeanNameViewResolver可以去解析我们自定义的视图
     3. 配置 属性 order, 表示视图解析器执行的顺序, 值越小, 优先级越高
     4. 属性 order 的默认值是最低优先级 ,值为 Integer.MAX_VALUE
        int LOWEST_PRECEDENCE = 2147483647
 -->
 <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
     <property name="order" value="99"/>
 </bean>

使用

 @RequestMapping(value = "/buy")
 public String buy() {
     System.out.println("------buy()-----");
     return "hspView";//填写自定义视图id
 }

源码剖析:

视图解析过程

1.先到DispatcherServlet中央控制器, 根据视图解析的 优先级 执行对应的 视图解析器
 @Nullable
 protected View resolveViewName(String viewName, @Nullable Map<String, Object> model,
       Locale locale, HttpServletRequest request) throws Exception {
 ​
    if (this.viewResolvers != null) {
       for (ViewResolver viewResolver : this.viewResolvers) {//viewResolvers存放了两个视图解析器(1)InternalResourceViewResolver默认视图解析器   (2)BeanNameViewResolver自定义视图解析器
          View view = viewResolver.resolveViewName(viewName, locale);
          if (view != null) {//如果返回的视图为空,那么会继续遍历所有的视图解析器;
              //注意:如果 默认视图解析器 优先级在前,那么不管怎样,它都不会再执行 自定义视图解析器 
              //原因:默认视图解析器 一定会返回视图,因为它是通过传入的视图名build一个视图
             return view;
          }
       }
    }
    return null;
 }
2.若默认视图解析器在前,那么用 视图解析器 解析
 @Override
 protected AbstractUrlBasedView buildView(String viewName) throws Exception {
    InternalResourceView view = (InternalResourceView) super.buildView(viewName);//根据viewName创建视图
    if (this.alwaysInclude != null) {
       view.setAlwaysInclude(this.alwaysInclude);
    }
    view.setPreventDispatchLoop(true);
    return view;
 }

注意:如果 默认视图解析器 优先级在前,那么不管怎样,它都不会再执行 自定义视图解析器 (因为:默认视图解析器 一定会返回视图,因为它是通过传入的视图名build一个视图)

3.若自定义视图解析器在前
 public View resolveViewName(String viewName, Locale locale) throws BeansException {
    ApplicationContext context = obtainApplicationContext();//context实质上就类似于ioc容器
    if (!context.containsBean(viewName)) {//判断context(ioc)中是否有id为viewName的bean
       // Allow for ViewResolver chaining...
       return null;
    }
    if (!context.isTypeMatch(viewName, View.class)) {//判断context(ioc)中是否有id为viewName并实现View接口的bean
       if (logger.isDebugEnabled()) {
          logger.debug("Found bean named '" + viewName + "' but it does not implement View");
       }
       // Since we're looking into the general ApplicationContext here,
       // let's accept this as a non-match and allow for chaining as well...
       return null;
    }
    return context.getBean(viewName, View.class);
 }

1.拿到context对象,实质上类似于ioc容器

2.//判断context(ioc)中是否有id为viewName的bean, 没有就返回null; 有就接着往下走

3.//判断context(ioc)中是否有id为viewName并实现View接口的bean 有就返回该视图 ,如果不存在传入的viewName对应的自定义视图,那么就返回null,接着走其他视图解析器

视图渲染和响应

1. 拿到view对象后, SpringMVC 调用自定义视图的 renderMergedOutputModel 方法渲染视图
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringMVC自定义视图完成步骤 和 视图解析的源码剖析 的相关文章

随机推荐

  • 随机生成Long值

    随机生成Long类型的数值 public class RandomLongUtil 随机生成Long值 param bit 位数 return 返回Long值 throws Exception 异常 public static Long r
  • STM32PWM控制智能风扇

    设计思路 这个是一个STM32通过定时器产生PWM波控制小风扇的设计 首先STM32驱动ds18b20温度传感器采集环境温度 然后通过按键设置温度的阈值 不同的温度范围定时器产生的PWM波不同 相应的小风扇的转速也会不一样 温度越高 小风扇
  • Spring属性注入方式

    1 Spring也表示一个开源框架 是为了解决企业程序应用开发的复杂性 框架的主要优势之一就是其分层架构 分层架构允许使用者选择使用哪一个组件 同时为J2EE应用程序开发提供集成的框架 Spring使用基本的bean来完成以前只能由EJB完
  • idea乱码解决方式大汇总

    目录 idea版本 解决方法 一 基本方法 1 File gt Settings gt Editor 2 二 Maven乱码解决方法 三 运行时乱码解决方法 四 因为以前乱设置导致的乱码 idea版本 解决方法 一 基本方法 1 File
  • 华为telnet学习笔记

    华为telnet用户密码aaa模式 配置完接口后 aaa local user admin password cipher cisco 创建用户设置账号密码 local user admin service type telnet 为这个用
  • QLUACM暑假训练5 C题题解

    C题题目大意 给一个n行m列的矩阵 矩阵的每个元素由 或者 填充 如果一行或者一列都由 构成 则删除这一行或者这一列 最后按照相对位置输出剩余的元素 题解 题目思路 1 我们需要找出一行或者一列都由 构成的行和列的位置 也就是我们需要找到没
  • 图像分割套件PaddleSeg全面解析(五)模型与Backbone代码解读

    本章节将介绍PaddleSeg的核心部分 分割模型和主干网络部分 在yaml配置文件中有以下定义 模型信息 model 模型的类型FCN type FCN 使用的主干网络为HRNet backbone type HRNet W18 主干网络
  • 宋浩高等数学笔记(六)定积分的应用

    本章继续更新高数笔记 6 5节的物理题暂不更新 有需求的同学自行看课
  • R语言:创建数据集

    文章目录 1 创建数据集 1 1 数据集的概念 1 2 数据结构 1 2 1 向量 1 2 2 矩阵 1 2 3 数组 1 2 4 数据框 data frame 的切片 attach detach 和with 实例标识符 1 2 5 因子
  • Flutter桌面小工具 -- 灵动岛【Windows+Android版本】

    通过此篇文章 你将了解到 Flutter动画实现灵动岛 Flutter如何开发一个置顶可自由拖拽的小工具 分享一些关于灵动岛的想法 本文为稀土掘金技术社区首发签约文章 14天内禁止转载 14天后未获授权禁止转载 侵权必究 前言 Flutte
  • FormData(file类型文件)

    有的时候我们上传图片时 后台要求是file类型 我们可以借助FormData 以这种方式上传的 后台接收到的 window files self files 0 if window files var form new FormData v
  • [Python从零到壹] 十.网络爬虫之Selenium爬取在线百科知识万字详解(NLP语料构造必备技能)

    欢迎大家来到 Python从零到壹 在这里我将分享约200篇Python系列文章 带大家一起去学习和玩耍 看看Python这个有趣的世界 所有文章都将结合案例 代码和作者的经验讲解 真心想把自己近十年的编程经验分享给大家 希望对您有所帮助
  • sql计算留存率

    SELECT first day sum case when by day 0 then 1 else 0 end day 0 sum case when by day 1 then 1 else 0 end day 1 sum case
  • 解决WebSocketClient.js?5586:16 WebSocket connection to ‘ws://192.168.1.102:8999/ws‘ failed:

    修改vue config js里的devServer配置 添加client 配置 client webSocketURL ws 0 0 0 0 8999 ws module exports 配置跨域请求 devServer 项目运行的端口号
  • frida辅助分析ollvm字符串加密

    frida辅助分析ollvm字符串加密 近期逆向任务繁重且艰巨 因此把工作期间得学习心得做下笔记还是十分得有必要得 防止后期遗忘 个人博客 http www zhuoyue360 com 文章目录 frida辅助分析ollvm字符串加密 一
  • JAVA解析纯真IP地址库

    前几天看了下Ruby的IPParse 觉得很过瘾 上网查了下貌似很多IP数据库都要收费的 就下了个纯真QQIP地址库 发现还可以在线升级的 很适合咱做点小玩意 具体解析的纯真版IP地址库请详见http lumaqq linuxsir org
  • Discuz!开发之主题高亮字段highlight解析

    Discuz 开发之主题高亮字段highlight解析 相关数据表pre forum thread 我们可以看到主题高亮信息存储于字段highlight 且为一个整型数据 那么discuz 如何将这个整型数解析为高亮 包括 字体颜色 背景颜
  • FPGA开发流程概述

    Lesson 3 FPGA开发流程概述 开始学习FPGA 想尽快上手FPGA开发 那么先来了解一下FPGA的开发流程 1 需求分析到模块划分 需求说明文档 器件选择 逻辑资源 功耗 IO数量 封装等等 配置电路考虑 开发工具选择 电路板的可
  • 数据结构与算法实验-实验一:线性表基本操作

    线性表基本操作 文章目录 线性表基本操作 题目1 题目2 题目3 题目1 线性表是最常见和常用的ADT 假设线性表的元素为整数 请基于顺序存储结构实现线性表ADT 基本功能包括 1 建立线性表 输入有两行 第一行是一个整数n 线性表的长度
  • SpringMVC自定义视图完成步骤 和 视图解析的源码剖析

    自定义视图完成步骤 7 2 1自定义视图完成步骤 1 自定义视图 创建一个 View 的 bean 该 bean 需要继承自 AbstractView 并实现 renderMergedOutputModel 方法 2 并把自定义 View