有时候我们需要得到某个jsp的输出内容。比如说在servlet里处理了Module Controller后,需要不同的jsp页面来展示view;又或者得到不同的模板内容(jsp本身可以作为模板语言)并将其缓冲到内存里。
利用 javax.servlet.http.HttpServletResponseWrapper 可以很好地实现我们所需要的功能。下面是使用方法:
- ....
- 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();
- }
可以看到,使用起来还是挺方便的。getJspOutput(”/view/header.jsp”, request, response) 就完成了对”/view/header.jsp”的输出内容获取,之后可以进行其他操作。
附WrapperResponse类代码:
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.io.UnsupportedEncodingException;
- import javax.servlet.ServletOutputStream;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpServletResponseWrapper
- /**
- * @see http://bianbian.sunshow.net/
- * @author dannyzhu, bianbian
- * @version 1.0
- */
- public class WrapperResponse extends HttpServletResponseWrapper
- {
- private PrintWriter tmpWriter;
- private ByteArrayOutputStream output;
- private ByteArrayServletOutputStream servletOutput;
- public WrapperResponse(HttpServletResponse httpServletResponse)
- {
- super(httpServletResponse);
- output = new ByteArrayOutputStream();
- tmpWriter = new PrintWriter(output);
- servletOutput = new ByteArrayServletOutputStream(output);
- }
- public void finalize() throws Throwable
- {
- super.finalize();
- servletOutput.close();
- output.close();
- tmpWriter.close();
- }
- public String getContent()
- {
- try{
- String s = output.toString("UTF-8");
- reset();
- return s;
- } catch(UnsupportedEncodingException e) {
- return "UnsupportedEncoding";
- }
- }
- public PrintWriter getWriter() throws IOException
- {
- // return servletResponse.getWriter();
- return tmpWriter;
- }
- public ServletOutputStream getOutputStream() throws IOException
- {
- return servletOutput;
- }
- public byte[] toByteArray()
- {
- return output.toByteArray();
- }
- public void flushBuffer() throws IOException
- {
- tmpWriter.flush();
- servletOutput.flush();
- }
- public void reset()
- {
- output.reset();
- }
- public void close() throws IOException
- {
- tmpWriter.close();
- }
- private static class ByteArrayServletOutputStream extends ServletOutputStream
- {
- ByteArrayOutputStream baos;
- public ByteArrayServletOutputStream(ByteArrayOutputStream baos)
- {
- this.baos = baos;
- }
- public void write(int i) throws IOException
- {
- baos.write(i);
- }
- }
- }