第五章 Response(JavaTM Servlet 規范3.1 )

The Response? 響應

響應對象包裝了從服務器端返回到客戶端的所有信息。在HTTP協議上,這些信息既可以通過HTTP headers 又可以通過響應體從服務器端傳輸到客戶端。

5.1 緩沖

為了效率,servlet 容器允許但非必須緩沖到客戶端的輸出。典型地,服務器默認使用緩沖,但是允許 servlets 可以指明緩沖參數。

ServletResponse 接口中的下列方法允許 servlet 訪問和設置緩沖信息:

■ getBufferSize

■ setBufferSize

■ isCommitted?

■ reset

■ resetBuffer

■ flushBuffer

ServletResponse 接口提供的這些方法允許執行緩沖操作,無論 servlet 使用 ServletOutputStream 還是 Writer。

getBufferSize 方法返回被隱含使用的緩沖的大小。如果沒有緩沖被使用,這個方法返回整數值0。

servlet 可以使用 setBufferSize 方法請求一個最佳的緩沖大小。賦予的緩沖不必是 servlet 請求的大小,但是必須至少與與請求的大小一樣大。這樣允許容器重用一組固定大小的緩沖,如何合適的話,提供一個比請求更大的緩沖。該方法必須在使用 ServletOutputStream 或 Writer 寫入任何內容前調用。如果任何內容已經被寫入或響應對象已經被提交,此方法必須拋出一個IllegalStateException。

isCommitted 方法返回一個布爾值表示所有(任何)響應字節已經返回到客戶端。

flushBuffer 方法強制緩沖中的內容被寫到客戶端。

當響應沒有被提交時,reset 方法清除緩沖中的數據。Headers,status codes 和 調用 reset 之前調用 getWriter 或 getOutputStream 被 servlet 設置的狀態也被清除。如果響應沒有被提交,resetBuffer 方法清除緩沖中的內容,但是不清除 headers 和status code。

如果響應已經被提交,調用 reset 或者 resetBuffer 方法,必須拋出IllegalStateException。響應和它關聯的緩沖將不會改變。

當使用緩沖時,容器必須立即將填滿緩沖的內容刷出到客戶端 。如果這是發送到客戶端的第一(唯一?)數據,可認為響應已經被提交。

5.2 Headers

servlet 可以通過 HttpServletResponse 接口的以下方法設置 HTTP 響應的頭:

■ setHeader

■ addHeader

setHeader方法使用一個給定的名稱和值設置一個 header。之前的 header 被新 header 替換。當此名有一個 header 值集合,所有值被清除并用新值代替。

addHeader 方法添加一個 header 值到給定名稱的頭的值集。如果該名稱沒有關聯的頭,一個新集被創建。Headers 可以包含表示 int 或 Date 對象的數據。HttpServletResponse 接口的下列便捷方法允許 servlet 為合適的數據類型使用正確的格式設置 header:

■ setIntHeader

■ setDateHeader

■ addIntHeader

■ addDateHeader

為了成功的傳回客戶端,頭必須在響應提交之前設置。響應提交之后設置的頭將被 servlet 容器忽略。

Servlet 開發者有責任保證為 servlet 生成的內容在響應對象中設置合適的 Content-type 頭。HTTP 1.1 規范沒有要求 HTTP 響應中設置此頭。開發者沒有設置此類型時,servlet 容器不必設置一個默認的內容類型(content type)。

建議容器使用 X-Powered-By HTTP header 發布它的實現信息。這個字段的值應該由一個或者多個實現類型組成,比如:”Servlet/3.1”。可選的,容器的補充信息和隱含的Java平臺信息可以添加在實現類型后面的括號內。容器應可配置隱藏此 header。

以下是此 header 的例子:

X-Powered-By: Servlet/3.1

X-Powered-By: Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition 4.0 Java/Oracle Corporation/1.7)

5.3 Non Blocking IO ?非阻塞IO

非阻塞IO只有在 Servlets 和 Filters 的異步請求處理和升級處理時才有效。否則當調用 ServletInputStream.setReadListener 或 ServletOutputStream.setWriteListener 時必須拋出IllegalStateException。為了支持在Web容器中非阻塞寫,除了在3.7節中描述的 ServletRequest 的變化之外,與處理響應有關的類/接口也發生了下面的變化:

WriteListener 提供了適合容器調用的如下回調方法:

■ WriteListener

