我正在尝试将 servlet 请求处理程序分派(dispatch)到 JSP 处理器并捕获它的内容。
我为 ServletRequest 和 ServletResponse 提供包装器实例,它们实现了相应的 HTTPServletRequest/-Response 接口(interface),因此它们应该是直接替换。当前所有方法都传递给原始 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 容器给出的原始请求。
有谁知道为什么这不适用于我的包装器?
更新: 我正在 google app engine 开发环境中尝试此操作,该环境使用 servlet 容器 IIRC 的 geronimo 实现
最佳答案
好的,找到问题了...
我已经用我自己的实现替换了与属性相关的函数。这就是 jsp 处理器返回空结果的原因(没有任何错误消息...)
因此,如果您想使用请求调度程序,那么在 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);
}
没有这些行它也可以工作。也许这对尝试类似事情的人有帮助......
关于java - 为什么我在 try catch JSP 输出时无法包装 ServletRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2620799/