【发布时间】:2011-12-21 15:06:23
【问题描述】:
我会很高兴为以下案例得到一个体面的解释。
这是一个简单的 JSF,有两种形式和文本输出:
<h:body>
<h:form>
<h:commandButton value="Go" action="#{wierdBean.doWierdStuff}"/>
</h:form>
<h:form>
<h:dataTable value="#{wierdBean.pages}" var="page">
<h:column>
<h:commandButton value="the same go action?" action="#{wierdBean.doWierdStuff}"/>
</h:column>
</h:dataTable>
</h:form>
</h:body>
<h:dataTable value="#{wierdBean.pages}" var="page">
<h:column>
<h:outputText value="#{page}"/>
</h:column>
</h:dataTable>
顶部的“Go”按钮应该做同样的事情 作为“相同的行动?”按钮。
支持 WierdBean 是:
public class WierdBean implements Serializable {
private int buttonsCount;
public WierdBean() {
System.out.println("WierdBean()");
}
@PostConstruct
public void postConstruct() {
System.out.println("postConstruct()");
}
public Integer[] getPages() {
System.out.print("getPages() buttonsCount(): " + buttonsCount);
Integer[] pages = new Integer[buttonsCount];
for (int i = 0; i < pages.length; i++) {
pages[i] = new Integer(i);
}
return pages;
}
public String doWierdStuff() {
System.out.println("doWierdStuff()");
buttonsCount = 2;
return "wierd";
}
}
当我进入页面时,我得到:
INFO: WierdBean()
INFO: postConstruct()
INFO: getPages() buttonsCount(): 0 (16 times)
我只看到了“开始”按钮。这是可以理解的。
按下“开始”按钮后,我得到:
INFO: WierdBean()
INFO: postConstruct()
INFO: getPages() buttonsCount(): 0 (19 times)
INFO: doWierdStuff()
INFO: getPages() buttonsCount(): 2 (16 times)
很好,调用了 doWierdStuff,然后我得到 2 个“相同的执行操作”按钮和 2 个文本输出。 没关系。
但是,当我按下任何“相同操作”按钮时,它们应该执行 与“开始”按钮相同 - 调用 doWierdStuff 方法 - 我得到:
INFO: WierdBean()
INFO: postConstruct()
INFO: getPages() buttonsCount(): 0 (44 times)
只有“开始”按钮可见。
这是为什么呢?
【问题讨论】:
-
我想我自己找到了答案。我将 getPages 方法中的代码放在 doWierdStuff 中,使 getPages 成为合法的 getter。在这种情况下,无论我做什么,我都只会得到“GO”按钮。让你的 getter 成为 GETTERS ONLY 的另一个原因!