寻找 HttpServletResponseWrapper 的捕获实现

2024-05-21

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

任何人都可以向我指出任何提供这些类的有用子类实现的实用程序库吗?特别是,我正在寻找响应包装器的子类,它捕获写入的响应(作为 String、byte[] 或任何合适的形式)并通过 API 方法公开它。

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


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

  • SiteMesh http://www.sitemesh.org/
  • DWR http://directwebremoting.org/也用它

原答案:

JavaWorld里有一篇经典文章使用Servlet 2.3模型过滤代码 http://www.javaworld.com/javaworld/jw-06-2001/jw-0622-filters.html。您可以找到包装请求和响应的示例:

  • 压缩响应 http://www.javaworld.com/javaworld/jw-06-2001/jw-0622-filters.html?page=4

    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;
      }
    }
    
  • 处理文件上传 http://www.javaworld.com/javaworld/jw-06-2001/jw-0622-filters.html?page=5

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

寻找 HttpServletResponseWrapper 的捕获实现 的相关文章

随机推荐

  • 使用 scikit-learn 进行二次采样 + 分类

    我正在使用 Scikit learn 进行二元分类任务 并且我有 0 级 有 200 个观察值 第 1 类 有 50 个观察值 而且因为我有不平衡的数据 我想抽取多数类的随机子样本 其中观察数量与少数类相同 并且希望使用新获得的数据集作为分
  • 如何关闭与数据库的现有连接

    我想关闭与 MS SQL Server 的现有连接 以便可以通过编程方式对该数据库进行恢复 这应该会断开其他所有人的连接 并使您成为唯一的用户 alter database YourDb set single user with rollb
  • 如何在 PHP 中运行 shell 脚本?

    我正在尝试使用 PHP 触发 shell 脚本的运行 本质上 当用户在我们用 PHP 编写的网站上完成一个操作时 我们希望触发一个 shell 脚本 该脚本本身调用一个 Java 文件 提前致谢 See shell exec http ph
  • PhotoChooserTask 抛出未处理的异常

    我已经有了这段代码 我使用它来显示一个按钮 该按钮允许用户从他的库中选择图像并将其用作我的应用程序的背景 所以我创建了一个PhotoChooserTask 将其设置为显示相机并将其绑定到任务完成时必须执行的方法 该按钮将通过显示PhotoC
  • has_many 关系中的 Active Record 对象何时保存?

    我正在使用 Rails 1 2 3 是的 我知道 并且对如何使用感到困惑has many适用于对象持久性 为了举例 我将使用它作为我的声明 class User lt ActiveRecord Base has many assignmen
  • 'numpy.float64'对象没有属性'translate'在Python中将值插入Mysql

    import dataset db dataset connect table db 当我尝试向 Mysql 表中插入一些值时 发生了此错误 我插入表中的示例值 print Buy ticker price date OType OSize
  • 在代码中旋转按钮(或其中的文本)

    我必须通过编码随机旋转按钮 或里面的文本 它是相同的 API级别低于11是否有button setRotate x 好吧 看了一下 答案是 很复杂 您可以使用旧的动画框架旋转按钮 例如像这样 Button button Button fin
  • 运行“npm install”:Node-gyp 错误 - MSBUILD.exe 失败,退出代码:1

    我在跑npm install在 Windows 上安装我的项目中的所有软件包 然后我收到有关 MSBUILD exe 的错误 gyp ERR stack Error C Program Files x86 Microsoft Visual
  • php exec 返回的结果比直接进入命令行要少

    我有一个 exec 命令 它的行为与通过 Penguinet 给 linux 的相同命令不同 res exec cd mnt mydirectory zcat log file gz echo res 当将命令直接放入命令行时 我在日志文件
  • 限制分页页数

    objConnect mysql connect localhost root or die mysql error objDB mysql select db Test strSQL SELECT FROM UserAddedRecord
  • 如何减去两个 gettimeofday 实例?

    我想减去两个 gettimeofday 实例 并以毫秒为单位给出答案 这个想法是 static struct timeval tv gettimeofday tv NULL static struct timeval tv2 gettime
  • 导航组件参数默认值

    在导航组件中 将参数从第一个片段发送到第二个片段时 默认值不会从导航图中获取哪个集合 这是我的代码 导航图 xml
  • 如何使用 Cucumber 和 Rspec 测试 Rails 3 引擎?

    如果这个问题有点主观 我深表歉意 我正在尝试找出使用 Cucumber 和 Rspec 测试 Rails 3 引擎的最佳方法 为了测试引擎 需要 Rails 3 应用程序 这是我目前正在做的事情 通过运行以下命令将 Rails 测试应用程序
  • 如何使用 HTML5 + Javascript 或服务器端语言仅裁剪某些区域?

    在提出我的问题之前 我有一个测试页 以便每个人都能更好地理解我的问题 网址是http iamthemoon com crop http iamthemoon com crop 您可以移动红色选区 我喜欢只裁剪红色选区的区域 我认为这可以在
  • Tensorflow 对 Python3.11 的支持

    我在 Windows10 PC 上安装了 Python3 11 0 尝试使用以下命令安装张量流 pip install tensorflow 给出错误 访问tensorflow网站后 我意识到它仅支持3 7 3 10 我应该降级 pytho
  • heroku 上的 bitbucket 私有存储库

    我有一个需要 gem 的 Rails 应用程序 我将这个 gem 托管在私有存储库的 bitbucket 上 在我的 Gemfile 中 我添加了 gem 如下所示 gem my gem git gt gi email protected
  • Bootstrap 4 具有 d-flex 类的列表项不响应 .hide()?

    当我添加课程时d flex我的引导程序 4 ul 列表项不响应 hide 不再 尽管style display none 被添加到 DOM 中 The d flex用于Bootstrap 4 列表徽章 https getbootstrap
  • 如何在 Laravel 5 中的视图模板上显示会话数据

    我正在尝试在 Laravel 5 中的视图模板上显示会话数据 但是它似乎没有显示任何内容 这是我用来设置会话的代码 Session set bookingConfirmed BookingDates where id Session get
  • 使用操作按钮在闪亮的 R 中添加包含现有数据框的新行

    我正在构建一个闪亮的表单 它将从 textInput 字段获取数据 并将这些输入与文本文件 将通过文件输入上传 组合起来 并在主面板中显示输出 有一个操作按钮用于第一次更新数据 从文本输入中获取数据并与处理后的文本文件合并 我添加了另一个操
  • 寻找 HttpServletResponseWrapper 的捕获实现

    JavaEE API 附带了 HttpServletResponseWrapper 引用 javadoc 的话 提供了 HttpServletResponse 接口的便捷实现 希望适应 Servlet 响应的开发人员可以对其进行子类化 如果