Servlet 2.5版本終止響應(yīng)
***處優(yōu)化細(xì)小又深?yuàn)W,但做為規(guī)范中的一個(gè)例子還有蠻有趣的。Servlet 2.4規(guī)范規(guī)定響應(yīng)在這幾種情況下應(yīng)該是有效的,包括:在響應(yīng)的setContentLength方法中內(nèi)容已經(jīng)明確說明,以及內(nèi)容已經(jīng)寫進(jìn)了響應(yīng)中。這種情況只有你的代碼像下面這樣才可以使響應(yīng)重新定向:
◆response.setHeader("Host", "localhost");
◆response.setHeader("Pragma", "no-cache");
◆response.setHeader("Content-Length", "0");
◆response.setHeader("Location", http://www.apache.org");
Servlet技術(shù)忽略特定區(qū)域的標(biāo)題頭,因?yàn)閮?nèi)容滿足0字節(jié)長(zhǎng)度,響應(yīng)就會(huì)立即生效。而在它開始之前,響應(yīng)就已失效了!Servlet容器通常拒絕執(zhí)行這種行為,而Servlet 2.5版本增加了“長(zhǎng)度必須大于0”這個(gè)原則。
實(shí)例編碼:
Servlet 2.4 規(guī)范規(guī)定必須在調(diào)用request.getReader()方法之前調(diào)用request.setCharacterEncoding()方法。但是,如果你忽略這個(gè)原則而在其之后去調(diào)用request.setCharacterEncoding()方法,那么會(huì)產(chǎn)生什么后果,這個(gè)問題規(guī)范里并沒有說。為了簡(jiǎn)便,現(xiàn)在消除這種情況!
Cross-context sessions(不同上下文目錄間的會(huì)話):
最近,關(guān)于Cross-context會(huì)話處理的規(guī)則已經(jīng)明確說明。當(dāng)Servlets指派從一個(gè)上下文到其他上下文的請(qǐng)求時(shí),這個(gè)規(guī)則就發(fā)揮了作用??在目標(biāo)調(diào)用過程中,包括哪些會(huì)話。這個(gè)版本的出現(xiàn)使得一個(gè)上下文目錄的主頁(yè)里的portlets可以通過幾種內(nèi)部的命令來對(duì)別的上下文目錄里的portlets起作用。
Servlet 2.5版本明確指出一個(gè)上下文目錄里的資源可以訪問其他上下文目錄的session(會(huì)話),而不用考慮這個(gè)請(qǐng)求從哪里開始的。這意味著portlets可以脫離主頁(yè)的范圍而在自己的范圍里運(yùn)行,而且這個(gè)規(guī)范還會(huì)應(yīng)用在不兼容的Serlvet容器中。期待:
由于Servlet 2.5版本要保持一些舊的性質(zhì),幾個(gè)大的概念不得不延后到下一個(gè)階段。它們包括:
◆新的輸入/輸出(NIO)支持:使NIO通道更有利于Servlets進(jìn)行客戶端通信成為可能。
◆過濾器wrap-under或wrap-over語義:有時(shí)用過濾器包裝請(qǐng)求,和/或者響應(yīng)對(duì)象去修改方法行為或者啟用新的方法。當(dāng)把這種包裝和服務(wù)器對(duì)請(qǐng)求和響應(yīng)的包裝結(jié)合起來時(shí),又應(yīng)該怎么包裝在一起?
◆用于歡迎的Servlets文件:做為索引應(yīng)該充當(dāng)歡迎作用的文件嗎?在此之前,這個(gè)回答是肯定的。但是規(guī)范沒有明確說明如何使用這個(gè)功能,尤其在沒有索引的情況下。
◆用于歡迎的文件的分派規(guī)則:如何分派歡迎文件,這個(gè)細(xì)節(jié)并沒有完全說明,而是遺留了一些開放的缺口來應(yīng)對(duì)不兼容問題。
◆登陸后選擇默認(rèn)頁(yè)面:如果用戶通過他們的書簽訪問Servlet的登陸頁(yè)面,那么在成功登陸后頁(yè)面應(yīng)該轉(zhuǎn)向哪里呢?這個(gè)問題至今尚未明確說明。
◆用戶的主題日志:在通過網(wǎng)站正確地注冊(cè)之后,不通過傳統(tǒng)地登陸方式?jīng)]有辦法使Servlet信任用戶。
【編輯推薦】