当前位置: 首页 > news >正文

Servlet详解

一.Servlet生命周期

  • 初始化
  • 提供服务
  • 销毁

1.测试生命周期

package com.demo.servlet;import javax.servlet.*;
import java.io.IOException;public class LifeServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("Servlet init");}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse)throws ServletException, IOException {System.out.println("Servlet service");}@Overridepublic void destroy() {System.out.println("Servlet destroy");}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic String getServletInfo() {return null;}
}

2.初始化:init()

(1)默认情况

  • 默认情况下,第一次被请求的时候初始化,初始化在整个生命中只有一次

在这里插入图片描述

(2)设置初始化时间

  • 某种原因,导致第一次请求时初始化很慢,这时就可以修改Servlet的初始化时间

  • 使用其值为大于等于0的整数时,该Servlet就会在服务器启动时初始化,初始化在整个生命中只有一次

在这里插入图片描述

3.提供服务:service()

  • 生命周期中会提供n次

在这里插入图片描述

4.销毁:destroy()

  • 服务器关闭时自动销毁,生命周期中只有一次

在这里插入图片描述

二.Servlet的映射路径

1.web.xml配置

(1)标签

  • 的子标签,用于给Servlet配置访问路径

(2)注意

  1. 路径最前面加上/,代表根目录
  2. 路径中可以出现文件夹的,如/user/test/urlServlet

(3)示例

  • http://localhost:8888/day02_war_exploded/user/test/lifeServlet
  • http://localhost:8888/day02_war_exploded/user/life.html

2.模块前端文件的访问路径

  1. 访问文件时,只需要关注自己创建的目录,自动生成的不管
  2. 访问Servlet时,照着url-pattern设置的值来找

3.Servlet3.0注解配置

(1)使用前提

  • Servlet3.0和JDK1.5及以后的版本才能使用

(2)使用

在这里插入图片描述

(3)注意

  • 同一个Servlet,要么使用web.xml文件配置,要么使用注解配置,但是不能使用两种方式同时配置

  • 注解中的参数有name、serviceName;若是只写name参数,可以省略key值,只写value;除此之外要写key-value的形式

三.Servlet请求对象

1.HttpServletRequest接口

  • 请求对象
  • 父接口:ServletRequest
  • 包含请求行,请求头和请求体

在这里插入图片描述

2.请求行

(1)包含

  • 请求方式
  • 请求的资源
  • 协议及其版本

(2)获取信息

    @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {System.out.println(req.getMethod());System.out.println(req.getRequestURL());System.out.println(req.getRequestURI());System.out.println(req.getServerName());System.out.println(req.getServerPort());}

3.请求头

(1)获取信息

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String value1 = req.getHeader("Host");System.out.println(value1);Enumeration<String> names = req.getHeaderNames();while (names.hasMoreElements()) {String name = names.nextElement();String value = req.getHeader(name);System.out.println(name+":"+value);}}

4.请求体

  • 就是请求的数据,也就是Servlet中获取的参数

(1)Servlet中获取请求的数据的方法

  • request.getParameter(“name属性的值”);返回值类型为String
  • request.getParameterValues(“name属性的值”);返回值类型为String[]

(2)示例

    @Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");String gender = req.getParameter("gender");String hobbies[] = req.getParameterValues("hobbies");System.out.println(username+","+password+","+gender+","+ Arrays.toString(hobbies));}

5.Servlet获取参数乱码问题

(1)问题

  • 中文乱码,Servlet的默认编码集是ISO-8859-1(纯英文)
  • 页面输入中文进行提交,会乱码

(2)解决方案

在这里插入图片描述

四.文件上传

  • 就是在指定的位置复制出一个跟源文件一模一样的文件

1.页面编写

  • 表单的method属性的值必须是pos
  • 表单上加上enctype,值为multipart/form-data

在这里插入图片描述

2.Servlet

  • 在Servlet上加上@MultipartConfig

在这里插入图片描述

3.Post方法编写

  • 不同浏览器上传文件的路径不一样
  • 绝对路径(不带盘符)
  • 文件名+文件类型后缀
    @Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//设置请求体编码集req.setCharacterEncoding("utf-8");String username = req.getParameter("username");String password = req.getParameter("password");String gender = req.getParameter("gender");String hobbies[] = req.getParameterValues("hobbies");System.out.println(username+","+password+","+gender+","+ Arrays.toString(hobbies));//文件相关处理//获取用户提交的文件对象Part part = req.getPart("photo");//指定上传路径String path = "d://upload";//判断该路径是否存在File file = new File(path);if (!file.exists()) {//不存在则创建file.mkdirs();}//获取上传的文件的名字String fileName = part.getSubmittedFileName();//在指定位置创建指定文件part.write(path+"/"+fileName);}

五.Servlet响应对象

1.HttpServletResponse接口

  • 服务器响应对象
  • 父接口:ServletResponse
  • 包含响应行,响应头和响应体。

在这里插入图片描述

2.响应行

  • 包含协议及其版本,状态码

(1)状态码

状态码说明
1**请求已到达服务器,但未完成,需要再次请求
2**请求已到达服务器,并且已完成
3**服务器内部资源重定向
4**资源找不到
5**服务器内部异常,代码异常
200成功
404找不到,原因:路径有问题
500代码有问题,90%以上都是空指针

(2)设置状态码

   @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.setStatus(404);}

3.响应头

响应头keyvalue
Location这个头通常配合302状态码使用,它用于告诉浏览器你去找谁。
Server告诉浏览器,服务器的类型
Content-Encoding服务器通过这个头,告诉浏览器,回送的数据采用的压缩格式。
Content-Length0
Content-Languagezh-cn
Content-Type这个头用于告诉浏览器,回送数据的类型
Last-Modified这个头用于告诉浏览器,数据的最后修改时间
Transfer-Encoding用于通知浏览器,数据是以分块形式回送的
Cache-Controlno-cache 通知浏览器不要缓存
Refresh1;url=http://www.it315.org 隔多少秒以后,让当前页面去访问哪个地址(例如网页登陆成功后,跳回原来的界面,就是用的这个头)
Content-Dispositionattachment;filename=aaa.zip 和下载相关,通知浏览器以附件的形式下载服务器发送过去的数据
Set-CookieSS=Q0=5Lb_nQ; path=/search 和cookie相关的头
ETagW/“83794-1208174400000” 和cookie相关的头
Expires-1 通知浏览器是否缓存当前资源:如果这个头的值是一个以毫秒为单位值,则通知浏览器缓存资源到指定的时间点;如果值是0或-1,则通知浏览器禁止缓存
Pragmano-cache 通知浏览器是否缓存资源
Connectionclose/Keep-Alive 是否继续保持连接
DateTue, 11 Jul 2000 18:23:51 GMT 当前响应的时间

(1)Location的使用

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.setStatus(302);resp.setHeader("location","http://www.baidu.com");}

(2)Refresh的使用

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.setHeader("refresh","2;url=http://www.qidian.com");}

4.响应体

  • 响应的数据,会将HTML,text等信息返回给客户端。

(1)响应数据传递方式

  • 响应数据需要通过流来传递,response自带两个输出流
  • 这两个流不能同时使用
ServletOutputStream out = response.getOutputStream();//字节流PrintWriter out = response.getWriter();//字符流

(2)示例

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();out.print("<h1>今天天气不错</h1>");out.close();}

六.文件下载

1.创建下载文件的页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><a href="responseServlet">下载</a>
</body>
</html>

2.添加测试图片操作

  • 去除原来的 exploded

  • 重新添加exploded

在这里插入图片描述

3.Servlet编写代码

  • 下载的源文件直接放在src目录下
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//告诉浏览器,以附件的形式打开数据resp.setHeader("Content-Disposition","attachment;filename=erha.png");//输入流读取文件//this.getClass().getClassLoader().getResourceAsStream("gouza.png")用于快速的获取src当中问文件对象流InputStream in = this.getClass().getClassLoader().getResourceAsStream("gouza.png");//输出流写文件ServletOutputStream out = resp.getOutputStream();//边读边写byte[] b = new byte[1024];int len = 0;while ((len = in.read(b)) != -1) {out.write(b,0,len);}out.close();in.close();}

七.请求转发与重定向

1.Servlet进行跳转的方式

跳转方式方法
请求转发request.getRequestDispatcher(“跳转的文件路径”).forward(request,response);
重定向response.sendRedirect(“跳转的文件路径”);

2.请求转发

在这里插入图片描述

(1)请求转发概述

  • 服务器行为,客户端不知道整个操作在服务器中到底处理了多少次,所以地址栏不会发生改变
  • 整个过程中只发送了一个请求,所以request对整个转发过程中所有的Servlet是共享的
  • 请求转发的是那种数据提交方式,那么第二个servlet也是该方式,出form表单和超链接

(2)创建FirstServlet

package com.demo.servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/firstServlet")
public class FirstServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {System.out.println("进入FirstServlet");req.setAttribute("color","red");System.out.println(req.getAttribute("color"));req.getRequestDispatcher("secondServlet").forward(req,resp);}
}

