学习Request和Response这一篇就够啦~

news2024/9/24 5:21:28

Request(请求) :

Request:获取请求数据
Response:设置响应数据

在这里插入图片描述

Request继承体系:

在这里插入图片描述

使用request对象,查阅JavaEE API文档的HttpServeltRequest接口

Tomcat需要解析请求数据,封装为request对象,并且创建requests对象传递到service方法中,验证如下:

创建Servlet并输出HttpServletRequest的包名:

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("/demo4")
public class Myservlet4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(req);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

输出结果如下:

在这里插入图片描述

Request获取请求数据:

请求行:GET/request-demo/req1?username=zhangsan HTTP/1.1

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("/demo4")
public class Myservlet4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    	//请求方式的获取方法:String getMethod()
        String method=req.getMethod();
        System.out.println(method);
        
        //虚拟目录 (项目访问路径)的获取方法:StringgetContextPath()
        String contextPath=req.getContextPath();
        System.out.println(contextPath);
        
       //URL(统一资源标识符)的获取方法:String getRequestURL()
        StringBuffer url=req.getRequestURL();
        System.out.println(url);
        
        //访问路径的完整目录
        String uri=req.getRequestURI();
        System.out.println(uri);
        
        //请求参数的获取方法:String getQueryString()
        String queryString=req.getQueryString();
        System.out.println(queryString);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

点击运行后在网页中输入请求参数以及访问路径:

在这里插入图片描述

输出如下:

在这里插入图片描述

请求头:User-Agent:Mozilla/5.0 Chrome/91.0.4472.106

String getHeader(String name):根据请求头名称,获取值

举例:

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("/demo4")
public class Myservlet4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求头:user-agent:浏览器的版本信息
        String agent=req.getHeader("user-agent");
        System.out.println(agent);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

获取的信息如下:

在这里插入图片描述

请求体:username=superbaby&password=123

ServletInputStream getInputStream():获取字节输入流
BufferedReader getReader():获取字符输入流

举例:

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.BufferedReader;
import java.io.IOException;

@WebServlet("/demo4")
public class Myservlet4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取post 请求体:请求参数

        //1.获取字符输入流
        BufferedReader br=req.getReader();

       //读取数据
        String line=br.readLine();
        System.out.println(line);
    }
}

a.html文件:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
<form action="/mymavenweb4/demo4" method="post">
    <input type="text" name="username">
    <input type="password" name="password">
    <input type="submit">
</form>
</body>
</html>

在网页中,输入下述内容:

在这里插入图片描述

点击回车,我们发现此时的路径变为了demo4,表示将上述数据提交到了路径为demo4的文件中

在这里插入图片描述

输出内容如下所示:

在这里插入图片描述

通过上述的方法我们知道GET获取请求参数是通过getQueryString()方法,而POST方式获取请求参数是通过getReader()方法,那么是否存在一种统一获取请求参数的方式,从而统一doGet和doPOST方法内的代码呢?

如下所示:

当我们获取到请求方式后,首先对其进行判断,如果是GET,则使用GET方式获取请求参数,反之使用POST

在这里插入图片描述

获取到值之后,request会将字符串进行解析。如下所示:

在这里插入图片描述

得到上述这些键值对后,request会将其存放在一个集合中,很多情况下,一个键值对中的值不止有一个,针对这种情况,request对于键值部分是采用字符数组的形式

在这里插入图片描述

Map<String,String[]> getParameterMap():获取所有参数Map集合

举例:

创建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;
import java.util.Map;

@WebServlet("/demo4")
public class Myservlet4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //get请求逻辑
        System.out.println("get.......");

        //获取所有参数map的集合
        Map<String,String[]> map=req.getParameterMap();
        for(String key:map.keySet()){

            //username:zhangsan lisi
            System.out.println(key+":");

            //获取值
            String[] values=map.get(key);
            for(String value:values){
                System.out.println(value+" ");
            }
            System.out.println();
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
}

创建web文件:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
<form action="/mymavenweb4/demo4" method="get">
    <input type="text" name="username">
    <input type="password" name="password">
    <input type="checkbox" name="hobby" value="1">游泳
    <input type="checkbox" name="hobby" value="2">爬山
    <input type="submit">
</form>
</body>
</html>

运行后在网页中输入以下内容:

在这里插入图片描述

点击回车后,出现以下内容:

在这里插入图片描述

控制台输出:

在这里插入图片描述

