2009-06-11 36 views
0

我正在將(UIInput)添加到動態創建的數據表(UIData)的頁腳列(UIColumn)。 UIData綁定到jsp中的數據表標籤。 在數據表中,我只有標題和頁腳,標題和頁腳在可編輯文本框中具有相應的值。 當我更改值並使用commandButton提交表單,並嘗試使用操作方法中的.getValue()訪問UIInput值時,我只獲取舊值,而不是頁面中更新的值。 我試着將它綁定到backing bean中的一個屬性,並檢查了setter中設置的值。我注意到舊值已被設置,我在頁面中更新的值不會反映在操作方法或設置器中。 我嘗試使用.getValue,.getLocalValue,.getSubmittedValue。這些都沒有給我新的價值。 有什麼建議我可能在做worng?DataTable頁腳中的JSF UIInput


我設法解決方法是從requestParameterMap中提取值。 如果有問題的解決方法,請讓我知道。 麥克道爾 - 感謝您的投入。

+0

你能否提供一個非常簡單的頁面和bean來重現問題?這將有助於縮小問題的範圍。 – McDowell 2009-06-11 16:22:31

回答

0

實際的代碼做了其他幾個處理,但下面的代碼應該有助於複製問題。在下面的代碼中,我期望TestString從頁面輸出修改後的值。但它只是返回舊值。 下面是在jsp:

<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%> 
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%> 
<html> 
<head> 
</head> 
<f:view> 
    <body> 
     <h:form styleClass="form" id="form1"> 
      <h:commandButton value="Save" action="#{TestPageBackingBean.save}" styleClass="commandExButton"/> 
      <h:outputText styleClass="label" value="Header Table"/> 
      <h:dataTable binding="#{TestPageBackingBean.headerDataTable}"></h:dataTable> 
     </h:form> 
    </body> 
</f:view> 
</html> 

下面是面配置:

<managed-bean> 
    <managed-bean-name>TestPageBackingBean</managed-bean-name> 
    <managed-bean-class>test.jsf.TestPageBackingBean</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
</managed-bean> 

下面是輔助bean代碼:

package test.jsf; 

import java.io.IOException; 

import javax.faces.component.UIColumn; 
import javax.faces.component.UIData; 
import javax.faces.component.UIInput; 
import javax.faces.component.UIOutput; 
import javax.faces.context.FacesContext; 

public class TestPageBackingBean { 

    private UIData headerDataTable = new UIData(); 

    public TestPageBackingBean() { 

    } 

    public UIData getHeaderDataTable() 
    {  
      return getHeaderTable(headerDataTable); 
    }  

    public UIData getHeaderTable(UIData dataTable) 
    {  
     for (int i=0;i<10;++i) 
     { 
      dataTable.getChildren().add(getColumn(i)); 
     } 
     return dataTable; 
    } 

    private UIColumn getColumn(int i) 
    { 
    UIOutput outputLabelText = new UIOutput(); 
     UIInput inputFieldText = new UIInput(); 
     UIColumn column = new UIColumn(); 

     outputLabelText.setValue("Label" + i); 
     inputFieldText.setValue("test input" + i); 

     column.setHeader(outputLabelText); 
     column.setFooter(inputFieldText); 
     return column; 
    } 

    public String save() throws IOException { 
      String TestString = ""; 
      FacesContext ctx = FacesContext.getCurrentInstance(); 
      if (!ctx.getResponseComplete()) { 
       for (int i=0; i<headerDataTable.getChildren().size();++i) 
       { 
        TestString = TestString + (String)((UIInput)((UIColumn) headerDataTable.getChildren().get(i)).getFooter()).getValue(); 
       } 
      System.out.println(TestString); 
      } 
      return "save"; 
     } 

    public void setHeaderDataTable(UIData headerDataTable) { 
     this.headerDataTable = headerDataTable; 
    } 
} 
1

我試圖下的MyFaces 1.2.3運行your demo code代碼在Tomcat上和Mojarra Glassfish上的2.0.0測試版,但無法重現問題 - save()方法打印出我在字段中輸入的值。

(要使用MyFaces的,我不得不改變新UIData()新HtmlDataTable(),可能是由於他們是如何實現的表格繪製,但是這是一個小的改動。)

我會注意到一對夫婦的事情有關bean:

  • 表吸氣將繼續增加列每次調用的時候 - 就像刷新頁面與服務器端狀態保存
  • 保管在會話bean中引用UIComponent通常不是一個好主意;你會使用組件綁定
    • 會話Bean請求範圍會更好應該實現串行接口(雖然我知道不是每個人都做到這一點),並UIComponents的不能序列
    • 您的組件可能在如果多個視圖結束用戶打開頁面兩次 - 併發問題
    • 根據spec:當JSF創建視圖時,它將使用通過getter綁定的組件;但是,當它恢復視圖(上提交),它會通過設置器所設置的組件,因此保持一提的是(最好)冗餘

你可能想吸氣更改爲類似這樣的:

private UIData headerDataTable; 

public UIData getHeaderDataTable() { 
    if (headerDataTable == null) { 
     headerDataTable = new UIData(); 
     getHeaderTable(headerDataTable); 
    } 
    return headerDataTable; 
} 

我不相信,這些變化將解決您的問題,雖然 - 如果你仍然有問題,更多的細節再試一次 - 你的JSF實現,版本和javax.faces.STATE_SAVING_METHOD的價值參數web.xml(如果有的話)。

0

該問題尚未完全解決。

我使用RSA 7和IBM JSF - Base Faces Support 7.0和WAS 6.0上的增強型Faces組件7.0默認情況下,javax.faces.STATE_SAVING_METHOD是'server'。

我試着將STATE_SAVING_METHOD更改爲'client'。它確實在輸出中打印了更改後的值,但在label4中而不是我修改的label0中。在下一次提交時,將值從label4移至label8。看起來不一致。