2012-02-10 125 views
3

我有一個很大的樹結構(將近6000個節點和不斷增長),我在我的webapp中顯示爲一個Richfaces rich:tree。JSF2 Richfaces 4.1.0樹的Ajax部分渲染

當選擇一個節點時,後臺bean中的處理函數運行一些邏輯併發揮一定的魔力。

發生的一件事情是樹在樹中的每個選擇上都通過Ajax調用重新呈現。這意味着每次選擇更改時都會將超過2MB的數據發送到服務器。

正如你可能猜測我的問題在於,這是非常緩慢的。我想要做的只是選擇了重新渲染的樹節點,而不是整個樹,因爲這隻希望向服務器發佈幾個KB。

這是我在JSF2.0中使用RichFaces 4.1.0開發的第一個真正的項目,因此我瘋狂地搜索了一個解決方案,並通過RichFaces站點上的文檔搜索,但尚未找到解決方案。

我的代碼如下所示:

<h:form id="main"> 
<a4j:outputPanel ajaxRendered="true"> 
<rich:panel id="treePanel" header="Tree"> 
<rich:tree id="theTree" var="tree" value="#{treeBean.rootNodes}" selectionType="ajax" toggleType="client" selectionChangeListener="#{treeBean.selectionChanged}"> 
<rich:treeNode> 
<h:outputText styleClass="#{tree.selected?'selectedNode':''}" value="#{tree.title}" /> 
</rich:treeNode> 
</rich:tree> 
</rich:panel> 
</a4j:outputPanel> 
</h:form> 
+0

你是否找出了樹節點部分渲染的解決方案。 – 2014-07-08 15:15:15

回答

1

JSF應用程序不工作就像在傳統的Ajax實現他們有一種稱爲ViewState的這基本上是所有必要的用戶控制數據,頁面狀態數據的集合以及在每個請求和響應中來回傳遞給服務器的其他數據。原因在於HTTP通信本質上是無狀態的,所以根據請求給服務器的ViewState會告訴服務器模型的每一個變化以及需要發生的觸發的服務器事件。當服務器完成處理該請求時,它將其構建的響應以及修改後的ViewState發送回客戶端。這個ViewState現在包含有關哪些頁面元素需要被JSF javascripts更新和刷新的信息。

這個大的2MB可能大部分由您的ViewState組成,因爲它默認存在於客戶端上。一種可能會降低帶寬並減少請求/響應大小的潛在性能改進是將ViewState存儲在服務器上。您可以通過將以下內容添加到您的web.xml來打開它。

<context-param> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>server</param-value> 
</context-param> 

這應該會減少客戶端上ViewState的大小,但是2MB將最終存儲在服務器內存中的服務器會話上。這會在服務器上佔用更多內存,因此請注意併爲此做好準備。

+0

感謝您的回覆。我實際上已經有了新的ViewState,並將它存儲在服務器上。這是我嘗試的第一件事情之一:-)但是,每次POST時它仍然推送2MB到服務器。 – FighterHayabusa 2012-02-10 12:55:39

+0

@FighterHayabusa您是否考慮在您的Web服務器上啓用GZIP壓縮?每一個現代信譽良好的瀏覽器都會接受它,當我處理大頁面時,我發現它的性能提升非常顯着。 – 2012-02-10 13:21:03

+0

還沒有嘗試過。不過,我認爲這不會對我的問題有所幫助,因爲這裏需要的時間是推向服務器,而不是收到答案。我同意這是一個很好的綜合性能提示,但:-) – FighterHayabusa 2012-02-10 14:28:16

1

大的迴應是因爲您在輸出面板上設置了AjaxRendered =「true」。這基本上是告訴richfaces更新整個面板及其每個ajax請求上的所有內容,無論是否與您的樹有關。你可能想要刪除它。