String[] getParameterValues(String name):根据名称获取参数值(数组)

在上述创建的servlet类的doGET方法中加入如下代码:

//根据key获取参数值,数组
        String[] hobbies=req.getParameterValues("hobby");
        for(String hobby:hobbies) {
        System.out.println(hobby);
}

运行,在网页中输入如下内容:

在这里插入图片描述

回车后我们发现,未填写值的部分获取到的为空字符串

在这里插入图片描述

控制台输出:

在这里插入图片描述

String getParamter(String name):根据名称获取参数值(单个值)

在上述创建的servlet类的doGET方法中加入如下代码:

 		//根据key获取单个参数值
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        System.out.println("获取到的单个参数值为:");
        System.out.println(username);
        System.out.println(password);

运行,在网页中输入如下内容:

在这里插入图片描述

回车:

在这里插入图片描述

控制台输出:

在这里插入图片描述

那么上述的这些方法是否也可用用于POST请求方式呢?

验证如下:

1:将刚在doget方法中书写的获取值的核心部分代码复制至dopost方法中,代码如下所示

 //post请求逻辑
        System.out.println("post.......");

        //获取所有参数map的集合
        Map<String,String[]> map=req.getParameterMap();
        for(String key:map.keySet()){

            //username:zhangsan lisi
            System.out.println(key+":");

            //获取值
            String[] values=map.get(key);
            for(String value:values){
                System.out.println(value+" ");
            }
        }
        System.out.println();


        //根据key获取参数值,数组
        String[] hobbies=req.getParameterValues("hobby");
        System.out.println("获取到的参数值为:");
        for(String hobby:hobbies) {
            System.out.println(hobby);
        }

        //根据key获取单个参数值
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        System.out.println("获取到的单个参数值为:");
        System.out.println(username);
        System.out.println(password);

第二步:将web文件中的method改为post

在这里插入图片描述

运行后在网页中输入如下内容:

在这里插入图片描述

点击回车,我们发现这里并没有显示我们刚输入的值,则证明为post请求方式:

在这里插入图片描述

控制台输出:

在这里插入图片描述

验证成功说明上述方法对于post请求和get请求均适用!

既然代码都是完全相同的,那么我们不必同样的代码书写两边,修改如下:

//当为post请求方式时,我们只需要调用doget方法
this.doGet(req,resp);

验证如下:

运行后在网页中输入如下内容:

在这里插入图片描述

回车,确实为post请求方式:

在这里插入图片描述

控制台输出:

在这里插入图片描述

这样也能够正确使用不同的请求方式,并且这种方式代码量更少!

解决中文乱码问题:

当我们在表单中填写的值为中文时,会出现乱码问题,而这种乱码问题与请求方式是没有关系的,无论是post还是get都会出现乱码问题

举例:

在这里插入图片描述

控制台输出:

在这里插入图片描述

解决POST请求方式出现的乱码问题:使用setCharacterEncoding设置字符输入流

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("/demo4")
public class Myservlet4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
		//一定要写在第一行!!!
        req.setCharacterEncoding("UTF-8");//设置字符输入流的编码

        String username=req.getParameter("username");
        System.out.println(username);


    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req,resp);
    }
}

乱码问题被解决:

在这里插入图片描述

如果还没有解决的小伙伴请检查自己web文件中的请求方式是不是错写成get了,或者可以试试设置为GBK

解决GET请求方式出现的乱码问题:

如下所示:

<configuration>
            <uriEncoding>${project.build.sourceEncoding}</uriEncoding>
</configuration>

Request请求转发:

请求转发[forword]:一种在服务器内部的资源跳转方式

在这里插入图片描述

实现方式:req.getRequestDispatcher("资源B路径").forword(req,resp);

举例:

新创建Myservlet5类:

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("/demo5")
    public class Myservlet5 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("demo5.............");
            //请求转发---我们所能改变的内容为转发的资源路径,也就是下一个要执行的servlet类
            req.getRequestDispatcher("/demo6").forward(req,resp);
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req,resp);
        }
    }

新创建Myservlet6类:

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("/demo6")
public class Myservlet6 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("demo6.............");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

打开浏览器访问demo5,控制台输出如下:

在这里插入图片描述

请求转发资源共享数据,使用Request对象:

void setAttribute(String name,Object o):存储数据到request域中
Object getAttribute(String name):根据key,获取值
void removeAttribute(String name):根据key,删除该键值对

