SpringMVC系列六: 视图和视图解析器

视图和视图解析器

  • 💞基本介绍
  • 💞 自定义视图
    • 为什么需要自定义视图
    • 自定义试图实例-代码实现
    • 自定义视图工作流程小结
    • Debug源码
    • 默认视图解析器执行流程
    • 多个视图解析器执行流程
  • 💞目标方法直接指定转发或重定向
    • 使用实例
    • 指定请求转发流程-Debug源码
    • 指定重定向流程-Debug源码
    • 课后作业

上一讲, 我们学习的是SpringMVC系列五: SpringMVC映射请求数据

现在打开springmvc项目

在这里插入图片描述

💞基本介绍

1.在SpirngMVC中的目标方法最终返回都是一个视图(有各种视图)
2.返回的视图都会由一个视图解析器来处理(视图解析器有很多种)

💞 自定义视图

为什么需要自定义视图

1.在默认情况下, 我们都是返回默认的视图, 然后返回的视图交由SpringMVCInternalResourceViewResolver视图解析器来处理的.

<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--配置属性prefix 和 suffix--><property name="prefix" value="/WEB-INF/pages/"/><property name="suffix" value=".jsp"/>
</bean>

2.在实际开发中, 我们有时需要自定义视图, 这样可以满足更多更复杂的需求.

自定义试图实例-代码实现

1.创建web路径/view.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>自定义视图测试</title>
</head>
<body>
<h2>自定义视图测试</h2>
<a href="?">点击到自定义视图</a>br/><br/>
</body>
</html>

2.创建com.zzw.web.viewresolver.GoodsHandler.java

