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