文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

谁再问Servlet的问题,我就亲自上门来教学了

2024-12-03 15:27

关注

 1. 概述

在这篇简短的文章中,我们将从概念上理解什么是servlet 和 servlet 容器以及它们是如何工作的。同时,还能在请求、响应、会话对象、共享变量和多线程的上下文中看到它们的身影。

2. Servlets 和 它的容器

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

要使用它们,首先需要容器注册 servlet ,无论是基于 JEE 还是基于 Spring 的容器,都可以在启动时接收它们。在开始时,容器通过调用 init() 方法来实例化 servlet。初始化完成后,servlet 就可以接受传入的请求。随后,容器将这些请求定向到 servlet 的 service 方法中进行处理。之后,它根据HTTP请求类型将请求进一步委托给适当的方法,例如 doGet() 或 doPost() 。

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

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

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

3. Request, Response 和 Session

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

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

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

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

这些对象的生命稍纵即逝。当客户端获得响应时,服务器将标记用于垃圾回收的请求和响应对象。那么我们如何在随后的客户端请求或连接之间保持一个状态?答案就是 HttpSession。

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

  1.  
  2.     10 
  3.  

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

4. Servlets 共享数据

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

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

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

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

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

5. 处理多线程

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

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

例如,下面的代码片段:

  1. public class ExampleThree extends HttpServlet { 
  2.      
  3.     private String instanceMessage; 
  4.  
  5.     @Override 
  6.     protected void doGet(HttpServletRequest request, HttpServletResponse response)  
  7.       throws ServletException, IOException { 
  8.         String message = request.getParameter("message"); 
  9.         instanceMessage = request.getParameter("message"); 
  10.         request.setAttribute("text", message); 
  11.         request.setAttribute("unsafeText", instanceMessage); 
  12.         request.getRequestDispatcher("/jsp/ExampleThree.jsp").forward(request, response); 
  13.     } 

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

6. 总结

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

本文转载自微信公众号「锅外的大佬」,可以通过以下二维码关注。转载本文请联系锅外的大佬公众号。

 

来源:锅外的大佬内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