Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过另一种方法减少JSF组件树/状态。可以吗?_Java_Jsf_Jsf 2_Primefaces - Fatal编程技术网

Java 通过另一种方法减少JSF组件树/状态。可以吗?

Java 通过另一种方法减少JSF组件树/状态。可以吗?,java,jsf,jsf-2,primefaces,Java,Jsf,Jsf 2,Primefaces,不幸的是,我在选择JSF作为面向互联网的高流量应用程序时犯了一个错误,现在我想知道如何提高这个JSF Web应用程序的可伸缩性 我有一个JSF页面,其中显示了大量的条目,每个条目都可能被评论。 为了减少状态并提高性能,我正在尝试减少页面上表单/命令按钮的数量 1.我可以通过什么方式减少JSF的组件树/状态?普通html元素(混合在jsf标记之间)也构成组件树的一部分吗?我不知道组件状态保存对我的应用程序有什么帮助,因为我在设计我的应用程序时一直遵循简单的请求/响应模型(可能仅仅对JSF的内部需求

不幸的是,我在选择JSF作为面向互联网的高流量应用程序时犯了一个错误,现在我想知道如何提高这个JSF Web应用程序的可伸缩性

我有一个JSF页面,其中显示了大量的条目,每个条目都可能被评论。 为了减少状态并提高性能,我正在尝试减少页面上
表单
/
命令按钮
的数量

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

2.
我在想一种方法,不是为下面的每个项目创建一个单独的
(每个项目都有一个单独的
命令按钮)

(通常做法)

(替代方法) 我正试图通过为所有项放置一个remoteCommand,并将所需的参数传递给这个remoteCommand,来改善上述情况


函数addComment(itemId,id){
$('#comment_in').attr('value'),$('#'+id).attr('value');
$('#forItem_in').attr('value',itemId);
addComment_RC();//调用remoteCommand在对话框中显示内容
}

这样做是否更好(或者这种方法是否存在任何问题)?

在您描述的情况下,性能问题通常是由大量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>
当用户提交表单时,解析所有注释并相应地更新模型

编辑:

为了解决一般性能问题,我添加了一篇文章中的建议,我觉得这篇文章很有帮助

希望这有帮助


顺便说一句,我推荐第一种方法,而不是最后两种。

如果您使用ajax,为什么不为所有元素使用一种表单?这会减少状态吗?&将所有不应同时处理的数据保存在一个表单下是否更有意义?是的,这将降低复杂性,并且您可以使用
f:ajax
execute
属性指示jsf只处理您感兴趣的表单元素。是的,可以避免这种替代方法的复杂性,但因为commandButtons的数量保持不变,状态如何减少?我强烈建议您对应用程序进行堆转储,并对其进行检查,以确定到底是什么在使用内存。如果您跳过这一点,您可能优化了程序的错误部分。我猜您在第1点中的建议与我的替代方法(如上所述)几乎相似,唯一的区别是我使用了一个非jsf html
按钮,而不是blur事件,来触发submit to hiddeninput,然后触发服务器上的更新。@user Yes,我采用了同样的方法,实现了以下原则1.使用一种形式(在这种情况下不需要更多形式,这只会使事情复杂化)2。重要信息-使用而不是可能会导致渲染元素时出现问题3.减少el表达式的数量4。在客户端生成响应注释。5.使用ajax调用服务器6。在服务器上间接更新模型。谢谢,您是否可以澄清使用而不是渲染元素可能会导致问题?我一直在毫无问题地使用它,现在您可以安全地将jsf组件与普通html标记混合使用。@user您是对的。有些情况可能会导致问题。例如,使用jsf()创建div,并将库div用作tomahawk。一种方法是始终让jsf决定如何呈现元素。您有大量的项目要呈现,所以我将开始使用标记的div和输入元素,并且只有在检查功能之后考虑移除它们。
<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>
  <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>
<h:inputHidden value="{myClass.allComments}" />