2

我的网页有一个带有简单支持 bean 的 primefaces 数据表。我使用相位监听器来记录幕后发生的事情。瞧,这个简单的页面在每次页面刷新时运行 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 的七次调用不是问题,JSF 就是这样做的。我在这里看到一个设计问题:

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

不要(重新)在 backing bean 的 getter 中创建您的列表!您的 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 回答