[转]利用HttpServletResponseWrapper获取jsp输出内容

转载: bianbian coding life


有时候我们需要得到某个jsp的输出内容。比如说在servlet里处理了Module Controller后,需要不同的jsp页面来展示view;又或者得到不同的模板内容(jsp本身可以作为模板语言)并将其缓冲到内存里。
利用 javax.servlet.http.HttpServletResponseWrapper 可以很好地实现我们所需要的功能。下面是使用方法:

  1. ....
  2. public static String getJspOutput(String jsppath, HttpServletRequest request, HttpServletResponse response)
  3. throws Exception
  4. {
  5. WrapperResponse wrapperResponse = new WrapperResponse(response);
  6. request.getRequestDispatcher(jsppath).include(request, wrapperResponse);
  7. return wrapperResponse.getContent();
  8. }

可以看到,使用起来还是挺方便的。getJspOutput(”/view/header.jsp”, request, response) 就完成了对”/view/header.jsp”的输出内容获取,之后可以进行其他操作。
附WrapperResponse类代码:

  1. import java.io.ByteArrayOutputStream;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import java.io.UnsupportedEncodingException;
  5. import javax.servlet.ServletOutputStream;
  6. import javax.servlet.http.HttpServletResponse;
  7. import javax.servlet.http.HttpServletResponseWrapper
  8. /**
  9. * @see http://bianbian.sunshow.net/
  10. * @author dannyzhu, bianbian
  11. * @version 1.0
  12. */
  13. public class WrapperResponse extends HttpServletResponseWrapper
  14. {
  15. private PrintWriter tmpWriter;
  16. private ByteArrayOutputStream output;
  17. private ByteArrayServletOutputStream servletOutput;
  18. public WrapperResponse(HttpServletResponse httpServletResponse)
  19. {
  20. super(httpServletResponse);
  21. output = new ByteArrayOutputStream();
  22. tmpWriter = new PrintWriter(output);
  23. servletOutput = new ByteArrayServletOutputStream(output);
  24. }
  25. public void finalize() throws Throwable
  26. {
  27. super.finalize();
  28. servletOutput.close();
  29. output.close();
  30. tmpWriter.close();
  31. }
  32. public String getContent()
  33. {
  34. try{
  35. String s = output.toString("UTF-8");
  36. reset();
  37. return s;
  38. } catch(UnsupportedEncodingException e) {
  39. return "UnsupportedEncoding";
  40. }
  41. }
  42. public PrintWriter getWriter() throws IOException
  43. {
  44. // return servletResponse.getWriter();
  45. return tmpWriter;
  46. }
  47. public ServletOutputStream getOutputStream() throws IOException
  48. {
  49. return servletOutput;
  50. }
  51. public byte[] toByteArray()
  52. {
  53. return output.toByteArray();
  54. }
  55. public void flushBuffer() throws IOException
  56. {
  57. tmpWriter.flush();
  58. servletOutput.flush();
  59. }
  60. public void reset()
  61. {
  62. output.reset();
  63. }
  64. public void close() throws IOException
  65. {
  66. tmpWriter.close();
  67. }
  68. private static class ByteArrayServletOutputStream extends ServletOutputStream
  69. {
  70. ByteArrayOutputStream baos;
  71. public ByteArrayServletOutputStream(ByteArrayOutputStream baos)
  72. {
  73. this.baos = baos;
  74. }
  75. public void write(int i) throws IOException
  76. {
  77. baos.write(i);
  78. }
  79. }
  80. }

转载:bianbian coding life

转载于:https://my.oschina.net/play/blog/4523

Servlet 中,可以使用 HttpServletResponse 的 getWriter() 方法或者 getOutputStream() 方法获取输出流。如果要获取输出流的内容,可以先将 HttpServletResponse 对象传递给一个自定义的 HttpServletResponseWrapper 子类,然后重写其 getOutputStream() 或 getWriter() 方法,在其中保存输出内容,最后通过调用 HttpServletResponseWrapper 子类的 getContent() 方法获取输出内容。 以下是一个示例代码: ```java public class ResponseWrapper extends HttpServletResponseWrapper { private StringWriter sw; private PrintWriter pw; public ResponseWrapper(HttpServletResponse response) { super(response); sw = new StringWriter(); pw = new PrintWriter(sw); } @Override public PrintWriter getWriter() throws IOException { return pw; } @Override public ServletOutputStream getOutputStream() throws IOException { return new ServletOutputStream() { @Override public boolean isReady() { return false; } @Override public void setWriteListener(WriteListener listener) { } @Override public void write(int b) throws IOException { sw.write(b); } }; } public String getContent() { pw.flush(); return sw.toString(); } } ``` 在 Servlet 中可以这样使用: ```java ResponseWrapper wrapper = new ResponseWrapper(response); chain.doFilter(request, wrapper); String content = wrapper.getContent(); ``` 其中 chain.doFilter(request, wrapper) 会将请求发给下一个 Filter 或者 Servlet,并将响应输出HttpServletResponse 中,而 wrapper.getContent() 则可以获取最终输出内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值