Servlet原理

 Servlet 体系结构的类层次关系

  1. Servlet(接口):定义了 Servlet 的核心生命周期方法(如 init()service()destroy()),是所有 Servlet 的顶层规范,任何 Servlet 都需实现该接口。
  2. GenericServlet(抽象类):实现了 Servlet 接口,提供了与协议无关的通用功能(如初始化、销毁等),但未具体处理 HTTP 协议相关逻辑,保留抽象方法。
  3. HttpServlet(抽象类):继承 GenericServlet,针对 HTTP 协议进行扩展,实现了基于 HTTP 方法(如 GET、POST)的请求分发逻辑(如 doGet()doPost() 等方法),专注于处理 HTTP 场景。
  4. 自定义 Servlet 类:通过继承 HttpServlet,重写对应的方法(如 doGet()doPost()),实现具体的业务逻辑,以处理客户端的 HTTP 请求。

Servlet资源准备

1、Servlet接口:

  • Servlet接口的作用:实现Servlet生命周期,定义init()、service(request,response)和destroy()方法。
  • 接口中的方法全都是抽象方法,只定义不实现,方法头默认为public abstract。
import com.qcby.Servlet.req.HttpServletRequest;
import com.qcby.Servlet.req.HttpServletResponse;public interface Servlet {void init();void service(HttpServletRequest request, HttpServletResponse response) throws Exception;void destroy();
}
  • init() 方法

    • 功能:初始化 Servlet 实例。
    • 调用时机:Servlet 容器(如 Tomcat)创建 Servlet 实例后立即调用,通常用于资源初始化(如加载配置文件、建立数据库连接等)。
    • 注意事项:该方法在 Servlet 的生命周期中仅调用一次。
  • service(HttpServletRequest request, HttpServletResponse response) 方法

    • 功能:处理客户端请求并返回响应。
    • 参数:
      • HttpServletRequest:封装客户端请求信息(如请求头、请求参数、URL 等)。
      • HttpServletResponse:封装服务器响应信息(如状态码、响应头、响应体等)。
    • 异常处理:声明抛出 Exception,允许实现类处理各类异常(如 IO 异常、业务异常等)。
    • 调用时机:每次接收到客户端请求时,容器会调用该方法。
  • destroy() 方法

    • 功能:销毁 Servlet 实例。
    • 调用时机:Servlet 容器关闭或重新加载 Servlet 时调用,通常用于资源释放(如关闭数据库连接、释放文件句柄等)。
    • 注意事项:该方法在 Servlet 的生命周期中仅调用一次。

2、GenericServlet抽象类

  •  GenericServlet抽象类实现Servlet接口中的init()方法destroy()方法

为什么GenericServlet类是抽象类?

  我们知道当一个普通类继承一个接口时,需要对接口中的所有方法进行实现,但这里我们不实现Servlet接口中的service(request,response)方法,因此我们需要把GenericServlet类变成抽象类,因为抽象类不必实现接口中的全部方法

public abstract class GenericServlet implements Servlet {public void init(){System.out.println("初始化成功");}public void destroy(){System.out.println("销毁成功");}
}

3、HttpServlet抽象类


HttpServlet抽象类实现Servlet接口中的service(request,response)方法


为什么HttpServlet类也是抽象类?

  之所以HttpServlet类也是抽象类,是因为普通类中必须对方法进行实现,而在HttpServlet类中,实现service(request,response)方法的逻辑为:如果接收到GET请求,那么执行doGet方法;如果接收到POST请求,那么执行doPost方法。在此我们只需要对doGet和doPost方法进行定义不需要实现,所以HttpServlet只有成为抽象类,才不必实现doGet和doPost方法。

import com.qcby.Servlet.req.HttpServletRequest;
import com.qcby.Servlet.req.HttpServletResponse;public abstract class HttpServlet  extends GenericServlet {//实现Servlet生命周期的service方法public void service(HttpServletRequest request, HttpServletResponse response) throws Exception {//如果接收到GET请求,那么执行doGet方法if(request.getMethod().equals("GET")){doGet(request,response);}//如果接收到POST请求,那么执行doPost方法else if(request.getMethod().equals("POST")){doPost(request,response);}}protected abstract void doGet(HttpServletRequest request,HttpServletResponse response) throws Exception;protected abstract void doPost(HttpServletRequest request,HttpServletResponse response)throws Exception;
}

4、HttpRequest类

  • HttpRequest类实现请求路径请求方法的获取与输出。
public class HttpServletRequest {private String path;private String method;public String getPath(){return path;};public void setPath(String path){this.path = path;}public String getMethod(){return method;}public void setMethod(String method){this.method = method;}
}

5、HttpResponse类

import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;public class HttpServletResponse {private OutputStream outputStream;public HttpServletResponse(OutputStream outputStream){this.outputStream = outputStream;}public void writeServlet(String context) throws IOException{outputStream.write(context.getBytes());}
}

I/0请求


 


  客户端向浏览器发出的请求,浏览器不会主动向客户端发送请求

1、请求方式
  HTTP协议的请求方式有很多,在这里我们只介绍GET请求和POST请求。

(1)GET请求
通过URL传递参数,URL与参数之间用?隔开,多个参数用&隔开,也是表单的默认提交方式。
GET传送的数据量较小,这主要是因为受到URL长度的限制。
GET会将数据显示到URL当中不安全。
基于以上三个特点,GET一般用于直接获取数据,提高查询速度。

 请求头

  • Accept-Encoding:gzip,deflate,br----浏览器所使用的语言 
  • Host:www.baidu.com----远程主机
  • Cookie----cookie
  • User-Agent----浏览器类型

请求正文

  即我们想要请求的信息。

  Socket

Socket(套接字)是计算机网络编程中用于实现网络通信的关键编程接口(API),它是对底层网络协议(如 TCP/IP)的封装,为开发者提供了便捷的网络通信能力,屏蔽了协议底层的复杂实现细节。

一、Socket 的核心作用

  • 标识进程通信:网络中主机靠 IP 地址唯一标识,而主机内的进程通信依赖 “协议 + 端口”。Socket 结合 IP 地址与端口号(如 IP 地址:端口号),唯一标识网络中的进程,实现不同主机进程间的数据交互。
  • 提供通信能力:如同 “发动机”,为程序提供发送和接收数据的网络通信基础能力,支持多种网络协议的应用开发。

