天天看點

[Servlet&JSP] 封裝器的使用請求封裝器響應封裝器

過濾器可以在執行servlet的service()方法前後,進行前置和後置處理。但是有些資訊無法更改,例如請求參數。使用請求封裝器及相應封裝器,将容器産生的請求與相應對象加以封裝,可以針對某個請求資訊或響應進行加工處理。

httpservletrequestwrapper實作了httpservletrequest接口,以下範例通過繼承httpservletrequestwrapper實作了一個請求封裝器,可以請請求參數中的角括号替換為替代字元。

可以使用這個請求封裝器搭配過濾器,以進行字元過濾的服務。例如:

如果想要對響應的内容進行壓縮處理等,可以在響應封裝器部分繼承httpservletresponsewrapper類來對httpservletresponse對象進行封裝。

如要對浏覽器進行輸出響應,必須通過getwriter()取得printwriter,或是通過getoutputstream()取得servletoutputstream。是以針對壓縮輸出的請求,主要就是繼承httpservletresponsewrapper之後,通過重寫這兩個方法來達成的。

在這裡壓縮功能将采用gzip格式,這是浏覽器可以接受的壓縮格式,可以使用gzipoutputstream類來實作。由于getwriter()的printwriter在建立時也是必須要用到servletoutputstream,是以這裡首先擴充servletoutputstream類,讓它具有壓縮功能。

gzipservletoutputstream.java:

compressionresponsewrapper.java:

compressionfilter.java(壓縮過濾器):

最後,将過濾器設定在web.xml中,響應就會是壓縮過後的内容。