richfaces性能優化

在使用seam或JSF時往往會跟Richfaces及ajax4jsf一起使用,利用richfaces優秀的組件使頁面展現更豐富更多樣化同時加快了開發的速度,但與此同時richfaces也給系統帶來了不少的性能問題。

別的暫且不說,就拿展現頁面來說,如果一個頁面上使用了richfaces組件,把最後解析出來的頁面的源代碼保存下來,你會發現保存下來的頁面源代碼非常大而且有一大推看得似懂非懂的代碼。可想而知頁面加載的性能會有多糟糕。

幸好richfaces提供了很多配置來提高加載頁面的性能和組件解析的性能。

 

首先來看一下腳本和樣式的加載策略:

   在3.1.3版本之前,RichFaces根據需要加載樣式表和腳本。即如果在一個特定頁面上需要它們,才加載文件。從RichFaces 3.1.3開始,是可以管理RichFaces腳本和樣式表文件如何被加載到應用程序。

   1、下面在你的web.xml文件中的聲明,准許加載完整的樣式表文件。該配置將保證所有和樣式相關的文件在第一次訪問Richfaces應用的請求到達時全部加載到客戶端:

<context-param>

    <param-name>org.richfaces.LoadStyleStrategy</param-name>

    <param-value>ALL</param-value>

</context-param>

完整的樣式表包含用於所有加載的組件的樣式。換膚功能仍然工作。

"DEFAULT"的值是一個典型的按需變量。


"NONE"停止加載任何樣式。重新設置較早引入的純皮膚的所有顏色和字體的參數爲null。org.richfaces.LoadStyleStrategy的"NONE"值,意味着RichFaces的預定義樣式不被使用。

2、下面在你的web.xml文件中的聲明,准許加載完整的腳本文件。該配置將保證所有和Richfaces相關的JavaScript、文件、庫等在第一次請求到達時被下載到客戶端:
<context-param>

    <param-name>org.richfaces.LoadScriptStrategy</param-name>

    <param-value>ALL</param-value>

</context-param>

 

如果你在web.xml文件中沒有聲明org.richfaces.LoadScriptStrategy,它等價於:
       <context-param>

    <param-name>org.richfaces.LoadScriptStrategy</param-name>

    <param-value>DEFAULT</param-value>

</context-param>

還有一種可能值是"NONE"。你沒有一個特殊原因使用它,除非你獲得了一個最新的(或修改)腳本版本,並且希望手動包括它在頁面頭中。


3、強制容器在發送到客戶端之前壓縮所有的Richfaces資源,包括圖片、樣式表、JavaScript等。它將大大的減少頁面的加載時間。配置如下:
 <context-param>   
         <param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>   
         <param-value>true</param-value>   
 </context-param>

 

過濾器配置:


richfaces使用了一個過濾器,用於根據ajax請求接收到的代碼的更正。在“標準”JSF請求的情況下,瀏覽器獨立地做更正。在ajax請求的情況下,爲了防止佈局被摧毀,需要使用過濾器,因爲收到的代碼可能不同與瀏覽器驗證的代碼,並且瀏覽器不能做任何更正。

下面是一個在你的應用程序的web.xml文件中設置過濾器的例子:
<filter>

    <display-name>RichFaces Filter</display-name>

    <filter-name>richfaces</filter-name>

    <filter-class>org.ajax4jsf.Filter</filter-class>

</filter>

<filter-mapping>

    <filter-name>richfaces</filter-name>

    <servlet-name>Faces Servlet</servlet-name>

    <dispatcher>FORWARD</dispatcher>

    <dispatcher>REQUEST</dispatcher>

    <dispatcher>INCLUDE</dispatcher>

</filter-mapping>

 
從RichFaces 3.2開始,過濾器的配置變得更靈活。它可以對相同的應用程序的不同的頁面集合配置不同的過濾器。


可能的過濾器類型是:
1)      TIDY —— TIDY過濾器基於TIDY解析器。這個過濾器推薦用於使用了複雜的或非標準的標記,當響應來自服務器時,當所有必要的代碼由過濾器做更正時。

2)      NEKO —— NEKO過濾器修正了前面的快速過濾器,並且基於NEKO解析器。在使用這個過濾器的情況下,代碼沒有被嚴格校驗。使用它,你要確保你的應用程序標記是嚴格用於這個過濾器的。否則可能會導致很多錯誤和惡化佈局結果。這個過濾器大大加快了Ajax請求的處理。

3)      NONE —— 沒有更正

 

一個配置例子,如下所示:

 

<context-param>
    <param-name>org.ajax4jsf.xmlparser.ORDER</param-name>

    <param-value>NONE,NEKO,TIDY</param-value>

</context-param>

<context-param>

    <param-name>org.ajax4jsf.xmlparser.NONE</param-name>

    <param-value>/pages/performance\.xhtml,/pages/default.*\.xhtml</param-value>

</context-param>

<context-param>

    <param-name>org.ajax4jsf.xmlparser.NEKO</param-name>

    <param-value>/pages/repeat\.xhtml</param-value>

</context-param>

<filter>

    <display-name>RichFaces Filter</display-name>

    <filter-name>richfaces</filter-name>

    <filter-class>org.ajax4jsf.Filter</filter-class>

</filter>

<filter-mapping>

    <filter-name>richfaces</filter-name>

    <servlet-name>Faces Servlet</servlet-name>

    <dispatcher>FORWARD</dispatcher>

    <dispatcher>REQUEST</dispatcher>

    <dispatcher>INCLUDE</dispatcher>

</filter-mapping>
      

這個例子顯示的ORDER參數,定義了用於頁面代碼更正的特殊過濾器類型的順序。


首先,所有"NONE"類型指定給過濾器。然後,兩個不同的頁面集合被定義,相應地使用了兩個過濾器類型(NONE和NEKO)。如果頁面涉及第一個集合,如下定義它:

<param-value>/pages/performance\.xhtml,/pages/default.*\.xhtml</param-value>


沒有更正,因爲這個頁面的過濾器類型被定義爲"NONE"。如果頁面不是出自於第一個集合,則設置"NEKO"類型。

 

如果頁面涉及第二個集合,如下定義它:


<param-value>/pages/repeat\.xhtml</param-value>

那麼"NEKO"類型被用於更正。如果沒有涉及第二個集合,則爲該過濾器設置爲"TIDY"("TIDY"過濾器類型用於代碼更正)。

根據上述過濾器和使用到的解析器我們可以在特定的情況下做些調整和優化:

1)啓用richfaces組件緩存,將組件緩存到客戶端來提高應用的性能。

 <filter>   
     <display-name>RichFaces Filter</display-name>   
     <filter-name>richfaces</filter-name>   
     <filter-class>org.ajax4jsf.Filter</filter-class>   
     <init-param>     
         <param-name>enable-cache</param-name>   
         <param-value>true</param-value>     
     </init-param>   
 </filter>
 <filter-mapping>
    <filter-name>richfaces</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
 </filter-mapping>


2)richfaces內置了幾個解析器,TIDY解析器用於複雜的或非標準的標記,這些標記由過濾器做嚴格效驗並更正。NEKO過濾器在解析代碼時沒有嚴格效驗,大大加快了ajax請求的處理,但使用時你要確保你的應用程序標記是嚴格用於這個過濾器,否則可能會導致很多錯誤和惡化佈局結果。

所以TIDY解析器相對NEKO解析器來說會慢很多。默認是TIDY解析器。

配置NEKO過濾器的代碼如下:(上面已經說了NEKO過濾器是基於NEKO解析器,過濾器配置爲NEKO過濾器就等於選擇了更高效的NEKO解析器)

<context-param>   
        <param-name>org.ajax4jsf.xmlparser.ORDER</param-name>   
        <param-value>NEKO</param-value>   
    </context-param>   
    <context-param>   
        <param-name>org.ajax4jsf.xmlparser.NEKO</param-name>   
        <param-value>.*\..*</param-value>   
    </context-param>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章