簡體   English   中英

JSF commandButton的“奇怪”行為

[英]JSF commandButton 'strange' behaviour

對於以下情況,我將很高興獲得體面的解釋。

這是一個簡單的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>

頂部的“執行”按鈕應該與“相同的執行動作”執行相同的操作? 紐扣。

支持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個“相同的go action”按鈕和2個文本輸出。 沒關系。

但是,當我按下“相同動作”按鈕中的任何一個時,它們應該執行的功能與“轉到”按鈕相同-調用doWierdStuff方法-我得到:

INFO: WierdBean() 
INFO: postConstruct() 
INFO: getPages() buttonsCount(): 0 (44 times)

僅顯示“開始”按鈕。

這是為什么?

您的具體問題有兩個方面:顯然,bean是請求范圍的,而不是視圖范圍的,並且您正在使用getter方法而不是(post)構造函數或(action)偵聽器方法進行業務工作。

在每個單獨的請求上都會重新創建請求范圍的Bean,並且不會在同一視圖上的后續請求上重用該請求范圍的Bean。 所有屬性(如buttonsCount都將重新初始化為其默認值。 單擊數據表中的命令鏈接/按鈕時,需要確保保留與初始請求中完全相同的數據模型。 如果不這樣做,JSF將無法找到要調用的動作。 只要您通過返回nullvoid與同一個視圖進行交互,bean就必須存在。 這可以通過使用@ViewScoped (或當您仍使用Tomahawk的<t:saveState>組件使用過時的JSF 1.x)將bean放在視圖范圍中來實現。

支持bean getter方法應僅返回事先准備好的數據,而不是准備數據本身。 假定該getter方法僅是數據的訪問點。 這是因為在請求-響應周期中,可以多次調用getter方法,尤其是在UIData組件和/或rendered屬性中引用該UIData

也可以看看:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM