日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

第五章 Response(JavaTM Servlet 规范3.1 )

發(fā)布時間:2023/12/10 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第五章 Response(JavaTM Servlet 规范3.1 ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

The Response? 響應(yīng)

響應(yīng)對象包裝了從服務(wù)器端返回到客戶端的所有信息。在HTTP協(xié)議上,這些信息既可以通過HTTP headers 又可以通過響應(yīng)體從服務(wù)器端傳輸?shù)娇蛻舳恕?/p>

5.1 緩沖

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

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

■ getBufferSize

■ setBufferSize

■ isCommitted?

■ reset

■ resetBuffer

■ flushBuffer

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

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

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

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

flushBuffer 方法強(qiáng)制緩沖中的內(nèi)容被寫到客戶端。

當(dāng)響應(yīng)沒有被提交時,reset 方法清除緩沖中的數(shù)據(jù)。Headers,status codes 和 調(diào)用 reset 之前調(diào)用 getWriter 或 getOutputStream 被 servlet 設(shè)置的狀態(tài)也被清除。如果響應(yīng)沒有被提交,resetBuffer 方法清除緩沖中的內(nèi)容,但是不清除 headers 和status code。

如果響應(yīng)已經(jīng)被提交,調(diào)用 reset 或者 resetBuffer 方法,必須拋出IllegalStateException。響應(yīng)和它關(guān)聯(lián)的緩沖將不會改變。

當(dāng)使用緩沖時,容器必須立即將填滿緩沖的內(nèi)容刷出到客戶端 。如果這是發(fā)送到客戶端的第一(唯一?)數(shù)據(jù),可認(rèn)為響應(yīng)已經(jīng)被提交。

5.2 Headers

servlet 可以通過 HttpServletResponse 接口的以下方法設(shè)置 HTTP 響應(yīng)的頭:

■ setHeader

■ addHeader

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

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

■ setIntHeader

■ setDateHeader

■ addIntHeader

■ addDateHeader

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

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

建議容器使用 X-Powered-By HTTP header 發(fā)布它的實現(xiàn)信息。這個字段的值應(yīng)該由一個或者多個實現(xiàn)類型組成,比如:”Servlet/3.1”。可選的,容器的補(bǔ)充信息和隱含的Java平臺信息可以添加在實現(xiàn)類型后面的括號內(nèi)。容器應(yīng)可配置隱藏此 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 的異步請求處理和升級處理時才有效。否則當(dāng)調(diào)用 ServletInputStream.setReadListener 或 ServletOutputStream.setWriteListener 時必須拋出IllegalStateException。為了支持在Web容器中非阻塞寫,除了在3.7節(jié)中描述的 ServletRequest 的變化之外,與處理響應(yīng)有關(guān)的類/接口也發(fā)生了下面的變化:

WriteListener 提供了適合容器調(diào)用的如下回調(diào)方法:

■ WriteListener

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

■ onError(Throwable t). 當(dāng)處理響應(yīng)發(fā)生錯誤時被調(diào)用。

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

■ ServletOutputStream

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

5.4 Convenience Methods 便捷方法?

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

■ sendRedirect

■ sendError

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

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

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

?

5.5 Internationalization? 國際化

Servlets 應(yīng)該設(shè)置 locale 和響應(yīng)的字符編碼。locale 使用 ServletResponse.setLocale 方法設(shè)置。該方法可以重復(fù)調(diào)用;但是響應(yīng)提交后的調(diào)用沒有效果。如果頁面提交前 servlet 沒有設(shè)置 locale,使用容器的默認(rèn) locale 來確定響應(yīng)的 locale,但是沒有為與客戶端的通信制定規(guī)范,比如使用 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 方法可以被重復(fù)調(diào)用來改變字符編碼。在 servlet 響應(yīng)的 getWriter 方法被調(diào)用后或響應(yīng)被提交后的調(diào)用不會對字符編碼產(chǎn)生影響。僅在用給定的內(nèi)容類型字符串為 charset 屬性提供一個值的時候,調(diào)用 setContentType 來設(shè)置字符編碼。只有當(dāng)既沒有使用 setCharacterEncoding 又沒有使用 setContentType 設(shè)置字符編碼之前調(diào)用 setLocale 設(shè)置字符編碼(是不是應(yīng)該設(shè)置Locale?)。

如果調(diào)用 ServletResponse 接口的 getWriter 方法或響應(yīng)提交之前,servlet 沒有指定字符編碼,將默認(rèn)使用“ISO-8859-1”。

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

?

5.6 ?Closure of Response Object? 響應(yīng)對象的關(guān)閉?

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

  • servlet 的 service 方法結(jié)束。?
  • 在 response 的 setContentLength 或 setContentLengthLong 方法中指定的內(nèi)容量大于 0,并且已經(jīng)寫入響應(yīng)。?
  • sendError 方法被調(diào)用。?
  • sendRedirect 方法被調(diào)用。?
  • AsyncContext 的 complete 方法被調(diào)用。?

5.7??? ?Lifetime of the Response Object? 響應(yīng)對象的生命周期

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

轉(zhuǎn)載于:https://www.cnblogs.com/whilliy/p/5684497.html

總結(jié)

以上是生活随笔為你收集整理的第五章 Response(JavaTM Servlet 规范3.1 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。