数据表页脚中的JSF UIInput
我正在向动态创建的datatable(UIData)的页脚列(UIColumn)添加(UIInput)。UIData绑定到jsp中的datatable标记。 在datatable中,我只有页眉和页脚,页眉有标签,页脚有可编辑文本框中的相应值。 当我使用commandButton更改值并提交表单,并尝试使用action方法中的.getValue()访问UIInput值时,我只获取旧值,而不是页面中更新的值。 我尝试将其绑定到支持bean中的属性,并检查setter中设置的值。我注意到正在设置旧的值,而我在页面中更新的值没有反映在action方法或setter中。 我尝试使用.getValue、.getLocalValue、.getSubmittedValue。这些都没有给我新的价值观。 有什么建议我可能在做什么吗数据表页脚中的JSF UIInput,jsf,datatable,textinput,Jsf,Datatable,Textinput,我正在向动态创建的datatable(UIData)的页脚列(UIColumn)添加(UIInput)。UIData绑定到jsp中的datatable标记。 在datatable中,我只有页眉和页脚,页眉有标签,页脚有可编辑文本框中的相应值。 当我使用commandButton更改值并提交表单,并尝试使用action方法中的.getValue()访问UIInput值时,我只获取旧值,而不是页面中更新的值。 我尝试将其绑定到支持bean中的属性,并检查setter中设置的值。我注意到正在设置旧的值
通过从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来重现问题吗?这将有助于缩小问题的范围。