0

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


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

4

3 回答 3

1

我尝试在 Tomcat 上的 MyFaces 1.2.3 和Glassfish 上的Mojarra 2.0.0 Beta 下运行您的演示代码,但无法重现该问题 - save() 方法打印了我在字段中输入的值。

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

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

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

您可能希望将 getter 更改为以下内容:

private UIData headerDataTable;

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

不过,我不相信这些更改会解决您的问题 - 如果您仍然遇到问题,请再次尝试更多详细信息 - 您的 JSF 实现、版本和web.xml中javax.faces.STATE_SAVING_METHOD参数的值(如果有)。

于 2009-06-11T22:58:52.253 回答
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;
    }   
}
于 2009-06-11T17:49:10.143 回答
0

这个问题还没有完全解决。

我使用带有 IBM JSF 的 RSA 7 - WAS 6.0 上的 Base Faces Support 7.0 和 Enhanced Faces Components 7.0 javax.faces.STATE_SAVING_METHOD 默认为“服务器”。

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

于 2009-06-15T23:06:58.910 回答