JavaEE Servlet的API详解

news2024/11/23 8:27:18

Servlet的API详解O(∩_∩)O~:

在这里插入图片描述

文章目录

  • JavaEE & Servlet的API详解
    • 1. HttpServlet抽象类
      • 1.1 init方法
      • 1.2 destroy方法
      • 1.3 service方法
    • 2. HttpRequest接口
      • 2.1 在浏览器上显示请求首行
      • 2.2 在浏览器上显示请求header
      • 2.3 getParameter方法 - 最常用的API之一
      • 2.4 json(body)的解析与构造
        • 2.4.1 ObjectMapper类
        • 2.4.1 通过json构造对象
        • 2.4.3 通过对象构造json:
    • 3. HttpResponse接口
      • 3.1 设置首行(版本号固定)
      • 3.2 设置格式和字符集
      • 3.3 自动刷新页面
      • 3.4 设置重定向
        • 3.4.1 设置状态码 + header属性Location
        • 3.4.2 调用sendRedirect方法

JavaEE & Servlet的API详解

对于Tomcat服务器的代码实现,就不做讲解了,本质上就是一个TCP服务器,感兴趣的可以去了解!

  • 接下来就是Servlet的API(有很多很多)

主要就是三个重点类:

  1. HttpServlet
  2. HttpServletRequest
  3. HttpServletResponse

而后面两个类,只要你熟悉HTTP协议,我想你也会知道怎么使用(猜)~

1. HttpServlet抽象类

  • 每一个Servlet程序都要继承这个HttpServlet类,重写其中的方法

在这里插入图片描述

既然如此,我们就需要熟悉我们能重写什么方法,以及这些方法有什么用~

按住ctrl点进HttpServlet:

在这里插入图片描述

方法名称调用时机
init在HttpServlet实例化之后呗调用一次
destory在HttpServlet实力不再使用的时候调用一次
service收到HTTP请求的时候调用
doGet顾名思义
doPost顾名思义
doPut/doDelete/doOptions/…顾名思义

1.1 init方法

  • 初始化相关的工作

HttpServlet被实例化之后会被调用一次

  • 即,首次收到匹配的请求(建立连接请求)的时候,实例化

在这里插入图片描述

  1. 记得打开服务器
  2. 记得发送请求(建立连接,后得到request)

所以init的打印在helloworld之前(doGet之前),且只调用了一次:

在这里插入图片描述

1.2 destroy方法

  • 这个方法是该webapp被卸载,被销毁之前执行一次
  • 做一些收尾工作

示例:

  • 编写代码,启动服务器再关闭:

在这里插入图片描述

然而好像并没有执行这个语句

  • 实际上,destroy不太靠谱
    1. 通过8005管理端口,来停止服务区,此时destroy都执行
    2. 直接通过杀死进程(ctrl + f2),此时destroy执行不了
      • 常见的简单粗暴的方法

所以不建议使用destroy方法,因为可能也不作数呀~

8005管理端口

  • 前面提到,Tomcat用到两个端口
    1. 8080业务端口
    2. 8005管理端口
  • 这就类似于,一个人的两个微信
    1. 工作微信,(同事客户领导…)
    2. 生活微信,(家人朋友…)

而不同的端口,就会有不同的请求响应

  • 8080就是我们的业务,我们需要通过这个端口定位到服务器的位置,以及其部署的资源
  • 8005则是做一些加载配置,重新启动,调整设置项…
    • 其中就包括,关闭服务器

1.3 service方法

  • 每次收到路径匹配的请求,都会执行

这是一个写好了的子框架!

doGet和doPost…都会在service中被调用,所以我们一般是不会重写这个方法,而是重写doGet和doPost就行了

  • init在连接时刻下调用一次
  • destroy在结束之前调用一次
  • service每次收到路径匹配的请求都会调用一次

Servlet的生命周期

  • 一个事物的“一生”,各个阶段干什么,就是生命周期

doGet等doXXX方法,已经写过很多次了,不做讲解~

  • 举一反三~

响应乱码问题:

在这里插入图片描述

原因就是,数据返回的编码方式和浏览器展示的编码方式,两者对应不上

  • 统一编码方式即可

    • IDEA默认返回的编码方式为utf8

    java中,char类型是unicode(两个字节)

    但是String类型的字符是utf8的(三个字节)

    • 只不过java中不太留意字节大小,所以无感
    • 这也解决粘包问题(unicode的硬伤)

    而我们只需要通过一些类进行套壳(Scanner),就会自动解析字节流了

    • 至于char数组到String的转化,java帮你做了,不必留意这些细节~
    • 而java中sout的时候,都是转化为字符串输出的~
    • 浏览器是根据系统默认的编码方式走的,(Windows11默认gbk)

gbk:两个字节去表示,能表示的汉字有限~

utf8:三个字节,可以表示丰富的文字

在这里插入图片描述

关闭再启动:

在这里插入图片描述

2. HttpRequest接口

一个HTTP请求里有啥,这个对象中就有啥

  1. 方法
  2. URL(host,queryString)
  3. 版本号
  4. header
  5. body
  6. Cookie

而这些内容,在这个对象中,都可以用对应的方法进行获取和设置~-

方法总览:

  • 不需要我们重写,因为这些是因为doXXX方法的传参向上转型,已经是框架重写好的了~

在这里插入图片描述

Protocol:

协议名称和版本号

URL 与 URI:

前者是网络资源定位符,后者是网络资源标识符

特别相似,相似到我们很多时候**直接混着用~**

在这里插入图片描述

在这里插入图片描述

Parameter:参数

  • 其实就请求中的键值对

Enumeration:列举

  • 是请求中所有键值对的所有key的名称
  1. querystring
  2. form(body)

前者就是获取参数名称(所有key),后者通过key获取value(首个)

在这里插入图片描述
key是可以对应多个值的(在querystring允许key重复出现)

  • 所以此方法能够获取key对应的value的字符串数组
  • 很罕见,这种方法,一般有这种特殊要求,服务器也是知道的,所以也会调用这个方法
    • (不会出现使用了只能获取一个value的那个方法,因为都是约定好的)

处理header的方法:

在这里插入图片描述

类似:

前者是获取header里的所有key,后者是获取key对应的value

  • 一般header的key是不重复的(一般不会用getHeaders)

获取特定的header的key对应的值:

  • 不需要输入名字字符串,而是通过编译器提词

在这里插入图片描述

获取字节输入流对象:

  • 用Scanner套壳可以处理字节输入流

进一步去读取body的内容!(压缩的body会被自动转换,不必担心)

  • 除了文本/二进制模式外的格式,随后讲解
  • 而这些格式的读写是得通过第三方库(依赖)的
    • 自己构造太麻烦了

表中未出现的其他方法,暂时不讲,随用随查随学!

2.1 在浏览器上显示请求首行

@WebServlet("/show")//没有分号~

public class ShowRequest extends HttpServlet {
        StringBuilder result = new StringBuilder();
        result.append(req.getProtocol());//版本号
        result.append('\n');

        result.append(req.getMethod());
        result.append('\n');

        result.append(req.getRequestURI());
        result.append('\n');

        result.append(req.getQueryString());//无字符串
        result.append('\n');
        
        result.append(req.getContextPath());
        result.append('\n');

        resp.getWriter().write(result.toString());
    }
}

启动服务器,通过浏览器发送请求~

在这里插入图片描述

自己搞个queryString:

在这里插入图片描述

如果响应的body是html格式的,则回车符就不能生效了~

  • 设置响应的body格式(提前一提),用的是setContentType方法

在这里插入图片描述

如果不改回车符:

  • 重新启动服务器哦!

在这里插入图片描述

  • 没有起到换行作用,而是相当于在html代码中按了一下回车,展示效果其实就是一个空格~

<br>代替:

在这里插入图片描述

2.2 在浏览器上显示请求header

result.append("<hr>");

Enumeration<String> headerNames = req.getHeaderNames();
//用不了for each语法,因为这个集合类没继承那个集合接口,也不是数组~
//而其本身,也可以看做是自身的迭代器
while(headerNames.hasMoreElements()) {
    String name = headerNames.nextElement();
    String value = req.getHeader(name);
    result.append(name);
    result.append(": ");
    result.append(value);
    result.append("<br>");
}
resp.setContentType("text/html; charset=utf8");
resp.getWriter().write(result.toString());
  • 这个headerNames对象,本身是一个集合,也是一个自身的一个迭代器~

效果:

在这里插入图片描述

2.3 getParameter方法 - 最常用的API之一

前端给后端传递数据,是很常见的:

  1. querystring传递
  2. body(form)
  3. body(json)
result.append("<hr>");

