自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

誰(shuí)再問(wèn)Servlet的問(wèn)題,我就親自上門(mén)來(lái)教學(xué)了

開(kāi)發(fā) 前端
在這篇簡(jiǎn)短的文章中,我們將從概念上理解什么是servlet 和 servlet 容器以及它們是如何工作的。同時(shí),還能在請(qǐng)求、響應(yīng)、會(huì)話對(duì)象、共享變量和多線程的上下文中看到它們的身影。

[[358266]]

 1. 概述

在這篇簡(jiǎn)短的文章中,我們將從概念上理解什么是servlet 和 servlet 容器以及它們是如何工作的。同時(shí),還能在請(qǐng)求、響應(yīng)、會(huì)話對(duì)象、共享變量和多線程的上下文中看到它們的身影。

2. Servlets 和 它的容器

servlet 是 JEE 用于 web 開(kāi)發(fā)常用的組件。它們基本上是運(yùn)行在容器邊界內(nèi)的Java程序??偟膩?lái)說(shuō),它們負(fù)責(zé)接受請(qǐng)求,處理請(qǐng)求,并返回響應(yīng)。

要使用它們,首先需要容器注冊(cè) servlet ,無(wú)論是基于 JEE 還是基于 Spring 的容器,都可以在啟動(dòng)時(shí)接收它們。在開(kāi)始時(shí),容器通過(guò)調(diào)用 init() 方法來(lái)實(shí)例化 servlet。初始化完成后,servlet 就可以接受傳入的請(qǐng)求。隨后,容器將這些請(qǐng)求定向到 servlet 的 service 方法中進(jìn)行處理。之后,它根據(jù)HTTP請(qǐng)求類型將請(qǐng)求進(jìn)一步委托給適當(dāng)?shù)姆椒?,例?doGet() 或 doPost() 。

使用 destroy(),容器會(huì)銷毀 servlet,并且不再接受傳入的請(qǐng)求。我們將這個(gè) init-service-destroy 的循環(huán)稱為 servlet 的生命周期。

現(xiàn)在我們從容器的角度來(lái)看,比如 Apache Tomcat 或 Jetty 在啟動(dòng)時(shí),創(chuàng)建一個(gè) ServletContext 的對(duì)象,ServletContext 的任務(wù)是充當(dāng)服務(wù)器或容器的內(nèi)存,并記住與web應(yīng)用程序相關(guān)聯(lián)的所有servlet、過(guò)濾器和偵聽(tīng)器,如其 web.xml文件或等效注解。在容器停止之前,ServletContext 會(huì)一直保留它。

不管怎么說(shuō),servlet的 load-on-startup 參數(shù)扮演重要的角色 。如果此參數(shù)的值大于零,則只有在啟動(dòng)時(shí)服務(wù)器才會(huì)對(duì)其進(jìn)行初始化。如果未指定此參數(shù),則在請(qǐng)求第一次命中 servlet時(shí)調(diào)用它的 init()。

3. Request, Response 和 Session

在上一節(jié)中,我們討論了發(fā)送請(qǐng)求和接收響應(yīng),這基本上是任何CS應(yīng)用程序的基礎(chǔ)?,F(xiàn)在,我們從servlet的角度來(lái)詳細(xì)了解它們。

在這種情況下,請(qǐng)求將由 HttpServletRequest 表示,響應(yīng)將用 HttpServletResponse 表示。

每當(dāng)瀏覽器或curl命令等發(fā)送請(qǐng)求時(shí),容器都會(huì)創(chuàng)建一個(gè)新的 HttpServletRequest 和 HttpServletResponse 對(duì)象。然后將這些新對(duì)象傳遞給 servlet 的 service方法。基于 HttpServletRequest 的 method 屬性,此方法確定應(yīng)調(diào)用哪個(gè) doXXX方法。

除了有關(guān)方法的信息外,request對(duì)象還攜帶其他信息,如頭、參數(shù)和主體。類似地,HttpServletResponse對(duì)象也攜帶頭、參數(shù)和主體——我們可以在 servlet 的 doXXX 方法中設(shè)置它們。

這些對(duì)象的生命稍縱即逝。當(dāng)客戶端獲得響應(yīng)時(shí),服務(wù)器將標(biāo)記用于垃圾回收的請(qǐng)求和響應(yīng)對(duì)象。那么我們?nèi)绾卧陔S后的客戶端請(qǐng)求或連接之間保持一個(gè)狀態(tài)?答案就是 HttpSession。

