jsp靜態化和僞靜態化

首先說說爲何要靜態化。
對於如今的Web Application來講,動態頁面是佔有絕對高的地位的,正由於有了動態化,纔有瞭如今Web的豐富多彩,可是如同全部別的事實同樣,好處每每都是有代價的。
爲了產生出動態的效果,每一次對頁面的請求都會要求服務器對頁面進行編譯或者執行,這些操做都很消耗系統資源。若是這期間還有和數據庫的通信,那麼代價將會更大。
若是一個頁面在必定的時間內,其內容沒有發生改變,那麼就沒必要爲每一次對它的訪問進行一次「新」的編譯或執行。咱們能夠把它在這段沒有發生改變的時間內的結果保存到一個靜態的頁面裏面,而後每次訪問這個頁面時,就用剛纔保存的靜態頁面進行回覆。這樣便能大大地減小系統資源的消耗,而且提升對客戶的響應速度。而這個過程就稱之爲頁面靜態化。 javascript

如今所面臨的問題就是如何在JSP中將頁面的內容保存下來。
在訪問JSP頁面的時候,服務器會先將JSP文件編譯爲Servlet文件,而後對這個Servlet編譯、執行,並最終把結果返回給客戶端。而咱們的任務就是要把這個最終生成的HTML靜態頁面保留下來,存放在服務器上。
解決的方法其實很簡單。普通的對於JSP的訪問,最終的數據流是回寫到客戶端的,若是咱們把它重定向,讓它回寫到服務器上一個本地的文件,這樣就能把JSP的執行結果保存起來,而這個文件就是咱們想要獲得的靜態化的結果。 html

好了,說了那麼多廢話,如今說說具體怎麼實現。
看過將JSP編譯成的Servlet文件之後,能夠知道這個Servlet是經過一個"JspWriter"類型的對象將數據回寫給客戶端的,而這個對象正是JSP裏面的內置對象"out",如今咱們只須要定義一個本身的類,讓它繼承"JspWriter"類,覆蓋裏面的輸出相關函數,讓數據都輸出到一個指定的文件就能夠了。
例如(省略了部分重載函數): java

程序代碼 web

Java代碼     收藏代碼
  1. import java.io.*;  
  2. import javax.servlet.jsp.*;  
  3. public class ConstPageWriter extends JspWriter {  
  4.      private PrintWriter pw;  
  5.      public ConstPageWriter(String fileName){  
  6.          super(JspWriter.DEFAULT_BUFFER, false);  
  7.          try{  
  8.              pw = new PrintWriter(fileName, "UTF-8");  
  9.          }catch(Exception e){  
  10.              e.printStackTrace();  
  11.          }  
  12.      }      
  13.      @Override  
  14.      public void print(String arg0) throws IOException {      
  15.          pw.print(arg0);  
  16.      }  
  17.      ......  
  18.      @Override  
  19.      public void println() throws IOException {  
  20.          pw.println();  
  21.      }  
  22.      @Override  
  23.      public void println(Object arg0) throws IOException {  
  24.          pw.println(arg0);  
  25.      }  
  26.      ......  
  27.      @Override  
  28.      public void write(char[] arg0, int arg1, int arg2) throws IOException {  
  29.          pw.write(arg0, arg1, arg2);  
  30.      }  
  31. }  

 


而後將須要靜態化的頁面寫成以下形式: 數據庫

程序代碼 服務器

Java代碼     收藏代碼
  1. <%  
  2. String fileName = "ConstPageName";   // 生成的靜態頁面文件名  
  3. if (notNeedUpdate){                 // 判斷是否須要更新  
  4.      response.sendRedirect(fileName);  
  5.      return;  
  6. }  
  7. out = new ConstPageWriter(pageContext.getServletContext().getRealPath(fileName));  
  8. %>  
  9. <%  
  10.      // Build this page,更新頁面  
  11. %>  
  12. <%  
  13. out.close();  
  14. response.sendRedirect(fileName);  
  15. %>  

 


這樣頁面靜態化基本上就算完成了,餘下的操做就是處理什麼時候須要更新。至於什麼時候更新是跟特定的應用程序相關的,這裏就不詳細分析了。 app

JSP使用URLRewirte實現url地址僞靜態化 jsp

在網上找了不少關於URLRewirte的使用,基本都是關於asp的,jsp的相關文檔不多,並且大多寫的很模糊,看了以後也是不清不楚,並且在項目中沒法使用成功,鑑於此,本身整理了關於URLRewirte的用法.該方法只是實現了url的僞靜態化,並非真正的靜態化. ide

工做環境:Eclipse3.2.2+MyEclipse_5.5.1+Tomcat5.0.28 函數

URLRewirte版本:urlrewrite-2.6.0.jar

前提條件:有一個能夠正常使用的web應用項目

URLRewirte的用處:

1.知足搜索引擎的要求

2.隱藏技術實現,提升網站的移植性

3.知足美感的要求(我的感受這個用處太牽強)

項目部署

1.首先在http://tuckey.org/urlrewirte/下載urlrewirtefilter

2.解壓所下載的文件,把urlrewrite-2.6.0.jar複製到項目的WebRoot/WEB-INF/lib/目錄下,而後編譯

3.把urlrewrite.xml複製到項目的WebRoot/WEB-INF/目錄下

4.在web.xml文件中加入如下:

<!-- 動態地址靜態化 -->

Xml代碼     收藏代碼
  1. <filter>  
  2. <filter-name>UrlRewriteFilter</filter-name>  
  3.    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>  
  4.    <init-param>  
  5.     <param-name>logLevel</param-name>  
  6.     <param-value>WARN</param-value>  
  7.    </init-param>  
  8. </filter>  
  9. <filter-mapping>  
  10.    <filter-name>UrlRewriteFilter</filter-name>  
  11.    <url-pattern>/*</url-pattern>  
  12. </filter-mapping>  

 

5.須要配置urlrewrite.xml文件來實現url靜態化,下面將詳細說明

到這裏相關的配置已經完成,下面看如何把動態地址靜態化

1.普通url靜態化

例如:要把http://localhost/prjtest/user/list.jsp轉換成http://localhost/prjtest/user/list.html

這種是最簡單的,當一個servlet跳轉到list.jsp頁面列出user列表時,在urlrewrite.xml中這樣配置:

Xml代碼     收藏代碼
  1. <rule>  
  2. <from>^/user/list.html</from>  
  3.    <to>/user/list.jsp</to>  
  4. </rule>  

 

當請求/user/list.html這個頁面時,實際上至關於請求/user/list.jsp頁面

在servlet的跳轉要這樣寫:

response.sendRedirect("./user/list.html");

2.帶參數的url靜態化

例如:要把http://localhost/prjtest/user/view.jsp?cid=1&cname=admin轉換成

       http://localhost/prjtest/user/view/1_admin.html

在urlrewrite.xml中這樣配置:

Java代碼     收藏代碼
  1. <rule>  
  2. <from>^/user/view/([0-9]+)_([a-z]+).html$</from>  
  3. <to>/user/view.jsp?cid=$1&amp;cname=$2</to>  
  4. </rule>  

 

當請求/user/view/1_admin.html這個頁面時,實際上至關於請求/user/list.jsp?cid=1&cname=admin頁面

在servlet的跳轉要這樣寫(cid,cname爲變量):

response.sendRedirect("./user/view/"+ cid +"_"+ cname +".html");

注意:配置文件中用"&amp;"來代替"&"

相關文章
相關標籤/搜索