■ void onWritePossible(). 當一個 WriteListener 注冊到 ServletOutputStream 時,當可以寫數據時這個方法被容器第一次調用。當且僅當下面描述的 ServletOutputStream 的 isReady 方法返回false 時,容器接下來會調用 onWritePossible 方法。

■ onError(Throwable t). 當處理響應發生錯誤時被調用。

與WriteListener一起,下面添加到 ServletOutputStream 類的方法允許開發者在運行時檢查是否有發送到客戶端的可寫數據。

■ ServletOutputStream

  • boolean isReady(). 如果對 ServletOutputStream 的寫會成功,該方法返回true,否則返回 false。如果該方法返回 true,可以在 ServletOutputStream 上執行一個寫操作。如果沒有后續數據可以寫到 ServletOutputStream,那么直到容器調用 WriteListener 的 onWritePossible 方法將隱含的數據刷出之前,此方法將返回false。該方法的后續調用將會返回true。
  • void setWriteListener(WriteListener listener). 用 WriteListener 關聯 ServletOutputStream。當 ServletOutputStream 可寫數據時,容器調用 WriteListener 上的回調方法。注冊一個 WriteListener 將開啟非阻塞IO。此時切換到傳統阻塞IO是非法的。Servlet 容器必須用線程安全的方式訪問 WriteListener 的方法。?

5.4 Convenience Methods 便捷方法?

?HttpServletResponse 接口中存在以下便捷方法:

■ sendRedirect

■ sendError

sendRedirect方法將設置合適的頭和內容體重定向客戶端到一個不同的URL。調用這個方法時使用一個相對URL路徑是合法的,但是隱含的容器必須轉換這個相對路徑為一個全路徑URL傳回客戶端。如果給了一個不完整的URL,不管什么原因都不能轉換為一個有效的URL,此方法必須拋出一個IllegalArgumentException。

sendError方法將為錯誤信息設置合適的頭和內容體返回到客戶端。sendError方法支持一個可選的字符串參數用來設置錯誤的內容體。

這些方法會對提交中的響應產生副作用,如果響應還沒有被提交,將會中斷它(?)。這些方法被調用之后,servlet 不會產生到客戶端的后續輸出。如果這些方法被調用后,有數據寫到了響應,這些數據將被忽略。如果數據被寫到了響應緩沖,但是還沒有返回到客戶端(比如:響應還沒有比提交),響應緩沖中的數據必須被清除,并且用這些方法設置的數據來替代。如果響應被提交,這些方法必須拋出一個IllegalStateException。

?

5.5 Internationalization? 國際化

Servlets 應該設置 locale 和響應的字符編碼。locale 使用 ServletResponse.setLocale 方法設置。該方法可以重復調用;但是響應提交后的調用沒有效果。如果頁面提交前 servlet 沒有設置 locale,使用容器的默認 locale 來確定響應的 locale,但是沒有為與客戶端的通信制定規范,比如使用 HTTP 情況下的Content-Language 頭。

<locale-encoding-mapping-list>

??? <locale-encoding-mapping>

??????? <locale>ja</locale>

??????? <encoding>Shift_JIS</encoding>

??? </locale-encoding-mapping>

</locale-encoding-mapping-list>

如果元素不存在或者沒有提供一個映射,setLocale 使用容器依賴的映射。setCharacterEncoding ,setContentType和 setLocale 方法可以被重復調用來改變字符編碼。在 servlet 響應的 getWriter 方法被調用后或響應被提交后的調用不會對字符編碼產生影響。僅在用給定的內容類型字符串為 charset 屬性提供一個值的時候,調用 setContentType 來設置字符編碼。只有當既沒有使用 setCharacterEncoding 又沒有使用 setContentType 設置字符編碼之前調用 setLocale 設置字符編碼(是不是應該設置Locale?)。

如果調用 ServletResponse 接口的 getWriter 方法或響應提交之前,servlet 沒有指定字符編碼,將默認使用“ISO-8859-1”。

如果使用的協議提供了這樣的方法,容器必須將 servlet 響應的 wirter 使用的 locale 和字符編碼傳給客戶端。在使用HTTP時,通過 Content-Language 頭傳遞 locale,字符編碼作為文本媒體類型 Content-Type 頭的一部分傳遞。注意:如果 servlet 沒有指明內容類型(content type),字符編碼不能通過HTTP 頭傳遞,但是仍然可以使用 servlet 響應的 writer 對文本編碼。

