我将(UIInput)添加到动态创建的数据表(UIData)的页脚列(UIColumn)中。 UIData绑定到jsp中的数据表标记。 在数据表中,我只有页眉和页脚,页眉的标签和页脚在可编辑的文本框中具有相应的值。 当我更改值并使用commandButton提交表单时,我尝试使用action方法中的.getValue()来访问UIInput值,我只是获取旧值而不是页面中更新的值。 我尝试将它绑定到辅助bean中的属性,并检查在setter中设置的值。我注意到正在设置旧值,并且我在页面中更新的值不会反映在action方法或setter中。 我尝试使用.getValue,.getLocalValue,.getSubmittedValue。这些都没有给我新的价值。 有什么建议我可能会做什么?
我设法通过从requestParameterMap中提取值来解决方法。 如果有问题的解决方案,请告诉我。 麦克道威尔 - 感谢您的投入。
答案 0 :(得分:1)
我尝试在Tomcat上的MyFaces 1.2.3下运行your demo code代码,在Glassfish上运行Mojarra 2.0.0 Beta,但无法重现问题 - save()方法打印了我输入的值进入田野。
(要使用MyFaces,我必须将 new UIData()更改为 new HtmlDataTable(),这可能是由于它们如何实现表格渲染器,但这是一个微小的变化。)
我会注意到关于bean的一些事情:
您可能希望将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。似乎不一致。