二、Socket 的常见类型

  1. 流式套接字(SOCK_STREAM
    • 基于 TCP 协议,提供面向连接、可靠的数据传输。
    • 确保数据无差错、无重复发送,并按顺序接收,内置流量控制(如网页浏览、文件传输)。
  2. 数据包套接字(SOCK_DGRAM
    • 基于 UDP 协议,提供无连接服务。
    • 不保证数据传输的可靠性,可能丢失、重复或乱序(如视频会议、在线游戏)。
  3. 原始套接字(SOCK_RAW
    • 允许直接访问较低层次协议(如 IP、ICMP),用于网络底层机制调试、新协议开发或网络监听。

三、Socket 的工作流程

  • 服务端
    1. 初始化 Socket 对象,指定协议族(如 AF_INET 表示 IPv4)和套接字类型(如 SOCK_STREAM)。
    2. 绑定(bind)服务端的 IP 地址和端口号。
    3. 对端口进行监听(listen),等待客户端连接。
    4. 接受连接(accept),与客户端建立通信链路后,通过读写操作(如 read/writerecv/send)传输数据。
    5. 通信结束后关闭连接。
  • 客户端
    1. 初始化 Socket 对象。
    2. 连接(connect)到服务端的 IP 地址和端口。
    3. 连接成功后,发送请求数据并接收响应。
    4. 通信结束后关闭连接。

四、Socket 与协议的关系

  • Socket 是工具层:它是网络通信的编程接口,而非具体协议,支持基于 TCP、UDP 等协议的通信。
  • TCP 和 UDP 是实现方式
    • TCP 是面向连接的可靠协议,适合对数据准确性要求高的场景。
    • UDP 是无连接的轻量级协议,适合对实时性要求高、容忍少量丢包的场景。

五、通俗比喻辅助理解

将 Socket 比作 “邮局”:

  • 每个程序(进程)如同 “城市”,需通过 “邮局(Socket)” 收发信息(数据)。
  • 邮局(Socket)负责处理邮件(数据)发送的复杂细节(如分类、路由),程序员无需关心底层网络协议(如 TCP/IP)的复杂实现,只需通过简单接口(如发信、收信操作)即可完成通信。
  • 不同的邮寄方式(如普通信件、快递)类似 Socket 支持的不同协议(TCP 可靠、UDP 快速但不保证送达)。
package Servlet.test;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) {// 使用try-with-resources自动关闭ServerSockettry (ServerSocket serverSocket = new ServerSocket(8080)) {System.out.println("服务器启动,监听端口: 8080");// 循环监听多个客户端连接while (true) {try (Socket socket = serverSocket.accept();InputStream inputStream = socket.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) {System.out.println("客户端连接成功: " + socket.getInetAddress());// 读取HTTP请求String line;while ((line = reader.readLine()) != null) {if (line.isEmpty()) { // 空行表示HTTP请求头结束break;}System.out.println("请求行: " + line);}// 返回简单的HTTP响应String response = "HTTP/1.1 200 OK\r\n" +"Content-Type: text/html\r\n" +"\r\n" +"<html><body><h1>Hello, World!</h1></body></html>";socket.getOutputStream().write(response.getBytes("UTF-8"));} catch (IOException e) {System.err.println("处理客户端连接时发生异常: " + e.getMessage());e.printStackTrace();}}} catch (IOException e) {System.err.println("服务器启动失败: " + e.getMessage());e.printStackTrace();}}
}
  1. 创建 ServerSocket 并绑定 8080 端口
  2. 监听客户端连接(accept 方法会阻塞)
  3. 获取客户端输入流并读取数据
  4. 将接收到的字节数据按 UTF-8 编码转换为字符串输出

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

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

相关文章

数据科学和机器学习的“看家兵器”——pandas模块 之五

目录 4.5 pandas 高级数据处理与分析 一、课程目标 二、对数据表格进行处理 (一)行列转置 (二)将数据表转换为树形结构 三、数据表的拼接 (一)merge () 函数的运用 (二)concat () 函数的运用 (三)append () 函数的运用 四、对数据表格的同级运算 五、计算数据表格中数…

组合问题(去重)

40. 组合总和 II - 力扣&#xff08;LeetCode&#xff09; class Solution { private:vector<vector<int>>result;vector<int>path;void backtracking(vector<int>& candidates, int target,int sum,int startIndex,vector<bool>&used)…

论QT6多线程技术

前言 以前我多线程使用传统的继承qthread重写run()或者继承qrunable类把对象丢到线程池解决。经过昨天的面试让我了解到新的技术&#xff0c;我之前看到过只不过没有详细的去了解movetotread技术&#xff0c;这个技术是qt5推出的&#xff0c;qt6还在延续使用 代码结构 以下是…

VTEP是什么

VTEP&#xff08;VXLAN Tunnel Endpoint&#xff0c;VXLAN 隧道端点&#xff09;是 VXLAN&#xff08;Virtual Extensible LAN&#xff09;网络中的关键组件&#xff0c;用于处理 VXLAN 流量的封装和解封装。以下以可读的 Markdown 格式详细解释 VTEP 的定义、功能、实现方式以…

antdv3 Tabs.TabPane 右上角增加一个角标Badge

1、Tabs官方说明 Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 2、Badge角标官方效果图 Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 3、Tabs.TabPane要实现的效果 4、代码 <Tabs v-m…

浅析 Spring 启动过程:从源码到核心方法

浅析 Spring 启动过程&#xff1a;从源码到核心方法 一、Spring 注解方式启动类 Demo二、Spring 启动过程源码解析​AnnotationConfigApplicationContext构造函数refresh()方法详解 三、refresh()的核心方法/步骤obtainFreshBeanFactory() - 获取Bean工厂prepareBeanFactory(be…

贝叶斯优化Transformer融合支持向量机多变量回归预测,附相关性气泡图、散点密度图,Matlab实现

贝叶斯优化Transformer融合支持向量机多变量回归预测&#xff0c;附相关性气泡图、散点密度图&#xff0c;Matlab实现 目录 贝叶斯优化Transformer融合支持向量机多变量回归预测&#xff0c;附相关性气泡图、散点密度图&#xff0c;Matlab实现效果一览基本介绍程序设计参考资料…

智慧化系统安全分析报告

智慧化系统的安全背景与现状 一、政策法规背景 &#xff08;一&#xff09;全球主要国家/地区政策对比 地区政策名称核心内容实施时间特点中国《生成式人工智能服务管理暂行办法》明确服务提供者责任&#xff0c;强调数据合法、隐私保护&#xff0c;禁止生成违法内容2023年8…

【学习笔记】点云自动化聚类简要总结

聚类是将将具有相似特征划分为相同点集的操作。 基于空间邻近性的方法 核心思想&#xff1a;依据点的空间距离进行分组 欧式聚类&#xff08;DBSCAN&#xff0c;KD-tree) 原理&#xff1a;基于半径搜索和最小点数扩展簇。 优点&#xff1a;适应不规则形状&#xff0c;无需预…

全志F10c200开发笔记——移植uboot

相关资料&#xff1a; &#xff08;二&#xff09;uboot移植--从零开始自制linux掌上电脑&#xff08;F1C200S)&#xff1c;嵌入式项目&#xff1e;-CSDN博客 F1C200S挖坑日记&#xff08;3&#xff09;——Uboot编译篇_f1c200s uboot-CSDN博客 一、安装编译器 Linaro Rele…

常见WEB漏洞----暴力破解

什么是暴力破解 暴力破解 (Brue Force) 是一种攻击方法 (穷举法)&#xff0c;简称为“爆破”&#xff0c;黑客通过反复猜解和实验&#xff0c;旨在以暴力手段登入、访问目标主机获取服务&#xff0c;破坏系统安全&#xff0c;其属于 ATT&CK技术中的一种&#xff0c;常利用…

ARM A64 LDR指令

ARM A64 LDR指令 1 LDR (immediate)1.1 Post-index1.2 Pre-index1.3 Unsigned offset 2 LDR (literal)3 LDR (register)4 其他LDR指令变体4.1 LDRB (immediate)4.1.1 Post-index4.1.2 Pre-index4.1.3 Unsigned offset 4.2 LDRB (register)4.3 LDRH (immediate)4.3.1 Post-index…

2.安卓逆向2-adb指令

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

Obsidian Callouts标注框语法

Obsidian 从 0.14 版本开始原生支持 Callouts&#xff1a; 语法基于 Markdown 引用块&#xff08;>&#xff09;扩展&#xff1a; 语法格式如下&#xff1a; > [!类型] 可选标题 > 内容支持 **Markdown 格式**、[[内部链接]] 和嵌入文件。预览 可选类型一览&#xf…

nt!MiAllocateWsle函数分析之设置Wsle[WorkingSetIndex]

第一部分&#xff1a; 1: kd> p nt!MiAddValidPageToWorkingSet0xa9: 80a83c13 e8da9afcff call nt!MiAllocateWsle (80a4d6f2) 1: kd> t nt!MiAllocateWsle: 80a4d6f2 55 push ebp 1: kd> dv WsInfo 0x8953a1f8 PointerPte …

docker 命令操作大全

1 Docker Hello World 简单命令 docker run ubuntu:15.10 /bin/echo "Hello world" docker run&#xff1a;启动一个新容器。 ubuntu:15.10&#xff1a;使用的 Docker 镜像&#xff08;Ubuntu 15.10 版本&#xff09;。 Docker 首先从本地主机上查找镜像是否存在&a…

【软件工程】基于机器学习的多缺陷定位

基于机器学习的多缺陷定位&#xff08;Multi-Dault Localization, MDL&#xff09;是软件工程和自动化测试领域的重要研究方向&#xff0c;旨在通过机器学习技术高效识别代码中多个潜在缺陷的位置。以下从方法、挑战、应用场景及未来方向展开分析&#xff1a; 一、核心方法 监督…

用MCP往ppt文件里插入系统架构图

文章目录 一、技术架构解析1. Markdown解析模块(markdown_to_hierarchy)2. 动态布局引擎(give_hierarchy_positions)3. PPTX生成模块(generate_pptx)二、核心技术亮点1. 自适应布局算法2. MCP服务集成三、工程实践建议1. 性能优化方向2. 样式扩展方案3. 部署实践四、应用…

CS016-2-unity ecs

目录 【23】射击改进 【24】僵尸生成器 ​编辑【25】随机行走 【27】射击光效 【23】射击改进 a. 当距离目标太远的时候&#xff0c;要继续移动。而当距离目标到达攻击距离之后&#xff0c;则停止移动。 上图中的if&#xff1a;判断自身和目标的距离是否大于攻击距离&#…

新能源汽车制动系统建模全解析——从理论到工程应用

《纯电动轻卡制动系统建模全解析&#xff1a;车速-阻力拟合、刹车力模型与旋转质量转换系数优化》 摘要 本文以纯电动轻卡为研究对象&#xff0c;系统解析制动系统建模核心参数优化方法&#xff0c;涵盖&#xff1a; 车速-阻力曲线拟合&#xff08;MATLAB实现与模型验证&…