2009-07-20 6 views
4

の捕獲IMPLをお探しのJavaEE APIは、Javadocを引用し、HttpServletResponseWrapperをどの付属しています「サーブレットからのレスポンスを改変したい開発者によってサブクラス化することができるのHttpServletResponseインタフェースの簡潔な実装を提供します。」サブクラス化を行わないと、このクラスはすべての呼び出しをラップされたレスポンスオブジェクトに渡します。リクエストにも同様のラッパーがあります。にHttpServletResponseWrapper

これらのクラスの有用なサブクラス実装を提供するユーティリティライブラリで私を指摘できますか?特に、私はレスポンスラッパーのサブクラスを探していて、レスポンスラッパーを(文字列、byte []、適切なものとして)キャプチャし、APIメソッドを介して公開しています。

私はかなりハーフベークドバージョンを自分で書いていますが、率直に言って、私はそうしてはいけません。むしろそれを捨て、シェルフから取り出して使います。

答えて

4

gzipの例はByteArrayOutputStreamに書き込むだけで簡単に適応できますが、私は実装について認識していません。あなたはまたで他の応答ラッパーの実装を見て、アイデアを取ることができます。また、それを使用しています

オリジナルの答え:

JavaWorldで古典的な記事がありますFilter code with Servlet 2.3 model。あなたは、ラップされたリクエストとレスポンスの例を見つけることができます(!2001年6月)

  • 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); 
        } 
    } 
    

コードは少し古いですが、使い方をよく示しています。

+0

ああ、もう少し面白いです、明確化のおかげで。私はすぐに私のニーズに応えられる実装をすでに持っています。私はそれを実現するユーティリティライブラリがないことに腹を立てていました。 – skaffman

1

これまで、私は春のフレームワークで提供されるオブジェクトを使用しました。特に、これはうまくいくはずです:

+0

ええ、私はそれを試みましたが、MockHttpServletResponseはHttpServletResponseWrapperを拡張せず、このタスクには使用しません。 – skaffman

関連する問題