Servlet的特性(一)

news2024/9/20 5:49:41

Servlet的主要用途:

  1. 接受、处理来自浏览器端(BS架构中的B端)的请求和用户输入

  2. 响应来自数据库或者服务端(BS架构中的S端)产生的数据到浏览器端,动态构建网页。

手动实现Servlet小程序

实现步骤

  1. 自定义一个类型,实现Servlet接口或者继承HttpServlet类

  2. 使用javac指令,将源文件编译成字节码文件

  3. 将编译完的字节码文件按照一定的组织结构打包,并编写web.xml配置文件

  4. 将整个组织结构放入Tomcat的webapps文件夹中

  5. 启动Tomcat,在浏览器上输入符合规范的地址去访问Servlet。

步骤1: 编写一个类HelloWorldServlet,继承HttpServlet类型

package com.zrgj;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloWorldServlet extends HttpServlet{
	@Override
	public void service(HttpServletRequest request,HttpServletResponse response)
	throws ServletException,IOException{
		response.getWriter().println("hello world");
	}
}

步骤2: 编译,生成.class文件

javac HelloWorldServlet.java -classpath   xxxxx\xxxxxx\servlet-api.jar

步骤3:项目的组织结构

appName 项目名称(主要用来区分其他项目的)
	--   WEB-INF文件夹
			 -- classes文件夹: 用来存储class文件的整个路径
			 		   com\zrgj\HelloWorldServlet.class
			 -- lib(可选文件夹)
			 -- web.xml:  当前项目的主配置文件

web.xml里的内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- web-app根标记下,可以有很多对servlet和servlet-mapping标记
           servlet里与servlet-mapping里的name相同,被认为是一组。
			name:随便命名
	        class: 书写classes目录下的具体类路径,也就是类全名
		    url-pattern: 寻找指定servlet组件的路径
		   注意:如果定义了url-pattern,那么浏览器的路径如下:
		   http://localhost:8080/appName/url-pattern
     -->
    <servlet>
        <servlet-name>a</servlet-name>
        <servlet-class>com.zrgj.HelloWorldServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>a</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

步骤4:将整个文件夹组织结构,拷贝到tomcat的webapps文件夹里。这一步的专业术语叫部署项目

步骤5:启动tomcat

步骤6:在浏览器上输入地址,向tomcat容器发送请求

http://localhost:8080/myfirstweb/hello ,回车后,应该会看到hello world字样

部署完项目后的执行流程:
1. 浏览器向服务器发送请求,访问服务器上的某一个项目下的某一个资源。   
   路径如下:http://服务器IP:服务器端口/项目名/资源路径
2. 服务器收到请求后,会先确认并找到该项目
3. 如果找到了该项目,会加载里面的web.xml配置文件
4. 然后通过资源路径,去匹配servlet-mapping里的url-pattern,来确定servlet-name。
5. 根据servlet-name,定位到对应的servlet里的servlet-class。
6. 根据servlet-class标签里的类全名,去项目的classes目录下查找对应的类文件
7. 执行类文件里的service方法,将数据最终响应给浏览器

Idea开发Servlet程序

第一步:创建java项目(java module):MyFirstWeb。

第二步:添加web框架支持。 也就是找到add Frameworks Support,选择web application.

第三步:在WEB-INF下创建lib文件夹,将第三方jar包放入,比如servlet-api.jar文件

第四步:编写Servlet组件

第五步:配置web.xml

第六步:关联tomcat:

常见的HTTP错误代码

404:Not found,表示您要请求的资源服务器无法帮您找到。原因可能如下

1. 没有写web.xml配置文件
2. 地址栏上的地址信息写错了,可能没有写部署的项目名称,或者项目名后的资源路径写错误
3. web.xml里的url-pattern对应上了,但是两个name没有对应上。
6:上面都改正确了,但是忘记了重新部署。   ^_^

405:Method Not Allowed

servlet组件里没有重写service/doGet/doPost方法,或者是方法写的不标准,比如参数,异常的声明等。

500:Internal Server Error,表示服务器内部发生错误

1. servlet-class标签里的类名书写有误。
2. 编写的类型不是一个servlet组件,也就是没有继承HttpServlet或者实现Servlet接口
3. Servlet 代码中抛出异常导致的,也就是servlet类里你写的代码有问题

Servlet的生命周期

servlet容器是如何创建Servlet对象,如何为Servlet对象分配资源,如何调用Servlet对象的方法来处理请求,以及如何销毁Servlet对象的整个过程。而这个过程可以分为四个阶段,分别是实例化阶段、初始化阶段、就绪阶段、销毁阶段

阶段一:实例化

什么是实例化?

  • 即容器调用Servlet的构造器,创建一个Servlet对象

MySecondServlet  s = new MySecondServlet()   <------不是程序员调用的,而是容器帮助我们调用并创建的。

什么时候实例化?

  • 情形一,开始容器里面没有Servlet对象,只有收到请求后才会创建Servlet对象(默认情况)

当浏览器发送请求:http://localhost:8088/employee_v1/listEmp
tomcat容器会收到该请求,该请求是请求的是ListEmp.class这个组件,因此tomcat容器会帮助程序员创建ListEmp这个组件的对象

其他的没有访问过的组件,比如AddEmp,DelEmp等这些组件,在容器中没有。。。。。。

情形二,容器启动之后就立即创建相应的实例,

需要添加配置<load-on-startup>1</load-on-startup> 1表示创建,-1表示不创建

 <servlet>
        <servlet-name>addEmp</servlet-name>
        <servlet-class>com.shuilidianli.employee.web.AddEmp</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>addEmp</servlet-name>
        <url-pattern>/addEmp</url-pattern>
    </servlet-mapping>

1. 谁负责实例化servlet类(也可以叫组件)的对象  :  tomcat(servlet容器)
2. 什么时机实例化:
    - 浏览器发送请求这个组件时创建
    - 添加配置参数load-on-startup, 在tomcat服务器启动时创建。

阶段二:初始化

什么是初始化?

  • 容器在创建好Servlet对象后,会立即调用该对象的init方法

  • 一般情况下,我们不用写init方法,因为genericServlet已经提供了init方法的实现(将容器传递过来的ServletConfig对象保存下来,并且,提供了getServletConfig方法来获取ServletConfig对象)。

  • init方法只会执行一次

默认情况下,init方法不需要重写。但是有的时候,如果你有这方面的需求时,比如将公司信息作为初始化参数,用于init方法来到程序中,就可以重写init进行获取。

阶段三:就绪

容器收到请求后调用Servlet对象的service()来处理请求

阶段四:销毁

  • 容器依据自身算法删除Servlet对象,删除前会调用destroy()

  • 只会执行一次

  • 可以override destroy方法来实现自己的处理逻辑

  • 应用程序卸载时一定会调用destroy方法

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>life</servlet-name>
        <servlet-class>com.shuilidianli.web.LifeServlet</servlet-class>
<!--        设置初始化阶段的一些参数-->
        <init-param>
            <param-name>school</param-name>
            <param-value>shuilidianli</param-value>
        </init-param>
        <!-- load-on-startup: 容器启动后,就实例化该组件,默认情况下是访问时才实例化-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>life</servlet-name>
        <url-pattern>/life</url-pattern>
    </servlet-mapping>
</web-app>

组件:

package com.shuilidianli.web;

import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LifeServlet extends GenericServlet {

    public void service(ServletRequest request,
                           ServletResponse resp) throws ServletException, IOException {
        //获取初始化阶段的数据,

        //获取ServletConfig对象
        ServletConfig servletConfig = super.getServletConfig();
        //获取初始化参数
        String school = servletConfig.getInitParameter("school");
        System.out.println(school);

    }

    @Override
    public void init() throws ServletException {
        System.out.println("------init--------");
    }




    @Override
    public void destroy() {
        System.out.println("------销毁--------");
    }
}

请求方式介绍

不同的请求方式在数据传输时,会有所不同;在表单提交以及服务器处理时都会采用不同的方式。浏览器针对每种请求方式也会使用不同的缓存技术,提高相应的处理速度。

常用的请求方式有:

get:   请求服务器上指定的资源
post: 向服务器上的资源提交数据
head:  和get相似
put:   上传资源
delete: 删除资源

get请求:

浏览器发送get请求的场景:
1.  在地址栏单纯的输入一个地址
2.  a标记产生的请求
3.  form表单默认提交方式,也是get请求

注意:
1. get请求,如果带有一些提交数据,比如用户名,密码等。那么这些数据会被添加到地址栏中,不安全。
2. get请求提交的数据量比较小,在4KB以内。

post:

浏览器发送post请求的场景:
1. form表单的method属性的值为post时。

注意:
    要传输给服务器的处理数据都会在正文(http信息数据的body)中存储。相对安全

service/doGet/doPost/

实际上:当浏览器发送请求后,会默认执行servlet组件继承过来的service方法,然后service方法里的逻辑:String method = req.getMethod(); 会获取请求的方法,

如果是get请求,会执行doGet(req, resp); 如果是post请求,会执行doPost(req, resp);

上述代码说明:程序员在写servlet时,可以选择覆盖service方法,也可以选择覆盖doGet() 或者是doPost方法。前提如果是get请求,可以直接覆盖doGet(), 如果是post请求,可以直接覆盖doPost()

注意:如果重写了service方法,就不会再执行doGet/doPost方法,除非重写的service方法里调用了doGet/doPost

package com.shuilidianli.web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class TestMethodServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("-----doGet-------");
        PrintWriter pw = resp.getWriter();
        pw.println("get");
        pw.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("-----doPost-------");
        doGet(req,resp);
    }
}

web.xml

<servlet>
   <servlet-name>test</servlet-name>
   <servlet-class>com.shuilidianli.web.TestMethodServlet</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>test</servlet-name>
   <url-pattern>/test</url-pattern>
</servlet-mapping>

test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="post" action="test">
        <input type="submit" value="提交">
    </form>
</body>
</html>

请求对象

web服务器(tomcat容器)在接收到浏览器发送过来的请求后,发送过来的所有通信数据都会被web服务器进行封装和提供。这些信息主要被封装到两个对象上。

一个是HttpServletRequest类型的对象:

1. 浏览器发送的所有数据都会被web服务器封装到HttpServletRequest类型的对象上,此类型提供了相应的方法可以从对象上获取相关的数据。比如请求行的数据、消息头、实体内容(正文、参数值)
2.作用:
    读取和设置http的请求数据
    取得和设置cookies
    实现请求转发
    取得路径信息
    标识HTTP会话

参数值的获取

不管是get请求提交的少量数据,还是post请求提交的大量的数据。那么服务器端就要接受到这些数据,并处理。

浏览器发送的数据有以下两种情况:

1:1的情况

localhost:8088/day42_servlet/web?username=zhangsan&password=123456

上述的地址,?后面是要传入到服务端的数据,username对应一个值,password对应一个值

1:N的情况

localhost:8088/day42_servlet/web?username=zhangsan&password=123456&hobby=book&hobby=movie&gender=f

上述的地址,?后面是要传入到服务端的数据,username对应一个值,password对应一个值,gender对应一个值
而hobby对应两个值,hobby与它的值就是1:N的情况

服务端的请求对象提供了相应的获取参数值的方法。

方法1:String getParameter()  :  
       解析:获取的是1对1的参数值,  比如用户名或密码
       用法: String value = request.getParameter("key")
       注意: 如果没有获取值,那么返回的是null,而不是异常   


方法2:String[] getParameterValues():  
       解析:获取的是1对多的参数值,  比如 爱好
       用法:String[] values = request.getParameter("key")
       注意:如果没有获取值,那么返回的是null,而不是异常 

参数:浏览器封装的参数是以键值对的形式体现的,比如username=zhangsan. username是参数名,zhangsan是参数值。

注意:input元素的name属性用于指定参数名

响应对象

一个是HttpServletResponse类型的对象

1.web服务器会对浏览器进行响应,响应的所有数据都会被封装到HttpServletResponse类型的对象上。此类型提供了相关设置方法,可以设置状态行、消息头、实体内容等。
2.作用:
    设置客户端的输出内容
    设置响应状态码
    设置浏览器的解码方式
    设置cookies
    实现重定向

中文乱码问题

两处乱码:

第一处: 后端响应浏览器时: response向浏览器返回中文时出现乱码

response.getWriter().println("你好,Servlet");

第二处: post请求时,浏览器向后端发送了中文时出现了乱码

String username = request.getParameter("username");      username=张三    是汉字时

乱码的情况原因很简单,就是编码过程使用的字符集与解码过程使用的字符集不一致造成的,不是逻辑问题。

编码:字符串变成字节数组的形式    "中国"-->[-86,-92,-78,-12,-64,-23]     使用字符手册 UTF8   三个字节对应一个汉字
解码:字节数组变成字符串的形式    [-86,-92,-78,-12,-64,-23]-->"中国"     使用字符手册uncode  两个字节对应一个汉字