@RequestMapping("/goods")
@Controller
public class GoodsHandler {@RequestMapping("/buy")public String buy() {System.out.println("buy() 被调用...");return "?";//待会再填写自定义视图名称}
}

3.创建comzzw.web.viewresolver.MyView.java自定义视图类

/*** 解读* 1.MyView 继承了AbstractView, 就可以作为一个视图使用* 2.@Component(value="myView"), 该视图会注入到容器中, 名字/id 是 zzwView*/
@Component(value = "zzwView")
public class MyView extends AbstractView {@Overrideprotected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {//完成视图渲染//并且可以确定我们要跳转的页面System.out.println("进入到自己的视图");}
}

4.创建web路径/WEB-INF/pages/my_view.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>my_view页面</title>
</head>
<body>
<h2>进入到my_view页面</h2>
<p>是从自定义视图来的</p>
</body>
</html>

5.补充MyView的代码

/*** 解读* 1.MyView 继承了AbstractView, 就可以作为一个视图使用* 2.@Component(value="myView"), 该视图会注入到容器中, 名字/id 是 zzwView*/
@Component(value = "zzwView")
public class MyView extends AbstractView {@Overrideprotected void renderMergedOutputModel(Map<String, Object> model,HttpServletRequest request,HttpServletResponse response) throws Exception {//完成视图渲染//并且可以确定我们要跳转的页面[请求转发] /WEB-INF/pages/my_view.jspSystem.out.println("进入到自己的视图");//解读//1.下面就是进行请求转发到 /WEB-INF/pages/my_view.jsp//2./WEB-INF/pages/my_view.jsp 会被springmvc解析//  /springmvc/WEB-INF/pages/my_view.jsprequest.getRequestDispatcher("/WEB-INF/pages/my_view.jsp").forward(request, response);}
}

6.配置springDispatcherServlet-servlet.xml, 增加自定义视图解析器

<!--配置视图解析器[默认视图解析器]-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--配置属性prefix 和 suffix--><property name="prefix" value="/WEB-INF/pages/"/><property name="suffix" value=".jsp"/>
</bean><!--
解读
1.配置自定义视图解析器BeanNameViewResolver
2.BeanNameViewResolver可以去解析我们自定义的视图
3.配置 属性 order, 表示视图解析器执行的顺序, 值越小, 优先级越高
4.属性 order 的默认值是最低优先级, 值为 Integer.MAX_VALUEint LOWEST_PRECEDENCE = 2,147,483,647;
-->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"><property name="order" value="99"/>
</bean>

7.view.jsp修改请求路径

<h2>自定义视图测试</h2>
<a href="goods/buy">点击到自定义视图</a>br/><br/>

8.GoodsHandler.java完善代码

@RequestMapping("/goods")
@Controller
public class GoodsHandler {@RequestMapping("/buy")public String buy() {System.out.println("buy() 被调用...");return "zzwView";//待会再填写自定义视图名称}
}

9.Postman测试
在这里插入图片描述

自定义视图工作流程小结

●自定义视图-小结

1.创建一个Viewbean, 该bean需要继承自AbstractView, 并实现renderMergedOutputModel方法
2.并把自定义View加入到IOC容器中
3.自定义视图的视图处理器, 使用BeanNameViewResolver, 这个视图处理器也需要配置到ioc容器
4.BeanNameViewResolver的调用优先级需要设置一下, 设置orderInteger.MAX_VALUE小的值, 以确保其在InternalResourceViewResolver之前被调用

●自定义视图-工作流程

1.SpringMVC调用目标方法, 返回自定义ViewIOC容器中的id
2.SpringMVC调用BeanNameViewResolver解析视图: 从IOC容器中获取 返回id值对应的bean, 即自定义View的对象
3,SpringMVC调用自定义视图的renderMergedOutputModel方法渲染视图
4.说明:如果在SpringMVC调用目标方法, 返回自定义View容器中的id, 不存在, 则仍然按照默认的视图处理器机制处理.

Debug源码

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
判断是否实现了View接口, 如果实现了, 返回View对象
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在MyView视图打个断点

在这里插入图片描述
进入到my_view.jsp
在这里插入图片描述

默认视图解析器执行流程

1.配置默认视图解析器的优先级

<!--配置视图解析器[默认视图解析器]-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--配置属性prefix 和 suffix--><property name="prefix" value="/WEB-INF/pages/"/><property name="suffix" value=".jsp"/><!--调整优先级--><property name="order" value="10"/>
</bean>

2.debug源码

在这里插入图片描述

在这里插入图片描述
进入到默认视图解析器
在这里插入图片描述
在这里插入图片描述
由于没有zzwView.jsp页面, 页面会报错
在这里插入图片描述

多个视图解析器执行流程

案例1: 假设自定义视图解析器的优先级大于默认视图解析器

1.将默认视图解析器的优先级大小设置为默认

<!--配置视图解析器[默认视图解析器]-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--配置属性prefix 和 suffix--><property name="prefix" value="/WEB-INF/pages/"/><property name="suffix" value=".jsp"/><!--调整优先级--><!--<property name="order" value="10"/>-->
</bean>

2.将自定义视图MyView.javabeanName改为zzwViewx

/*** 解读* 1.MyView 继承了AbstractView, 就可以作为一个视图使用* 2.@Component(value="myView"), 该视图会注入到容器中, 名字/id 是 zzwView*/
@Component(value = "zzwViewx")
public class MyView extends AbstractView {@Overrideprotected void renderMergedOutputModel(Map<String, Object> model,HttpServletRequest request,HttpServletResponse response) throws Exception {//完成视图渲染//并且可以确定我们要跳转的页面[请求转发] /WEB-INF/pages/my_view.jspSystem.out.println("进入到自己的视图");//解读//1.下面就是进行请求转发到 /WEB-INF/pages/my_view.jsp//2./WEB-INF/pages/my_view.jsp 会被springmvc解析//  /springmvc/WEB-INF/pages/my_view.jsprequest.getRequestDispatcher("/WEB-INF/pages/my_view.jsp").forward(request, response);}
}

3.debug源码

在这里插入图片描述
在这里插入图片描述
在容器中找不到id为zzwView的bean对象. 参数viewNamezzwView,
在这里插入图片描述BeanName视图解析器返回了空, 开始循环第二个默认视图解析器
在这里插入图片描述在这里插入图片描述对返回的view对象进行估算. 没有 /WEB-INF/pages/zzwView.jsp 这个文件, 会报404错误.
在这里插入图片描述在这里插入图片描述

案例2: 假设默认视图解析器的优先级大于自定义视图解析器

1.将默认视图解析器的优先级大小设置为10, 此时自定义视图解析器的优先级是99.

<!--配置视图解析器[默认视图解析器]-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--配置属性prefix 和 suffix--><property name="prefix" value="/WEB-INF/pages/"/><property name="suffix" value=".jsp"/><!--调整优先级--><property name="order" value="10"/>
</bean>

2.将自定义视图MyView.java的beanName改为zzwView

/*** 解读* 1.MyView 继承了AbstractView, 就可以作为一个视图使用* 2.@Component(value="myView"), 该视图会注入到容器中, 名字/id 是 zzwView*/
@Component(value = "zzwView")
public class MyView extends AbstractView {@Overrideprotected void renderMergedOutputModel(Map<String, Object> model,HttpServletRequest request,HttpServletResponse response) throws Exception {//完成视图渲染//并且可以确定我们要跳转的页面[请求转发] /WEB-INF/pages/my_view.jspSystem.out.println("进入到自己的视图");//解读//1.下面就是进行请求转发到 /WEB-INF/pages/my_view.jsp//2./WEB-INF/pages/my_view.jsp 会被springmvc解析//  /springmvc/WEB-INF/pages/my_view.jsprequest.getRequestDispatcher("/WEB-INF/pages/my_view.jsp").forward(request, response);}
}

3.debug源码
在这里插入图片描述
在这里插入图片描述在这里插入图片描述只要执行了默认视图解析器, 找不到页面, 会报404, 不会再执行下一个视图解析器.
在这里插入图片描述

💞目标方法直接指定转发或重定向

使用实例

● 目标方法中指定转发或者重定向

1.默认返回的方法是请求转发, 然后用视图处理器进行处理, 比如在目标方法中这样写:
在这里插入图片描述

2.也可以在目标方法中直接指定重定向或请求转发的url地址

3.如果指定重定向, 可以定向到web路径下的资源在这里插入图片描述

但是有个例外: 不能重定向到/WEB-INF目录.
原因: WEB-INF下的资源是服务器内部访问的, 浏览器不能访问
在这里插入图片描述

案例
1.修改com.zzw.web.viewresolver.GoodsHandler.java, 增加方法order

@RequestMapping("/goods")
@Controller
public class GoodsHandler {@RequestMapping("/order")public String order() {System.out.println("===========order()===========");//1.请求转发到 /WEB-INF/pages/my_view.jsp//2.下面的这个路径 /WEB-INF/pages/my_view.jsp//  会被解析成 /springmvc/WEB-INF/pages/my_view.jsp//return "forward:/WEB-INF/pages/my_view.jsp";//1.请求转发到 /aa/bb/ok.jsp//2.下面的这个路径 /aa/bb/ok.jsp//  会被解析成 /springmvc/aa/bb/ok.jsp//return "forward:/aa/bb/ok.jsp";/*** 直接指定要重定向的页面* 1. 对于重定向来说, 不能重定向到 /WEB-INF/ 目录下* 2. redirect 关键字, 表示进行重定向* 3. /login.jsp 会在服务器解析成 /springmvc/login.jsp*///return "redirect:/login.jsp";//重定向到 /WEB-INF/pages/my_view.jsp//下面的这个路径 /WEB-INF/pages/my_view.js 会在服务器解析成// /springmvc/WEB-INF/pages/my_view.jspreturn "redirect:/WEB-INF/pages/my_view.jsp";}
}

2.view.jsp增加代码

<body>
<h2>自定义视图测试</h2>
<a href="goods/buy">点击到自定义视图</a><br/><br/>
<a href="goods/order">测试在目标方法中指定请求转发或者重定向到页面</a>
</body>

测试1

//1.请求转发到 /WEB-INF/pages/my_view.jsp
//2.下面的这个路径 /WEB-INF/pages/my_view.jsp 会被解析成 /springmvc/WEB-INF/pages/my_view.jsp
return "forward:/WEB-INF/pages/my_view.jsp";

测试2

//1.请求转发到 /aa/bb/ok.jsp
//2.下面的这个路径 /aa/bb/ok.jsp 会被解析成 /springmvc/aa/bb/ok.jsp
return "forward:/aa/bb/ok.jsp";

测试3

/*** 直接指定要重定向的页面* 1. 对于重定向来说, 不能重定向到 /WEB-INF/ 目录下* 2. redirect 关键字, 表示进行重定向* 3. /login.jsp 会在服务器解析成 /springmvc/login.jsp*/
return "redirect:/login.jsp";

在这里插入图片描述
在这里插入图片描述

测试4

//1.重定向到 /WEB-INF/pages/my_view.jsp
//2.下面的这个路径 /WEB-INF/pages/my_view.js 会在服务器解析成 /springmvc/WEB-INF/pages/my_view.jspreturn "redirect:/WEB-INF/pages/my_view.jsp";

在这里插入图片描述WEB-INF下的资源是服务器内部访问的, 浏览器不能访问
在这里插入图片描述

指定请求转发流程-Debug源码

在这里插入图片描述

debug源码

在这里插入图片描述
在这里插入图片描述

调用默认的视图解析器
在这里插入图片描述在这里插入图片描述

已经作为一个bean对象存储在容器中
在这里插入图片描述

下一步, 开始渲染

在这里插入图片描述

下一步

在这里插入图片描述

进入

在这里插入图片描述

进入, renderMergedOutputModel()MyView.java中的相仿

在这里插入图片描述

下一步, 找到rd = request.getRequestDispatcher(dispatcherPath);

在这里插入图片描述

下一步

在这里插入图片描述

指定重定向流程-Debug源码

在这里插入图片描述


debug源码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SpringMVC有很多视图种类

在这里插入图片描述

下一步

在这里插入图片描述在这里插入图片描述

进入

在这里插入图片描述

进入, 调用RedirectView的视图渲染方法

在这里插入图片描述

课后作业

1.熟悉前面的SpringMVC映射数据请求, 模型数据, 视图和视图解析的案例
2.清晰Debug源码的流程
3.完成一个简单的用户登录案例
1)编写登陆页面web路径/homework/login.jsp
2)com.zzw.web.homework.LoginHandler [doLogin方法], 如果用户输入用户名是zzw, 密码123, 就可以登陆成功; 否则登陆失败
3)创建JavaBeancom.zzw.web.homework.entity.User.java
4)表单提交数据到doLogin方法, 以User对象形式接收
5)登陆成功到, 页面 web路径/WEB-INF/pages/homework/login_ok.jsp, 并显示登陆欢迎信息 [显示用户名, 模型数据会自动填充到request域中]
6)登陆失败到, 页面 web路径/WEB-INF/pages/homework/login_err.jsp, 并给出重新登录的超链接 [考察web工程路径应用问题]


代码实现

1.在web路径/homework下 新建login.jsp

<head><title>登陆页面</title>
</head>
<body>
<form action="<%=request.getContextPath()%>/doLogin">用户名: <input type="text" name="username"/><br/><br/>密 码: <input type="text" name="pwd"/><br/><br/><input type="submit" value="登录"/>
</form>
</body>

2.在com.zzw.web.homework下新建LoginHandler

@Controller
public class LoginHandler {@RequestMapping("/doLogin")public String doLogin(User user) {System.out.println("===========doLogin()===========");if ("zzw".equals(user.getUsername()) && "123".equals(user.getPwd())) {//使用的是默认视图解析器return "forward:/WEB-INF/pages/homework/login_ok.jsp";} else {return "forward:/WEB-INF/pages/homework/login_err.jsp";}}
}

3.填充login.jsp的请求路径 涉及-web工程路径问题

<%--<%=request.getContextPath()%>/doLogin => /springmvc/doLogin/springmvc/doLogin 被浏览器解析成 http://localhost:8080/springmvc/doLogin
--%>
<form action="<%=request.getContextPath()%>/doLogin">

4.在com.zzw.web.homework.entity下新建User.java

public class User {private String username;private String pwd;//setter, getter方法
}

5.在web路径/WEB-INF/pages/homework下 新建login_ok.jsp
登录成功到login_ok.jsp, 并显示登陆欢迎信息 模型数据默认放入request域.

<head><title>登陆成功</title>
</head>
<body>
登陆成功, 欢迎 ${requestScope.user.username}
</body>

6.在web路径/WEB-INF/pages/homework下 新建login_err.jsp
登陆失败到login_err.jsp, 并给出重新登陆的超链接. 相对路径的知识点

<head><title>登陆失败</title>
</head>
<body>
<a href="homework/login.jsp">重新登陆</a>
</body>

使用自定义视图解析器再次完成

代码实现

1.springDispatcherServlet-servlet.xml中注释掉默认视图解析器的优先级, 使用自定义视图

<!--<property name="order" value="10"/>-->

2.修改LoginHandler

@Controller
public class LoginHandler {@RequestMapping("/doLogin")public String doLogin(User user) {System.out.println("===========doLogin()===========");return "homeworkView";}
}

3.新建com.zzw.web.homework.viewresolver.MyView

/*** 解读* 1.MyView 继承了AbstractView, 就可以作为一个试图使用* 2.@Component("homeworkView") 表示该视图会注入到容器中, 名字/id 是 homeworkView*/
@Component("homeworkView")
public class MyView extends AbstractView {@Overrideprotected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {//完成视图渲染//并且可以确定我们要跳转的页面System.out.println("进入到了自己的视图");request.setCharacterEncoding("utf-8");String username = request.getParameter("username");String pwd = request.getParameter("pwd");if ("zzw".equals(username) && "123".equals(pwd)) {request.setAttribute("username", username);request.getRequestDispatcher("/WEB-INF/pages/homework/login_ok.jsp").forward(request, response);} else {request.getRequestDispatcher("/WEB-INF/pages/homework/login_err.jsp").forward(request, response);}}
}

4.修改login_ok.jsp

登陆成功, 欢迎 ${requestScope.username}

在这里插入图片描述

下一讲, 我们学习 SpringMVC系列七: 手动实现SpringMVC底层机制-上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/356726.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

考前刷题练手感(北航期末往年数据结构编程题)

本次因为是考前一天极速刷题&#xff0c;所以没有讲解&#xff0c;若有问题可私信。 目录 一、 查找同时空人员二、 老鼠回家-无回路三、函数调⽤关系四、东二食堂模拟五、栈帧 一、 查找同时空人员 【问题描述】 假设一共有6个手机基站&#xff0c;都具有记录手机连接基站状…

51单片机定时器中断配置

测试环境 单片机型号&#xff1a;STC8G1K08-38I-TSSOP20&#xff0c;其他型号请自行测试&#xff1b; IDE&#xff1a;Keil C51&#xff1b; 定时器配置及主要代码 以定时器T0为例&#xff0c;查看手册&#xff0c;有4种工作模式&#xff1a;模式0&#xff08;16位自动重装载…

软件测试笔记

一、介绍 软件测试是为了尽可能多地发现软件系统中的错误而不是证明软件的正确性。 1、软件缺陷是什么&#xff1f; 软件在使用过程中存在的任何问题都叫软件的缺陷&#xff0c;简称bug。 缺陷的判定标准 软件未实现需求说明书中明确要求的功能——少功能 软件出现了需求说…

Django从入门到精通:First [Django版本.Python面向对象.Web基础.创建Django项目]

文章目录 Django初学者指南1 Django简介1.1 Django的历史1.2 使用Django的知名网站1.4 Django的主要特点1.5 Django的工作原理 2 Django 版本选择2.1 Django 支持的 Python 版本2.2 Django 版本 3 Django 开发 Web 程序3.1 Python知识点3.1.1 Python 函数3.1.2 Python 面向对象…

LabVIEW电机故障监测系统

电机作为工业生产中的关键设备&#xff0c;其故障会导致生产停滞和经济损失。因此&#xff0c;开发一个能实时监控电机状态并预测潜在故障的系统具有重要意义。通过高效的数据采集和分析技术&#xff0c;提升故障诊断的准确性和及时性。 系统组成 该系统由以下部分组成&#…

java:JWT的简单例子

【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version> </dependency> <dependency><groupId>org.springf…

Map集合之HashMap细说

最近在看面试题&#xff0c;看到了hashmap相关的知识&#xff0c;面试中问的也挺多的&#xff0c;然后我这里记录下来&#xff0c;供大家学习。 Hashmap为什么线程不安全 jdk 1.7中&#xff0c;在扩容的时候因为使用头插法导致链表需要倒转&#xff0c;从而可能出现循环链表问…

JAVA大型医院绩效考核系统源码:​医院绩效考核实施的难点痛点

JAVA大型医院绩效考核系统源码&#xff1a;​医院绩效考核实施的难点痛点 绩效考核数字化综合管理系统是一个基于数字化技术的管理平台&#xff0c;用于帮助企业、机构等组织进行绩效考评的各个环节的管理和处理。它将绩效考评的各个环节集成到一个系统中&#xff0c;包括目标…

常见的宽基指数基金

指数基金投资指南 ❝ 这篇博客里面的内容主要来自于银行螺丝钉的《定投十年&#xff0c;财务自由》和《指数基金投资指南》这两本书中章“常见的宽基指数”&#xff0c;最近第三次读这本书&#xff0c;打算做一点笔记加深自己的印象。 博客中很多内容是从书中摘抄的&#xff0c…

【数据结构】顺序表实操——通讯录项目

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

深入了解 AndroidX ConstraintLayout 中的 Barrier

androidx.constraintlayout.widget.Barrier&#xff08;简称Barrier&#xff09;是 ConstraintLayout 2.0 中引入的一个新特性&#xff0c;它可以极大地简化复杂布局的实现。本文将详细介绍Barrier 的概念、使用方法以及在实际开发中的应用场景。 什么是 Barrier&#xff1f; …

Hallo技术:革新电影、游戏与虚拟现实中的动态肖像动画

在数字娱乐的浪潮中&#xff0c;逼真的动态肖像动画成为了电影制作、游戏开发和虚拟现实等领域不可或缺的一部分。复旦大学研发的Hallo技术&#xff0c;以其独特的扩散模型和分层音频驱动视觉合成模块&#xff0c;为这一领域带来了革命性的突破。 技术概览 Hallo技术是一种基…

安卓开发使用proxyman监控真机

1、真机跟电脑连接到同个网络中 2、手机里面设置代理&#xff0c;代理地址为proxyman上面指示的地址。 3、一般情况下&#xff0c;电脑的对应的端口是没开放的。需要到防火墙里面新建规则。入站规则 选择端口输入上方端口号 这样就能监控到了

任务4.8.4 利用Spark SQL实现分组排行榜

文章目录 1. 任务说明2. 解决思路3. 准备成绩文件4. 采用交互式实现5. 采用Spark项目实战概述&#xff1a;使用Spark SQL实现分组排行榜任务背景任务目标技术选型实现步骤1. 准备数据2. 数据上传至HDFS3. 启动Spark Shell或创建Spark项目4. 读取数据5. 数据转换6. 创建临时视图…

React hydrateRoot如何实现

React 服务器渲染中&#xff0c;hydrateRoot 是核心&#xff0c;它将服务器段的渲染与客户端的交互绑定在一起&#xff0c;我们知道 React 中 Fiber Tree 是渲染的的核心&#xff0c;那么 React 是怎么实现 hydrateRoot 的呢&#xff1f;首先我们验证一下&#xff0c;hydrateRo…

考研计组chap4指令系统

目录 一、指令格式 155 13.操作码地址码 2.按照地址码数量 &#xff08;1&#xff09;零地址指令 &#xff08;2&#xff09;一地址指令 &#xff08;3&#xff09;二地址指令 &#xff08;4&#xff09;三地址指令 &#xff08;5&#xff09;四地址指令 3.指令长度 …

动态规划——买卖股票的最佳时机含冷冻期

1、题目链接 leetcode 309. 买卖股票的最佳时机含冷冻期 2、题目分析 该题有我们可以定义三种状态&#xff0c;买入状态&#xff0c;可交易状态 &#xff0c;冷冻期状态 我们可以建立一个n*3的二维数组来表示这三种状态&#xff1a; 根据这个图可以看出&#xff0c; 可以从…

探索Linux的奇妙世界:第二关---Linux的基本指令1

1. xshell与服务器的连接 想必大家在看过上一期视频时已经搭建好了Linux的环境了并且已经下好了终端---xshell了吧?让我来带大家看一看下好了是什么样子的: 第一次登陆会让你连接你的服务器,就是我们买的云服务器,买完之后需要把公网地址ip复制过来进行链接,需要用户名和密码连…

【从0实现React18】 (一) 项目初始化

Multi-repo 和 Mono-repo 由于需要同时管理多个包&#xff0c;如React、React-dom等&#xff0c;所以选择**Mono-repo** 选择使用pnpm-workspace搭建Mono-repo环境的原因 依赖安装快更规范 Pnpm初始化 npm install -g pnpm pnpm init配置pnpm-workspace.yml文件 pnpm-work…

【单片机毕业设计选题24020】-全自动鱼缸的设计与应用

系统功能: &#xff08;1&#xff09;检测并控制鱼缸水温&#xff0c;水温低于22℃后开启加热&#xff0c;高于28℃后关闭加热。 &#xff08;2&#xff09;定时喂食&#xff0c;每天12点和0点喂食一次&#xff0c;步进电机开启后再关闭模拟喂食。 &#xff08;3&#xff09…