2

私の Web ページには、シンプルなバッキング Bean を持つプライムフェイスのデータテーブルがあります。フェーズ リスナーを使用して、舞台裏で何が起こっているかをログに記録します。見よ、この単純なページは、ページが更新されるたびにJSFライフサイクルを7回以上実行します!!! 何が起こっている?

<p:dataTable id="readers" var="reader" value="#{readerManagerBean.texts}" 
   rowKey="#{reader.id}" selection="#{readerBean.selectedText}" 
   selectionMode="multiple">  

  <p:column headerText="Reader Name" width="820">
      <h:outputText value="#{reader.name}" />
   </p:column>

</p:dataTable>

バッキング Bean は次のとおりです。

@ManagedBean
@RequestScoped
public class ReaderManagerBean {

private ArrayList<Text> texts;
private Text selectedText;
@EJB
private TextFacade t;

public Text getSelectedText() {
    return selectedText;
}

public void setSelectedText(Text selectedText) {
    this.selectedText = selectedText;
}

public ArrayList<Text> getTexts() {
    ArrayList<Text> texts = new ArrayList<Text>();
    texts.addAll(t.findAll());
    return texts;
}

public void setTexts(ArrayList<Text> texts) {
    this.texts = texts;
}

}

4

2 に答える 2

2

Bean への 7 回の呼び出しは問題ではなく、JSF はそのようにしています。ここに設計上の問題があります。

public ArrayList<Text> getTexts() {
    ArrayList<Text> texts = new ArrayList<Text>();
    texts.addAll(t.findAll());
    return texts; }

バッキング Bean のゲッターでリストを (再) 作成しないでください。Primefaces データテーブルはソートできません。すべての呼び出しで同じList インスタンスを返す必要があります。

簡単な解決策は、リストをキャッシュして遅延作成することです。

Primefaces の神であり主任開発者によるこの回答を参照してください: Datatable does not sort elements in primefaces

于 2013-05-09T12:58:05.060 に答える
1

何てことだ...

試行錯誤して、何が起こっているのかを見つけました。

簡潔にするために、facelets ページにすべてのコードを含めませんでした。信じられないかもしれませんが、リンクするすべての CSS ページとロードするすべての画像に対して、JSF ライフサイクル全体が実行されます。そして、それはすべて head タグで行われます:

    <h:head>
    <link href="../resources/css/default.css" rel="stylesheet" type="text/css" />
    <link href="../resources/css/cssLayout.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="../resources/javascript/main.js"/>

    <script type="text/javascript">
        var preLoad = new Array();
        preLoad[0] = new Image();
        preLoad[0].src = '../resources/img/play_normal.png';
        preLoad[1] = new Image();
        preLoad[1].src = '../resources/img/play_hover.png';
        preLoad[2] = new Image();
        preLoad[2].src = '../resources/img/play_pressed.png';

        function switchImage(whichImage, imageNumber){
            document.images[whichImage].src = preLoad[imageNumber].src;
        }    
    </script>
</h:head>

だから私の修正された質問はこれです: どうすればこれらの些細なコード行がライフサイクル全体を実行するのを防ぐことができますか?

于 2013-05-09T13:21:42.993 に答える