Enumeration<String> keys = req.getParameterNames();
//同样可以迭代~
while(keys.hasMoreElements()) {
    String key = keys.nextElement();
    String value = req.getParameter(key);
    result.append(key);
    result.append("=");
    result.append(value);
    result.append("<br>");
}
result.append("<hr>");
String value1 = req.getParameter("a");
String value2 = req.getParameter("b");
String value3 = req.getParameter("c");
result.append(value1 == null ? "noFound" : value1);
result.append("<br>");
result.append(value2 == null ? "noFound" : value2);
result.append("<br>");
result.append(value3 == null ? "noFound" : value3);
result.append("<br>");

效果:

在这里插入图片描述

  1. querystring传递
  2. body(form)
  3. body(json)
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //获取请求的body
    StringBuilder result = new StringBuilder();
    Enumeration<String> keys = req.getParameterNames();
    while(keys.hasMoreElements()) {
        String key = keys.nextElement();
        String value = req.getParameter(key);
        result.append(key);
        result.append("=");
        result.append(value);
        result.append("<br>");
    }
    resp.setContentType("text/html; charset=utf8");
    resp.getWriter().write(result.toString());
}

通过Postman构造post请求发送个服务器

在这里插入图片描述

可见,获取到了body里的form相关的键值对

中文乱码现象1:

  • 在querystring中写中文也是有风险的(成功也只不过凑巧可以打印)
  • querystring的键值对包含中文/特殊字符,就需要用urlencode的方式进行转码,否则存在风险(querystring的机制似乎优化过了,软件/浏览器支持的很好
    • 进行转码是有必要的,减少变数

在这里插入图片描述

  • 如果出现乱码,服务器将无法正确识别,从而无法返回正确的响应!!!

UrlEncode编码和UrlDecode解码-在线URL编码解码工具

通过转码工具转码:

在这里插入图片描述

作为后端程序员,一般也感知不到这个问题,因为我们获得乱码,那肯定是前端程序员的锅~

  • 自己的前后端分离的项目也是要注意一下的

中文乱码现象2:

  • 在form(body)的键值对中,前端传过来的utf8,而后端并不清楚它就是utf8,所以后端代码不知道/用其他编码方式读取,就会乱码

在这里插入图片描述

显示告知编码方式:

在这里插入图片描述

  • 请求本来就有一套编码方式,这个操作设置的是后端代码怎么识别这串请求的

效果:

在这里插入图片描述

2.4 json(body)的解析与构造

  1. querystring传递
  2. body(form)
  3. body(json)
    • 肥肠重要!
    • json一般有对象构造而来,以对象来理解,所以通过String识别字符串(key与value),即utf8,所以不告知编码方式也行

用getParameter方法的话,似乎是摄取不到json里面的键值对的

  • 因为Servlet是没有内置解析json的功能的~
    在这里插入图片描述

没有关系!我们只需要引入一个第三方库(一个依赖)

  • json的依赖,有很多
    • 用法差不多,功能相似,例如fastjson、gson、jackson…
    • jackson是spring官方的指定产品(提前认识点,后续spring有关操作也恰好要用到jackson)

Maven Repository: Central (mvnrepository.com)

  • 中央仓库里去下载/复制代码

搜jackson,选择这个:

在这里插入图片描述

我选择的是这个版本:

在这里插入图片描述

复制代码:

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>

在这里插入图片描述

在pom.xml中引入依赖:

  • 刷新触发加载~

在这里插入图片描述

2.4.1 ObjectMapper类

private ObjectMapper objectMapper = new ObjectMapper();
//解析json的核心类就是,ObjectMapper
  • 这个类我的理解就是:对象映射制造器
    • object即对象,map即映射
  1. 通过对象内部的映射关系,制作json格式的字符串
  2. 通过json格式的字符串,构造对象
class User {
    public String username;
    private String password;
    public double score;

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

2.4.1 通过json构造对象

  • 用readValue方法(readValues的话,就是传过来的body是json数组)

    • 传入req的输入流(输入,即喂给后端代码)
    • 传入类对象(类名.class)
      • 这个方法通过这个类名(普通类,不能是抽象类/接口),构造对类名对应的对象!

    没错,底层它会通过反射(只有这个反射才能通过类名通过成员名方法名去设置和获取)去构造一个对象,

    • json的key对应成员名,value对应成员的值

      • 不存在的还是默认值~
    • private或者其他此时权限不够的修饰符修饰成员,必须有对应的getter和setter,才能被反射获取到!才能正确制造对象

      • 注意:setter和getter用编译器快速构造即可(alt + insert)
      1. boolean外的其他类型,都是getXxx和setXxx
      2. boolean类型,则是isXxx和setXxx
@WebServlet("/show_json")
public class showJSON extends HttpServlet {

    private ObjectMapper objectMapper = new ObjectMapper();
    //解析json的核心类就是,ObjectMapper

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf8");

        User user = objectMapper.readValue(req.getInputStream(), User.class);

        resp.setContentType("application/json; charset=utf8");

    }
}

启动服务器,通过Postman发送请求:

在这里插入图片描述

这里是500,就是认定请求的body为标准,只是后端代码(服务器那边)没有做好匹配

错误1 :

  • 成员的类型与值不匹配

在这里插入图片描述

错误2:

  • 不存在此成员:

在这里插入图片描述

请求的key值较少,无所谓~

竟然是映射关系,那么也可以用Map储存:

  • 这样用的话,我们还要手写成员名才能获取value(这两个编译器都不会提词)
  • 麻烦!
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("utf8");

    //User user = objectMapper.readValue(req.getInputStream(), User.class);
    //System.out.println(user.username + " " + user.getPassword() + " " + user.score);
    resp.setContentType("application/json; charset=utf8");
    Map<String, String> map = objectMapper.readValue(req.getInputStream(), HashMap.class);
    System.out.println(map.get("username") + " " +
                       map.get("password") + " " + map.get("score"));
}

重新启动服务器,发送post请求:

在这里插入图片描述

2.4.3 通过对象构造json:

一般构造json,是为了写入响应返回给客户端,所以从习惯上是客户端发送GET请求,所以重写doGet方法

  • 用writeValueAsString方法

在这里插入图片描述

  • 传入任何对象,都会帮你转换为json
  1. 基本数据类型/String/包装类/非复杂(自定义)类型的数组和集合类

    "value.toString()"
    //基本数据类型就是:value
    //数组就是Arrays.toString(value)
    

    在这里插入图片描述

  2. 自定义类

    {
        "成员1": "value1",
        "成员2": "value2",
        //......
        "成员n": "valuen"//最后没有逗号
    }
    

    在这里插入图片描述

  3. 自定义类的数组/集合

    [
        {
            //json1
        }
        {
        	//json2
        }
    	//	...
    	{
            //json_n
        }
    ]
    

    在这里插入图片描述

注意:

如果对象没有new出来,还是null,那么转换的也就是null(没有指向)

在这里插入图片描述

  1. 自带映射的Map

    {
        "key1": "value1",
        //...
        "keyn": "value2"
    }
    

    在这里插入图片描述

3. HttpResponse接口

表示一个HTTP响应,响应有什么,里面就有什么~

  • 只讲几个常用的~

在这里插入图片描述

处理header的方法

在这里插入图片描述

  1. set => key存在,覆盖;key不存在,创建一个key: value键值对
  2. add => key存在/不存在:创建一个key: value键值对
    • 即,header可能出现重复

设置body的格式,设置字符集…

在这里插入图片描述

  • 设置body格式后面加个“; charset=XXX”,也能起到设置字符集的作用

在这里插入图片描述

设置重定向

在这里插入图片描述

  • 获得输出字符流,输出字节流(输出,即后端代码投喂给响应)

3.1 设置首行(版本号固定)

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setStatus(200);
    resp.getWriter().write("200响应");
}

在这里插入图片描述

抓包:

  • Content-Length等非自定义的header属性自动补上了~

在这里插入图片描述

3.2 设置格式和字符集

在这里插入图片描述

3.3 自动刷新页面

  • 通过setHeader方法,对Refresh属性进行设置value
    • 含义就是,在value秒后,页面自动刷新(浏览器)
    • 但是如果浏览器有互动性的东西,就不会触发刷新(因为强制刷新,就会清空用户输入了的东西,影响体验)
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=utf8");
        //不设置状态码,默认为200 ok,状态码描述跟状态码对应的,并不需要设置
        resp.setHeader("Refresh", "1");
        resp.getWriter().write(String.valueOf(System.currentTimeMillis()));
    }

在这里插入图片描述

  • 虽然不能精确到1000ms整,但是很接近1s了(机器也要工作时间嘛~)

3.4 设置重定向

3.4.1 设置状态码 + header属性Location

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setContentType("text/html; charset=utf8");
    resp.setStatus(302);
    resp.setHeader("Location", "https://www.bilibili.com/");
}

效果:

在这里插入图片描述

3.4.2 调用sendRedirect方法

  • 是等价于上述两步的
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setContentType("text/html; charset=utf8");
    resp.sendRedirect("https://www.bilibili.com/");
}

效果一致~


文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆

Servlet的一些API就讲到这里了✿✿ヽ(°▽°)ノ✿

我们已经知道怎么构造请求,解析响应,已经有了前端

  • 有了这些知识,我们就可以简单的做一些前后端交互的小项目了
  • 下章预告:升级版表白墙

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

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

相关文章

【MAC】nvm安装和使用

傻瓜式使用教程如下&#xff0c;不用担心443 和 mac的文件夹权限问题 &#xff01; 1.将nvm包clone下来并克隆到nvm 文件夹中 打开终端后执行&#xff1a; git clone https://gitee.com/mirrors/nvm.git ~/.nvm2.激活nvm sudo source ~/.nvm/nvm.sh接着就可以通过nvm ls命令…

2023/6/1总结

学习CSS 动画&#xff1a; 2023-05-31 21-48-43-504 效果图&#xff1a; 2023-06-01 13-58-26-168 3D转换 3D移动&#xff1a; transform:translateX() 在x轴移动 transform:translateY() 在y轴移动 transform:translateZ() 在z轴移动 transform:translate3d(x,y,z); …

程序设计综合实习(C语言):链表的创建

一、目的 1&#xff0e;掌握单向链表的概念 2&#xff0e;掌握单向链表的创建、查找、删除方法 二、实习环境 Visual Stdio 2022 三、实习内容、步骤与要求 1&#xff0e;创建一个单向链表&#xff0c;存放10个学生的学号&#xff0c;姓名&#xff0c;并输出这种10个学生的信…

分布式锁框架-Redisson

分布式锁框架-Redisson 一、Redisson介绍二、在SpringBoot中使用Redisson三、Redisson工作原理四、Redisson使用扩展4.1、Redisson单机连接4.2、Redisson集群连接4.3、Redisson主从连接 五、分布式锁总结5.1、分布式锁特点5.2、锁的分类5.3、Redission的使用 基于Redis看门狗机…

chatgpt赋能python:Python以图搜图:如何用Python优化SEO?

Python以图搜图&#xff1a;如何用Python优化SEO&#xff1f; 随着搜索引擎算法的普及&#xff0c;优化您的SEO策略需要更多的创意和技巧。一种方法是使用Python以图搜图&#xff0c;具有该技能可以使您的网站上升到搜索结果列表的顶部。在这篇文章中&#xff0c;我们将探讨Py…

在外部编译器中使用pyqgis

pyqgis_dragonzoebai的博客-CSDN博客 升级后整理 例如在vscode当中添加qgis提供的python解释器&#xff0c;那么就可以使用qgis.core等库 批量处理gdb文件夹&#xff0c;导出对应文件夹目录的geojson文件。 我的gdb文件均没有坐标系&#xff0c;因此需要自己设置正确的坐标系…

chatgpt赋能python:Python网页的SEO优化指南

Python 网页的 SEO 优化指南 在如今互联网高度竞争的时代&#xff0c;一个网站的优化已经成为了至关重要的一环&#xff0c;特别是 SEO 优化。而对于使用 Python 开发网站的人来说&#xff0c;如何进行 SEO 优化&#xff0c;也是需要着重考虑的问题。本文将介绍一些 Python 网…

BGP选路规则实验

1、BGP选路规则实验-基础配置 1&#xff09;拓扑 2&#xff09;基础配置 第一步&#xff1a;基础配置&#xff1a; R1的配置&#xff1a; sysname R1 # interface GigabitEthernet0/0/0 ip address 192.168.12.1 255.255.255.0 # interface GigabitEthernet0/0/1 ip addres…

DeiT详解:知识蒸馏的Transformer

DeiT详解&#xff1a;知识蒸馏的Transformer 0. 引言1. ViT2. DeiT2.1 知识蒸馏2.1.1 提出背景2.1.2 理论原理 2.2 DeiT模型 3. 总结 0. 引言 针对 ViT 需求数据量大、运算速度慢的问题&#xff0c;Facebook 与索邦大学 Matthieu Cord 教授合作发表 Training data-efficient i…

工控机设备安全-系统加固分析

工控设备安全现状 工业控制系统是支撑国民经济的重要设施&#xff0c;是工业领域的神经中枢。现在工业控制系统已经广泛应用于电力、通信、化工、交通、航天等工业领域&#xff0c;支撑起国计民生的关键基础设施。 随着传统的工业转型&#xff0c;数字化、网络化和智能化的工…

倾斜摄影三维模型数据的高程偏差修正的几何纠正技术方法探讨

倾斜摄影三维模型数据的高程偏差修正的几何纠正技术方法探讨 倾斜摄影是一种先进的数字摄影技术&#xff0c;可以生成高分辨率、高精度的三维模型数据。然而&#xff0c;在倾斜摄影中&#xff0c;由于相机的倾斜角度和地形的高程差异&#xff0c;可能会出现高程偏差问题。为了…

Java性能权威指南-总结4

Java性能权威指南-总结4 Java性能调优工具箱操作系统的工具和分析CPU运行队列磁盘使用率网络使用率 Java监控工具基本的VM信息 Java性能调优工具箱 操作系统的工具和分析 CPU运行队列 快速小结 检查应用性能时&#xff0c;首先应该审查CPU时间。优化代码的目的是提升而不是…

树莓派初体验:开机啦

感谢大佬的赞助&#xff0c;这玩意是真的贵哇&#xff0c;呜呜呜呜呜呜&#xff0c;根本买不起 一、烧录系统 需要&#xff1a;SD卡&#xff08;推荐16G&#xff09;、读卡器&#xff08;推荐高速读卡器&#xff09; 进入官网&#xff1a;https://www.raspberrypi.com/softwa…

《MYSQL必知必会》读书笔记2

哈夫曼树的学习&#xff1a; http://t.csdn.cn/XJhUI 创建计算字段 字段&#xff1a;基本上与列的意思相同&#xff08;数据库列一般称为列&#xff0c;而字段通常用于计算字段连接上&#xff09; 拼接字段 拼接&#xff1a;将值联结到一起构成单个值 把两个结拼接起来&a…

【2023最叼教程】Appium自动化环境搭建保姆级教程

APP自动化测试运行环境比较复杂&#xff0c;稍微不注意安装就会失败。我见过不少朋友&#xff0c;装了1个星期&#xff0c;Appium 的运行环境还没有搭好的。 搭建环境本身不是一个有难度的工作&#xff0c;但是 Appium 安装过程中确实存在不少隐藏的比较深的坑&#xff0c;如果…

编程(38)----------计算机的部分原理

本篇主要总结一些计算机的理论部分. 计算机在发展历程中,无论是最早的巨无霸机器,还是现在小到可以拿在手中的掌机.只要其本质上是计算机,在最基础的结构上,都是以冯诺依曼体系所构建的. 冯诺依曼体系大致将计算机分为几个最重要的部分:输入,输出,中央处理器,存储设备.也就是…

Meta Quest 3发布:超越虚拟现实全新境界

2023年6月2日凌晨&#xff0c;全球领先的虚拟现实技术公司Meta隆重推出了Meta Quest 3无线头戴式显示器。这款全新设计的头戴设备从内到外焕然一新&#xff0c;为用户提供了全方位的体验。 借助全新一代骁龙芯片&#xff0c;Meta Quest 3拥有比Quest 2更高两倍的GPU处理能力&am…

VanillaNet详解:极简的网络模型

VanillaNet详解&#xff1a;极简的网络模型 0. 引言1. 网络结构2. 如何提高简单网络的非线性2.1 深度训练策略2.2 基于级数启发的激活函数3. 实验4. 代码解析总结 0. 引言 深度学习模型架构越复杂越好吗&#xff1f; 自过去的几十年里&#xff0c;人工神经网络取得了显著的进…

chatgpt赋能python:Python在硬件开发中的作用

Python在硬件开发中的作用 随着物联网的快速发展&#xff0c;越来越多的硬件设备需要与互联网连接。Python在硬件开发过程中扮演着重要的角色。 Python的优势 作为一种高级编程语言&#xff0c;Python有以下几个优势&#xff1a; 简单易学&#xff1a;Python的语法简洁清晰…

chatgpt赋能python:Python做网页可以直接访问吗?

Python做网页可以直接访问吗&#xff1f; Python作为一门功能强大的编程语言&#xff0c;近年来在Web开发中也越来越受欢迎。很多人或企业都采用Python来开发网站和网页&#xff0c;那么问题来了&#xff0c;Python做的网页能否直接被搜索引擎访问和索引呢&#xff1f; Pytho…