Servlet 3.1 特性功能

產品支援 Servlet 3.1 規格。請檢視可用功能的闡明與說明。

Java™ Servlet 規格中已提供 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 完成。完成與否取決於其他外部因素,例如:環境或網路的速度。

升級處理程序

重要: 請將 ServletOutputStream 類別與 WriteListener 介面一起使用,將 ServletInputStream 類別與 ReadListener 介面一起使用。 請勿將這些類別與 ObjectInputStream 類別或 ObjectOutputStream 類別一起使用。 這些類別會規避 ReadListener 和 WriteListener 介面的一些必要檢查,主要是各項 isReady 檢查,且可能會導致非預期的行為。
升級處理程序是一項 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 方法。Javadoc for onReadListener.onAllDataRead 會傳回下列訊息:
在讀取現行要求的所有資料時呼叫。
就「升級」案例來說,伺服器並不知道資料結束,這是因為所升級的資料並不是使用 HTTP 要求內文資料的定界方式。除了在用戶端連線關閉時,無從判斷資料的結束。

表單型鑑別

在鑑別成功之後,會將用戶端重新導向至原始要求的資源。Servlet 3.1規格指定:為了改良重新導向要求 HTTP 方法的可預測性,儲存器在重新導向時,必須使用 303 (SC_SEE_OTHER) 狀態碼,但是如果需要具備與 HTTP 1.0 使用者代理程式之間的交互作業能力,就必須使用 302 狀態碼。 特性會維護與 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 儲存器處理成功,它所需的記憶體量可能是公佈資料大小的兩倍。

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



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