?

5.6 ?Closure of Response Object? 響應對象的關閉?

???????? 當響應關閉時,容器必須立即將響應緩沖中剩余的內容刷出到客戶端。下面的事件表明 servlet 滿足了請求,響應對象將被關閉:

  • servlet 的 service 方法結束。?
  • 在 response 的 setContentLength 或 setContentLengthLong 方法中指定的內容量大于 0,并且已經寫入響應。?
  • sendError 方法被調用。?
  • sendRedirect 方法被調用。?
  • AsyncContext 的 complete 方法被調用。?

5.7??? ?Lifetime of the Response Object? 響應對象的生命周期

除非關聯的請求對象為組件開啟了異步處理,否則每個響應對象只在 servlet 的 service 方法或 filter 的 doFilter 方法的作用域中有效。如果相關聯請求的異步處理已經開始,在 AsyncContext 的 complete 方法調用之前該請求對象一直有效。為了避免創建響應對象的性能開銷,容器通常會回收利用響應對象。開發者必須注意相應的請求沒有被調用 startAsync 方法,在上面描述的作用域之外保持響應對象的引用可能會導致無法確定的行為。?

轉載于:https://www.cnblogs.com/whilliy/p/5684497.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271332.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271332.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271332.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言深度剖析第三版pdf_入門到入墳,蘊含全網最強知識點3283頁筆記、pdf教程,活到老,學到老...

又到了“金九銀十”面試求職高峰期&#xff0c;在金三銀四時也參與過不少面試&#xff0c;2020都說工作不好找&#xff0c;也是對開發人員的要求變高。前段時間自己有整理了一些Java后端開發面試常問的高頻考點問題做成一份PDF文檔&#xff08;1000道高頻題&#xff09;&#x…

mysql 5.7.23要錢嗎_最新mysql 5.7.23安裝配置圖文教程

2018年最新mysql5.7詳細安裝與配置&#xff0c;總共分為四步&#xff0c;其中環境變量配置不是必須的。1、安裝包下載2、安裝過程3、環境變量配置4、連接測試一、官網下載mysql安裝包1.前往官網下載&#xff0c;下載鏈接為&#xff1a;2.選擇合適你電腦系統的版本進行安裝。如果…

計算機基礎:信息安全相關知識筆記

1、信息安全要素機密性&#xff1a;保證信息不暴露給未授權的用戶。完整性&#xff1a;得到允許的用戶可以修改數據&#xff0c;并且可以判斷數據是否被篡改。可用性&#xff1a;擁有授權的用戶可以在需要時訪問數據。可控性&#xff1a;可控制授權的范圍內的信息流向以及行為方…

mysql gtid ha_MySQl新特性 GTID

GTID簡介概念全局事務標識符(GTID)是創建的唯一標識符&#xff0c;并與在源(主)服務器上提交的每個事務相關聯。此標識符不但是唯一的&#xff0c;而且在給定復制設置中的所有服務器上都是唯一的。所有交易和所有GTID之間都有一對一的映射關系。GTID由source_id和transaction_i…

python gui界面 tcp_通過python實現TCP編程

偽代碼&#xff1a; ss socket() #創建服務器套接字 ss.bind() #把地址綁定到套接字上 ss.listen() #監聽連接&#xff08;最大連接數&#xff09; info_loop: #服務器無限循環 cs ss.accept() #接受客戶端連接 comm_loop: #通信循環 cs.recv()/cs.send() #對話&#xff08;接…

計算機網絡安全基礎知識筆記

1、網絡安全威脅介紹非法授權訪問&#xff1a;沒有預先經過同意&#xff0c;就使用網絡或相關的計算機資源就是非授權訪問。主要有以下幾種形式&#xff1a;身份攻擊、假冒、非法用戶進入網絡系統進行違法操作、合法用戶以未授權的方式進行操作。信息泄露丟失&#xff1a;主要是…

Delphi面向對象學習隨筆七:COM

作者&#xff1a;巴哈姆特http://www.cnpack.org&#xff08;轉載請注明出處并保持完整&#xff09; 上一篇&#xff0c;我們介紹了接口。如果沒有接觸過COM對象的話&#xff0c;你會覺得接口真的很麻煩&#xff0c;也許會有&#xff1a;“還不如直接定義一個類更方便”的想法。…

lambda

例子&#xff1a;

mysql查詢語句詳解_基于mysql查詢語句的使用詳解