(3)创建SecondServlet

package com.demo.servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/secondServlet")
public class SecondServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {System.out.println("进入SecondServlet");System.out.println(req.getAttribute("color"));}
}

(4)index.html,点击测试跳转

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><a href="firstServlet">测试请求转发</a>
</body>
</html>

(5)结果

在这里插入图片描述

3.重定向

在这里插入图片描述

(1)重定向概述

  • 客户端行为,客户端向FirstServlet发送请求,FirstServlet给了客户端响应告诉客户端去找SecondServlet,客户端向SecondServlet发送请求
  • 地址栏会变,request不共享

(2)创建FirstServlet

package com.demo.servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/firstServlet")
public class FirstServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {System.out.println("进入FirstServlet");req.setAttribute("color","red");System.out.println(req.getAttribute("color"));resp.sendRedirect("secondServlet");}
}

(3)创建SecondServlet

package com.demo.servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/secondServlet")
public class SecondServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {System.out.println("进入SecondServlet");System.out.println(req.getAttribute("color"));}
}

(4)测试

在这里插入图片描述

4.请求转发与重定向的区别

请求转发重定向
发出位置服务器行为客户端行为
地址栏内容地址栏不会发生改变地址栏会发生改变
请求次数只有一次请求至少两次请求
request共享equest是共享的request不共享的
转发效率较低
发送范围只能在当前模块中进行可以跳转到其他模块的作用域容器对象:作用域里面的作为容器的对象

--------------------------------------------------------: |
| 发出位置 | 服务器行为 | 客户端行为 |
| 地址栏内容 | 地址栏不会发生改变 | 地址栏会发生改变 |
| 请求次数 | 只有一次请求 | 至少两次请求 |
| request共享 | equest是共享的 | request不共享的 |
| 转发效率 | 高 | 较低 |
| 发送范围 | 只能在当前模块中进行 | 可以跳转到其他模块的作用域容器对象:作用域里面的作为容器的对象 |

相关文章:

Servlet详解