在上述创建的Myservlet5和Myservlet6的基础上进行如下步骤:

举例:

1:在Myservlet5中添加数据

在这里插入图片描述

在Myservlet6中添加下述代码:

在这里插入图片描述

打开浏览器访问demo5,控制台输出:

在这里插入图片描述

请求转发特点:

浏览器地址栏路径不发生变化
只能转发到当前服务器的内部资源
一次请求,可以在转发的资源间使用request共享数据

Response(响应):

Response:设置响应数据功能介绍

响应数据分为3部分:

1:响应行:HTTP/1.1 200 OK

void setStatus(int sc):设置响应状态码

2:响应头:Content-Type:text/html

void setHeader(String name,String value):设置响应头键值对

3:响应体<html><head><head><body></body></html>

PrintWriter getWriter():获取字符输出流
ServeltOutputStream getOutputStream():获取字节输出流

重定向:一种资源跳转方式

在这里插入图片描述

实现方式:

resp.setStatus(302);
resp.setHeader("location","资源B的路径");

举例:

创建MyResponse1类:

package Response;

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("/res1")
public class MyResponse1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                System.out.println("res1..........");

        //重定向
        //1:设置响应状态码:302
       resp.setStatus(302);
        //设置响应头Location
        resp.setHeader("Location","res2");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }

创建MyResponse2类:

package Response;

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("/res2")
public class MyResponse2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("res2..........");


    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

当在浏览器访问res1:

在这里插入图片描述

回车,重定向至res2:

在这里插入图片描述

控制台输出:

在这里插入图片描述

如果有小伙伴的控制台只输出了res1,如下所示:

在这里插入图片描述

错误的原因为:响应头的路径书写错误,有可能是多加了“/”,有可能是忘记写虚拟路径,也就是项目的名称,我这里没写项目名称的原因是因为我的IDE为2021版本的,可以直接写另一个资源的名称

resp.setHeader("Location","res2");

除了上述方法可以进行重定向外,我们还可以使用下述这种简化的方式进行重定向,这种方法的输出结果上述完全相同

 resp.sendRedirect("res2");

重定向的特点:

1:浏览器地址栏路径发生变化—>在上述案例中我们已经指出了

2:可以重定向到任意位置的资源(服务器内部,外部均可)

上述案例的资源即为服务器内部,我们也可以将其定位到服务器外部,如下所示,我们将重定向的路径定位至百度:

resp.sendRedirect("https://www.baidu.com/");

浏览器依然访问res1资源:

在这里插入图片描述

点击回车,浏览器地址栏路径发生不仅变为了百度的网址,而且页面也是跳转到了百度

在这里插入图片描述

3:两次请求,不能在多个资源使用request共享数据

由于浏览器发送了两次请求,是两个不同的request对象,就无法通过request对象进行共享数据

Resopnse响应字符数据:

使用:

1:通过Response对象获得字符输出流

PrintWriter writer=resp.getWriter();

2:写数据

writer.writer("aaa");

举例:

新建servlet类:

package Response;
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;
import java.io.PrintWriter;

@WebServlet("/res3")
public class MyResponse3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         //获取字符输出流
         //该流不需要关闭,当最后程序结束时,response对象被销毁的时候,该流自动关闭
        PrintWriter writer=resp.getWriter();
        writer.write("aaa");
        writer.write("<h1>aaa</h1>");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

浏览器打开运行:

在这里插入图片描述

这样看似好像没什么问题,但仔细看,我们写入的<h1>aaa<h1>的标签本质是想将其以标题的形式显示,但是这里并非如此,而是将其按照文本直接输出了,针对上述问题,解决方法如下:

//将其解析为html文件
resp.setHeader("content-type","text/html");

显示如下:

在这里插入图片描述

解决中文乱码问题:

上述实例中,我们所写的字符都是英文的,那么如果是中文的,会出现乱码问题吗?

测试如下:

writer.write("你好");

输出如下所示:

我们看到,你好此时被解析为了两个问号

在这里插入图片描述

针对上述问题的解决方法如下:

在doGET方法的第一行加入下述代码:

resp.setContentType("text/html;charset=utf-8");

输出如下:乱码被解决

在这里插入图片描述

Resopnse响应字节数据:

1:通过Response对象获取字符输出流

ServletOutputStream outputStream=resp.getOutputStream();

2:写数据

outputStream.write(字节数据);

举例:

package Response;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;

