1. 概述

在这篇简短的文章中,我们将从概念上理解什么是servletservlet 容器以及它们是如何工作的

同时,还能在请求、响应、会话对象、共享变量和多线程的上下文中看到它们的身影。

2. Servlets 和 它的容器

servletJEE 用于 web 开发常用的组件。它们基本上是运行在容器边界内的Java程序。总的来说,它们负责接受请求,处理请求,并返回响应

要使用它们,首先需要容器注册 servlet ,无论是基于 JEE 还是基于 Spring 的容器,都可以在启动时接收它们。在开始时,容器通过调用 init() 方法来实例化 servlet

初始化完成后,servlet 就可以接受传入的请求。随后,容器将这些请求定向到 servletservice 方法中进行处理。之后,它根据HTTP请求类型将请求进一步委托给适当的方法,例如 doGet()doPost()

使用 destroy(),容器会销毁 servlet,并且不再接受传入的请求。我们将这个 init-service-destroy 的循环称为 servlet 的生命周期。

现在我们从容器的角度来看,比如 Apache TomcatJetty 在启动时,创建一个 ServletContext 的对象,ServletContext 的任务是充当服务器或容器的内存,并记住与web应用程序相关联的所有servlet、过滤器和侦听器,如其 web.xml文件或等效注解。在容器停止之前,ServletContext 会一直保留它。

不管怎么说,servletload-on-startup 参数扮演重要的角色 。如果此参数的值大于零,则只有在启动时服务器才会对其进行初始化。如果未指定此参数,则在请求第一次命中 servlet时调用它的 init()

3. Request, Response 和 Session

在上一节中,我们讨论了发送请求和接收响应,这基本上是任何CS应用程序的基础。现在,我们从servlet的角度来详细了解它们。

在这种情况下,请求将由 HttpServletRequest 表示,响应将用 HttpServletResponse 表示。

每当浏览器或curl命令等发送请求时,容器都会创建一个新的 HttpServletRequestHttpServletResponse 对象。然后将这些新对象传递给 servletservice方法。基于 HttpServletRequestmethod 属性,此方法确定应调用哪个 doXXX方法。

除了有关方法的信息外,request对象还携带其他信息,如头、参数和主体。类似地,HttpServletResponse对象也携带头、参数和主体——我们可以在 servletdoXXX 方法中设置它们。

这些对象的生命稍纵即逝。当客户端获得响应时,服务器将标记用于垃圾回收的请求和响应对象。

那么我们如何在随后的客户端请求或连接之间保持一个状态?答案就是 HttpSession

原理是将这些对象绑定到用户会话,以便与特定用户相关的信息可以跨多个请求持久化。这通常是通过使用cookies的概念,使用 [JSESSIONID] 作为给定会话的唯一标识符。我们可以在web.xml中指定会话的超时时长。

<session-config>
<session-timeout>10</session-timeout>
</session-config>

以上配置表示,如果会话空闲了10分钟,服务器将丢弃它。任何后续请求都将创建一个新的会话。

4. Servlets 共享数据

根据所需的范围,servlet 可以通过多种方式共享数据。

正如在前面的章节中提到的,不同的对象有不同的生命周期。HttpServletRequestHttpServletResponse 对象只存在于一个 servlet 调用之间。HttpSession只要它处于活动状态并且没有超时,它就会一直存在。

ServletContext的生命周期最长。它与Web应用程序一起诞生,只有当应用程序本身关闭时才会被销毁。由于servlet、filter 和 listener 实例与上下文绑定,所以只要web应用程序启动并运行,它们也会一直存在。

因此,如果我们的需求是在所有servlet之间共享数据,假设我们要计算站点的访问者数量,那么我们应该将变量放在 ServletContext 中。如果我们需要在一个会话中共享数据,那么我们就把它保存在会话范围内。在本例中,用户名就是一个例子。

最后,还有与单个请求的数据相关的请求范围,比如请求有效负载。

5. 处理多线程

多个HttpServletRequest 对象彼此共享 servlet,这样每个请求都使用它自己的 servlet 实例线程进行操作。

就线程安全而言,这实际上表明:我们不应该将请求或会话范围内的数据指定为 servlet的实例变量。

例如,下面的代码片段:

public class ExampleThree extends HttpServlet {

    private String instanceMessage;

    @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String message = request.getParameter("message");
instanceMessage = request.getParameter("message");
request.setAttribute("text", message);
request.setAttribute("unsafeText", instanceMessage);
request.getRequestDispatcher("/jsp/ExampleThree.jsp").forward(request, response);
}
}

在本例中,会话中的所有请求共享 instanceMessage,而 message对于给定的请求对象是唯一的。因此,在并发请求的情况下,instanceMessage 中的数据可能不一致。

6. 总结

在本教程中,我们探讨了有关servlet的一些概念、它们的容器以及它们所围绕的一些基本对象,以及 servlet 如何共享数据和多线程如何影响它们.

如果你觉得文章还不错,记得关注公众号: 锅外的大佬

锅外的大佬博客

谁再问Servlet的问题,我就亲自上门来教学了的更多相关文章

  1. Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章

    原创文章,转载请务注明出处 OOP三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...

  2. 拜托!面试请不要再问我Spring Cloud底层原理[z]

    [z]https://juejin.im/post/5be13b83f265da6116393fc7 拜托!面试请不要再问我Spring Cloud底层原理 欢迎关注微信公众号:石杉的架构笔记(id: ...

  3. vmware 安装配置 ,记住这一次不要再问我了。ok?

    Linux 安装配置 ,记住这一次不要再问我了.ok? 第一步 选择版本 如果遇到问题无法自动获取的  老男孩教育-李泳谊<youjiu_linux@qq.com> 17:51:43明天开 ...

  4. 求你了,再问你Java内存模型的时候别再给我讲堆栈方法区了…

    GitHub 4.1k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 4.1k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 4.1k Star 的 ...

  5. 面试官,不要再问我“Java GC垃圾回收机制”了

    Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底层原理,图文并茂,突破学习及面试瓶颈. 楔子-JVM内存结构补充 在上篇<JVM之内存结构详解> ...

  6. 面试官,不要再问我“Java 垃圾收集器”了

    如果Java虚拟机中标记清除算法.标记整理算法.复制算法.分代算法这些属于GC收集算法中的方法论,那么"GC收集器"则是这些方法论的具体实现. 在面试过程中这个深度的问题涉及的比较 ...

  7. 面试官,不要再问我“Java虚拟机类加载机制”了

    关于Java虚拟机类加载机制往往有两方面的面试题:根据程序判断输出结果和讲讲虚拟机类加载机制的流程.其实这两类题本质上都是考察面试者对Java虚拟机类加载机制的了解. 面试题试水 现在有这样一道判断程 ...

  8. 面试官,不要再问我“Java虚拟机类加载机制”了(转载)

    关于Java虚拟机类加载机制往往有两方面的 面试题:根据程序判断输出结果和讲讲虚拟机类加载机制的流程.其实这两类题本质上都是考察面试者对Java虚拟机类加载机制的了解. 面试题试水 现在有这样一道判断 ...

  9. 面试官,不要再问我“Java 垃圾收集器”了(转载)

    如果Java虚拟机中标记清除算法.标记整理算法.复制算法.分代算法这些属于GC收集算法中的方法论,那么"GC收集器"则是这些方法论的具体实现. 在 面试过程中这个深度的问题涉及的比 ...

随机推荐

  1. 掌握Python可以去哪些岗位?薪资如何?

    一.人工智能 Python作为人工智能的黄金语言,选择人工智能作为就业方向是理所当然的,就业前景也还不错.人工智能工程师的招聘起薪一般在20K-35K,如果是初级工程师,起薪一般12K. 二.大数据 ...

  2. 这篇SpringBoot整合JSON的学习笔记,建议收藏起来,写的太细了

    前言 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛. 采用完全独立于编程语言的文本格式来存储和表示数据. 简洁和清晰 ...

  3. FL Studio通道预设之采样预览

    FL Studio采样预览栏在采样设置窗口的最底端,它能很好地显示 出载入采样的波形也可以将波形显示改为频谱显示.它里面显示出的是经过预处理效果栏处理后的波形或频谱图.我们在波形显示器下面还可以看到波 ...

  4. MathType中怎么打约化普朗克常数ħ

    普朗克常数记为ħ,是一个物理常数,用以描述量子大小.在量子力学中占有重要的角色,马克斯·普朗克在1900年研究物体热辐射的规律时发现的.如果要打出关于约化普朗克常数ħ的公式,就需要用到专业的公式编辑器 ...

  5. 巧妙运用Camtasia 旅行Vlog轻松get

    旅行时,除了要欣赏当地的美丽风景.享受当地美食外,当然还要将旅行中的各种小细节记录下来.以前我们可能更多地使用相机拍照,现在呢,越来越多的人采用视频拍摄的方式制作Vlog.这种兼具影像与叙事的视频表现 ...

  6. MathType中的条件概率的输入

    条件概率公式是高中数学的概率知识中比较常用的一个公式,今天我们来介绍一下在MathType中如何输入条件概率公式. 具体步骤如下: 步骤一 打开专业的公式编辑软件MathType 7,在输入框中输入& ...

  7. Guitar Pro指弹入门——特殊拍号

    在吉他演奏技术不断提高的同时,我们经常会遇到一些奇怪的曲谱.他们的拍号不是正常的4/4拍或者3/4拍,而是5/4或者5/8等等我们不太了解的拍号,致使我们在演奏和练习之中陷入纷乱的节奏. 那么本期文章 ...

  8. 下载器Folx专业版有没有iTunes整合功能

    对于使用Mac系统的用户来说,相信对iTunes都不陌生.Folx专业版提供的iTunes整合功能,能将下载的音频.电影等文件自动同步到iTunes. 该功能将会有助于用户的音频.视频整合,对于喜欢听 ...

  9. 基于Kubernetes和OpenKruise的可变基础设施实践

    本文首发在OPPO互联网公众号,欢迎点击转载 https://mp.weixin.qq.com/s/hRvZz_bZfchmP0tkF6M2OA 对于可变基础设施的思考 kubernetes中的可变与 ...

  10. transform的2D和3D变换

    transform取值 none:默认值,即是无转换 matrix(,,,,,): 以一个含六值的(a,b,c,d,e,f)变换矩阵的形式指定一个2D变换,相当于直接应用一个[a,b,c,d,e,f] ...