浏览器使用post请求方式提交中文时:

1. 确保浏览器的html页面是utf-8编码集
2. 在servlet中(也就是服务端)的service方法的第一行处,使用
   request.setCharacterEncoding("utf-8");即可

浏览器使用get请求方式提交中文时:

1. 确保浏览器的html页面是utf-8编码集
2. 因为服务端默认使用iso-8859-1进行解码。我们的解决方式就是在服务端再次使用iso-8859-1进行编码,然后在使用utf-8进行解码。
       String username = request.getParameter("username") // 
       byte[] bs =  username.getBytes("iso-8859-1") ; 
       //借助string的构造器,重新解码即可
       String str = new String(bs,"utf-8");// 

服务端向浏览器发送中文乱码情况:

只需要在服务端对中文进行编码前,写入这一行代码即可:
response.setContentType("text/html;charset=utf8");

Servlet调用DAO

第一步:引入第三方资源,比如相关依赖的jar包坐标, mysql驱动,druid数据源

第二步:在resources配置druid.properties

第三步:编写DruidUtil工具类,并测试(里面提供main方法)

第四步:根据ORM关系模型,编写emp表的实体类Emp

第五步:编写相关的Dao接口以及Dao接口的实现类

第六步:编写EmpServlet组件

第七步: 编写web.xml

第八步:File–>Project structure–>Artifacts–>Available Elements–>右键点击项目–>put into output root

第九步:重新部署项目(启动tomcat) 在浏览器上输入地址进行测试

总结 servlet的运行流程:

1: 浏览器发送地址请求
2: 根据ip和port号定位到tomcat容器
3: tomcat容器根据appName确定项目
4: 然后tomcat查找当前项目下的web.xml配置信息,用url-pattern与地址信息进行匹配
5: 根据两个相同的name找到对应的servlet组件
6: 执行servlet组件里的service方法(执行的是classes里的class文件)
7: 向浏览器发送响应信息。
8:浏览器收到响应信息后会进行解析和显示。

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

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

相关文章

Spring Boot 集成 Redisson 实现消息队列

包含组件内容 RedisQueue&#xff1a;消息队列监听标识RedisQueueInit&#xff1a;Redis队列监听器RedisQueueListener&#xff1a;Redis消息队列监听实现RedisQueueService&#xff1a;Redis消息队列服务工具 代码实现 RedisQueue import java.lang.annotation.ElementTyp…

GD32E230 RTC报警中断功能使用

GD32E230 RTC报警中断使用 GD32E230 RTC时钟源有3个&#xff0c;一个是内部RC振动器产生的40KHz作为时钟源&#xff0c;或者是有外部32768Hz晶振.,或者外部高速时钟晶振分频作为时钟源。 &#x1f516;个人认为最难理解难点的就是有关RTC时钟异步预分频和同步预分频的计算。在对…

C++第二节入门 - 缺省参数和函数重载

一、缺省参数 1、概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。 在调用该函数的时候&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参&#xff01; #include<iostream> using namespace std;void Func(int a 0) {c…

2024 水博会,国信华源登场,数智创新助力水利高质量发展

9月4日-6日&#xff0c;由中国水利学会和中国水利工程协会共同主办的2024中国水博览会暨第十九届中国&#xff08;国际&#xff09;水务创新技术交流会在重庆国际博览中心召开。 本次水博会以“展水利前沿新技术 览新质生产力场景”为主题&#xff0c;国信华源携最新智能监测预…

【佳学基因检测】如何升级一个不再维护的软件包中的PHP代码?

如何升级一个不再维护的软件包中的PHP代码&#xff1f; 为什么要升级一个不再维护但是仍在使用的软件包中的PHP代码&#xff1f; 升级一个不再维护但仍在使用的软件包中的 PHP 代码是一个复杂但重要的过程。虽然这些软件包可能已经不再活跃地维护或更新&#xff0c;但升级其代…

通信工程学习:什么是ATM异步转移模式

ATM&#xff1a;异步转移模式 ATM&#xff1a;Asynchronous Transfer Mode&#xff08;异步转移模式&#xff09;是一种先进的通信技术&#xff0c;它采用固定长度的信元&#xff08;Cell&#xff09;作为信息传输、复用、交换及处理的基本单位&#xff0c;并通过异步时分复用的…

挖矿木马-Linux