@WebServlet("/res4")
public class MyResponse4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //读取文件
        FileInputStream fileInputStream = new FileInputStream("E://开心的微笑.jpg");
        //获取response字节输出流
        ServletOutputStream os = resp.getOutputStream();
        //完成流的copy
        byte[] buff = new byte[1024];
        int len = 0;
        while ((len = fileInputStream.read(buff)) != -1) {
            os.write(buff, 0, len);
        }
        fileInputStream.close();
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

访问res4资源,显示如下:

在这里插入图片描述

上述流的copy只是为了巩固基础,为了简化代码,我们可以直接使用工具类,步骤如下:

首先在pom.xml文件中导入下述依赖:

<dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
</dependency>

2:将上述中流copy的部分改为下述代码:

IOUtils.copy(fileInputStream,os);

在浏览器中再次访问res4资源,发现依然可以成功输出,但下述这种方式明显简单许多:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

知识图谱嵌入技术研究综述

作者 张天成 1 , * 田 雪 1 , * 孙相会 1 , * 于明鹤 2 , * 孙艳红 1 , * 于 戈 摘要 知识图谱 是一种用图模型来描述知识和建模事物之间的关联关系的技术。 知识图谱嵌入 作为一种被广泛采用的知识表示方法。 主要思想是将知识图谱中的实体和关系嵌入到连续的向量空间中…

Ansible---playbook剧本

目录 引言&#xff1a;什么是playbook&#xff1f; 一、Playbook 1.1、playbook中的核心元素 1.2、playbook中的基础组件 1.3、playbook格式说明 1.4、实例&#xff1a;httpd服务剧本 二、playbook中的模块 2.1、Templates 模块 2.2、tags 模块 2.3、Roles 模块 引言&…

关于链表中插入结点的操作……

服了&#xff0c;好久没敲链表了&#xff0c;这都忘了 newnode->next cur->next; cur->next newnode; newnode->next cur->next; cur->next newnode; newnode->next cur->next; cur->next newnode; newnode->next cur->next; cur-…

科技常识就像雨衣,要常备哦

科技常识就像雨衣&#xff0c;平常不准备&#xff0c;遇雨成落汤鸡 昨日晨跑遇雨&#xff0c;随身带轻便雨塑料雨衣 趣讲大白话&#xff1a;晴天挖水渠 *********** 信息科技是现代科技的【火车头】 往前看&#xff1a;要关注趋势 往后看&#xff1a;要了解行业历史 在当下&…

数据结构 | 栈与队列

&#x1f525;Go for it!&#x1f525; &#x1f4dd;个人主页&#xff1a;按键难防 &#x1f4eb; 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一起进步&#x1f440; &#x1f4d6;系列专栏&#xff1a;数据结构与算法 &#x1f52…

使用C#编写k8s CRD Controller

本文项目地址&#xff1a;k8s-crd - Repos (azure.com)CRDCRD指的是Custom Resource Definition。开发者更多的关注k8s对于容器的编排与调度&#xff0c;这也是k8s最初惊艳开发者的地方。而k8s最具价值的地方是它提供了一套标准化、跨厂商的 API、结构和语义。k8s将它拥有的一切…

【测试开发】web 自动化测试实战 --- MuiscServerTest

目录界面测试功能测试1. 登录注册模块功能测试2. 音乐列表页自动化测试3. 喜欢音乐列表页自动化测试4. 上传音乐模块自动化测试5. 以上所有测试用例集成测试套件项目测试亮点web 自动化测试实战就通过测试自己的 onlinemusicserver 音乐服务器项目进行测试&#xff0c;通过 sel…

冰冰学习笔记:多线程

欢迎各位大佬光临本文章&#xff01;&#xff01;&#xff01; 还请各位大佬提出宝贵的意见&#xff0c;如发现文章错误请联系冰冰&#xff0c;冰冰一定会虚心接受&#xff0c;及时改正。 本系列文章为冰冰学习编程的学习笔记&#xff0c;如果对您也有帮助&#xff0c;还请各位…

基于TimeQuest时序优化原理和方法

&#x1f4a1; 回顾基于RTL逻辑时序优化的基本思路&#xff0c;在关键路径中插入寄存器来优化时序 分析最坏路径 通过前面对TimeQuest软件的理解&#xff0c;基本上可以找到关键路径&#xff0c;此文章主要对关键路径时序进行优化&#xff0c;使设计达到时序要求&#xff0c;以…

RibbitMQ 入门到应用 ( 一 ) 基本概念

1.什么是RabbitMQ 1.0.什么是MQ 1.1.RabbitMQ简介 消息队列提供一个异步通信机制&#xff0c;消息的发送者不必一直等待到消息被成功处理才返回&#xff0c;而是立即返回。消息中间件负责处理网络通信&#xff0c;如果网络连接不可用&#xff0c;消息被暂存于队列当中&#…

基于YOLOV5的钢材缺陷检测

数据和源码见文末 1.任务概述 数据集使用的是东北大学收集的一个钢材缺陷检测数据集,需要检测出钢材表面的6种划痕。同时,数据集格式是VOC格式,需要进行转化,上传的源码中的数据集是经过转换格式的版本。 2.数据与标签配置方法 在数据集目录下,train文件夹下有训练集数据…

机器学习基本概念总结

深度学习是机器学习的一个特定分支&#xff0c;要想充分理解深度学习&#xff0c;就必须对机器学习的基本原理有深刻的理解。机器学习的本质属于应用统计学&#xff0c;其更多地关注如何用计算机统计地估计复杂函数&#xff0c;而不太关注为这些函数提供置信区间&#xff0c;大…

HTTP、HTTPS

目录 1.HTTP 1.1.概述 1.2.报文结构 1.2.1.请求报文 1.2.2.响应报文 1.3.方法 2.HTTPS 1.HTTP 1.1.概述 HTTP&#xff0c;超文本传输协议&#xff0c;WEB体系选用了该协议作为应用层协议。 1.2.报文结构 1.2.1.请求报文 HTTP的请求报文&#xff08;request&#xff0…

idea集成chatGPT

idea集成chatGPT 一、idea安装chat GPT插件 1.在Plugins中搜索chatGPT&#xff0c;找到如图所示的这个并点击安装&#xff0c;安装完成后点击apply 插件安装成后会出现chatGPT的图标 2.点击点击工具窗口的扳手按钮&#xff0c;将进行插件的初始设置&#xff0c;这里选择官方…

Linux GPIO模块-RK3588 GPIO驱动分析

1.简介 GPIO是可编程的通用I/O外设。如下图所示&#xff0c;RK3588 GPIO控制器包含3个部分&#xff1b;APB接口模块和SoC内部的APB总线连接&#xff0c;负责与SoC交换数据&#xff0c;位宽为32位&#xff1b;I/O port接口模块管理外部的引脚&#xff0c;引脚的输入和输出都要经…

C++复习笔记7

1.C内存分区 C内存分区&#xff1a;代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统管理 全局区&#xff1a;存放全局变量静态变量和常量。 栈区&#xff1a;编译器分配&#xff0c;存放函数的参数值和局部变量等。 堆区&#xff1a;由程序员分配和释放&a…

IntelliJ IDEA 创建JavaFX项目运行

IntelliJ IDEA 创建JavaFX项目运行JavaFX官网文档&#xff1a;https://openjfx.io/openjfx-docs/ JavaFX 2008年12月05日诞生&#xff0c;是一个开源的下一代客户端应用程序平台&#xff0c;适用于基于 Java 构建的桌面、移动和嵌入式系统。这是许多个人和公司的协作努力&#…

函数栈帧的创建和销毁(C语言)

函数栈帧的创建和销毁&#xff08;C语言&#xff09;前言主体前言 函数栈帧是一个非常重要的概念&#xff0c;是重点也是难点&#xff0c;当然涉及底层方面的知识都会很难&#xff0c;但是对我们理解函数的创建和运用有非常重要的作用。本篇博客的目的就是了解函数栈帧的创建和…

go 命令行工具整理

这里会整理可能会使用到的命令行参数&#xff0c;比如 go build、go run&#xff0c;诸如此类。了解这些内容对我们工作会有什么帮助吗&#xff1f;更多的时候&#xff0c;是能让我们理解代码编译的意图&#xff0c;或者&#xff0c;给我们一种排查问题的手段。 比方说&#x…

电子学会2022年12月青少年软件编程(图形化)等级考试试卷(一级)答案解析

目录 一、单选题(共25题&#xff0c;共50分) 二、判断题(共10题&#xff0c;共20分) 三、编程题(共2题&#xff0c;共30分) 青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;一级&#xff09; 一、单选题(共25题&#xff0c;共50分) 1. 小明想在开始…