Servlet详解(Servlet源码)

Servlet

Servlet是运行在Web服务器或应用服务器上的小程序,它作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。Servlet能够接收来自客户端的基于HTTP协议的请求,并且对请求进行响应。
Servlet是用来处理客户端请求并产生动态网页内容的Java类。
通常Servlet特指HttpServlet,用来接受浏览器的访问请求,浏览器最常用的请求为GET和POST方式,还有其它五种,而HttpServlet分别有七个方法(PUT、DELETE、HEADER、TRACE、OPTION)处理这些类型的请求,另有一个是J2EE不支持的,是CONNECT。Servlet是J2EE规范中的重要成员,是构成WEB的重要组件
Servlet是JavaEE规范中的技术之一,是Java开发中最重要的动态资源之一。

Servlet生命周期

Servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。 Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doGet,doPost等,当服务器决定将实例销毁的时候调用其destroy方法。

Servlet的执行流程

客户端发起请求:客户端(如浏览器)向服务端发起HTTP请求。
服务器解析请求:Tomcat服务器通过解析请求地址(URL),找到对应的web应用,并解析出客户端想访问的web资源。
加载Servlet:如果发现Servlet是第一次访问,服务器就会加载Servlet,创建Servlet对象。
初始化:调用Servlet的init()方法,进行初始化操作。默认情况下,Servlet对象会在第一次被访问的时候初始化,对应的init()方法得到执行,并且只会执行一次。
处理请求:调用Servlet的service()方法处理客户端的请求。每当有一次来自客户端的请求,Tomcat服务器会开启一个新的线程调用service()方法。
响应请求:service()方法执行完后,服务器会响应数据给客户端浏览器。
销毁:当服务器正常关闭时,Servlet对象会被销毁,对应的destroy()方法执行,并且只会执行一次。

Servlet的创建方式

Servlet的创建主要有三种方式:
实现Servlet接口:通过实现Servlet接口,实现所有抽象方法。这种方式支持最大程度的自定义,但通常不推荐,因为需要实现的方法较多。
继承GenericServlet抽象类:GenericServlet实现了Servlet接口,但必须与协议无关。继承此类后,需要重写service()方法,其他方法可以选择重写。这种方式让开发Servlet变得简单,但和HTTP协议无关。
继承HttpServlet抽象类:HttpServlet继承自GenericServlet,并基于HTTP协议进行了封装。继承此类后,需要重写doGet()和doPost()等方法。这种方式表示请求和响应都要和HTTP相关,是最常用的方式。

Servlet的配置方式

Servlet的配置主要有两种方式:
web.xml文件配置:在web应用的web.xml文件中配置Servlet的映射关系。
注解配置:使用@WebServlet注解直接在Servlet类上进行配置,这种方式简化了配置过程,是现代开发中的主流方式。

Servlet的生命周期

Servlet的生命周期从创建开始,直到销毁结束。主要包括以下几个阶段:
加载和实例化:当Servlet容器启动时,或者在请求到达时Servlet容器首次调用Servlet的service()方法时,Servlet容器会加载并实例化Servlet。
初始化:容器调用Servlet的init()方法进行初始化。
请求处理:对于到达的客户端请求,Servlet容器会创建代表请求的HttpServletRequest对象和代表响应的HttpServletResponse对象,然后调用Servlet的service()方法。service()方法会根据请求的方式(GET、POST等)调用相应的doXXX()方法(如doGet()、doPost())。
销毁:当Servlet容器关闭或Web应用被卸载时,Servlet容器会调用Servlet的destroy()方法进行销毁。

Servlet的用途

Servlet主要用于处理客户端的请求,生成动态网页内容,并与后端的数据库或其他应用进行交互。它可以读取客户端发送的显式数据(如HTML表单数据)和隐式数据(如cookies、媒体类型等),处理这些数据,并生成响应发送给客户端。Servlet还可以与Java类库的其他部分进行交互,如通过sockets和RMI机制与applets、数据库或其他软件进行通信。

Servlet的线程安全问题

由于Servlet采用的是单例模式(即Servlet对象从始至终都只会创建一次),而一个浏览器就代表一个线程,多个浏览器就是多线程。因此,当存在成员变量时,多个线程并发访问此变量就容易出现线程安全问题。解决线程安全问题的方案包括:
改变共享属性:将成员变量变成局部变量。
改变可变属性:用final修饰成员变量,使其成为常量。
使用同步锁:虽然可以解决线程安全问题,但会降低Servlet的性能,因此通常不推荐在Servlet中使用同步锁。
实现SingleThreadModel接口:虽然可以让Servlet引擎以单线程模式调用service()方法,但这种方式并不推荐,因为它会降低Servlet的并发处理能力。
综上所述,Servlet是Java Web开发中非常重要的技术之一,它通过处理HTTP请求和响应,实现了Web应用的前后端交互。在使用Servlet时,需要注意其生命周期、配置方式、线程安全问题等方面。

