实际情况是这样的:
Java Web服务器(Weblogic)接收来自用户的请求,它必须发送一个ZIP存档作为响应.存档必须从用户要求的某些文件和服务器本身生成的一个HTML报告动态生成.我想重新使用服务器在其他情况下已经使用的JSF servlet来生成此报告.所以,基本上我用的是:
HttpURLConnection self = new URL ("http://me.myself.com/report.jsf?...").openConnection (); String report_html = fetchHtmlFromConnection (self);
问题是,我可以避免在这种情况下发出内部HTTP请求(report.jsf)吗?这涉及到基本上没有意义(因为应用程序只是“谈论”自己),通过操作系统,HTTPD(可能在不同的机器上)等等.
解决方法
我对JSF不是很熟悉,但是从我所了解的这些,您可以使用也适用于JSP页面的技术:
>创建自己的HttpServletResponseWrapper(容器使用的类,允许您修改响应)
>使用它来覆盖默认的Writer(将渲染的页面写入输出),并提供一个将输出写入一个String或一个临时文件,该文件将提供压缩代码.
有一个漂亮简单的教程,向您展示如何做到这一点:
http://blog.valotas.com/2011/09/get-output-of-jsp-or-servlet-response.html
然后
>如gyan所示,从你的servlet中获取一个ServletRequestDispatcher,让你调用JSF的渲染
>转发servlet调用,以提供自己的HttpServletResponseWrapper
>使用您的HttpServletResponseWrapper获取渲染的HTML并将其提供给压缩代码.
所以压缩Servlet就像:
TempFileRespWrapper respWrapper = new TempFileRespWrapper(); RequestDispatcher dispatcher = getServletContext().getRequestDispatcher( "/report.jsf"); dispatcher.forward(request,respWrapper); File f = respWrapper.getOutputPath(); addFileToZip(f);