通过替代方法减少JSF组件树/状态。好吗?

时间:2012-03-15 10:29:49

标签: java jsf jsf-2 primefaces

不幸的是,我错误地选择了面向互联网的高流量应用JSF,现在我想知道如何提高这个JSF webapp的可扩展性。

我有一个JSF页面,显示大量的项目,每个项目都可以评论。 为了减少状态和提高效果我正在尝试减少页面上forms / commandButtons的内容。

1. 我可以通过哪些方式减少JSF的组件树/状态?普通的html元素(在jsf标签之间混合)是否也构成了组件树的一部分?我不知道组件状态保存如何对我的应用程序有帮助,因为我在设计我的应用程序时一直遵循简单的请求/响应模型,(可能仅对JSF的内部要求有帮助)!

2. 我在考虑一种方法,而不是为下面的每个项目创建单独的<h:form>(每个都有一个单独的commandButton),< / p>

(通常的方法)

<h:form> <!-- for each item a separately -->
      <h:outputText value="Add comment"/>
      <h:inputTextarea value="#{itemController.comment}"  required="true"/>

      <p:commandButton actionListener="#{itemController.addUserComment(123)}" value="Add" />
</h:form>

(替代方法)

我试图通过为所有项目放置一个remoteCommand来改善上述效果。将所需参数传递给此remoteCommand。

<form>
   <input id="item1_comment"/>
   <button onclick="addComment(123, 'item1_comment');"/>  
</form>    

<script type="text/javascript">
    function addComment(itemId, id) {
        $('#comment_in').attr('value', $('#'+id).attr('value'));
        $('#forItem_in').attr('value', itemId);
        addComment_RC(); // call remoteCommand to show the content in dialog
    }
</script>

<h:form prependId="false" >  <!-- for all items, just single remoteCOmmand -->
    <h:inputHidden id="comment_in" value="#{itemController.comment}"/>
    <h:inputHidden id="forItem_in" value="#{itemController.forItem}"/>
    <p:remoteCommand name="addComment_RC" process="@form" actionListener="#{itemController.addComment()}" />
</h:form>

这样做是否更好(或者这种方法有问题吗?)

1 个答案:

答案 0 :(得分:6)

您描述的情况中的性能问题通常是由大量EL表达式引起的,这会给服务器带来负担。

解决此问题的一种方法是在客户端计算注释,并将它们全部传递给服务器。因此将注释EL表达式的数量减少到一个或没有,并且只使用一个按钮。

将所有元素放在一个表单中。注释字段没有绑定。

  <h:form>

       // first element 
       <h:outputText value=#{first element}
       // first comment 
       <h:inputTextarea id="comment1"/> <-- notice there is no EL expression 
                                            But we use a unique id for each comment 

       // second element 
       <h:outputText value=#{second element}
       // second comment 
       <h:inputTextarea id="comment2"/> 
       .
       .
       .



</h:form>

从这里你可以

1。在任何评论字段中的每个模糊事件后, ajax 服务器并作为参数传递评论。在服务器上相应地更新您的模型

或者您也可以在客户端收集所有评论并一次将它们发送到服务器。

2. 当用户按下提交按钮时,调用js函数来聚合您可以在服务器端轻松解析的结构中的所有注释 (即"{c1,comment a};{c2,comment b};{c5=,comment e}...")。 将该字符串传递给服务器,解析它并相应地更新您的模型。

在任何评论字段中的每个模糊事件之后

3。,调用更新隐藏字段的js函数。

<h:inputHidden value="{myClass.allComments}" />

当用户提交表单解析allComments并相应地更新您的模型时。

修改

为了解决一般性能问题,我添加了一篇文章中的建议,我认为该文章很有帮助speed up part 1 Speed up part 2

希望这有帮助

不过,我会推荐第一种方法,而不是最后两种方法。