DataTable页脚中的JSF UIInput

时间:2009-06-11 15:25:45

标签: jsf datatable textinput

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


我设法通过从requestParameterMap中提取值来解决方法。 如果有问题的解决方案,请告诉我。 麦克道威尔 - 感谢您的投入。

3 个答案:

答案 0 :(得分:1)

我尝试在Tomcat上的MyFaces 1.2.3下运行your demo code代码,在Glassfish上运行Mojarra 2.0.0 Beta,但无法重现问题 - save()方法打印了我输入的值进入田野。

(要使用MyFaces,我必须将 new UIData()更改为 new HtmlDataTable(),这可能是由于它们如何实现表格渲染器,但这是一个微小的变化。)

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

  • 表getter将在每次调用时不断添加列 - 就像在页面刷新时使用服务器端状态保存
  • 在会话bean中保持对UIComponent的引用通常不是一个好主意;你最好使用组件绑定的请求范围
    • 会话bean应该实现Serializable(虽然我意识到不是每个人都这样做)并且UIComponents无法序列化
    • 如果用户打开两次页面 - 并发问题
    • ,您的组件可能会以多个视图结束
    • 根据spec:当JSF创建视图时,它将使用通过getter绑定的组件;但是,当它恢复视图时(在提交时),它将通过setter设置组件,因此保持引用是(最多)冗余

您可能希望将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 中的参数(如果有)。

答案 1 :(得分: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>

下面是faces config:

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

答案 2 :(得分:0)

该问题尚未完全解决。

我在WAS 6.0上使用RSA 7,IBM JSF - Base Faces Support 7.0和Enhanced Faces Components 7.0 javax.faces.STATE_SAVING_METHOD默认为'server'。

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