JavaWeb_Servlet+Http协议概述

本文详细介绍了JavaWeb中Servlet的初始化时机与映射配置,以及HTTP协议的基础知识,包括请求和响应报文结构、GET与POST请求的区别。通过实例解析了如何抓取和分析HTTP请求报文,加深对Web通信的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

01_Servlet:Servlet类初始化时机

Servlet类初始化时机

问题:在浏览器第一次发送请求时,会创建Servlet对象并执行初始化方法。但Servlet在初始化时,用户只能处于等待状态,用户体验度不高 ( 用户浏览器端响应会比较慢 [在等待Servlet初始化] )

解决方案:更改Servlet的初始化时机,将第一次请求时初始化,更改为Tomcat服务器一启动就创建Servlet对象并初始化(可以提高用户体验度,提高运行效率)

当需要调整Servlet初始化时机,要在web.xml文件中给指定的Servlet添加一个标签<load-on-startup>

实现步骤:在web.xml中的<servlet>标签内部中配置:

<servlet>
    <servlet-name>...</servlet-name>
    <servlet-class>...</servlet-class>
    
    <!-- 设置Servlet的初始化时机,设置为tomcat服务器一启动就创建Servlet类对象 -->
    <!-- load-on-startup取值为正整数,数值越小优先级越高 -->
    <load-on-startup>1</load-on-startup><!-- 传入正整数,整数越小,被创建的优先级就越高 -->
    
</servlet>  

02_Servlet:Servlet映射路径配置

在web.xml核心配置文件的标签:中的映射路径配置存在以下几种方式:

1. 完全匹配  		 /user/hello		  资源路径为/user/hello时可以访问
2. 目录匹配			/user/*				  资源路径中含有/user目录均可访问
3. 后缀名匹配	    *.do			     资源路径中以.do结尾的均可访问
4. 缺省路径			/			          访问的路径找不到,就会去找缺省路径

tomcat获得匹配路径时,优先级顺序:1 > 2 > 3 > 4

注意:开发中一般使用完全匹配,即一个Servlet对应一个映射路径

03_HTTP:http协议概述

  • 浏览器和服务器通信是按照一定格式进行数据交互的。这种数据交互的格式规范就是协议

    • 协议:网络通信中,以固定的格式进行数据传输
  • 浏览器和服务器是按照HTTP协议进行数据通信的(通信就是一次请求,一次响应)

  • HTTP协议分为:请求协议和响应协议

    • 请求协议:浏览器将数据以请求格式发送到服务器
    • 响应协议:服务器将数据以响应格式返回给浏览器

HTTP协议的介绍

HTTP协议:

  • 全称超文本传输协议(HTTP,HyperText Transfer Protocol),是互联网上应用最为广泛的一种网络协议

  • 所有的WWW文件(客户机/服务器网络)都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法

    1960年美国人TedNelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。
    Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC(一系列以编号排定的文件),其中著名的RFC 2616定义了HTTP 1.1
    
    协议版本:
    - [x] HTTP/1.0,发送请求,创建一次连接,获得一个web资源,连接断开。
    - [x] HTTP/1.1,发送请求,创建一次连接,获得多个web资源,连接断开。
    
  • 简而言之,http协议就是浏览器和服务器进行数据传输的固定格式。

我们之前学习过TCP协议,而Java中使用Socket类表示TCP协议,而在web技术中Java同样提供了HttpServletRequest接口表示HTTP协议。

HTTP协议的请求方式

浏览器和服务器是基于请求/响应的交互模式。请求和响应必须成对,先有请求后有响应。

浏览器是通过请求协议将数据传递到服务器,浏览器访问服务器几种方式:

请求方式请求说明
OPTIONS返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*'的请求来测试服务器的功能性。
HEAD向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息
GET向特定的资源发出请求(a href="servlet"标签/js location.href=“servlet”,在浏览器输入网址)
POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建或已有资源的修改
PUT向指定资源位置上传其最新内容
DELETE请求服务器删除Request-URI所标识的资源
TRACE回显服务器收到的请求,主要用于测试或诊断
CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器

虽然HTTP的请求方式有8种,但是我们在实际应用中常用的也就是get和post

HTTP协议的结构

HTTP协议的结构包括两部分:请求报文,响应报文

  • 请求报文:
    • 浏览器给服务器发送的请求数据的格式。请求报文主要包括:请求行请求头请求体
  • 响应报文:
    • 服务器给浏览器(客户端)响应的数据格式。响应报文主要包括:响应行响应头响应体

总结:

  • 浏览器和tomcat服务器交互时,必须遵循http协议

  • http协议分为:

    • 请求协议: 浏览器向tomcat服务器发送固定格式的请求数据
      • 请求数据包含:
        • 请求行
        • 请求头
        • 请求体
    • 响应协议:tomcat服务器向浏览器发送固定格式的响应数据
      • 响应数据包含:
        • 响应行
        • 响应头
        • 响应体

    get请求的特点:

    • 请求的数据在跟在请求路径的后面,以?作为分隔
      • 请求的数据会显示在地址栏中
      • 数据不安全
    • 请求的数据受浏览器的限制
      • 不同的浏览器对地址栏中的URL字符串长度要求不同

    post请求的特点:

    • 请求的数据不会跟在请求路径的后面(请求数据存放在请求体中)
      • 数据相对安全
    • 请求数据不受浏览器限制(适用于数据比较大的操作)

04_HTTP:抓取http请求报文

准备工作

通过浏览器可以抓取请求的数据,但是现在的浏览器都对请求的参数在格式上进行了优化。如果想要看到原始的请求报文,需要使用到工具。我们学习中使用chrome浏览器自带的工具对请求数据进行抓取分析。

第1步:在idea中创建html文件

request01.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h2>GET请求</h2>
    <form action="/getServlet" method="get">
        用户名:<input type="text" name="username" value="zhangsan" /><br>
        密码:<input type="text" name="pwd" value="123" /><br>
        <input type="submit" value="提交"/>
    </form>


<h2>POST请求</h2>
    <form action="/postServlet" method="post">
        用户名:<input type="text" name="username" value="zhangsan"/><br>
        密码:<input type="text" name="pwd" value="123"/><br>
        <input type="submit" value="提交"/>
    </form>

</body>
</html>

第2步:在idea中创建Servlet

GetServlet代码:(GET请求)

@WebServlet("/getServlet")
public class GetServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

PostServlet代码: (POST请求)

@WebServlet("/postServlet")
public class PostServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

第3步:启动Tomcat服务器,打开Chrome浏览器访问request01.html页面

页面显示效果:

请添加图片描述

使用chrome浏览器抓取GET请求报文

方式:点击GET请求提交按钮,然后按下快捷键F12

请添加图片描述

使用chrome浏览器抓取POST请求报文

方式:点击POST请求提交按钮,然后按下快捷键F12

请添加图片描述

注意:post请求时表单中的数据没有存在于url后面

结论:

  • GET请求:
    • 请求的数据是包含在URL路径后面,所以没有请求体
  • POST请求:
    • 请求的数据没有放在URL路径后面,post请求的数据存储在请求体中

05_HTTP:http请求报文分析

GET请求报文结构

请求报文主要包括:请求行、请求头 、请求体

GET请求抓取包的内容:

【请求行】
Request URL: http://localhost:8080/getServlet?username=lisi&password=1234
Request Method: GET


【请求头】
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: keep-alive
Cookie: Idea-b448aa5d=cd5f4ed8-f3f1-4815-82c0-776f9477ca73; life=lifetime; JSESSIONID=4138D7A0EAAB9788E9AD01900F064832
Host: localhost:8080
Referer: http://localhost:8080/demo01.html
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36


【请求体】

说明:get请求,请求体为空(随着请求发送的数据都拼接在url后面)

POST请求报文结构

POST请求抓取包的内容:

【请求行】
Request URL: http://localhost:8080/postServlet
Request Method: POST


【请求头】
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cache-Control: max-age=0
Connection: keep-alive
Content-Length: 27
Content-Type: application/x-www-form-urlencoded
Cookie: Idea-b448aa5d=cd5f4ed8-f3f1-4815-82c0-776f9477ca73; life=lifetime; JSESSIONID=4138D7A0EAAB9788E9AD01900F064832
Host: localhost:8080
Origin: http://localhost:8080
Referer: http://localhost:8080/demo01.html
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36


【请求体】
username: lisi
password: 1234

分析请求报文

请求行

  • 请求行位于请求报文的第一行,由:url请求方式协议/版本 组成

    Request URL: http://localhost:8080/postServlet
    Request Method: POST
    

​ 说明:由于浏览器的原因我们看不到请求协议和版本

请求头

  • 位于请求行的下面,以键值对的形式给服务器传递信息 (部分请求头信息是非必须的)

    Host: localhost:63342   #本次请求的目标地址
    Connection: keep-aliv   #保持连接状态(keep-aliv 表示浏览器和服务器进行长连接)
    Content-Length: 25      #实体数据的大小(25B)
    Cookie: JSESSIONID=AEE81E76BF586D353D84886D9B5E0BFD;
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
    

常用的请求头:

请求头示例说明
User-AgentUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)浏览器携带的用户操作系统,浏览器版本等信息

请求体

  • get请求请求体为空
  • post请求的请求体传递请求参数

刚才通过抓包看到post请求体中数据

username: lisi
password: 1234

小结

http请求报文包含三部分内容:

  • 请求行 (第一部分)
    • 包含:URL、请求方式、协议/版本
  • 请求头 (第二部分)
    • 内容是以KV形式存在
  • 请求体 (第三部分) //get请求没有请求体 post请求体中存放就是发送给tomcat服务器的请求数据

06_HTTP:http协议小结

HTTP协议

  • http协议:超文本传输协议,定义了浏览器与服务器之间数据传输的格式

  • HTTP协议组成:

    • 请求报文:请求行、请求头、请求体
      • 请求行:
        • 请求报文中的第一行数据,包括请求方式URL协议/版本 ;
      • 请求头:
        • 以键值对的数据格式,给服务器传输数据。常用的请求头:user-agent,cookie;
      • 请求体:
        • get请求:有请求体,但是没有内容
        • post请求:请求体传递请求参数
    • 响应报文:响应行,响应头,响应体
  • 浏览器通过HTTP协议的请求协议,将数据传送到服务器中。

  • GET和POST请求区别:

    • GET请求
      • 请求行直接传递请求参数,将请求参数追加在URL后面 (数据不安全)
        • 例如:form.html?username=jack&username=1234
      • URL长度限制(不同浏览器限制大小不一致),GET请求方式的数据大小,不可以传输数据量较大或者非文本数据。 例如:图片、视频
      • 请求体里面没有内容
    • POST请求
      • 请求参数以请求体形式发送给服务器,数据传输安全
      • 请求数据可以为非文本数据,可以传输数据量较大的数据
      • 只有表单mthod属性设置为是post请求,才可以实现数据存储在请求体中
        • 其他的都是get请求。常见GET请求:地址栏直接访问、
  • 请求体:

    • get请求:有请求体,但是没有内容
    • post请求:请求体传递请求参数
  • 响应报文:响应行,响应头,响应体

  • 浏览器通过HTTP协议的请求协议,将数据传送到服务器中。

  • GET和POST请求区别:

    • GET请求
      • 请求行直接传递请求参数,将请求参数追加在URL后面 (数据不安全)
        • 例如:form.html?username=jack&username=1234
      • URL长度限制(不同浏览器限制大小不一致),GET请求方式的数据大小,不可以传输数据量较大或者非文本数据。 例如:图片、视频
      • 请求体里面没有内容
    • POST请求
      • 请求参数以请求体形式发送给服务器,数据传输安全
      • 请求数据可以为非文本数据,可以传输数据量较大的数据
      • 只有表单mthod属性设置为是post请求,才可以实现数据存储在请求体中
        • 其他的都是get请求。常见GET请求:地址栏直接访问、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值