我的网页有一个带有简单支持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;
}
}
答案 0 :(得分:2)
对bean的七次调用不是问题,JSF正是这样做的。我在这里看到一个设计问题:
public ArrayList<Text> getTexts() {
ArrayList<Text> texts = new ArrayList<Text>();
texts.addAll(t.findAll());
return texts; }
不要(重新)在支持bean的getter中创建列表! Primefaces数据表不可排序。您必须在所有呼叫上返回相同的列表实例。
一个简单的解决方案是缓存列表并懒惰地创建它。
Primefaces上帝和首席开发人员查看此答案:Datatable does not sort elements in primefaces
答案 1 :(得分:1)
哦......我......上帝......
通过反复试验,我发现了正在发生的事情。
为了简洁起见,我没有在facelets页面中包含所有代码。信不信由你,我为每个链接的css页面和我加载的每个图像运行一个完整的JSF生命周期。这一切都发生在头标记中:
<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>
所以我修改过的问题是:如何防止这些琐碎的代码行执行整个生命周期?