【发布时间】:2012-03-31 20:28:03
【问题描述】:
不幸的是,我错误地将 JSF 选择用于面向 Internet 的高流量应用程序,现在我想知道如何提高这个 JSF webapp 的可扩展性。
我有一个 JSF 页面,其中显示了大量项目,每个项目都可以评论。
为了减少状态并提高性能,我正在尝试减少页面上forms /commandButtons 的数量。
1. 通过什么方式可以减少JSF的组件树/状态?纯 html 元素(混合在 jsf 标签之间)是否也构成组件树的一部分?我不知道组件状态保存对我的应用程序有什么帮助,因为我在设计我的应用程序时一直遵循简单的请求/响应模型,(可能只是对 JSF 的内部需求有帮助)!?
2. 我正在考虑一种方法,而不是为每个项目创建一个单独的<h:form>(每个都有一个单独的commandButton),如下所示,
(通常的方法)
<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>
这样做更好吗(或者这种方法有什么问题)?
【问题讨论】:
-
如果您使用 ajax,为什么不对所有元素使用一种形式?
-
这会减少状态吗? & 将不应该一次性处理的所有数据保存在一个表单中是否更有意义?
-
是的,它会降低复杂性,您可以使用
f:ajax的execute属性指示jsf 仅处理您感兴趣的表单元素 -
是的,这种替代方法的复杂性可以避免,但由于命令按钮的数量保持不变,如何减少状态?
-
我强烈建议您对应用程序进行堆转储,并检查它以确定究竟是什么在使用内存。如果您跳过该部分,您可能正在优化程序的错误部分。
标签: java jsf jsf-2 primefaces