/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package servlets; import java.io.ByteArrayOutputStream; import java.io.File; 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 Administrator */ public class ToHtmlPath extends HttpServlet { /** * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. * @param request servlet request * @param response servlet response */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } @Override public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String url =""; String name =""; ServletContext servletContext = getServletContext(); final String CONTEXT_PATH=servletContext.getRealPath("/"); String file_name = request.getParameter("file_name");// 你 要訪問的jsp文件,如news.jsf。 file_name=file_name+".jsp"; //目前只設置了jsp頁面的生成。 // file_name如:fileDetail.jsf?fileId=56.要是有參數, 只有一個參數。 並且以參數名作為文件名。 String build_name = request.getParameter("build_name");// 要保存的文件名。如index; 可以沒有這個參數。 String path = request.getParameter("path"); // 你要訪問的 jsp文件路徑。如news。可以沒有這個參數。 String real_path = request.getParameter("real_path");// 你 要保存的文件路徑,如html-news.注意可以沒有這個參數。 if (build_name==null || build_name.equals("")) { int a = 0; a = file_name.indexOf("=") + 1; build_name = file_name.substring(a); if (build_name.indexOf(".")>0) { build_name = file_name.substring(0, file_name.indexOf (".")); } } // 下面構造要訪問的頁面。 if (path ==null || path.equals("")) { url = "/"+ file_name;// 這是你要生成HTML的jsp文件,如 } else { url ="/" + path + File.separator + file_name;// 這是你要 生成HTML的jsp文件,如 } // 下面構造要保存的文件名,及路徑。 // 1、如果有real_path,則保存在real_path下。 // 2、如果有path則保存在path下。 // 3、否則,保存在根目錄下。 if (real_path == null || real_path.equals("")) { if (path == null || path.equals("")) { name =CONTEXT_PATH + File.separator + build_name + ".html";// 這是生成的html文件名,如index.htm.說明: ConfConstants.CONTEXT_PATH為你 的上下文路徑。 } else { name =CONTEXT_PATH + File.separator + path + File.separator + build_name + ".html";// 這是生成的html文件名,如 index.htm. } } else { name =CONTEXT_PATH + File.separator + real_path +File.separator + build_name + ".html";// 這是生成的html文件名,如 index.htm. } // 訪問請求的頁面,並生成指定的文件。 RequestDispatcher dispatcher = servletContext.getRequestDispatcher (url); //對這個URL請求 final ByteArrayOutputStream byteos = new ByteArrayOutputStream(); final ServletOutputStream stream = new ServletOutputStream() { //只 是處理字節流,而PrintWriter則是處理字符流,和 @Override //重寫了裡面的方法 public void write(byte[] data, int offset, int length) { byteos.write(data, offset, length); } @Override//重寫了裡面的方法 public void write(int b) throws IOException { byteos.write(b); } }; final PrintWriter printw; printw= new PrintWriter(new OutputStreamWriter(byteos,"UTF- 8")); //進行編碼轉換,當輸出流從比特流轉換為字符流的時候設置才是有效的。 HttpServletResponse rep = new HttpServletResponseWrapper(response) { @Override public ServletOutputStream getOutputStream() { return stream; } @Override public PrintWriter getWriter() { return printw; } }; dispatcher.include(request, rep); printw.flush(); FileOutputStream fileos = new FileOutputStream(name); // 把jsp輸出的 內容寫到xxx.htm //out.print(name); byteos.writeTo(fileos); fileos.close(); out.print("發布成功!"); } // <editor-fold defaultstate="collapsed" desc="HttpServlet 方法。單 擊左側的 + 號以編輯代碼。"> /** * Handles the HTTP <code>GET</code> method. * @param request servlet request * @param response servlet response */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Handles the HTTP <code>POST</code> method. * @param request servlet request * @param response servlet response */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Returns a short description of the servlet. */ @Override public String getServletInfo() { return "Short description"; }// </editor-fold> }