2011-01-27 25 views
4

これは面白いものだと思います。繰り返しの中でSeamコンポーネントへの呼び出し回数を最小限に抑えたい。私はSeam 2.2.1.CR1、Richfaces 3.3.3.Final、JSF 1.2、Faceletsを使用しています。JSF/Richfaces反復の反復スコープ変数?

は以下にfaceletスニペットを見てください:私はここに属性(ROWSPANを計算しています上記のコードで

<rich:datatable value="#{myBean.products}" var="prod"> 

<rich:column rowspan="#{rowspan.calcHomePageProductRowspan(prod)}"> 
    #{prod.name} 
</rich:column> 

<rich:column rowspan="#{rowspan.calcHomePageProductRowspan(prod)}"> 
    #{prod.number} 
</rich:column> 

... 

<rich:column rowspan="#{rowspan.calcHomePageProductRowspan(prod)}"> 
    #{prod.somethingElse1} 
</rich:column> 

<rich:column rowspan="#{rowspan.calcHomePageProductRowspan(prod)}"> 
    #{prod.somethingElse2} 
</rich:column> 

... 

<rich:column rowspan="#{rowspan.calcHomePageProductRowspan(prod)}"> 
    #{prod.somethingElse3} 
</rich:column> 

</rich:datatable> 

を、それは本当に問題ではない、それは任意の属性または値であることができEL式を評価することで、それに集中しないでください)。ご覧のように、値を計算するメソッドは、現在のprodを引数として取ります。

私はrowspan Seamコンポーネントで内部最適化を行い、すでに計算されたすべての値をHashMapに保持しています。したがって、EL式が第2のrich:columnで評価されるとき、rowspanは、最初にHashMapですでに計算された値を検索し、それを再度計算する代わりに返します。

これはもう一度やり直すのが良いですが、まだSeamコンポーネントを呼び出す必要があります。何らかの理由でSeamコンポーネントを一度呼び出すしか方法はありません。何らかの形で現在の繰り返しの計算値を保持していますか?

Javaに似ているのは、各繰り返しでループ内に変数を定義し、繰り返し全体で変数を再利用することです。

注:は、私はすでに、このような@BypassInterceptorsなど他のSeam指向の最適化を行った、SeamコンポーネントはEVENTスコープにあるので、何階層検索が行われないなど

+1

JSPまたはFacelets? JSPの場合、ここで終了します(いいえ、JSTL ''は 'UIData'コンポーネントの中でここで助けてくださいません)。 Faceletsの場合は、「」を使用します。 – BalusC

+0

私はFaceletsを使用しています。質問を編集しました。 –

答えて

1

する方法がありますSeamコンポーネントを一度呼び出すだけで、何らかの形で現在の反復の計算値が保持されますか?

確かに、理論上。

しかし、私はあなたの質問を完全に理解しているかどうかはわかりません。どの継ぎ目のコンポーネントについて話していますか? rowspan

これが当てはまる場合は、それを呼び出すたびに呼び出されますが、これは意味があります。あなたはdataTableをループしていて、それを呼び出す行ごとにループしています。

あなたがしようとしていることについてさらに詳しく知ることなく、答えを示唆することは困難です。コードは遅いですか?それはあなたがさらに最適化する必要がある理由ですか?私はわからないけれども、それは

<rich:dataTable value="#{myBean.products}" var="prod"> 
    <ui:param name="myrowspan" value="#{rowspan.calcHomePageProductRowspan(prod)}"/> 
    <rich:column rowspan="#{myrowspan}"> 
    #{prod.name} 
    </rich:column> 
</rich:dataTable> 

第二の更新プログラムを

を動作するかどう

更新

はあなたであるためにあなたのコードを変更していないそうだとすれば、これを試してみてください@ Out、@Factory、@Unwrapまたは同様のものであれば、これは常にそれが実行されるたびに評価されます。これはJSFの仕組みです。
JSFが各JSFフェーズでこれを呼び出すので、ゲッターでこれを行うべきだと言う理由です。リストをキャッシュしていないだろう、とヌルのチェック、JSFは、各フェーズのために、データテーブルの行ごとにデータベースをヒットしたい場合

public List<Foo> getFoo() { 
    if(this.field != null) {  
    field = (List)entityManager.createQuery("from Foo").getResultList(); 
    } 
    return this.field; 
} 

これはあなたが住んでいなければならないものです。

+0

はい、rowspanはSeamコンポーネントです。 –

+0

''を試した後、このmyrowspanをrowspanタグで使用しましたか?私はそれがうまくいくかどうかわからない。 –

+0

@ Markos Fragkakis:私は私の提案がうまくいくと推測していますか? –