2012-02-10 5 views
3

私はWebappでRichfaces rich:ツリーとして表示される大きなツリー構造(ほぼ6000個のノードと成長)を持っています。JSF2 Richfaces 4.1.0ツリーのAjax部分レンダリング

ノードが選択されると、バッキングBeanのハンドラ関数がロジックを実行し、いくつかの魔法を働きます。

ツリー内のすべての選択に対してツリーがAjaxコールで再レンダリングされることがあります。これは、選択が変更されるたびに、2MBを超えるファイルがサーバーにPOSTされることを意味します。

ここで私の問題を推測するかもしれませんが、これは非常に遅いです。私がしたいのは、選択されたツリーノードがツリー全体ではなく再レンダリングされるようにすることだけです。これは、サーバーに数KBをPOSTするだけでよいからです。

これは、RichFaces 4.1.0を使用しているJSF2.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

ツリーノードの部分レンダリングの解決策を見つけましたか? –

答えて

1

JSFアプリケーションは、彼らは基本的にすべての必要なユーザ制御データ、ページ状態データの集まりであるViewStateのと呼ばれるものを持っているという点で、伝統的なAjaxの実装のように動作しません。 、および各要求と応答でサーバーに前後に渡されるその他のデータが含まれます。この理由は、HTTP通信は本質的にステートレスであるため、要求に応じてサーバーに渡されるViewStateは、発生する必要のあるモデルおよびトリガーされたサーバー・イベントのすべての変更についてサーバーに通知します。サーバーはこの要求の処理を終了すると、変更されたViewStateと共に構築された応答をクライアントに返します。このViewStateには、JSF javascriptによって視覚的に更新および更新が必要なページ要素に関する情報が含まれるようになりました。

この2MBの大きなものは、おそらくデフォルトではクライアントにのみ存在するため、ほとんどの場合ViewStateで構成されています。帯域幅を削減し、要求/応答サイズを縮小する潜在的なパフォーマンス改善の1つは、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について既に新しいです。私はそれをそのままサーバーに保存しています。それは私が試した最初のものの1つでした:-)しかし、POSTごとに2MBをサーバーに押し込んでいます。 – FighterHayabusa

+0

@FighterHayabusa WebサーバーでGZIP圧縮を有効にすることを検討しましたか?現代の評判の良いブラウザはすべてそれを受け入れ、私は大きなページを扱っているときにかなりのパフォーマンスの向上が見られる。 –

+0

それを試していない。しかし、私はそれが私の問題に役立つとは思わない、ここに時間がかかっているのは答えを受け取らずにサーバーに向かっているからです。 – FighterHayabusa

1

大きな応答は、出力パネルにAjaxRendered = "true"を設定しているためです。これは基本的にrichfacesにあなたのツリーに関連するかどうかにかかわらず、すべてのAjaxリクエストでパネル全体とその内容を更新するように指示しています。それを削除したいかもしれません。

関連する問題