HttpServletRequestWrapper類的使用
servlet規范中中引入的filter是非常有用的,因為它引入了一個功能強大的攔截模式。
filter是這樣的一種java對象。它可以在request到達servlet之前攔截HttpServletRequest對象,也可以在服務方法轉移控制后攔截HttpServletResponse對象。
我們可以使用filter對象完成的任務有:檢查用戶的輸入、以及壓縮web內容。
但是,當我們在使用filter的時候卻會發現至少有一半的時間我們都想改變HttpServletRequest對象的參數。如:用filter在HttpServletRequest對象到達Servlet之前將用戶輸入的空格去掉。但是由於java.util.Map包裝的HttpServletRequest對象的參數是不可改變的,那要怎么辦呢?
幸運的是,盡管我們不能改變對象本身,但是可以通過裝飾模式來改變其狀態。
比如在上文中編寫的內部類Request就是HttpServletRequest類的裝飾類。
該類繼承的HttpServletRequestWrapper類是HttpServletRequest類的裝飾類。
這在jsp/servlet 中是非常有用的,web程序通過調用httpServletRequest對象的getParameter方法來處理表單,因此通過重寫裝飾類中的此方法就可以改變HttpServletRequest對象的狀態。所以在上題的內部類Request中就重寫了getParameter方法和getParameterValues方法。
因此,想要改變在httpServletRequest中的參數,可以通過httpServletRequest的裝飾類HttpServletRequestWrapper來實現,只需要在裝飾類中按照需要重寫其getParameter(getParameterValues)方法即可。