原理是將這些對(duì)象綁定到用戶會(huì)話,以便與特定用戶相關(guān)的信息可以跨多個(gè)請(qǐng)求持久化。這通常是通過(guò)使用cookies的概念,使用 [JSESSIONID] 作為給定會(huì)話的唯一標(biāo)識(shí)符。我們可以在web.xml中指定會(huì)話的超時(shí)時(shí)長(zhǎng)。

  1. <session-config> 
  2.     <session-timeout>10</session-timeout> 
  3. </session-config> 

以上配置表示,如果會(huì)話空閑了10分鐘,服務(wù)器將丟棄它。任何后續(xù)請(qǐng)求都將創(chuàng)建一個(gè)新的會(huì)話。

4. Servlets 共享數(shù)據(jù)

根據(jù)所需的范圍,servlet 可以通過(guò)多種方式共享數(shù)據(jù)。

正如在前面的章節(jié)中提到的,不同的對(duì)象有不同的生命周期。HttpServletRequest和HttpServletResponse 對(duì)象只存在于一個(gè) servlet 調(diào)用之間。HttpSession只要它處于活動(dòng)狀態(tài)并且沒(méi)有超時(shí),它就會(huì)一直存在。

ServletContext的生命周期最長(zhǎng)。它與Web應(yīng)用程序一起誕生,只有當(dāng)應(yīng)用程序本身關(guān)閉時(shí)才會(huì)被銷毀。由于servlet、filter 和 listener 實(shí)例與上下文綁定,所以只要web應(yīng)用程序啟動(dòng)并運(yùn)行,它們也會(huì)一直存在。

因此,如果我們的需求是在所有servlet之間共享數(shù)據(jù),假設(shè)我們要計(jì)算站點(diǎn)的訪問(wèn)者數(shù)量,那么我們應(yīng)該將變量放在 ServletContext 中。如果我們需要在一個(gè)會(huì)話中共享數(shù)據(jù),那么我們就把它保存在會(huì)話范圍內(nèi)。在本例中,用戶名就是一個(gè)例子。

最后,還有與單個(gè)請(qǐng)求的數(shù)據(jù)相關(guān)的請(qǐng)求范圍,比如請(qǐng)求有效負(fù)載。

5. 處理多線程

多個(gè)HttpServletRequest 對(duì)象彼此共享 servlet,這樣每個(gè)請(qǐng)求都使用它自己的 servlet 實(shí)例線程進(jìn)行操作。

就線程安全而言,這實(shí)際上表明:我們不應(yīng)該將請(qǐng)求或會(huì)話范圍內(nèi)的數(shù)據(jù)指定為 servlet的實(shí)例變量。

例如,下面的代碼片段:

  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.     } 

在本例中,會(huì)話中的所有請(qǐng)求共享 instanceMessage,而 message對(duì)于給定的請(qǐng)求對(duì)象是唯一的。因此,在并發(fā)請(qǐng)求的情況下,instanceMessage 中的數(shù)據(jù)可能不一致。

6. 總結(jié)

在本教程中,我們探討了有關(guān)servlet的一些概念、它們的容器以及它們所圍繞的一些基本對(duì)象,以及 servlet 如何共享數(shù)據(jù)和多線程如何影響它們.

本文轉(zhuǎn)載自微信公眾號(hào)「鍋外的大佬」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系鍋外的大佬公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 鍋外的大佬
相關(guān)推薦

2021-01-27 08:37:22

IDEAProjectIntelliJ ID

2019-12-17 09:29:02

數(shù)據(jù)庫(kù)架構(gòu)分庫(kù)分表

2020-10-30 09:02:15

Redis內(nèi)存數(shù)據(jù)

2019-08-28 10:41:35

RustC語(yǔ)言編程

2009-08-05 11:30:08

2009-07-06 15:55:52

Servlet例子Ruby

2009-07-07 14:11:07

XML來(lái)配置Servl

2020-09-02 08:04:59

多線程互聯(lián)網(wǎng)高并發(fā)

2020-03-25 09:40:57

微軟瀏覽器Windows

2009-07-06 09:49:26

Servlet JSP

2021-04-14 09:49:19

FSFRMS軟件

2020-07-14 11:14:55

網(wǎng)絡(luò)安全APP技術(shù)

2021-07-07 06:54:37

網(wǎng)頁(yè)Selenium瀏覽器

2009-07-03 17:18:34

Servlet多線程

2024-04-26 00:00:00

OpenAIGPT-5超算

2009-07-07 13:29:33

Servlet和JSP

2015-05-06 10:11:48

2015-09-21 16:10:59

我來(lái)貸

2022-01-05 09:40:03

DIff算法前端

2022-05-08 13:05:22

職位產(chǎn)品經(jīng)理開(kāi)源
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)