Servlet 源码

Servlet 是 Java EE 中处理服务器端请求和响应的核心组件。通过 Servlet 接口、GenericServlet 类和 HttpServlet 类,我们可以实现各种功能的Servlet应用。HttpServletRequest 和 HttpServletResponse 接口提供了丰富的方法来处理HTTP请求和生成响应。理解这些类和接口的源码和工作原理,有助于开发高效的Web应用程序。
1. Servlet 接口
Servlet 接口是所有 Servlet 的父接口,定义了 Servlet 的生命周期方法:
init(ServletConfig config): 初始化 Servlet 方法。在 Servlet 被实例化后调用一次,用于进行资源初始化。
service(ServletRequest req, ServletResponse res): 处理请求和生成响应的方法。每个请求都会调用该方法。
destroy(): 销毁 Servlet 方法。在服务器卸载 Servlet 时调用,用于进行资源清理。
getServletConfig(): 返回 Servlet 的配置信息。
getServletInfo(): 返回 Servlet 的基本信息,如作者、版本等。

public interface Servlet {void init(ServletConfig config) throws ServletException;ServletConfig getServletConfig();void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;String getServletInfo();void destroy();
}

2. GenericServlet 类
GenericServlet 类实现了 Servlet 接口,并简化了实现过程。开发者只需要实现 service 方法。

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {private transient ServletConfig config;public void init(ServletConfig config) throws ServletException {this.config = config;this.init();}public void init() throws ServletException {}public ServletConfig getServletConfig() {return this.config;}public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;public String getServletInfo() {return "";}public void destroy() {}
}

3. HttpServlet 类
HttpServlet 类继承了 GenericServlet 类,专门用于处理 HTTP 请求。它定义了多个方法来处理不同的 HTTP 方法(如 GET、POST、PUT、DELETE 等)。

public abstract class HttpServlet extends GenericServlet {protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "Method GET is not supported by this URL");}protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "Method POST is not supported by this URL");}protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "Method PUT is not supported by this URL");}protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "Method DELETE is not supported by this URL");}protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setHeader("Allow", "GET, HEAD, POST, PUT, DELETE, OPTIONS");}protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "Method TRACE is not supported by this URL");}protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String method = req.getMethod();if (method.equals("GET")) {this.doGet(req, resp);} else if (method.equals("POST")) {this.doPost(req, resp);} else if (method.equals("PUT")) {this.doPut(req, resp);} else if (method.equals("DELETE")) {this.doDelete(req, resp);} else if (method.equals("OPTIONS")) {this.doOptions(req, resp);} else if (method.equals("TRACE")) {this.doTrace(req, resp);} else {resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "Method " + method + " is not supported by this URL");}}protected long getLastModified(HttpServletRequest req) {return -1L;}
}

4. HttpServletRequest 和 HttpServletResponse 接口
HttpServletRequest 和 HttpServletResponse 是两个用于处理 HTTP 请求和响应的接口。
HttpServletRequest:
获取请求参数、头信息、路径信息、会话信息等。
常用方法:getParameter(), getHeader(), getSession(), getMethod(), getRequestURI() 等。

public interface HttpServletRequest extends ServletRequest {String getAuthType();Cookie[] getCookies();long getDateHeader(String name);String getHeader(String name);Enumeration<String> getHeaders(String name);Enumeration<String> getHeaderNames();int getIntHeader(String name);String getMethod();String getPathInfo();String getPathTranslated();String getContextPath();String getQueryString();String getRemoteUser();boolean isUserInRole(String role);Principal getUserPrincipal();String getRequestedSessionId();String getRequestURI();StringBuffer getRequestURL();String getServletPath();HttpSession getSession(boolean create);HttpSession getSession();String changeSessionId();boolean isRequestedSessionIdValid();boolean isRequestedSessionIdFromCookie();boolean isRequestedSessionIdFromURL();boolean isRequestedSessionIdFromUrl();boolean authenticate(HttpServletResponse response) throws IOException, ServletException;void login(String username, String password) throws ServletException;void logout() throws ServletException;Collection<Part> getParts() throws IOException, ServletException;Part getPart(String name) throws IOException, ServletException;<T extends HttpUpgradeHandler> T upgrade(Class<T> handlerClass) throws IOException, ServletException;
}

