百度空间 | 百度首页 
 
查看文章
 
如何(怎么)获取jsp输出内容?用HttpServletResponseWrapper吧
2007-05-15 23:14
感谢此文提供思路。博客主如其自我介绍("关注技术, 翻译文档, 偶尔动动手")一样,该文思路不错,但或许是没有"动动手"测试下其写的代码是否可用,是否能得到预期结果。这个工作就由我来做吧。

总的思路是,利用HttpServletResponseWrapper封装HttpServletResponse,使HttpServletResponse采用我们自己定义的输入流(OutputStream)。这样,我们就可以通过这个OutputStream得到目标jsp页面内容。

这里有两个关键点。1、怎样用当前HttpServletRequest访问目标jsp而不跳转;2、怎样构建一个OutputStream,且让HttpServletResponse获得的jsp内容输入到这个OutputStream。如果解决了这两个问题,那一切好办了。

看代码:
代码1:在不跳转下访问目标jsp。就是利用RequestDispatcher.include(ServletRequest request, ServletResponse response)。该方法把RequestDispatcher指向的目标页面写到response中。
  1. public static String getJspOutput(String jsppath, HttpServletRequest request, HttpServletResponse response)
  2. throws Exception
  3. {
  4. WrapperResponse wrapperResponse = new WrapperResponse(response);
  5. request.getRequestDispatcher(jsppath).include(request, wrapperResponse);
  6. return wrapperResponse.getContent();
  7. }
此处一个自定义类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;
      }
   }
}

好了,讲述完毕,以上代码经过我测试的。

写完这篇blog,再思考前一篇blog,想想也是,我的live space倾向于编程技术,这或许是没人气的一个原因吧。

PS: 本文一开始提及的文章作者还真是博学啊,其博客内容广泛。不像我只会点java,呵呵。

类别:Java | 添加到搜藏 | 浏览() | 评论 (4)
 
最近读者:
 
网友评论:
1
2007-05-28 17:09 | 回复
用这种方式获取到JSP的内容后呢,如果我们获取后保存到一个文件,然后想重定向到这个保存下来的文件,又怎么样处理呢?
 
2
2007-05-29 18:20 | 回复
to Rick 你后续的问题就非常好办了!!!你应该能够知道jsp内容保存到哪个文件吧?那么通过本地文件系统路径转化为uri路径来访问该文件。比如你web app根目录在C:\mysite,存放jsp内容的文件放在C:\mysite\temp下,假设取名为a.htm,那么可以通过http://yourserver/temp/a.htm访问内容啊~
 
3
2007-09-29 17:58 | 回复
不知道说什么,可能是没有仔细看,HttpServletResponseWrapper本来就是包装response的。这样就可以把response输出流得到。得到输出流,干什么都行啊。输出到文件。等等。 Rick更奇怪,重定向的流生成的文件就是jsp的内容啊。不过都带了tag而已。你要重定向到它有什么用?一般生成的流都是用于分析用的。或者测试web service而已。
 
4
2009-04-01 16:50 | 回复
    将得到的响应生成文件再重定到文件,可用于jsp静态页面技术,这是提高网站访问速度的很好的一个技术。
    网友:1111有点自以为是了,“Rick更奇怪……你要重定向到它有什么用?一般生成的流都是用于分析用的。”不要以为你知道的就是全部,其实仅仅是一丁点儿
   有句话怎么说来着,知道的越多,才发现原来自己不知道的更多
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu