public class CreateStaticHTMLPage {
HttpServlet da= new HttpServlet() {
};
public void create(HttpServletRequest request, HttpServletResponse response,
ServletContext servletContext, String fileName, String fileFullPath, String jspPath)
throws ServletException, IOException {
response.setContentType("text/html;charset=gb2312");// 设置HTML结果流编码(即HTML文件编码)
RequestDispatcher rd = servletContext.getRequestDispatcher(jspPath);// 得到JSP资源
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();// 用于从ServletOutputStream中接收资源
final ServletOutputStream servletOuputStream = new ServletOutputStream() {// 用于从HttpServletResponse中接收资源
/*
* 我看不懂这里(?)写了servletOutPutStream得write()的两个方法,**
* 这是什么用处和怎么实现的????**
*/
public void write(byte[] b, int off, int len) {
byteArrayOutputStream.write(b, off, len);
}
public void write(int b) {
byteArrayOutputStream.write(b);
}
@Override
public boolean isReady() {
// TODO Auto-generated method stub
return false;
}
@Override
public void setWriteListener(WriteListener arg0) {
}
};
final PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream));// 把转换字节流转换成字符流
HttpServletResponse httpServletResponse = new HttpServletResponseWrapper(response) {// 用于从response获取结果流资源
/*
* 这里写的两个方法我也不知道是做什么用的??看了源码,这个类里面并没有这两个方法**
* 这两个方法的用处和实现原理是什么?**
*/
public ServletOutputStream getOutputStream() {
return servletOuputStream;
}
public PrintWriter getWriter() {
return printWriter;
}
};
rd.include(request, httpServletResponse);// 发送结果流(把带有两个输出流的response发到相应jsp页面)
printWriter.flush();// 刷新缓冲区,把缓冲区的数据输出
/*
*
* 也就是说,把带有两个输出流httpServletResponse发送到对应jsp文件,并printWrite.flush()之后,
* servletOuputStream和printwrite都带有相同的html的内容,就是上述HTML内容
所以在这里总结一下:为什么flush之后,这两个输出流里面就都有了完整的html信息了呢????百思不得其解啊,求大神解答一下啊,,谢谢啦****
*/
FileOutputStream fileOutputStream = new FileOutputStream(fileFullPath);
/*
此时的bytearrayoutputstream已经具有了所有的jsp中servletoutputstream的内容*/
/*这里的byteArrayOutputStream流里面又有什么内容,也很迷惑*/
byteArrayOutputStream.writeTo(fileOutputStream);// 把byteArrayOuputStream中的资源全部写入到fileOuputStream中
fileOutputStream.close();// 关闭输出流,并释放相关资源
response.sendRedirect(fileName);// 发送指定文件流到客户端
}
}