Servlet4.0 Response

来源:https://www.cnblogs.com/code-for-me/archive/2022/09/30/16745077.html
-Advertisement-
Play Games

Servlet4.0 Response對象Response對象封裝Server返回Client的所有信息。在HTTP協議中,Server傳達給Client信息轉換到HTTP Header或者HTTP BODY中。5.1 Buffering緩衝區Serverlet Container可以但不強制緩衝發 ...


Servlet4.0 Response對象

Response對象封裝Server返回Client的所有信息。在HTTP協議中,Server傳達給Client信息轉換到HTTP Header或者HTTP BODY中。

5.1 Buffering緩衝區

Serverlet Container可以但不強制緩衝發送給客戶端的內容。預設得,Servlet Container會開放介面設置緩衝區。如ServletResponse對象的方法可以設置緩衝區:

  • getBufferSize
  • setBufferSize
  • isCommitted
  • reset
  • resetBuffer
  • flushBuffer

當Servlet Container使用ServletOutputStream或者Write時,可以使用這些方法配置緩衝區。

getBufferSize返回緩衝區大小,若沒有緩衝區,則返回0。

setBufferSize servlet可以使用該方法設置緩衝區大小。

申請的大小可以不是servlet請求的大小,但是至少要是請求的大小。這樣,容器才能重使用該緩衝區,也能夠提供足夠的緩衝區。該方法需要在Servlet Container使用ServletOutputStream或者是Writer輸出響應之前調用。

isCommitted方法表示內容是否已經響應給客戶端。

flushBuffer方法強制將緩衝區數據輸出至客戶端。

reset方法強制清空緩衝區的數據若內容未提交至客戶端。

resetBuffer方法強制清空緩衝區的數據但不包括請求頭和響應碼若內容未提交至客戶端。

若內容已經輸出至客戶端,調用reset方法或resetBuffer方法都會拋出異常。但是不會改變緩衝區內容。

若緩衝區已經滿需要立即輸出響應內容給客戶端。

5.2 HTTP響應頭

Servlet可以通過ServletResponse介面的方法設置HTTP響應頭。方法如下:

  • setHeader
  • addHeader

setHeader使用指定的名稱替換已經存在的值,若header的值是集合,則集合的值被清空,使用新值替換。

addHeader添加指定名稱的值到集合,該名稱未存在,則會創建新集合。

若header的值是int類型或Date類型,則ServletResponse介面提供下述方法:

  • setIntHeader
  • setDateHeader
  • addIntHeader
  • setIntHeader

HTTP響應頭需要比響應體輸出至客戶端,若響應體已經輸出再輸出響應頭,Servlet Container會忽略響應頭。

對於Servlet生成的內容Servlet 編程者有義務設置Content-Type。HTTP/1.1不要求必須設置Content-Type請求頭。

推薦Servlet Container 使用X-Powerd-By請求頭髮布自身的實現。

這個請求頭的值起碼是一個以上。如"Servlet/4.0"。

5.3 HTTP Trailer 預告

HTTP Trailer是發送在響應體之後的響應頭集合。適用於chunked編碼發送的場景或者是其他額外的協議。

如果HTTP Trailer 請求頭已經就緒則調用isTrailerFieldsReady()方法會返回true。

servlet可以通過HttpServletRequest介面的getTrailerFields()方法讀取 Trailer 請求頭。

servlet可以輸出HTTP Trailer頭通過提供Supplier給HttpServletResponse介面提供的setTrailerFields()方法。也可以通過提供的Supplier使用HttpServletResponse介面的getTrailerFields()方法獲取HTTP Trailer請求頭。

5.4 非阻塞IO

非阻塞IO只能在非同步處理請求中使用。否則ServletInputStream.setReadListener和ServletOutputStream.setWriteListener調用時,需要拋出IllegalStateException異常。

為了支持在Web 容器支持非阻塞寫,引入如下改變:

WriteListener提供下述回調方法:

  • void onWritePossible() 當WriteListener註冊到ServletOutputStream

後,當ServletOutputStream能寫時會第一次調用WriteListener.onWritePossible()方法。

只有當ServletOutputStream.isReady()方法返回true才會調用WriteListener.onWritePossible()方法。

  • onError(Throwable t)處理響應失敗時會調用該方法。

伴隨著WriteListener還有ServletOutputStream的其他方法幫助WebApplication判斷是否準備好寫內容至客戶端。

  • boolean isReady()如果寫ServletOutputStream成功則會返回true。如果這個方法返回true,則ServletOutputStream寫操作可以繼續完成。若沒有後續內容需要寫,則該方法返回false。
  • void setWriteListener(WriteListener listener) 關聯WriteListener和ServletOutputStream。當可以寫入數據時容器會調用WriteListener的方法。

註冊的WriteListener會開始非阻塞IO,此時禁止轉為阻塞IO。Servlet Container需要保證WriteListener的線程安全

5.5 Response對象的生命周期

每個Response對象都只能在service或者doFilter方法中生效,非同步處理請求除外。

非同步處理請求情況下,Response對象一直有效直到Servlet Container 調用AsyncContext.complete方法後。Servlet Container會回收Response對象為了提供性能,

研發需要明白,在這些作用域外引用Response對象都會引發未知錯誤。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 介紹了分散式鎖的特性,模擬想要實現redis分散式鎖的演變流程,分析redisson源碼是如何實現分散式鎖的,面對高併發下,我們該如何提升分散式鎖性能 ...
  • 1.冒泡排序(Bubble Sort) | 第0輪 | 3 | 1 | 4 | 1 | 5 | 9 | 2 | 6 | 5 | 3 | 5 | 8 | 9 | | | | | | | | | | | | | | | | | 第1輪 | 1 | 3 | 1 | 4 | 5 | 2 | 6 | 5 | ...
  • 前言 tkinter:GUI桌面應用開發模塊,寫軟體界面你還可以打包成exe軟體, 哪怕你沒有python環境, 一樣可以用雖然不一定要有界面, 但是有界面, 用戶體驗很棒… 環境使用 Python 3.8 Pycharm 模塊使用 import tkinter import webbrowser ...
  • 1、無論是淺拷貝還是深拷貝,拷貝對象後是否會開闢新記憶體,取決於被拷貝對象的數據類型是否可變,一般來講,可變的數據類型會開闢新記憶體,不可變數據類型反之不會開闢新記憶體,進行記憶體地址的引用(-5-256以外的大整數池會開闢記憶體,但我本地進行測試比較記憶體還是一樣的,有問題) 2、要在單層、嵌套型對象中逐一比 ...
  • 前言 環境使用 Python 3.8 Pycharm 模塊使用 import requests —> 數據請求模塊 pip install requests import parsel —> 數據解析模塊 pip install parsel from selenium import webdriv ...
  • Java Hutool 包工具類推薦 ExcelUtil 包引入 hutool包版本號可根據實際情況更換 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.4.M1</ ...
  • 總結: ArrayList與Vector集合的底層都是通過Object[] elementData數組存放對象的 ArrayList使用無參構造器時,初始容量為0,當存放一個對象後,容量擴容為10,此後按1.5*當前容量進行擴容 ArrayList使用帶參構造器時,初始容量為設定值,當存放對象個數達 ...
  • 1.List集合概要 2.Iterable介面 1.概要 2.重要方法 forEach方法:對Collection集合中的每個對象進行消費 List<Student> list = Stream.generate(() -> new Student("張三", 23)).limit(100).col ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...