【问题标题】:Looking for a capturing impl of HttpServletResponseWrapper寻找 HttpServletResponseWrapper 的捕获实现
【发布时间】:2010-11-12 06:33:36
【问题描述】:

JavaEE API 附带 HttpServletResponseWrapper,引用 javadoc 的话,“提供了一个方便的 HttpServletResponse 接口实现,开发人员可以将其子类化,以适应来自 Servlet 的响应。”如果没有子类化,这个类只会将所有调用传递给包装的响应对象。有一个类似的请求包装器。

谁能指点我提供这些类的有用子类实现的任何实用程序库?特别是,我正在寻找响应包装器的子类,它捕获写入的响应(作为字符串、字节 [],任何合适的)并通过 API 方法公开它。

我自己写了一个相当半生不熟的版本,但坦率地说,我不应该这样做,我宁愿把它扔掉并使用现成的一个。

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    我不知道有任何实现,即使 gzip 示例可以通过写入 ByteArrayOutputStream 轻松调整。您还可以通过查看其他响应包装器实现来获取想法:

    原答案:

    JavaWorldFilter 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 月!),但它很好地演示了用法。

    【讨论】:

    • 哦,对了,这有点有趣,感谢您的澄清。我已经有了一个满足我当前需求的实现,我只是在哀叹缺少一个为我做这件事的实用程序库。
    【解决方案2】:

    过去我使用过 spring 框架中提供的对象。特别是,这应该有效:http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/mock/web/MockHttpServletRequest.html

    【讨论】:

    • 是的,我试过了,但是 MockHttpServletResponse 没有扩展 HttpServletResponseWrapper,对这个任务没有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2021-10-17
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    相关资源
    最近更新 更多