让天下没有难学的技术
06-Servlet
讲师:王振国
今日任务
1.Servlet 技术
a)什么是 Servlet
1、Servlet 是 JavaEE 规范之一。规范就是接口
2、Servlet就 JavaWeb 三大组件之一。三大组件分别是: Servlet程 序 、Filter过 滤 器 、Listener 监听器。
3、Servlet是运行在服务器上的一个 java 小程序, 它可以接收客户端发送过来的请求,并响应数据给客户端。
b)手动实现 Servlet 程序
1、 编写一个类去实现 Servlet 接口
2、实现 service 方法,处理请求,并响应数据
3、 到 web.xml 中去配置 servlet 程序的访问地址
Servlet 程序的示例代码:
public class HelloServlet implements Servlet { | |
---|---|
/** | |
*service *@param *@param *@throws *@throws | |
*/ |
方法是专门用来处理请求和响应的
servletRequest
servletResponse
ServletException
IOException |
| @Override
public void service(ServletRequest servletRequest,ServletResponse servletResponse)throws
ServletException,IOException {
System.out.println(“Hello Servlet 被访问了”);
}
} | |
让天下没有难学的技术
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”>
HelloServlet</servlet-name>
com.atguigu.servlet.HelloServlet
HelloServlet
_
/hello
</web-app>
常见的错误1: url-pattern 中配置的路径没有以斜杠打头。
| Terg E
avax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)<16 internal calls> |
---|
ava.lang.Thread.run(Thread.java:745) |
y:java.lang.IllegalArgumentException:Invalid surl-pattern>hello in servlet mapping |
rg.apache.catalina.core.StandardContext.addServletMappingDecoded(StandardContext.java:3195) |
rg.apache.catalina.core.StandardContext.addServletMappingDecoded(Standardcontext.java:3182) |
anache catalina stantun CnntextCnnfis cnnfigureCnntext(CnntextCnnfig iaua·13841 |
常见错误2:servlet-name 配置的值不存在:
fagement.remote.rmi.RNIConnectionImplsPrivilegedoperation.run( RMTConnectionImpl.java:1309)<1 internal
cali
agement.remote.rmi .RMIConnectionImpl.doPrivilegedOperation( RMIConnectionImpl.java:1408 )
agement.remote.rmi .RMIConnectionImpl.invoke( RMIConnectionImpl.iava:829 )**<16 internal calls> **.Thread .run( Thread.java:745 )
lang .IllegalArgumentException : Servlet manping specifies an unknown servlet name HelloServlet1
he.catalina.core.StandardContext.addServletNappingDecoded(StandardContext.java:3191)
he.catalina.core .StandardContext .addServletMappingDecoded(StandardContext.java:3182)
he.catalina.startup.ContextConfig.configureContext(ContextConfig.java:1384)
常见错误3: servlet-class 标签的全类名配置错误:
让天下没有难学的技术
| org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(Task Thread.java: java.lang.Thread.run(Thread.java:745)
root caus
java.lang.ClassNotFoundExcept ion:com.atguigu.servlt.HelloServlet
org.apache.catalina.loadel!WebappClassLoaderbase.IoadClasy(WebappClassL oaderBase org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
org.apache.catalina.valves.Abst ract AccessLogValve.invoke(Abst ract AccessLogValve org.apache.catalina.connect or.Coyot eAdapter.service (Coyot eAdapter.java:502) org.apache.coyote.http11.Abst ractHttp11Processor.process(Abst ractHttp11Processo |
---|
c)url 地址到 Servlet 程序的访问
通过ip地扯定位服务器
通过端口号,定位Tomcat
客户端(浏览器)
8080端口 Tomcat 服务器
/06_servlet工程 /book工程 /abc工程 ……等等
类 public class Hel loSerylet {
public void service(request,response){
执行你的功能代码
}
}
web.xml 配置文件
<serlet -name>HelloServlet</servlet-name)
com.atguigu.servlet.Hel loServlet
Hel loServlet<*servtet–Hame>
localhost 是服务器ip
:8080是服务器端口号 /06_servlet 是工程路径 /hello 资源路径
http://localhost:8080/06_serylet/hel lo
/hello</ ur+patterm :
服务器硬件电脑 ip地址 (ip唯一)
http:// 表示http协议
粤带苯空登确定
d)Servlet 的生命周期
1、执行 Servlet 构造器方法
2、执行 init 初始化方法
第一、二步,是在第一次访问,的时候创建Servlet 程序会调用。
3、 执 行 service 方 法
第三步,每次访问都会调用。
4、执行 destroy 销毁方法
第四步,在 web 工程停止的时候调用。
让天下没有难学的技术
e)GET 和 POST 请求的分发处理
| **public class **HelloServlet implements Servlet {
/**
*service 方法是专门用来处理请求和响应的
*@paramservletRequest
_*@param servletResponse
@throws ServletException
_@throws IOException
*/
@Override
public void service(ServletRequest servletRequest,ServletResponse servletResponse)throws
ServletException,IOException {
System.out.println(“3 service ===Hello Servlet 被访问了”);
//类型转换(因为它有getMethod() 方法)
HttpServletRequest httpServletRequest =(HttpServletRequest)servletRequest;
//获取请求的方式
String method =httpServletRequest.getMethod();
if(“GET”.equals(method)){
doGet();
}else if(“POST”.equals(method)){
doPost();
}
}
/**
*做get 请求的操作
/
public void doGet(){
System.out.println(“get 请求”);
System.out.println(“get请求”);
}
/*
*做post 请求的操作
*/
**public void **doPost(){
System.out.println("post 请求");
System.out.println("post 请求");
} |
---|
让天下没有难学的技术
f) 通过继承 HttpServlet 实现 Servlet 程序
一般在实际项目开发中,都是使用继承HttpServlet 类的方式去实现 Servlet 程序。
1、编写一个类去继承 HttpServlet 类
2、根据业务需要重写 doGet 或 doPost 方法
3、到 web.xml中的配置 Servlet 程序的访问地址
Servlet 类的代码:
public class HelloServlet2 extends HttpServlet {
/**
*doGet() 在get 请求的时候调用
@param _req
_@param resp
*@throws ServletException
*@throws IOException
/
@Override
**protected void **doGet(HttpServletRequest req,HttpServletResponse resp) **throws ServletException,
IOException {
System.out.println("HelloServlet2 的 doGet 方法");
3
/
*doPost()
在post 请求的时候调用
req
resp
_@param
*@param
@throws
ServletException
IOException
_@throws
*/
@override
protected
void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletException,
IOException {
System.out.println(“HelloServlet2 的doPost 方法”);
}
web.xml 中的配置:
HelloServlet2
com.atguigu.servlet.HelloServlet2
</servlet>
HelloServlet2</ servlet-name>
/hello2
k/servlet-mapping>
让天下没有难学的技术
g)使用 IDEA 创建 Servlet 程序
菜单: new->Servlet 程序
| eb
ervlet
TC
em.atgui gu.servl
CHelloServlet C HelloServlet2
eb
WEB-IIF
web.xml
a.html
sp 1ndex.JSI
6_servlet.iml
eb.iml
Libraries
es and Consoles | | Hew
Cut
自Copy
Copr Reference
Copy Path.
□ Paste | |
Ctrl+X
Ctrl+C Ctrl+Alt+Shi ft+(
Ctrl+V | Java Class
x Kotlin File/Class
File
Scrat ch Hile
Package
FXML File
T package-infoiav |
Ctrl+Alt+Shift+Insert |
| — | — | — | — | — | — | — |
| | Find Usages
Find in Path
Replace in Path.
Analyze | | Alt+F7 Ctrl+Shift+F Ctrl+Shift+R
》 |
| | | HML File
ss Styleshee
as TavaScript File
s IypeScript File
package.ison File
CFML/CFC file
CoffeeScript File
r Kotlin Script
Kotlin Worksheet
TavaFXApplicatio
例 KSLI Stylesheet | | |
| | Refactor 》 | | | |
| | Add to Favorites > | | | |
| | Reformat 0ptimize Delete | | Code
Imports | Ctrl+Alt+L Ctrl+Alt+0 Delete |
| | Build Module ‘06_servlet’
Rebuild’com.atguigu.servlet’ Ctrl+Shift+F9 | | | |
| [serylet | | | |
| | Show in Explorer
Directory Path Ctrl+Alt+F12
Open in Terminal | | | Edit File Templates…
EditorConfig File
Swing UI Designer
Resgurce Bund]s
XML Configuration File
Diagr am | |
| 》Temeat Localha | | |
| ent | | On |
| | Lacal History )
S Reload from Disk | | | |
| 6_servlet:war ex | | 个
山
)》 |
| | CopareNith. Ctrl+D | | | |
| | Mark Directory as
Remove BOM | | | | Create llew Servlet
Create Tew Filter | |
配置Servlet 的信息:
Iev Servlet
×
Wame: HelloServles3
prefix and suffix
art
Package:
com.atguigu.servlet
Class:
Servlet-name
类在哪个包下
com.atguigu.servlet.HelloServlet3
ate Java EE 6 annotated class
0K
全 类 名
Cancel
让天下没有难学的技术
h)Servlet 类的继承体系
javax.servlet
Interface Servlet
Servlet 接口,只是负责定义Servlet 程序的访问规范。
实现接口
javax.servlet
Class GenericServlet
继 承
GenericServlet 类实现了Servlet 接口。做了很多空实现。
并持有一个ServletConfig 类的引用。并对ServletConfig 的使用做一些方法。
HttpServlet 抽取类实现了service) 方法,并实现了请求的分发处理
String method =req.getMethod 0;
javax.servlet.http
Class HttpServlet
继承
GET
doGet 0
POST
doPost0
负责抛异常,说不支持GET/POST 请 求
自定义的Servlet 程 序
我们只需要根据
自己的业务需要
去重写doGet
或doPost 方法即可
重 写
doGet 0
doPost)
2.ServletConfig 类
ServletConfig类从类名上来看,就知道是Servlet 程序的配置信息类。
Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。
Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对
象。
a)ServletConfig 类的三大作用
1、 可以获取 Servlet 程序的别名 servlet-name 的值
2、 获取初始化参数 init-param
3、获取 ServletContext 对象
web.xml 中的配置:
k!–servlet 标签给Tomcat 配置Servlet 程序–>
HelloServlet
山 尚硅谷
让天下没有难学的技术
|
com.atguigu.servlet.HelloServlet
username
root
url
jdbc:mysql://localhost:3306/test
</servlet>
<servlet-mapping)
HelloServlet
/hello
</servlet-mapping> |
---|
**Servlet **中的代码:
@Override
**public void **init(ServletConfig servletConfig)throws ServletException {
System.out.println("2 init 初始化方法");
1,可以获取Servlet 程序的别名servlet-name 的值
System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName());
2、获取初始化参数init-param
System.out.println(" 初始化参数 username 的值是;“+ servletConfig.getInitParameter(“username”)); System.out.println(” 初始化参数url 的值是;" + servletConfig.getInitParameter(“url”));
3、获取ServletContext 对象
System.out.println(servletConfig.getServletContext());
}
//
//
//
注意点:
山 尚硅谷
让天下没有难学的技术
| | | @Override
public void init(ServletCanfig comrig)throws Se super.init(config); | 重写init方法里面一定要调用父类 的init(ServletConfig)操作 | |
| — | — | — | — | — |
| | | System.out.println("重写了init初始化方法,做了一些工作");
} | | |
3.ServletContext 类
a)什么是 ServletContext?
1、ServletContext 是一个接口,它表示Servlet上下文对象
2、 一个 web 工程,只有一个 ServletContext 对象实例。
3 、ServletContext 对象是一个域对象。
4、ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁。
什么是域对象?
域对象,是可以像Map 一样存取数据的对象,叫域对象。
这里的域指的是存取数据的操作范围,整个 web 工程。
Map
域对象
存数据
put()
setAttribute()
取数据
get()
getAttribute()
删除数据
remove()
removeAttribute();
b)ServletContext 类的四个作用
1、 获取 web.xml 中配置的上下文参数 context-param
2、 获取当前的工程路径,格式:/工程路径
3、 获取工程部署后在服务器硬盘上的绝对路径
4、 像 Map一样存取数据
ServletContext 演示代码:
**protected void **doGet(HttpServletRequest request,HttpServletResponse response) throws
ServletException,IOException {
// 1、获取web.xmL 中配置的上下文参数context-param
ServletContext context =getServletConfig().getServletContext();
String username =context.getInitParameter(“username”);
System.out.println("context-param 参数 username 的值是:"+ username);
System.out.println("context-param 参数 password 的值是:"+
context.getInitParameter(“password”));
2、获取当前的工程路径,格式:/工程路径
}
尚硅谷
山
让天下没有难学的技术
System.out.println(" 当前工程路径:"+ context.getContextPath()) ;
3、获取工程部署后在服务器硬盘上的绝对路径
/**
* /斜杠被服务器解析地址为:http://ip:port/ 工程名/ 映射到IDEA 代码的web 目录
*/
System.out.println(" 工程部署的路径是:"+ context.getRealPath(“/”) );
System.out.println(" 工程下 css 目录的绝对路径是:"+ context.getRealPath(“/css”));
System.out.println(" 工程下 imgs 目录1 .jpg 的绝对路径是:"+ **context.getRealPath(“/imgs/1.jpg”) **);
web.xml 中的配置:
k!–context-param 是上下文参数(它属于整个web 工程)–>
<param-name>username
context
k**/context-param>**
<param-name>password</ param-name>
root</ param-value>
k**/context-param>**
ServletContext 像 Map一样存取数据:
ContextServlet1 代码:
public class ContextServlet1 extends HttpServlet {
**protected void **doGet(HttpServletRequest request,HttpServletResponse response)throws
ServletException,IOException {
//获取ServletContext 对象
ServletContext context =getServletContext();
System.out.println(context);
System.out.println(" 保存之前:Context1 获取 key1 的值是:"+ **context.getAttribute(“key1”)) **;
context.setAttribute(“key1”,“value1”);
System.out.println("Context1 中获取域数据 key1 的值是:"+ context.getAttribute(“key1”));
}
ContextServlet2 代码:
protected void doGet(HttpServletRequest request,HttpServletResponse response) **throws **ServletException,
IOException {
ServletContext context =getServletContext();
让天下没有难学的技术
System.out.println(context);
Sys tem.out.println("Context2
中获取域数据 key1 的值是:"+ context.getAttribute(“key1”))
;
4.HTTP 协 议
a)什么是 HTTP 协议
什么是协议?
协议是指双方,或多方,相互约定好,大家都需要遵守的规则,叫协议。
所谓HTTP 协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫HTTP 协议。
HTTP 协议中的数据又叫报文。
b)请求的 HTTP 协议格式
客户端给服务器发送数据叫请求。
服务器给客户端回传数据叫响应。
请求又分为GET 请求,和 POST 请求两种
i.GET 请 求
1、 请求行
(1) 请求的方式 GET
(2)请求的资源路径[+?+请求参数]
(3)请求的协议的版本号 HTTP/1.1
2、 请求头
key:value 组 成 不同的键值对,表示不同的含义。
山 尚硅谷
让天下没有难学的技术
|
| |
| — | — |
| A c c e p t : 告 诉 服 务 器 , 客 户 端 可 以 接 收 的 数 据 类 型
A cc e p t - L a n g u a g e ; 告 诉 服 务 器 客 户 端 可 以 接 收 的 语 言 类 型 | 请求头 |
| zh CN 中文中国
en Us 英文美国
U s e r - A g e n t : 就 是 浏 览 器 的 信 息
Accept -En c o d i n g : 告 诉 服 务 器 , 客 户 端 可 以 接 收 的 数 据 编 码 ( 压 缩 ) 格 式
H o s t : 表 示 请 求 的 服 务 器 i p 和 端 口 号
C o n n e c t i o n : 告 诉 服 务 器 请 求 连 接 如 何 处 理
Keep-Alive 告 诉 服 务 器 回 传 数 据 不 要 马 上 关 闭 , 保 持 一 小 段 时 间 的 连 接
Closed 马上关闭 | |
ii.POST 请 求
1、 请求行
(1) 请求的方式 POST
(2) 请求的资源路径[+?+请求参数]
(3) 请求的协议的版本号 HTTP/1.1
2、请求头
- key:value 不同的请求头,有不同的含义
空行
3、请求体 ===>>> 就是发送给服务器的数据
| 以 下 是 P O S T 请 求 H T T P 协 议 内 容
请求行
1、请求的方式 POST
2、请求的资源路径 /06_servlet/hello3
3、请求的协议和版本号 HTTP/1.1
(POST /06 servlet/hel1o3 HTTP/1.1)
空 行
action=login&username=root —— >请求体,发送给服务器的数据
Accept:表示客户端可以接收的数据类型
请求头
Accept-Language:表示客户端可以接收的语言类型
Referer:表示请求发起时,测览器地址栏中的地址(从哪来)
User-Agent:表示测览器的信息
Content-Type:表示发送的数据的类型
application/x-www-form-urlencoded
表示提交的数据格式是:name=value&name=value,然后对其进行url编码
url编码是把非英文内容转换为:%xx%xx
multipart/form-data
表示以多段的形式提交数据给服务器(以流的形式提交,用于上传)
Content-Lnegth:表示发送的数据的长度
Cache-Control表示如何控制缓存no-cache不缓存 |
---|
让天下没有难学的技术
iii.常用请求头的说明
Accept: 表示客户端可以接收的数据类型
Accpet-Languege: 表示客户端可以接收的语言类型
User-Agent: 表示客户端浏览器的信息
Host: 表示请求时的服务器 ip 和端口号
iv.哪些是 GET 请求,哪些是 POST 请求
GET 请求有哪些:
1、form 标签 method=get
2、a 标签
3、link标签引入 css
4、Script 标签引入 js文件
5 、img 标签引入图片
6、iframe 引入html页面
7、在浏览器地址栏中输入地址后敲回车
POST 请求有哪些:
8、form 标签 method=post
c)响应的 HTTP 协议格式
1、 响应行
(1)响应的协议和版本号
(2) 响应状态码
(3)响应状态描述符
2、 响应头
(1) key:value 不同的响应头,有其不同含义
空行
3、 响应体 ---->>> 就是回传给客户端的数据
山 尚硅谷
让天下没有难学的技术
以下内容就是响应的HTTP 协议示例:
|
HTTP/1.1200 OK
Server:Apache-Coyote /1.1
Accept-Ranges:bytes
ETag:W/“375-1578903773217”
Last-Modified:Mon,13 Jan
Content-Type:text/html
Content-Length:375 | 响应行
1、 响 应 的 协 议
2、 响 应 状 态 码
3、响应状态描述符
202008:22:53 GMT 响 应 头 |
| — | — |
Date:Mon,13 Jan 202008:38:42 GMT
空
HTTP/1.1
200
0K
Server: 表示服务器的信息
Content-Type: 表示响应体的数据类型
Content-Length: 响应体的长度
Date:请求响应的时间(这是格林时间)
action="http://localhost:8080/06_servlet/hello3"method=“post”>
type="hidden"name="action"value=“login”/>
type="hidden"name="username"value=“root”/>
type=“submit”>
响应体
d)常用的响应码说明
200 表示请求成功
302 表示请求重定向(明天讲)
404 表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)
500 表示服务器已经收到请求,但是服务器内部错误(代码错误)
e)MIME 类型说明
MIME 是 HTTP 协议中数据类型。
MIME 的英文全称是"Multipurpose Internet Mail Extensions”多功能 Internet 邮件扩充服务。MIME 类型的格式是“大类型/小
类型”,并与某一种文件的扩展名相对应。
常见的 MIME 类型:
文件 | MIME类型 |
---|---|
超文本标记语言文本 | .html,.htm text/html |
普通文本 | .txt text/plain |
RTF文本 | .rtf application/rtf |
GIF图形 | .gif image/gif |
JPEG图形 | .jpeg,.jpg image/jpeg |
au声音文件 | .au audio/basic |
让天下没有难学的技术
MIDI音乐文件 | mid,.mid audio/midi,audio/x-mid |
---|---|
RealAudio音乐文件 | .ra,.ram audio/x-pn-realaudio |
M P E G 文 件 | .mpg,.mpeg video/mpeg |
AVI文件 | .avi video/x-msvideo |
GZIP文件 | ·gZ application/x-gzip |
TAR文件 | .tar application/x-tar |
谷歌浏览器如何查看 HTTP 协议:
[ Elements Console S⁰L Network Performance Memory Application Security Audits | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
☑ View: 一 Preserve log Disable cache Offline No throttling | ||||||||||||
FilteClear Regex Hide data URLs XHR JS CSS Img Media Font Doc WS Manifest Other | ||||||||||||
10000 ms | 20000 ms | 30000ms | 40000 ms | 50000 ms | 60000ms | 70000 ms | 80000ms | 900 | ||||
Name | × Headers | Preview Response Cookies Timing | ||||||||||
a.html?username=wzg168&passwo. | vGeneral | |||||||||||
Request URL:http://localhost:8080/06_servlet/a.html?usern Request Method:GET | ||||||||||||
Status Code: 200 OK | ||||||||||||
Remote Address:127.0.0.1:8080 | ||||||||||||
Referrer Policy:no-referrer-when-downgrade |
ame=wzg168&password=123
全局请求信息 | | |
456 | |
| | W Response Headers view source
Accept-Ranges:bytes
Content-Length:375
Content-Type:text/html
Date:Mon,13 Jan 202008:54:48 GMT
ETag:W/“375-1578903773217”
Last-Modified:Mon,13 Jan 202008:22:53 GMT
Server:Apache-Coyote/1.1 | | | |
响应内容 | | | | | |
| | W Request Headers view source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/ | | | | | | |
*;q=0.8 | | |
| | Accept-Encoding:gzip,deflate,sdch,br
Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4 | | | | 请求信息 | | | |
| 1 requests 1601 B transferred I Finish: | | | |
| | Cannartinns Laan-alie | | | | | | | | | |
火狐浏览器如何查看 HTTP 协议:
山尚硅谷
让天下没有难学的技术
查看器 | )控制台 □调试器 {}样式编辑器 性能 内存↑ ↓ 网 络 日存储 言 无 障 碍 环 境 | |
---|---|---|
了过滤LRL ll 所有 HTL | ||
状 7 方城名 文件 触发… 类!传输 大/ | D 消 息 头 Cookie 参数 响应 耗时 | |
228 CET io…a htrl?ucernamesz…docum…h…601…3 | ||
GET lo…favicon.ico img h…973 …9… | 请求网址:http://localhost:sese/06_servlet/a.html?username=wzg168&password=123456 请求方法:GET | |
远程地址: 127.0.0.1:8080 | ||
状 态 码 :208 OK ② | ||
版本:HTTP/1.1 | ||
了过滤消息头 | ||
w响应头(226字节) | ||
② Accept-Ranges:bytes | ||
② Content-Length:375 | ||
② Content-Type:text/html | ||
②Date:Non,13 Jan 202008:56:39 CMT | ||
②ETag:W/“375-1578903773217” | ||
②Last-Modified:Mon,13 Jan 202008:22:53 GMT | ||
② Server:Apache-Coyote/1.1 | ||
w请求头(477字节) | ||
② Accept:text/html,application/xhtml-xm…plication/xm1;q=0.9,/;q=0.8 ② Accept-Bncoding:ezip,deflate | ||
② Accept-Language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 ② Connection:keep-alive | ||
② Cookie:Idea-661643a5=fa873a04-3c5f-4a30-Be55-ab2d8070a905 | ||
②Host:localhost:8080 | ||
② Uperade-Insecure-Requests:1 | ||
② User-Agent:Mozilla/5.0(Windows NT 6.1;T…)Cecko/20100101 Firefox/71.0 |
让天下没有难学的技术