2009-06-11 78 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。看起来不一致。