`

用HttpServletResponseWrapper 获取jsp输出内容

阅读更多
总的思路是,利用HttpServletResponseWrapper封装HttpServletResponse,使HttpServletResponse采用我们自己定义的输入流(OutputStream)。这样,我们就可以通过这个OutputStream得到目标jsp页面内容。
这里有两个关键点。
1、怎样用当前HttpServletRequest访问目标jsp而不跳转;
2、怎样构建一个OutputStream,且让HttpServletResponse获得的jsp内容输入到这个OutputStream。
如果解决了这两个问题,那一切好办了。
看代码:
代码1:在不跳转下访问目标jsp。就是利用RequestDispatcher.include(ServletRequest request, ServletResponse response)。该方法把RequestDispatcher指向的目标页面写到response中。
public static String getJspOutput(String jsppath, HttpServletRequest request, HttpServletResponse response) 
throws Exception 
{ 
WrapperResponse wrapperResponse = new WrapperResponse(response); 
request.getRequestDispatcher(jsppath).include(request, wrapperResponse); 
return wrapperResponse.getContent(); 
} 

此处一个自定义类WrapperResponse封装了HttpServletResponse,具体请看一下代码。
代码2:HttpServletResponse的封装类,继承自HttpServletResponseWrapper。其核心是构建一个OutputStream,且让HttpServletResponse获得的jsp内容输入到这个OutputStream。
package com.bobrow.framework.util; 
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class WrapperResponse extends HttpServletResponseWrapper {
   private MyPrintWriter tmpWriter;
   private ByteArrayOutputStream output;
   public WrapperResponse(HttpServletResponse httpServletResponse) {
      super(httpServletResponse);
      output = new ByteArrayOutputStream();
      tmpWriter = new MyPrintWriter(output);
   } 
  public void finalize() throws Throwable {
      super.finalize();
      output.close();
      tmpWriter.close();
   }   
   public String getContent() {
      try {
         tmpWriter.flush();  
          //刷新该流的缓冲,详看java.io.Writer.flush()
         String s = tmpWriter.getByteArrayOutputStream().toString("UTF-8");
         //此处可根据需要进行对输出流以及Writer的重置操作
       //比如tmpWriter.getByteArrayOutputStream().reset()
         return s;
      } catch (UnsupportedEncodingException e) {
         return "UnsupportedEncoding";
      }
   }

   //覆盖getWriter()方法,使用我们自己定义的Writer  
  public PrintWriter getWriter() throws IOException {
      return tmpWriter;
   }   public void close() throws IOException {
      tmpWriter.close();
   }

   //自定义PrintWriter,为的是把response流写到自己指定的输入流当中
   //而非默认的ServletOutputStream   
private static class MyPrintWriter extends PrintWriter {
      ByteArrayOutputStream myOutput;  
    //此即为存放response输入流的对象 
     public MyPrintWriter(ByteArrayOutputStream output) {
         super(output);
         myOutput = output;
      }      
public ByteArrayOutputStream getByteArrayOutputStream() {
         return myOutput;
      }   }

好了,讲述完毕,以上代码经过我测试的。
分享到:
评论
1 楼 eye_IT1968 2017-03-23  
谢谢你的博文,帮助了我!
我也根据你的博文写了一篇动态获取jsp内容的博文!
http://blog.csdn.net/u010648555/article/details/64922835

相关推荐

    用servlet将jsp文件内容转为html

    使用`RequestDispatcher`接口的`include`方法获取JSP页面的内容。 4. 将获取到的JSP内容输出到一个`ByteArrayOutputStream`对象中。 5. 最后,将`ByteArrayOutputStream`中的内容写入到指定的HTML文件中。 #### ...

    jsp生成静态页面的方法

    4. **内容捕获与保存**:通过`RequestDispatcher`的`include`方法调用指定的JSP页面,并将输出内容写入到内存中的`ByteArrayOutputStream`中。最后将内存中的内容写入到硬盘上的HTML文件中。 #### 关键点总结 - ...

    JSP生成静态页面[归类].pdf

    // 将JSP输出的内容写入到HTML文件 pw.flush(); FileOutputStream fos = new FileOutputStream(name); os.writeTo(fos); fos.close(); // 此处的response.getWriter()用于处理原始的JSP请求,不在生成静态...

    jsp实现将动态网页转换成静态页面的方法.docx

    - 创建自定义的`ServletResponse`包装器`FileCaptureResponseWrapper`来重定向JSP输出到指定文件。 3. **自定义Filter实现**: ```java public class FileCaptureFilter implements Filter { private String ...

    解决struts2下载异常的jar包 struts2-sunspoter-stream-1.0.jar

    所以在JSP容器通过Response获取输出流之前,前面的流并没有关闭,所以会造成该异常的报出。 本文解决办法: 在前面所说的网络解决办法中,使用的是一种躲避的方式解决该问题,也就是置之不理。 这里提供一个...

Global site tag (gtag.js) - Google Analytics