数据表页脚中的JSF UIInput

数据表页脚中的JSF UIInput,jsf,datatable,textinput,Jsf,Datatable,Textinput,我正在向动态创建的datatable(UIData)的页脚列(UIColumn)添加(UIInput)。UIData绑定到jsp中的datatable标记。 在datatable中,我只有页眉和页脚,页眉有标签,页脚有可编辑文本框中的相应值。 当我使用commandButton更改值并提交表单,并尝试使用action方法中的.getValue()访问UIInput值时,我只获取旧值,而不是页面中更新的值。 我尝试将其绑定到支持bean中的属性,并检查setter中设置的值。我注意到正在设置旧的值

我正在向动态创建的datatable(UIData)的页脚列(UIColumn)添加(UIInput)。UIData绑定到jsp中的datatable标记。 在datatable中,我只有页眉和页脚,页眉有标签,页脚有可编辑文本框中的相应值。 当我使用commandButton更改值并提交表单,并尝试使用action方法中的.getValue()访问UIInput值时,我只获取旧值,而不是页面中更新的值。 我尝试将其绑定到支持bean中的属性,并检查setter中设置的值。我注意到正在设置旧的值,而我在页面中更新的值没有反映在action方法或setter中。 我尝试使用.getValue、.getLocalValue、.getSubmittedValue。这些都没有给我新的价值观。 有什么建议我可能在做什么吗


通过从requestParameterMap中提取值,我成功地解决了这个问题。 如果有解决问题的方法,请务必让我知道。
McDowell-感谢您的输入。

实际代码会进行其他一些处理,但下面的代码应该有助于复制问题。在下面的代码中,我希望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>

下面是faces配置:

<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> 

TestPageBackingBean
test.jsf.TestPageBackingBean
一场
下面是支持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;
    }   
}
package test.jsf;
导入java.io.IOException;
导入javax.faces.component.ui列;
导入javax.faces.component.UIData;
导入javax.faces.component.UIInput;
导入javax.faces.component.UIOutput;
导入javax.faces.context.FacesContext;
公共类TestPageBackingBean{
私有UIData headerDataTable=新UIData();
公共TestPageBackingBean(){
}
公共UIData getHeaderDataTable()
{    
返回getHeaderTable(headerDataTable);
}       
公共UIData getHeaderTable(UIData数据表)
{    
对于(int i=0;i我尝试在Tomcat上的MyFaces 1.2.3和Glassfish上的MyFaces 2.0.0 Beta下运行代码,但无法重现问题-save()方法将我输入的值打印到字段中

(要使用MyFaces,我必须将new UIData()更改为new HtmlDataTable(),这可能是由于它们如何实现表呈现器,但这只是一个小改动。)

我将注意到关于bean的一些事情:

  • 每次调用表getter时,它都会不断添加列,就像使用服务器端状态保存进行页面刷新一样
  • 在会话bean中保留对UIComponent的引用通常不是一个好主意;最好使用组件绑定的请求范围
    • 会话bean应该实现可序列化(尽管我知道不是每个人都这样做),UIComponents不能序列化
    • 如果用户打开页面两次,组件可能会出现多个视图-并发性问题
    • 根据:当JSF创建视图时,它将使用通过getter绑定的组件;但是,当它恢复视图时(提交时),它将通过setter设置组件,因此保留引用(最多)是多余的
您可能希望将getter更改为以下内容:

private UIData headerDataTable;

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

我不相信这些更改会解决您的问题,但是-如果您仍然有问题,请再试一次,并提供更多详细信息-您的JSF实现、版本以及web.xml中参数的值(如果有)。

问题尚未完全解决

我使用RSA 7,在IBM JSF-Base Faces支持7.0和增强的Faces组件7.0的情况下,WAS 6.0上的javax.Faces.STATE保存方法默认为“server”


我尝试将STATE_SAVING_方法更改为“client”。它确实在输出中打印了更改后的值,但打印的是label4,而不是我修改的label0。下次提交时,该值从label4移动到label8。似乎不一致。

您能提供一个非常简单的页面和bean来重现问题吗?这将有助于缩小问题的范围。