一.Servlet生命周期 初始化提供服务销毁 1.测试生命周期 package com.demo.servlet;import javax.servlet.*; import java.io.IOException;public class LifeServlet implements Servlet {Overridepublic void init(ServletConfig servletConfig) throws ServletException {…...

遥遥领先,免费开源的django4-vue3前后端分离项目

星域后台管理系统前端介绍 &#x1f33f;项目简介 本项目前端基于当下流行且常用的vue3作为主要技术栈进行开发&#xff0c;融合了typescript和element-plus-ui&#xff0c;提供暗黑模式和白昼模式两种主题以及全屏切换&#xff0c;开发bug少&#xff0c;简单易学&#xff0c…...

行业安卓主板-基于RK3568/3288/3588的AI智能网络广告机/自动售货机/收银机解决方案(三)

广告机 智能网络广告机通过网络将音视频、图片、文档、网页等自由排版创建成节目发布到终端。可针对不同的终端统一管理&#xff0c;统一发布&#xff1b;针对应用场景的集中和分散&#xff0c;可以选用局域网管理和云服务器管理。 自动售货机 随着物联网、大数据、人工智能的…...

寻找二维数组的最大值和对应下标 | C语言代码

题目&#xff1a; 本题目要求读入M(最大为10)行N&#xff08;最大为15&#xff09;列个元素&#xff0c;找出其中最大的元素&#xff0c;并输出其行列值。 输入格式: 输入在第一行中给出行数m和列数n。接下来输入m*n个整数。 输出格式: 输出最大值的行号,列号,值。 输入样例…...

2311dC++连接与串

原文 extern(C)函数使用在装饰名中包括参数类型的C装饰名.但是,因为C没有像D的T[]内置切片类型,因此C没有有效的D切片装饰. 因此,无法编译以D切片为参数的extern(C)函数. 为此,可按结构转换切片: struct DSlice(T) {T* ptr;size_t length;T[] opIndex() > ptr[0 .. length]…...

macOS 下 starUML 软件激活方案

starUML每次打开都弹出提示其实挺烦的&#xff0c;于是研究了一下如何 po 解(激活)它。记录一下方法以便以后使用。 我觉得这个软件很好用&#xff0c;大型项目的所有图我都是用这个软件画的。 直接上步骤&#xff01;先关掉starUML 1、安装 asar&#xff0c;以便可以打开 asa…...

一文读懂从 CPU 多级缓存 缓存一致性协议(MESI)到 Java 内存模型

文章目录 CPU 多级缓存 & 缓存一致性协议&#xff08;MESI&#xff09;CPU 多级缓存缓存一致性协议&#xff08;MESI&#xff09;缓存行&#xff08;Cache line&#xff09;四种缓存状态缓存行状态转换多核协同示例网站体验 MESI优化和引入的问题Store Bufferes & Inva…...

MongoDB设置密码

关于为什么要设置密码 公司的测试服务器MongoDB服务对外网开放的&#xff0c;结果这几天发现数据库被每天晚上被人清空的了&#xff0c;还新建了个数据库&#xff0c;说是要支付比特币。查了日志看到有个境外的IP登录且删除了所有的集合。所以为了安全起见&#xff0c;我们给m…...

重生奇迹mu召唤师怎么加点?

召唤师在重生奇迹mu游戏里面是一个智力型的职业&#xff0c;所以智力自然就成为主要加点属性&#xff0c;但是此职业却又算是近身攻击&#xff0c;因为她的技能范围并不算远&#xff0c;而且还是呈现出一种半径趋势&#xff0c;一方面是攻击伤害&#xff0c;另一方面则是辅助造…...

第九章《搞懂算法:决策树是怎么回事》笔记

决策树算法是机器学习中很经典的一个算法&#xff0c;它既可以作为分类算法&#xff0c;也可以作为回归算法。 9.1 典型的决策树是什么样的 决策树算法是依据“分而治之”的思想&#xff0c;每次根据某属性的值对样本进行分类&#xff0c;然后传递给下个属性继续进行分类判断…...

jar包的精细化运营,Java模块化简介 | 京东云技术团队

图&#xff1a;模块化手机概念 一、什么是Java模块化 Java模块化&#xff08;module&#xff09;是Java9及以后版本引入的新特性。 官方对模块的定义为&#xff1a;一个被命名的&#xff0c;代码和数据的自描述集合。&#xff08; the module, which is a named, self-descri…...

「Verilog学习笔记」移位运算与乘法

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 1、在硬件中进行乘除法运算是比较消耗资源的一种方法&#xff0c;想要在不影响延迟并尽量减少资源消耗&#xff0c;必须从硬件的特点上进行设计。根据寄存器的原理&a…...

静态、友好、内在:解析C++中的这些特殊元素和对象复制的优化

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a; 前面我们学习了C中关于类与对象的许多知识点&#xff0c;今天我们继续学习类与对象&#xff0c;最后再总结一下类与对象中的一些关键字内容&#xff0c;以及需要注意的细节。满满的干货…...

【RabbitMQ】 RabbitMQ 消息的延迟 —— 深入探索 RabbitMQ 的死信交换机,消息的 TTL 以及延迟队列

文章目录 一、死信交换机1.1 什么是死信和死信交换机1.2 死信交换机和死信队列的创建方式 二、消息的 TTL2.1 什么是消息的 TTL2.2 基于死信交换机和 TTL 实现消息的延迟 三、基于 DelayExchang 插件实现延迟队列3.1 安装 DelayExchang 插件3.2 DelayExchang 实现消息延迟的原理…...

CVE-2023-34040 Kafka 反序列化RCE

漏洞描述 Spring Kafka 是 Spring Framework 生态系统中的一个模块&#xff0c;用于简化在 Spring 应用程序中集成 Apache Kafka 的过程&#xff0c;记录 (record) 指 Kafka 消息中的一条记录。 受影响版本中默认未对记录配置 ErrorHandlingDeserializer&#xff0c;当用户将容…...

全局变量和局部变量在for循环的使用

imageloc字典作为全局变量&#xff0c;然后添加到全局的列表中&#xff0c;每次for循环都会将最新的元素改变之前for循环添加的元素。而imageloc字典作为局部变量&#xff0c;则不会影响。 import numpy as np originaljson [{"joints_vis": [1,1,1,1,1,1,1,1,1,1,…...

pytorch collate_fn测试用例

collate_fn 函数用于处理数据加载器(DataLoader)中的一批数据。在PyTorch中使用 DataLoader 时&#xff0c;通过设置collate_fn&#xff0c;我们可以决定如何将多个样本数据整合到一起成为一个 batch。在某些情况下&#xff0c;该函数需要由用户自定义以满足特定需求。 import …...

【qemu逃逸】HITB2017-babyqemu 2019数字经济-qemu

前言 由于本地环境问题&#xff0c;babyqemu 环境都没有起起&#xff0c;这里仅仅做记录&#xff0c;exp 可能不正确。 HITB2017-babyqemu 设备逆向 设备定位啥的就不说了&#xff0c;先看下实例结构体&#xff1a; 其中 dma_state 结构体如下&#xff1a; 这里看字段猜测…...

Docker Compose学习笔记

Docker Compose用来做什么&#xff1f; Docker Compose 是Docker官方的开源项目。 Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single …...

基于树 二叉树的回溯搜索算法(DPLL)

1&#xff09;全称&#xff1a;Davis-Putnam-Logemann-Loveland 2&#xff09;思想&#xff1a;基于树/二叉树的回溯搜索算法&#xff0c;主要基于两种策略。 单子句规则&#xff1a;如果一个CNF范式中存在单子句L&#xff08;含有一个文字的子句&#xff09;&#xff0c;取L为…...

【嵌入式】适用于ESP32/ESP8266远程自动烧录工具

文章目录 介绍开始使用下载项目开启服务端开始远程烧录 后记 介绍 esp_remote_flash_tool 是一款基于 esptool.py 的远程自动烧录工具&#xff0c;支持 ESP32 和 ESP8266。 使用场景 基于 ESP-IDF 、ESP8266 NONO SDK、ESP8266 RTOS SDK 进行开发的项目项目代码存储在 Linux…...

服务器遭受攻击如何处理(记录排查)

本文的重点是介绍如何鉴别安全事件以及保护现场的方法&#xff0c;以确保服务器负责人能够在第一时间对安全攻击做出反应&#xff0c;并在最短时间内抵御攻击或减少攻击所带来的影响。 在服务器遭遇疑似安全事件时&#xff0c;通常可以从账号、进程、网络和日志四个主要方面进…...

分享81个工作总结PPT,总有一款适合您

分享81个工作总结PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;https://pan.baidu.com/s/13hyrlZo2GhRoQjI-6z31-w?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知识付…...

什么是DITA?从百度的回答说起

▲ 搜索“大龙谈智能内容”关注GongZongHao▲ 什么是DITA? 把这个问题输入百度&#xff0c;获得以下回答&#xff1a; DITA 是“Darwin Information Typing Architecture”&#xff08;达尔文信息类型化体系结构&#xff09;的缩写&#xff0c;它是IBM 公司为OASIS 所支持…...

线扫相机DALSA软件开发套件有哪些

Win10和Win7系统完整SDK目录截图&#xff1a; Sapera Configuration 缓存与内存管理&#xff0c;以及通信端口配置工具&#xff0c;部分功能等效于Detection(查找相机)内的Settings。 Sapera Log Viewer 打开Log Viewer后会显示之前发生过的所有与Sapera LT软件有关的运行信息…...

Scala集合操作

1 集合简介 Scala 中拥有多种集合类型&#xff0c;主要分为可变的和不可变的集合两大类&#xff1a; 可变集合&#xff1a; 可以被修改。即可以更改&#xff0c;添加&#xff0c;删除集合中的元素&#xff1b; 不可变集合类&#xff1a;不能被修改。对集合执行更改&#xff0c;…...

SQL备忘--特殊状态“未知“以及“空值NULL“的判断

一、新逻辑状态&#xff1a;未知 对于大多数其他语言的逻辑判断&#xff0c;一般只有两种结果&#xff1a;真(TURE)或假(FALSE)但在SQL中&#xff0c;还会有第三种判断结果&#xff1a;未知(UNKNOWN)&#xff0c;表示无法判断出真或者假。 未知状态会影响传统逻辑运算&#x…...

《Pytorch新手入门》第一节-认识Tensor

《Pytorch新手入门》第一节-认识Tensor 一、认识Tensor1.1 Tensor定义1.2 Tensor运算操作1.3 Tensor与numpy转换 参考《深度学习框架PyTorch&#xff1a;入门与实践_陈云(著)》 一、认识Tensor 1.1 Tensor定义 Tensor 是 PyTorch 中重要的数据结构&#xff0c;可认为是一个高…...

【JAVA学习笔记】55 - 集合-Map接口、HashMap类、HashTable类、Properties类、TreeMap类(难点)

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/map_ Map接口 一、Map接口的特点&#xff08;难点&#xff09; 难点在于对Node和Entry和EntrySet的关系 注意:这里讲的是JDK8的Map接口特点 Map java 1) Map与Collect…...

Pytorch图像模型转ONNX后出现色偏问题

本篇记录一次从Pytorch图像处理模型转换成ONNX模型之后&#xff0c;在推理过程中出现了明显色偏问题的解决过程。 问题描述&#xff1a;原始pytorch模型推理正常&#xff0c;通过torch.onnx.export()函数转换成onnx之后&#xff0c;推理时出现了比较明显的颜色偏差。 原始模型…...