我要啦免费统计

          微藍(lán)領(lǐng)域

          我的學(xué)習(xí)檔案館
          posts - 19, comments - 57, trackbacks - 0, articles - 57
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          通過JSP生成靜態(tài)頁面

          Posted on 2007-08-20 12:22 hilor 閱讀(543) 評論(0)  編輯  收藏 所屬分類: J2EE
                生成靜態(tài)頁面技術(shù)解決方案系列(一)

                2006-10-26 

                 相信很多人都希望自己的頁面越快越好,最好是能靜態(tài)的,提高客戶訪問速度。也便于搜索引擎搜索。所以,就希望我們的動(dòng)態(tài)讀取數(shù)據(jù)庫的頁面,盡可能的生成靜態(tài)頁面。一下系列文章,介紹一下個(gè)人的解決方案。

                本系列將介紹個(gè)人的一種方法,在不改變原來jsp文件的基礎(chǔ)上,只需要加入少量的代碼,就讓你的新聞發(fā)布系統(tǒng),很容易就完全變成靜態(tài)的頁面。

                      本文假設(shè)你是用java開發(fā)的web動(dòng)態(tài)頁面。

                     第一步,加入servlet.代碼如下。


                public class ToHtml extends HttpServlet {

                 public void service(HttpServletRequest request, HttpServletResponse response)
                   throws ServletException, IOException {
                  String url = "";
                  String name = "";

                  ServletContext sc = getServletContext();

                  String file_name = request.getParameter("file_name");// 你要訪問的jsp文件名,如index,不包括擴(kuò)展名

                  // 則你訪問這個(gè)servlet時(shí)加參數(shù).如http://localhost/test/toHtml?file_name=index

                  url = "/" + file_name + ".jsf";// 你要生成的頁面的文件名。我的擴(kuò)展名為jsf .

                  name = ConfConstants.CONTEXT_PATH+"\\"+ file_name + ".htm";// 這是生成的html文件名,如index.htm.文件名字與源文件名相同。擴(kuò)展名為htm

                //ConfConstants.CONTEXT_PATH為你的應(yīng)用的上下文路徑。

                  RequestDispatcher rd = sc.getRequestDispatcher(url);

                  final ByteArrayOutputStream ōs = 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);
                   }
                  };

                  final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));

                  HttpServletResponse rep = new HttpServletResponseWrapper(response) {
                   public ServletOutputStream getOutputStream() {
                    return stream;
                   }

                   public PrintWriter getWriter() {
                    return pw;
                   }
                  };
                  rd.include(request, rep);
                  pw.flush();
                  FileOutputStream fos = new FileOutputStream(name); // 把jsp輸出的內(nèi)容寫到xxx.htm
                  os.writeTo(fos);
                  fos.close();
                  PrintWriter ōut = response.getWriter();
                  out
                    .print("<p align=center><font size=3 color=red>頁面已經(jīng)成功生成!single<br>http://www.agilejava.org/space/? 233</font></p>");
                 }
                }

                第二步、配置你的web.xml

                 <servlet>
                  <servlet-name>toHtml</servlet-name>
                  <servlet-class>mj.util.html.ToHtml</servlet-class>//你的servlet的類。
                 </servlet>
                 <servlet-mapping>
                  <servlet-name>toHtml</servlet-name>
                  <url-pattern>/toHtml</url-pattern>
                 </servlet-mapping>

                第三步、運(yùn)行servlet。如:http://localhost:8080/test/toHtml?file_name=index

                

                OK,這就在你的test項(xiàng)目的根目錄下,生成了一個(gè)index.htm的靜態(tài)文件?!?

                

                局限性:本文只能生成一個(gè)文件!訪問一次,生成一個(gè)文件。并且生成的文件名也與原來的文件名相同。

                比較適合主頁生成靜態(tài)頁面。

                

                本系列的后續(xù)文章將解決更多的問題。使之在新聞發(fā)布系統(tǒng)中,很容易就集成應(yīng)用。


              *
                生成靜態(tài)頁面技術(shù)解決方案系列(二)

                2006-10-28

                      注意:轉(zhuǎn)貼本文,請加上本文鏈接http://www.agilejava.org/space/?233/action_viewspace_itemid_21.html 

                     在上一篇文章中,生成靜態(tài)頁面,是有一定的局限性的。生成主頁是很方便,但要生成二級頁面,就不方便了。

                       本文假設(shè)一個(gè)新聞發(fā)布系統(tǒng)。希望后臺發(fā)布的,前臺顯示的是靜態(tài)的文檔。這就涉及,主頁要是靜態(tài)的,同時(shí)二級列表也是靜態(tài)的,新聞內(nèi)容也是靜態(tài)的。也就是說, 在發(fā)布一篇新聞的時(shí)候,可能涉及到三個(gè)地方生成靜態(tài)文檔。并且,要生成一個(gè)網(wǎng)頁,必須訪問一個(gè)servlet。在大量生成靜態(tài)網(wǎng)頁的時(shí)候,

                      以下方法,可以解決這些問題。

                    一、加入一下servelet

                    /**
                     * @file_name 文件名及文件之后的參數(shù).最好為a.jsf?fileId=aaaa
                     * @path 文件所在的路徑.相對于根目錄而言的.
                     * @realName文件要保存的名字
                     * @realPath文件要保存的真實(shí)路徑。默認(rèn)與文件所在的目錄相同。
                     */
                    public class ToHtmlPath extends HttpServlet {

                     public void service(HttpServletRequest request, HttpServletResponse response)
                       throws ServletException, IOException {
                      String url = "";
                      String name = "";

                      ServletContext sc = getServletContext();

                      String file_name = request.getParameter("file_name");// 你要訪問的jsp文件,如news.jsf。
                      // file_name如:fileDetail.jsf?fileId=56.要是有參數(shù), 只有一個(gè)參數(shù)。并且以參數(shù)名作為文件名。
                      String realName = request.getParameter("realName");// 要保存的文件名。如aaa;注意可以沒有這個(gè)參數(shù)。

                      String path = request.getParameter("path");// 你要訪問的jsp文件路徑。如news。注意可以沒有這個(gè)參數(shù)。

                      String realPath = request.getParameter("realPath");// 你要保存的文件路徑,如htmlNews.注意可以沒有這個(gè)參數(shù)。
                      // 下面確定要保存的文件名字。
                      if (realName == null || realName == "") {
                       int a = 0;
                       a = file_name.indexOf("=") + 1;
                       realName = file_name.substring(a);
                       if (realName.indexOf(".")>0) {
                        realName = file_name.substring(0, file_name.indexOf("."));
                       }
                      }
                      // 下面構(gòu)造要訪問的頁面。
                      if (path == null || path == "") {
                       url = "/" + file_name;// 這是你要生成HTML的jsp文件,如
                      } else {
                       url = "/" + path + "/" + file_name;// 這是你要生成HTML的jsp文件,如
                      }
                      // 下面構(gòu)造要保存的文件名,及路徑。
                      // 1、如果有realPath,則保存在realPath下。
                      // 2、如果有path則保存在path下。
                      // 3、否則,保存在根目錄下。
                      if (realPath == null || realPath == "") {
                       if (path == null || path == "") {
                        name = ConfConstants.CONTEXT_PATH + "\\" + realName + ".htm";// 這是生成的html文件名,如index.htm.說明: ConfConstants.CONTEXT_PATH為你的上下文路徑。
                       } else {
                        name = ConfConstants.CONTEXT_PATH + "\\" + path + "\\"
                          + realName + ".htm";// 這是生成的html文件名,如index.htm.
                       }
                      } else {
                       name = ConfConstants.CONTEXT_PATH + "\\" + realPath + "\\"
                         + realName + ".htm";// 這是生成的html文件名,如index.htm.
                      }

                      // 訪問請求的頁面,并生成指定的文件。
                      RequestDispatcher rd = sc.getRequestDispatcher(url);

                      final ByteArrayOutputStream ōs = 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);
                       }
                      };

                      final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));

                      HttpServletResponse rep = new HttpServletResponseWrapper(response) {
                       public ServletOutputStream getOutputStream() {
                        return stream;
                       }

                       public PrintWriter getWriter() {
                        return pw;
                       }
                      };
                      rd.include(request, rep);
                      pw.flush();
                      FileOutputStream fos = new FileOutputStream(name); // 把jsp輸出的內(nèi)容寫到xxx.htm
                      os.writeTo(fos);
                      fos.close();
                      PrintWriter ōut = response.getWriter();
                      out.print("<p align=center><font size=3 color=red>success!</font></p>");
                     }
                    }

                    

                    二、在web.xml里面配置你的servlet

                     <servlet>
                      <servlet-name>toHtmlPath</servlet-name>
                      <servlet-class>mj.util.html.ToHtmlPath</servlet-class>
                     </servlet>
                     <servlet-mapping>
                      <servlet-name>toHtmlPath</servlet-name>
                      <url-pattern>/toHtmlPath</url-pattern>
                     </servlet-mapping>

                    三、寫一個(gè)通用的方法, 供調(diào)用。

                    public class CallHtml {

                     public static void callOnePage(String fileName, String path,
                       String realName, String realPath) {
                      try {
                       String str = "http://localhost:8080/test/toHtmlPath?file_name="
                         + fileName + "&&path=" + path + "&&realName=" + realName
                         + "&&realPath=" + realPath;
                       int httpResult;
                       URL url = new URL(str);
                       URLConnection connection = url.openConnection();
                       connection.connect();
                       HttpURLConnection httpURLConnection = (HttpURLConnection) connection;
                       httpResult = httpURLConnection.getResponseCode();
                       if (httpResult != HttpURLConnection.HTTP_OK) {
                        System.out.println("沒有連接成功");
                       } else {
                        System.out.println("連接成功了 ");
                       }
                      } catch (Exception e) {
                       // TODO: handle exception
                      }
                     }

                    //這個(gè)方法適當(dāng)重載,就可以省去一些參數(shù)傳遞。

                    }

                    四、在你的新聞發(fā)布save時(shí),調(diào)用方法。

                    1、CallHtml.callOnePage("info.jsf?file_id=aaa",news,"", "");//將在news目錄下生成一個(gè)aaa.htm的靜態(tài)文件

                    2、CallHtml.callOnePage("newsList.jsf",news,"", "");//將在news目錄下生成一個(gè)newsList.htm的靜態(tài)文件,顯示最新的新聞。

                    3、CallHtml.callOnePage("index.jsf","","", "");//生成主頁。

                    好了,這就保持了,主頁、列表、新聞內(nèi)容都是最新的靜態(tài)頁面了。 

          主站蜘蛛池模板: 许昌市| 涿州市| 阿坝县| 宽城| 凤山县| 永新县| 神农架林区| 平武县| 随州市| 纳雍县| 临朐县| 双城市| 交城县| 张家川| 深水埗区| 临漳县| 林芝县| 湖南省| 赣榆县| 肃北| 东阳市| 新源县| 铅山县| 道真| 张家港市| 镇坪县| 和平区| 茌平县| 正安县| 长阳| 沁源县| 萍乡市| 桐柏县| 枣庄市| 始兴县| 清镇市| 黄梅县| 株洲市| 胶南市| 武穴市| 通州市|