📄 tohtml.java
字号:
/*
* 创建日期 2007-1-11
*/
package ch06.html;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/**
* @author <a href="chengweits@hotmail.com">ChengWei </a>
* 静态页面生成程序
*/
public class toHtml extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
long current = System.currentTimeMillis();
//路径
String url = "";
//取得文件名
String name = "";
/**
* 通过Servlet的getServletContext()函数获取javax.servlet.ServletContext
* 这个对象在应用程序的整个生命周期间都有效,存放在这个对象内的数据任何Web组件都能访问到
*/
ServletContext sc = getServletContext();
/**
* file_name 将要访问的jsp文件,这个参数是从页面上得到的参数
* 如http://localhost:8080/ch06.news/toHtml?file_name=help
* 这个参数可以直接从前面传过来,当读者访问这个servlet时加参数
*/
String file_name = request.getParameter("file_name") == null ? ""
: request.getParameter("file_name");
System.out.println("file_name=" + file_name);
/**
* ServletContext的路径一定要加"/",相对于当前路径
*
* @url 将要生成静态页面的jsp文件,如http://localhost:8080/ch06.news/help.jsp的执行结果.
* @name 生成后的htm文件名及保存位置.
* 根据系统当前时间和文件名参数一起来作为静态页面文件名保存.
*/
url = "/" + file_name + ".jsp";
name = Constants.html_path + current + "_" + file_name + ".htm";
/**
* @ByteArrayOutputStream可以捕获内存缓冲区的数据,转换成字节数组,实现将数据从高层次的形式转化成低层次的形式.
* @public ByteArrayOutputStream()创建一个新的字节数组输出流。缓冲区初始容量为 32 字节,
* 必要时可增加其尺寸.
*
* @public synchronized void write(byte b[],int off,int len)
* @将指定字节数组中从偏移量 off 开始的 len 个字节写入该字节数组输出流。参数:(b - 数据.off - 数据的起始偏移量.len -
* 写入的字节数.)
*
* @write(int)将指定字节写入该字节数组输出流。
*/
final ByteArrayOutputStream os = new ByteArrayOutputStream();
final ServletOutputStream stream = new ServletOutputStream() {
public void write(byte[] data, int offset, int length) {
os.write(data, offset, length);
}
public void write(int b) throws IOException {
os.write(b);
}
};
/**
* @调用PrintWriter实现缓冲流中的内容写出到文件中去
* @定义HttpServletResponse参数让其传到其它界面
*/
final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));
HttpServletResponse rep = new HttpServletResponseWrapper(response) {
public ServletOutputStream getOutputStream() {
return stream;
}
public PrintWriter getWriter() {
return pw;
}
};
/**
* 使用RequestDispatcher重定向而不用redirect,主要是因为前面的可以将form传给目标URL,而后者不能。
* dispatcher类型对应了RequestDispatcher.forward方法,而redirect类型则是HttpServletResponse.sendRedirect方法。
* forward方法确实是不会使得其参数中包含的URL在IE地址栏中显示出来的。
*/
RequestDispatcher rd = sc.getRequestDispatcher(url);
/**
* @RequestDispatcher的include()方法将把Request Dispatcher资源的输出包含到当前输出中
*/
rd.include(request, rep);
/**
* @flush()方法强制输出后刷新缓冲区,清空缓冲区.
*/
pw.flush();
//把jsp输出的内容写到静态页面文件中
FileOutputStream fos = new FileOutputStream(name);
//把os的内部缓冲区写到fos文件中去.
System.out.println(fos);
os.writeTo(fos);
fos.close();
PrintWriter out = response.getWriter();
request.setCharacterEncoding("GBK");
out.print("<p align=center><font size=3 color=red>Success create html!</font></p>");
out.print("<p align=center><font size=3 color=red>"
+ current + file_name + "</font></p>");
/**
* @实现页面转向
* @让访问者直接生成的页面
* @response.sendRedirect(url)转址会在地址栏中显示目标URL值
*/
response.sendRedirect("./doc/" + current + "_" + file_name + ".htm");
/* ==============使用RequestDispatcher转向不会在地址栏显示目标URL========= */
// RequestDispatcher rdo = getServletContext()
// .getRequestDispatcher("./doc/" + current + "_" + file_name + ".htm");
// rdo.forward(request, response);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -