HttpServlet详解

Servlet与HttpServlet详解

一、Servlet概述

Servlet(Server Applet)是Java Servlet API中定义的一个接口,用于扩展Web服务器的功能。Servlet是一个运行在Web服务器或应用服务器上的Java程序,它可以动态地生成Web页面或其他类型的响应。

二、HttpServlet类

HttpServlet类是Java Servlet API中的一个核心类,它继承自GenericServlet类,实现了Servlet接口,并为HTTP协议提供了特定的实现。HttpServlet类的主要职责是处理HTTP请求和构建HTTP响应。

HttpServlet的主要方法

  1. service(ServletRequest req, ServletResponse res)
    这是Servlet接口中的核心方法,所有来自客户端的请求首先都会调用此方法。HttpServlet为这个方法提供了默认实现,它会根据请求的类型(GET、POST等)调用对应的doXXX方法。

  2. doGet(HttpServletRequest request, HttpServletResponse response)
    用于处理HTTP GET请求。

  3. doPost(HttpServletRequest request, HttpServletResponse response)
    用于处理HTTP POST请求。

  4. doPut, doDelete, doOptions, doHead, doTrace
    这些方法用于处理其他类型的HTTP请求,但在常见的Web应用中很少直接使用。

  5. init(ServletConfig config)
    Servlet的初始化方法,当Servlet实例被加载到内存并准备使用时,容器会调用此方法。

  6. destroy()
    Servlet的销毁方法,当Servlet实例不再需要并被容器卸载时,容器会调用此方法。

HttpServlet处理流程

  1. 部署Servlet

    • 开发者编写Servlet类,继承自HttpServlet并覆盖相应的方法。
    • 在Web应用的web.xml文件中配置Servlet的映射路径和初始化参数等信息。
    • 将Web应用打包成WAR文件并部署到Servlet容器中(如Tomcat)。
  2. 客户端请求

    • 客户端(如Web浏览器)发送HTTP请求到Servlet容器。
    • 请求中包含URL、HTTP方法(GET、POST等)、请求头、请求体等信息。
  3. 容器调度

    • Servlet容器接收到请求后,解析URL路径,找到与之匹配的Servlet实例。
    • 如果Servlet实例不存在,容器会创建一个。
  4. 调用service方法

    • Servlet容器调用Servlet实例的service方法,并传入HttpServletRequestHttpServletResponse对象。
    • HttpServletRequest对象包含了请求的所有信息,如参数、头信息等。
    • HttpServletResponse对象用于构建并发送HTTP响应。
  5. 处理请求

    • 根据请求的类型(如GET、POST),service方法会调用相应的doXXX方法。
    • 开发者在doXXX方法中实现业务逻辑,如访问数据库、处理数据等。
  6. 构建响应

    • 开发者使用HttpServletResponse对象设置响应的状态码、响应头、响应体等。
    • 可以向响应体写入HTML、JSON、XML等格式的数据。
  7. 发送响应

    • Servlet容器将HttpServletResponse对象封装成HTTP响应,并通过网络发送给客户端。
    • 客户端接收到响应后,会显示在Web浏览器上或进行其他处理。
  8. Servlet生命周期结束

    • 当Servlet实例不再需要时(如Web应用被卸载),容器会调用destroy方法,允许开发者进行资源清理工作。
      在Servlet API中,service 方法是Servlet容器(如Tomcat)用来调用特定HTTP方法处理程序的入口点。当客户端发送一个HTTP请求到Servlet容器时,容器会解析请求,确定它是哪种类型的HTTP方法(如GET、POST、PUT、DELETE等),然后调用相应的doXXX方法。

service方法是一个重要的方法,它根据客户端发送的HTTP请求类型(如GET、POST等)调用相应的doXXX方法。以下是HttpServlet类中service方法的实现:

@Override
public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException {HttpServletRequest  request;HttpServletResponse response;try {// 将ServletRequest和ServletResponse强制转换为HttpServletRequest和HttpServletResponserequest = (HttpServletRequest) req;response = (HttpServletResponse) res;} catch (ClassCastException e) {throw new ServletException("Cannot cast to HttpServletRequest/HttpServletResponse");}// 获取HTTP请求方法String method = request.getMethod();if (method.equalsIgnoreCase("GET")) {// 如果是GET请求,调用doGet方法long lastModified = getLastModified(request);if (lastModified == -1) {// 标记响应不被缓存response.setDateHeader("Expires", -1);response.setHeader("Cache-Control", "no-cache");response.setHeader("Pragma", "no-cache");} else {// 检查If-Modified-Since头以判断是否发送304 Not Modified响应long ifModifiedSince = request.getDateHeader("If-Modified-Since");if (ifModifiedSince < (lastModified / 1000 * 1000)) {// 资源已修改,发送新内容maybeSetLastModified(response, lastModified);} else {// 资源未修改,发送304 Not Modified响应response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);return;}}doGet(request, response);} else if (method.equalsIgnoreCase("HEAD")) {// 如果是HEAD请求,调用doHead方法long lastModified = getLastModified(request);maybeSetLastModified(response, lastModified);doHead(request, response);} else if (method.equalsIgnoreCase("POST")) {// 如果是POST请求,调用doPost方法doPost(request, response);} else if (method.equalsIgnoreCase("PUT")) {// 如果是PUT请求,调用doPut方法doPut(request, response);} else if (method.equalsIgnoreCase("DELETE")) {// 如果是DELETE请求,调用doDelete方法doDelete(request, response);} else if (method.equalsIgnoreCase("OPTIONS")) {// 如果是OPTIONS请求,调用doOptions方法doOptions(request, response);} else if (method.equalsIgnoreCase("TRACE")) {// 如果是TRACE请求,调用doTrace方法doTrace(request, response);} else {// 对于不支持的HTTP方法,抛出ServletExceptionthrow new ServletException("HTTP method " + method + " is not supported");}
}

这个service方法首先检查传入的ServletRequestServletResponse是否可以安全地强制转换为HttpServletRequestHttpServletResponse。接着,它获取HTTP请求的方法(如GET、POST等),并根据这个方法调用相应的doXXX方法。如果请求方法是GET,它还会检查If-Modified-Since头以判断是否发送304 Not Modified响应。

对于不支持的HTTP方法,service方法会抛出一个ServletException。通常,开发者会覆盖doGetdoPost等方法来提供具体的业务逻辑,而service方法则负责调度这些方法。

三、示例代码

下面是一个简单的HttpServlet示例,展示了如何处理GET请求:

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 MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 设置响应内容类型response.setContentType("text/html;charset=UTF-8");// 实际的逻辑是在这里String message = "<html><body><h1>Hello, World!</h1></body></html>";// 将响应体写入到response对象中response.getWriter().write(message);}
}

在这个示例中,MyServlet类继承了HttpServlet类,并重写了doGet()方法。当容器接收到一个GET请求时,它会调用doGet()方法来处理请求。在doGet()方法中,我们设置了响应的内容类型为HTML,并构建了一个简单的HTML消息作为响应体。

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

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

相关文章

【云原生】Spring Cloud Gateway的底层原理与实践方法探究

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &#x1f680; 本…

Leetcode. 739 每日温度

题目信息 LeetoCode地址: . - 力扣&#xff08;LeetCode&#xff09; 题目理解 题意很好理解&#xff0c;找到比每日温度更高的温度的已过天数的偏移量。如果找不到&#xff0c;则设为0。 最直观的想法是&#xff0c;从每一天开始向后一天一天找&#xff0c;直到找到更高温…

fly-barrage 前端弹幕库(2):弹幕内容支持混入渲染图片的设计与实现

如果弹幕内容只支持文字的话&#xff0c;只需要借助 canvas 绘图上下文的 fillText 方法就可以实现功能了。 但如果想同时支持渲染图片和文字的话&#xff0c;需要以下几个步骤&#xff1a; 设计一个面向用户的数据结构&#xff0c;用于描述弹幕应该渲染哪些文字和图片&#x…

SpringBoot MultipartResolver原理

Spring Boot中的MultipartResolver是一个用于解析multipart/form-data类型请求的策略接口。这种类型的请求通常用于文件上传。Spring Boot中默认实现了两个MultipartResolver的接口&#xff1a;CommonsMultipartResolver和StandardServletMultipartResolver。 1. MultipartRes…

应急响应-常规处置办法

网站中被植入Webshell&#xff0c;通常代表着网站中存在可利用的高危漏洞&#xff0c;攻击者利用这些漏洞&#xff0c;将Webshell写入网站&#xff0c;从而获取网站的控制权。一旦在网站中发现webshell文件&#xff0c;可采取以下步骤进行临时处置。 入侵确定时间 通过在网站…

迅为RK3568开发板驱动开发指南-输入子系统

《iTOP-RK3568开发板驱动开发指南》更新&#xff0c;本次更新内容对应的是驱动&#xff08;第十三篇 输入子系统&#xff09;视频&#xff0c;帮助用户快速入门&#xff0c;大大提升研发速度。 第13篇-输入子系统目录 第1篇 驱动基础篇 第2篇 字符设备基础 第3篇 并发与竞争 …

解决gogs勾选“使用选定的文件和模板初始化仓库”报错500,gogs邮件发送失败,gogs邮件配置不生效,gogs自定义模板等问题

解决gogs勾选“使用选定的文件和模板初始化仓库”报错500,gogs邮件发送失败,gogs邮件配置不生效,gogs自定义模板等问题 前几天出了教程本地部署gogs&#xff0c;在后期运行时发现两个问题&#xff1a; 第一&#xff1a;邮件明明配置了&#xff0c;后台显示未配置&#xff0c;…

这家宠物品牌的内容运营怎么做的?太好玩儿了吧

养宠的朋友应该多多少少对“诚实一口”这个牌子有所耳闻&#xff0c;2018年诚实一口品牌正式立项&#xff0c;虽然不算经典品牌&#xff0c;但在国内也是小有名气的宠物品牌。今天媒介盒子想和大家聊的不是产品&#xff0c;而是想聊聊作为成立时间不长的国产宠粮品牌是如何凭借…

【数据结构】栈OJ题《用栈实现队列》(题库+解析+代码)

1. 前言 通过前面栈的实现和详解大家对队列应该有一定熟悉了&#xff0c;现在上强度开始做题吧 栈详解&#xff1a;http://t.csdnimg.cn/9Fsbs 本体的做题思路也可以参考上一篇文章&#xff0c;就是有一点点不同。 用队列实现栈&#xff1a;http://t.csdnimg.cn/V2qjW 2. …

小型内衣裤洗衣机哪个牌子好?四大顶尖内衣洗衣机测评分享

要知道&#xff0c;内衣裤可能会残留我们身体分泌的尿液&#xff0c;或者是没有擦干净的便便&#xff0c;以及其他的一些分泌物&#xff0c;据科学家研究发现&#xff0c;内衣裤是含有很多细菌和病毒的地方&#xff0c;如果将内衣裤和衣服放在一起洗&#xff0c;导致这些细菌附…

MyStringBuffer-自定义实现StringBuffer

在Java中&#xff0c;StringBuffer是一个可变的字符串类&#xff0c;它允许对字符串进行动态修改。与String类不同的是&#xff0c;StringBuffer对象的长度和内容都可以被改变。这使得StringBuffer在需要频繁修改字符串内容时比String更加高效。 StringBuffer类提供了许多方法…

Docker基础篇(六) dockerfile体系结构语法

FROM&#xff1a;基础镜像&#xff0c;当前新镜像是基于哪个镜像的 MAINTAINER &#xff1a;镜像维护者的姓名和邮箱地址 RUN&#xff1a;容器构建时需要运行的命令 EXPOSE &#xff1a;当前容器对外暴露出的端口号 WORKDIR&#xff1a;指定在创建容器后&#xff0c;终端默认登…

《Docker 简易速速上手小册》第4章 Docker 容器管理(2024 最新版)

文章目录 4.1 容器生命周期管理4.1.1 重点基础知识4.1.2 重点案例&#xff1a;启动并管理 Python Flask 应用容器4.1.3 拓展案例 1&#xff1a;调试运行中的容器4.1.4 拓展案例 2&#xff1a;优雅地停止和清理容器 4.2 容器数据管理与持久化4.2.1 重点基础知识4.2.2 重点案例&a…

C++力扣题目 42--接雨水 84--柱状图中最大的矩形

42. 接雨水 力扣题目链接(opens new window) 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1]输出&#xff1a;6解释&#xff…

一键解锁本地大型语言模型!Ollama框架让你轻松运行Gemma

想要在本地运行大型语言模型吗&#xff1f; Ollama框架提供了这样的机会。 这个框架是专为在Docker容器中部署LLM而设计的&#xff0c;简化了部署和管理流程。 安装Ollama后&#xff0c;你只需执行一条命令&#xff0c;即可在本地运行开源大型语言模型。 它将模型权重、配置…

Less预处理器教程

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈 一、Less介绍 less官方文档 lesscss.org/ less中文文档 less.bootcss.com/ less是一种css预处理器&#xff0c;它扩展了css语言&#xff0c…

C++ 设计模式:单例模式

一个类只允许存在一个对象 实现起来很简单&#xff0c;将构造函数设置为私有&#xff0c;拷贝构造等关闭然后提供一个静态接口返回实例即可 class A {A() {}A(const A&) delete;A& operator(const A&) delete; public:static A& get_val() {static A a;retu…

Docker复习笔记

Centos7安装Docker Docker官网:www.docker.com Docker官网仓库:hub.docker.com Docker文档是比较详细的 安装相关依赖 yum -y install gcc gcc-c yum install -y yum-utils 设置docker镜像仓库 yum-config-manager --add-repo https://download.docker.com/linux/centos/do…

OpenCV开发笔记(七十五):相机标定矫正中使用remap重映射进行畸变矫正

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/136293833 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 红胖子(红模仿…

网络设备和网络软件

文章目录 网络设备和网络软件网卡交换机交换机的三个主要功能交换机的工作原理第二层交换和第三层交换交换机的堆叠和级联 路由器路由器工作原理 网关网关的分类 无线接入点(AP)调制解调器网络软件 网络设备和网络软件 网卡 网络接口卡又称网络适配器&#xff0c;简称网卡。网…