【问题标题】:Why can't I wrap the ServletRequest when trying to capture JSP output为什么在尝试捕获 JSP 输出时无法包装 ServletRequest
【发布时间】:2011-02-06 22:14:43
【问题描述】:

我正在尝试将 servlet 请求处理程序分派到 JSP 处理器并捕获它的内容。

我正在为 ServletRequest 和 ServletResponse 提供包装器实例,它们实现了相应的 HTTPServletRequest/-Response 接口,因此它们应该是替代品。所有方法当前都传递给原始的 Servlet Request 对象(我计划很快修改其中的一些)。此外,我还介绍了一些新方法。 (如果想看代码:http://code.google.com/p/gloudy/source/browse/trunk/gloudyPortal/src/java/org/gloudy/gloudlet/impl/RenderResponseImpl.java

HttpServletResponse 使用自己的输出流来捕获输出。

当我尝试打电话时

request.getRequestDispatcher("/WEB-INF/views/test.jsp").include(request, response);    

使用我的请求和响应包装器,该方法返回并且没有捕获任何内容。当我尝试传递原始请求对象时,它起作用了!但从长远来看,这不是我所需要的......

request.getRequestDispatcher("/WEB-INF/views/test.jsp").include(request.getServletRequest(), response);

这行得通。 getservletRequest() 返回由 servlet 容器提供的原始请求。

有人知道为什么这不适用于我的包装器吗?

更新: 我正在谷歌应用引擎开发环境中尝试这个,它使用 geronimo 实现 servlet 容器 IIRC

【问题讨论】:

  • 我很难理解/看到问题。要捕获 JSP 输出,您通常只需包装响应并覆盖其 getWriter()getOutputStream()。您根本不需要触摸请求。还有更多的事情。你运行调试器了吗?
  • 我已经包装了请求,因为我正在引入(或者我正在尝试引入)类似于渲染参数的东西。我将为每个页面呈现处理一些 jsp 页面和 servlet,因此我想包装原始请求和响应对象以防止“页面片段 servlet”内的更改。调试器对我没有帮助,因为我还没有找到 google app engine servlet 容器代码的源代码... :-(

标签: java google-app-engine jsp servlets


【解决方案1】:

好的,找到问题了……

我已经用我自己的实现替换了与属性相关的函数。这就是 jsp 处理器返回空结果的原因(没有任何错误消息...)

因此,如果您想使用 Request Dispatcher,最好在 ServletRequest Wrappers 中执行此操作:

 private Map<String, Object> attributes = new HashMap<String, Object>();
 ...

 public Object getAttribute(String string) {
    return attributes.get(this);
  }

  public Enumeration<String> getAttributeNames() {
    return (Enumeration<String>) attributes.keySet();
  }

  public void setAttribute(String string, Object o) {
    attributes.put(string, o);
  }

  public void removeAttribute(String string) {
    attributes.remove(string);
  }

没有这些行它也可以工作。也许这对尝试类似事情的人有所帮助...

【讨论】:

  • 如果您也致电super.methodname(whateverargs),它们也会起作用。
猜你喜欢
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 2014-08-27
  • 1970-01-01
  • 2017-02-03
相关资源
最近更新 更多