HttpServletResponse:
设置响应状态码、头信息、内容类型,写出响应内容等。
常用方法:setStatus(), setHeader(), setContentType(), getWriter(), getOutputStream() 等。

public interface HttpServletResponse extends ServletResponse {void addCookie(Cookie cookie);boolean containsHeader(String name);String encodeURL(String url);**加粗样式**String encodeRedirectURL(String url);String encodeUrl(String url);String encodeRedirectUrl(String url);void sendError(int sc, String msg) throws IOException;void sendError(int sc) throws IOException;void sendRedirect(String location) throws IOException;void setDateHeader(String name, long date);void addDateHeader(String name, long date);void setHeader(String name, String value);void addHeader(String name, String value);void setIntHeader(String name, int value);void addIntHeader(String name, int value);void setStatus(int sc);void setStatus(int sc, String sm);int getStatus();String getHeader(String name);Collection<String> getHeaders(String name);Collection<String> getHeaderNames();void setContentType(String type);
}

5. 示例:自定义Servlet
以下是一个简单的自定义Servlet示例:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/hello")
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html");PrintWriter out = resp.getWriter();out.println("<html><body>");out.println("<h1>Hello, Servlet!</h1>");out.println("</body></html>");}
}

在这个示例中,我们创建了一个简单的Servlet,处理GET请求并返回一个HTML页面。

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

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

相关文章

Java每日一练,技术成长不间断

目录 题目1.下列关于继承的哪项叙述是正确的&#xff1f;2.Java的跨平台特性是指它的源代码可以在多个平台运行。&#xff08;&#xff09;3.以下 _____ 不是 Object 类的方法4.以下代码&#xff1a;5.下面哪个流类不属于面向字符的流&#xff08;&#xff09;总结 题目 选自牛…

KubeSphere 部署向量数据库 Milvus 实战指南

作者&#xff1a;运维有术星主 Milvus 是一个为通用人工智能&#xff08;GenAI&#xff09;应用而构建的开源向量数据库。它以卓越的性能和灵活性&#xff0c;提供了一个强大的平台&#xff0c;用于存储、搜索和管理大规模的向量数据。Milvus 能够执行高速搜索&#xff0c;并以…

一文剖析高可用向量数据库的本质

面对因电力故障、网络问题或人为操作失误等导致的服务中断&#xff0c;数据库系统高可用能够保证系统在这些情况下仍然不间断地提供服务。如果数据库系统不具备高可用性&#xff0c;那么系统就需要承担停机和数据丢失等重大风险&#xff0c;而这些风险极有可能造成用户流失&…

python中的print函数总结

文章目录 打印变量打印数学计算多行文本复制n次字符串 x*n,n*x不换行输出多个数据换行符制表位转义原字符字符串切片格式化字符串千位分隔符&#xff08;只适用于整数和浮点数&#xff09;浮点数小数部分的精度字符串类型&#xff0c;.表示最大的显示长度整数类型浮点数类型 打…

(新)VMware虚拟机安装Linux教程(超详细)

创作不易&#xff0c;禁止转载抄袭&#xff01;&#xff01;&#xff01;违者必究&#xff01;&#xff01;&#xff01; 创作不易&#xff0c;禁止转载抄袭&#xff01;&#xff01;&#xff01;违者必究&#xff01;&#xff01;&#xff01; 创作不易&#xff0c;禁止转载抄…

C语言:扫雷游戏实现

一、扫雷游戏的分析和设计 扫雷游戏想必大家都玩过吧&#xff0c;初级的玩法是在一个9*9的棋盘上找到没有雷的格子&#xff0c;而今天我们就要做的就是9*9扫雷游戏的实现。 1、游戏功能和规则 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘…

Flink SQL 的工作机制

前言 Flink SQL 引擎的工作流总结如图所示。 从图中可以看出&#xff0c;一段查询 SQL / 使用TableAPI 编写的程序&#xff08;以下简称 TableAPI 代码&#xff09;从输入到编译为可执行的 JobGraph 主要经历如下几个阶段&#xff1a; 将 SQL文本 / TableAPI 代码转化为逻辑执…

面试经典算法150题系列-数组/字符串操作之多数元素

序言&#xff1a;今天是第五题啦&#xff0c;前面四题的解法还清楚吗&#xff1f;可以到面试算法题系列150题专栏 进行复习呀。 温故而知新&#xff0c;可以为师矣&#xff01;加油&#xff0c;未来的技术大牛们。 多数元素 给定一个大小为 n 的数组 nums &#xff0c;返回其…

C#实现深度优先搜索(Depth-First Search,DFS)算法

深度优先搜索&#xff08;DFS&#xff09;是一种图搜索算法&#xff0c;它尽可能深入一个分支&#xff0c;然后回溯并探索其他分支。以下是使用C#实现DFS的代码示例&#xff1a; using System; using System.Collections.Generic;class Graph {private int V; // 顶点的数量pr…

大模型算法备案流程最详细说明【流程+附件】

文章目录 一、语料安全评估 二、黑盒测试 三、模型安全措施评估 四、性能评估 五、性能评估 六、安全性评估 七、可解释性评估 八、法律和合规性评估 九、应急管理措施 十、材料准备 十一、【线下流程】大模型备案线下详细步骤说明 十二、【线上流程】算法备案填报…

ChatGLM3-6B模型部署微调实战

准备 视频教程 https://www.bilibili.com/video/BV1ce411J7nZ?p14&vd_source165c419c549bc8d0c2d71be2d7b93ccc 视频对应的资料 https://pan.baidu.com/wap/init?surlAjPi7naUMcI3OGG9lDpnpQ&pwdvai2#/home/%2FB%E7%AB%99%E5%85%AC%E5%BC%80%E8%AF%BE%E3%80%90%E8…

HTTP协议详解(一)

协议 为了使数据在网络上从源头到达目的&#xff0c;网络通信的参与方必须遵循相同的规则&#xff0c;这套规则称为协议&#xff0c;它最终体现为在网络上传输的数据包的格式。 一、HTTP 协议介绍 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;&#xff1a; 全…

Monorepo简介

Monorepo 第一章&#xff1a;与Monorepo的邂逅第二章&#xff1a;Multirepo的困境第三章&#xff1a;Monorepo的魔力 - 不可思议的解决问题能力第四章&#xff1a;Monorepo的挑战与应对策略第五章&#xff1a;总结第六章&#xff1a;参考 第一章&#xff1a;与Monorepo的邂逅 …

【AI大模型】分布式训练:深入探索与实践优化

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 一、分布式训练的核心原理二、技术细节与实现框架1. 数据并行与模型并行2. 主流框架 三、面临的挑战与优化策略1. 通信开销2. 数据一致性3. 负载均衡 4.使用示例示例一&#xff1a;TensorFlow中的数据…

VAE、GAN与Transformer核心公式解析

VAE、GAN与Transformer核心公式解析 VAE、GAN与Transformer&#xff1a;三大深度学习模型的异同解析 【表格】VAE、GAN与Transformer的对比分析 序号对比维度VAE&#xff08;变分自编码器&#xff09;GAN&#xff08;生成对抗网络&#xff09;Transformer&#xff08;变换器&…

设计师的素材管理神器,eagle、千鹿大测评

前言 专业的设计师都会精心维护自己的个人素材库&#xff0c;常常需要耗费大量时间用于浏览采集、分类标注、预览筛选、分享协作&#xff0c;还要管理字体、图片、音视频等各类设计素材 如果你作为设计师的话&#xff0c;今天&#xff0c;就为大家带来两款热门的素材管理工具…

SpringMVC中的常用注解

目录 SpringMVC的定义 SpringMVC的常用注解 获取Cookie和Session SpringMVC的定义 Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它…

全麦饼:健康与美味的完美结合

在追求健康饮食的当下&#xff0c;全麦饼以其独特的魅力脱颖而出&#xff0c;成为了众多美食爱好者的新宠。食家巷全麦饼&#xff0c;顾名思义&#xff0c;主要由全麦面粉制作而成。与普通面粉相比&#xff0c;全麦面粉保留了小麦的麸皮、胚芽和胚乳&#xff0c;富含更多的膳食…

免费聊天回复神器微信小程序

客服在手机上通过微信聊天&#xff0c;回复客户咨询的时候&#xff0c;如果想把整理好的话术一键发给客户&#xff0c;又不想切换微信聊天窗口&#xff0c;微信小程序是一个很好的选择 微信小程序支持微信聊天 客服在手机上通过微信聊天&#xff0c;回复客户咨询的时候&#x…

Shell编程——简介和基础语法(1)

文章目录 Shell简介什么是ShellShell环境第一个Shell脚本Shell脚本的运行方法 Shell基础语法Shell变量Shell传递参数Shell字符串Shell字符串截取Shell数组Shell运算符 Shell简介 什么是Shell Shell是一种程序设计语言。作为命令语言&#xff0c;它交互式解释和执行用户输入的命…