如何避免从Java Web服务器向自身发送HTTP请求?

dou*_*lep 10 java webserver weblogic

实际情况是这样的:Java Web服务器(Weblogic)接收来自用户的请求,它必须发送ZIP存档作为响应.存档必须从用户要求的一些文件和服务器本身生成的一个HTML报告动态生成.我想重用服务器已经在其他情况下使用的JSF servlet来生成此报告.所以,基本上,我使用的是:

HttpURLConnection  self = new URL ("http://me.myself.com/report.jsf?...").openConnection ();
String  report_html = fetchHtmlFromConnection (self);
Run Code Online (Sandbox Code Playgroud)

然后创建所请求的ZIP,包括生成的HTML.

问题是,我可以以某种方式避免report.jsf在这种情况下发出内部HTTP请求(to )吗?这涉及到基本上没有意义(因为应用程序只是"自言自语")通过操作系统往返,HTTPD(可能在不同的机器上),等等.

Dji*_*eus 2

我对 JSF 不是很熟悉,但根据我对它们的了解,您可以使用也适用于 JSP 页面的技术:

  • 创建您自己的HttpServletResponseWrapper(容器使用的类,可让您修改响应)
  • 使用它来覆盖默认值Writer(将呈现的页面写入输出)并提供一个将输出写入String将提供压缩代码的临时文件。

有一个很好且简单的教程向您展示如何做到这一点: http://blog.valotas.com/2011/09/get-output-of-jsp-or-servlet-response.html

然后

  • 正如 gyan 所暗示的,ServletRequestDispatcher从您的 servlet 中获取一个可以让您调用 JSF 渲染的
  • 转发 servlet 调用以便提供您自己的HttpServletResponseWrapper
  • 使用 yourHttpServletResponseWrapper来获取渲染的 HTML 并将其提供给压缩代码。

所以压缩 Servlet 会是这样的:

TempFileRespWrapper respWrapper = new TempFileRespWrapper();
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher( "/report.jsf");
dispatcher.forward(request, respWrapper);
File f = respWrapper.getOutputPath();
addFileToZip(f);
Run Code Online (Sandbox Code Playgroud)