將JSP輸出成靜態html頁面

ccfc 9年前發布 | 3K 次閱讀 Java


/**

 * 參數requestPageUrl想要生成html的jsp文件路徑(如:/frontStage/articleMenuContent.jsp),這是實際存在的jsp文件
 * (同時我看了一些API想找到只需要傳過來一個action也可以的方法,但是找不到...請高手幫幫忙..指點一下)
 * 參數createPagePath為存放生成html的路徑(如:/frontStage/articleMenuContent.html)
 * **/
public void createStaticPage(String requestPageUrl,String createPagePath) throws Exception{
    /**
     * 創建ServletContext對象,用于獲取RequestDispatcher對象
     */
    ServletContext sc = ServletActionContext.getServletContext();

    /**
     * 根據傳過來的相對文件路徑,生成一個reqeustDispatcher的包裝類
     */
    RequestDispatcher rd = sc.getRequestDispatcher(requestPageUrl);

    /**
     * 獲得request,response對象
     */
    HttpServletRequest request = ServletActionContext.getRequest();
    HttpServletResponse response = ServletActionContext.getResponse();

    /**
     * 創建一個ByteArrayOutputStream的字節數組輸出流,用來存放輸出的信息
     */
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();

    /**
     * ServletOutputStream是抽象類,必須實現write的方法
     */
    final ServletOutputStream outputStream = new ServletOutputStream(){
        @Override
        public void write(int b) throws IOException {
            /**
             * 將指定的字節寫入此字節輸出流
             */
            baos.write(b);
        }
    }; 
    /**
     * 通過現有的 OutputStream 創建新的 PrintWriter
     * OutputStreamWriter 是字符流通向字節流的橋梁:可使用指定的 charset 將要寫入流中的字符編碼成字節
     */
    final PrintWriter pw = new PrintWriter(new OutputStreamWriter(baos,"utf-8"),true);

    /**
     * 生成HttpServletResponse的適配器,用來包裝response
     */
    HttpServletResponse resp = new HttpServletResponseWrapper(response){
        /**
         * 調用getOutputStream的方法(此方法是ServletResponse中已有的)返回ServletOutputStream的對象
         * 用來在response中返回一個二進制輸出對象
         * 此方法目的是把源文件寫入byteArrayOutputStream
         */
        public ServletOutputStream getOutputStream(){
            return outputStream;
        }

        /**
         * 再調用getWriter的方法(此方法是ServletResponse中已有)返回PrintWriter的對象
         * 此方法用來發送字符文本到客戶端
         */
        public PrintWriter getWriter(){
            return pw;
        }
    }; 
    /**
     * 在不跳轉下訪問目標jsp。 就是利用RequestDispatcher.include(ServletRequest request,
     * ServletResponse response)。 該方法把RequestDispatcher指向的目標頁面寫到response中。
     */
    rd.include(request, resp);
    pw.flush();
    FileOutputStream fos = new FileOutputStream(createPagePath);
    /**
     * 使用ByteArrayOutputStream的writeTo方法來向文本輸出流寫入數據,這也是為什么要使用ByteArray的一個原因
     */
    baos.writeTo(fos);
    fos.close();
}</pre> 


 本文由用戶 ccfc 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!