目录 介绍步骤 介绍 1、挖矿木马靶机中切换至root用户执行/root目录下的start.sh和attack.sh 2、题目服务器中包含两个应用场景&#xff0c;redis服务和hpMyAdmin服务&#xff0c;黑客分别通过两场景进行入侵&#xff0c;入侵与后续利用线路路如下&#xff1a; redis服务&…

Tomcat Request Cookie 丢失问题

优质博文&#xff1a;IT-BLOG-CN 一、问题描述 生产环境偶尔(涉及到多线程处理)出现"前端传递Cookie为空"的告警&#xff0c;导致前端请求丢失&#xff0c;出现请求失败问题。告警内容如下 前端传递Cookie为空 告警内容&#xff1a;服务端获取request Cookie为空&…

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民&#xff0c;网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席20…

每日一练:螺旋矩阵

一、题目要求 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1a;ma…

Java | Leetcode Java题解之第396题旋转函数

题目&#xff1a; 题解&#xff1a; class Solution {public int maxRotateFunction(int[] nums) {int f 0, n nums.length, numSum Arrays.stream(nums).sum();for (int i 0; i < n; i) {f i * nums[i];}int res f;for (int i n - 1; i > 0; i--) {f numSum - …

NISP 一级 | 3.1 网络基础知识

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;Internet 和 TCP/IP 协议 因特网&#xff08;Internet&#xff09;通过 TCP/IP 协议将遍布在全世界各地的计算机互联&#xff0c;从而形成超级计算机网络。因特网为用户提供了非…

【50 Pandas+Pyecharts | 暑期档电影票房数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 提取电影名称 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 电影总票房排行3.2 各电影票房占比3.3 2023中国各省地区大学数量分布3.4 《抓…

浅谈产线工控安全,产线工控安全的有效方案

随着工业4.0的发展&#xff0c;产线日益智能化&#xff0c;生产网已经发展成一个组网的计算机环境&#xff0c;虽然都进行了隔离&#xff0c;但仍需和外部进行数据交互&#xff0c;导致有病毒入侵可能。 产线工控安全事件不断 深信达MCK主机加固方案&#xff0c;针对产线工控…

工业无人机性能参数特点!!!

一、基本性能参数 动力系统&#xff1a;工业无人机多采用电动或油动动力系统&#xff0c;以提供足够的推力和续航能力。电动无人机通常具有较低的噪音和振动&#xff0c;适合城市或近距离作业&#xff1b;而油动无人机则具有更长的续航时间和更大的载重能力&#xff0c;适合远…

安科瑞Acrel-1000DP分布式光伏监控系统平台的设计与应用-安科瑞 蒋静

针对用户新能源接入后存在安全隐患、缺少有效监控、发电效率无法保证、收益计算困难、运行维护效率低等通点&#xff0c;提出的Acrel-1000DP分布式光伏监控系统平台&#xff0c;对整个用户电站全面监控&#xff0c;为用户实现降低能源使用成本、减轻变压器负载、余电上网&#…

MySQL基础作业三

查询 1.分别查询student表和score表的所有记录 mysql> select *from student; ---------------------------------------------------- | id | name | sex | birth | department | address | ---------------------------------------------------- | 901 | 张三丰…

大模型×认知科学:多维潜空间洞悉复杂认知

最近的一篇来自于Cognitive Sciences的精炼综述带给了我一些对于当下AI的某种反向思考&#x1f914;&#xff0c;分享给大家&#xff1a; 这篇综述讨论了如何通过多种降维技术揭示认知科学中的潜在表征空间&#xff0c;并探讨了选择适合研究目标的嵌入算法时需要考虑的关键因素…

每日一题,力扣leetcode Hot100之206反转链表

原来的链表是1-2-3-4-5-null 反转后是5-4-3-2-1-null 只需要循环遍历&#xff0c;并且借一个temp便可以完成反转 class Solution:def reverseList(self, head: ListNode) -> ListNode:cur, pre head, Nonewhile cur:tmp cur.next # 暂存后继节点 cur.nextcur.next pre…

AndroidStudio清除重置Http Proxy代理的方式

问题背景 在国内做代码开发的都知道&#xff0c;在国际互联网我们存在看不见的墙&#xff0c;导致无法访问一些代码库和资源&#xff0c;所以在使用开发工具拉取第三方库的时候总会遇到无法连接或者连接超时的情况&#xff0c;所以就会使用一些安全的网络代理工具&#xff0c;辅…