2009-07-20 40 views
4

JavaEE API附帶HttpServletResponseWrapper,引用javadoc「提供了一個方便的HttpServletResponse接口實現,該接口可以由希望修改Servlet響應的開發人員進行分類。」沒有子類,這個類只是將所有調用傳遞給包裝的響應對象。有一個類似的請求包裝。尋找HttpServletResponseWrapper的捕獲impl

任何人都可以指向任何提供這些類的有用子類實現的實用程序庫嗎?特別是,我正在尋找一個響應包裝器的子類,它可以捕獲寫入的響應(如適當的String,byte []),並通過API方法公開它。

我自己寫了一個相當不完整的版本,但坦率地說,我不應該,我寧願把它扔掉,並使用現成的一個。

回答

4

我不知道任何實現,即使gzip示例可以通過只寫入一個ByteArrayOutputStream很容易適應。您也可以通過尋找其他響應包裝實施採取的想法:

原來的答覆:

有一個在JavaWorld的經典文章Filter code with Servlet 2.3 model。你可以找到包裝的請求和示例響應:

  • Compression the response

    public class CompressionResponseWrapper extends HttpServletResponseWrapper { 
        protected ServletOutputStream stream = null; 
        protected PrintWriter writer = null; 
        protected int threshold = 0; 
        protected HttpServletResponse origResponse = null; 
        public CompressionResponseWrapper(HttpServletResponse response) { 
    super(response); 
    origResponse = response; 
        } 
        public void setCompressionThreshold(int threshold) { 
    this.threshold = threshold; 
        } 
        public ServletOutputStream createOutputStream() throws IOException { 
    return (new CompressionResponseStream(origResponse)); 
        } 
        public ServletOutputStream getOutputStream() throws IOException { 
    if (writer != null) { 
        throw new IllegalStateException("getWriter() has already been " + 
                "called for this response"); 
    } 
    if (stream == null) { 
        stream = createOutputStream(); 
    } 
    ((CompressionResponseStream) stream).setCommit(true); 
    ((CompressionResponseStream) stream).setBuffer(threshold); 
    return stream; 
        } 
        public PrintWriter getWriter() throws IOException { 
    if (writer != null) { 
        return writer; 
    } 
    if (stream != null) { 
        throw new IllegalStateException("getOutputStream() has already " + 
                "been called for this response"); 
    } 
    stream = createOutputStream(); 
    ((CompressionResponseStream) stream).setCommit(true); 
    ((CompressionResponseStream) stream).setBuffer(threshold); 
    writer = new PrintWriter(stream); 
    return writer; 
        } 
    } 
    
  • Handling file upload

    public class MultipartWrapper extends HttpServletRequestWrapper { 
        MultipartRequest mreq = null; 
        public MultipartWrapper(HttpServletRequest req, String dir) 
               throws IOException { 
    super(req); 
    mreq = new MultipartRequest(req, dir); 
        } 
        // Methods to replace HSR methods 
        public Enumeration getParameterNames() { 
    return mreq.getParameterNames(); 
        } 
        public String getParameter(String name) { 
    return mreq.getParameter(name); 
        } 
        public String[] getParameterValues(String name) { 
    return mreq.getParameterValues(name); 
        } 
        public Map getParameterMap() { 
    Map map = new HashMap(); 
    Enumeration enum = getParameterNames(); 
    while (enum.hasMoreElements()) { 
        String name = (String) enum.nextElement(); 
        map.put(name, mreq.getParameterValues(name)); 
    } 
    return map; 
        } 
        // Methods only in MultipartRequest 
        public Enumeration getFileNames() { 
    return mreq.getFileNames(); 
        } 
        public String getFilesystemName(String name) { 
    return mreq.getFilesystemName(name); 
        } 
        public String getContentType(String name) { 
    return mreq.getContentType(name); 
        } 
        public File getFile(String name) { 
    return mreq.getFile(name); 
        } 
    } 
    

的代碼是有點老了(!2001年6月),但它很好地展示了它的用法。

+0

哦,對了,這有點兒有趣,謝謝澄清。我已經有了一個滿足我眼前需求的實現,我只是在惋惜缺少一個爲我做的實用程序庫。 – skaffman 2009-07-21 07:28:26