`
yinlongfei
  • 浏览: 153406 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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>

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics