Servlet 3.1 特性功能

Servlet 3.1 特性完整支援 Servlet 3.1 規格。

Servlet 3.1 規格中已提供 Servlet 3.1 新功能的說明,這裡不再贅述。不過,對於 Servlet 3.1 特性,另有下列這些考量:

非同步 I/O

Servlet 3.1 特性的新特性指定,當啟動非阻斷讀取時,在剩餘的要求生命期限期間,任何資源都無法呼叫 API,而這可能造成阻斷讀取。以 POST 要求為例,在資源設定讀取接聽器之後,後續只要呼叫 getParameter() 和 getPart() API,都會導致 IllegalStateException。

當您使用非同步 Servlet 時,必須考量使用 AsyncContext.setTimeout API 來設定逾時值,否則會使用儲存器預設值(例如 30 秒)。每當使用 ServletRequest 啟動非同步時,會重設逾時值。會呼叫 StartAsync API,如果在前次啟動非同步之後的逾時期間內沒有呼叫 AsyncContext.complete API,StartAsync API 就會到期。當您使用 Servlet-3.1 特性提供的非同步 I/O 支援時,請使用 AsyncContext.setTimeout API 來設定逾時值,以容許非同步 I/O 完成。完成與否取決於其他外部因素,例如:環境或網路的速度。

升級處理

當讀取或寫入作業非同步時,非阻斷讀取與寫入(Servlet 3.1 特性推出的升級特性)不會限制伺服器的等待時間。您可以在 server.xml 檔中,使用 upgradereadtimeoutupgradewritetimeout 等之類的 Web 儲存器自訂內容,來設定逾時值。例如,依如下所示將逾時值設為 5 秒:
<webContainer upgradeReadTimeout="5000" />
<webContainer upgradeWriteTimeout="5000" />

在非同步 Servlet 處理要求期間,不得使用 Servlet 3.1 的升級特性來升級要求。

如果應用程式支援使用 Servlet 3.1 特性進行升級,則在升級的要求上,用戶端與管理升級的應用程式之間的連線需維持開啟。當從應用程式的處理程式或其他任何資源(例如 ReadListener 或 WriteListener)完成升級處理程序時,如果該應用程式沒有起始 WebConnection close(),TCP 連線會維持開啟,直到伺服器停止再啟動為止。

當您使用 Servlet 3.1 特性中的 UpgradeHandler 和 ReadListener 時,只有在用戶端關閉指向管理所升級應用程式之伺服器的連線時,才會呼叫 ReadListener.onAllDataRead 方法。onReadListener.onAllDataRead 的 Javadoc 指出「在已讀取現行要求的所有資料時呼叫」。就「升級」案例來說,伺服器並不知道資料結束,這是因為所升級的資料並不是使用 HTTP 要求內文資料的定界方式。除了在用戶端連線關閉時,無從判斷資料的結束。

表單型鑑別

在鑑別成功之後,會將用戶端重新導向至原始要求的資源。Servlet 3.1 規格指定:「為了改良重新導向要求 HTTP 方法的可預測性,儲存器在重新導向時,應使用 303 (SC_SEE_OTHER) 狀態碼,但是如果需要具備與 HTTP 1.0 使用者代理程式之間的交互作業能力,就應該使用 302 狀態碼」。Servlet-3.1 特性會維護與 HTTP 1.0 使用者代理程式之間的交互作業能力,因此一律使用 302 狀態碼。如需配置 Servlet 3.1 以具備安全性的相關資訊,請閱讀「針對 Servlet 3.1 配置 Liberty 設定檔」主題。

大量公佈資料

新增的 ServletRequest.getContentLengthLong() API 需要支援接收長度超過 Integer.MAX_VALUE,且無法完整容納於單位元組陣列或字串中的公佈資料。

如果您取得的公佈資料內容會使用 API,而該 API 會將內容置於字串或 byte[] 中傳回,這個新增項目存在一些含意。例如,用來存取參數的 javax.servlet.ServletRequest 方法:
String    getParamter(String name)
String[]  getParameterValues()
Map<String,String> getParameterMap()

所傳送的公佈資料有可能包含多個參數,當加以合併時,其長度超過了 Integer.MAX_VALUE。不過,每一個個別的參數名稱和參數值的長度必須小於 Integer.MAX_VALUE

傳送大量公佈資料時,另有下列這些考量:
  • 傳送公佈資料時,其片段的長度不得超過 Integer.MAX-VALUE
  • Web 儲存器所處理的公佈資料(例如:參數或組件)必須完整讀取之後,才能開始處理。如果是大量公佈資料,公佈資料可能需要可觀的記憶體,因為為了使 Web 儲存器處理成功,它所需的記憶體量可能是公佈資料大小的兩倍。

指示主題類型的圖示 概念主題

資訊中心條款 | 意見


「時間戳記」圖示 前次更新: 2015 年 6 月 22 日
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=cwlp_servlet31
檔名:cwlp_servlet31.html