1> 查詢數據表除了前三條以外的數據。起初我想到的是這條語句SELECT * FROM admin WHERE userid NOT IN (SELECT userid FROM admin ORDER BY userid LIMIT 3) ORDER BY userid DESC但是運行的時候會報 This version of MySQL doesnt yet support LIMIT & IN/ALL/ANY/SO…

數據庫技術基礎:數據庫與數據庫管理系統概念介紹

一、數據庫系統基本概念知識1、 數據&#xff08;Data&#xff09;用來描述事物的符號記錄&#xff0c;它具有多種表現形式比如文字、圖形、圖像、視頻等。信息&#xff1a;是現實事物的存在方式或狀態的反映。信息的特性有可感知、可存儲、可加工、可傳遞、可再生等。2、 數據…

unity3d collider自動調整大小_Maya模型在Unity3d中的快速烘焙【2020】

本文小姐姐將以一個Maya的室內小客廳場景為例&#xff0c;和童鞋們一起討論Unity3d快速烘焙Maya室內模型光照的方法&#xff0c;一方面是對前面知識的綜合應用&#xff0c;另一方面滿足一下做室內設計童鞋的學習需求。話不多說&#xff0c;開工&#xff01;這個例子的Maya場景模…

angualarjsdemo

AngularJs學習筆記--Forms 原版地址&#xff1a;http://code.angularjs.org/1.0.2/docs/guide/forms 控件&#xff08;input、select、textarea&#xff09;是用戶輸入數據的一種方式。Form&#xff08;表單&#xff09;是這些控件的集合&#xff0c;目的是將相關的控件進行分組…

Java中Comparator比較器的使用以及使用lamba簡化代碼

代碼例子&#xff1a; /*** 測試Comparator*/Testpublic void test17() {//原始方法Comparator<Integer> comparator new Comparator<Integer>() {Overridepublic int compare(Integer o1, Integer o2) {return Integer.compare(o1, o2);}};int compare1 compara…

php字符串轉換mysql_在PHP中將字符串轉換為MySQL時間戳格式

我使用從androidjava應用程序發送的字符串在php中編寫查詢.查詢是這樣的&#xff1a;$insertSQL sprintf("INSERT INTO app_DuckTag (taste) VALUES (%s) WHERE species%s AND timestamp%s",GetSQLValueString($_POST[taste], "text"),GetSQLValueString(…

數據庫技術基礎:數據庫管理系統的功能介紹筆記

1、DBMS功能介紹1.1 數據定義數據庫定義語言&#xff08;DDL&#xff09;&#xff1a;可以對數據庫結構描述&#xff0c;包括外模式、模式、內模式的定義&#xff1b;數據庫完整性定義&#xff1b;安全保密定義比如口令、級別和存取權限。這些定義存儲在數據字典中是DBMS運行的…

charles亂碼_基于iOS的Charles抓包實踐

奇技指南在應用開發過程中&#xff0c;通過抓包調試服務端接口的場景時常出現。Charles和Wireshark是開發過程中最常用的兩款軟件。那么今天&#xff0c;讓我們以iOS為例&#xff0c;聊一聊Charles抓包。本文來自360奇舞團QiShare團隊投稿。在日常開發中&#xff0c;我們無法看…

分珠(dfs+并查集)

1140 分珠 時間限制:500MS 內存限制:65536K提交次數:24 通過次數:18 題型: 編程題 語言: G;GCC Description 如下圖所示&#xff0c;有若干珠子&#xff0c;每顆珠子重量不同&#xff0c;珠子之間有一些細線將它們連在一起。現要求切斷一些細線&#xff0c;將它們分成兩部分…

那些程序員爆笑段子,扎心了…

1、特殊“2020是屬于程序員的一年。”“怎么說&#xff1f;”“2020-1024996。”2、真相“你們程序員是不是沒見過下班時候的太陽&#xff1f;”“也不是啦&#xff0c;夏天的時候還是能看到的。”“哦哦&#xff0c;夏天黑得比較晚。”“不是&#xff0c;是天亮得比較早。”3、…

lambda中sorted排序

準備工作&#xff0c;新建一個User類 使用stream排序操作&#xff08;默認ASC排序) stream倒序排序操作 sorted(Comparator.reverseOrder()) 代碼例子&#xff1a; /*** lambda* sorted排序*/Testpublic void test19() {List<Integer> list new ArrayList<>();…