我正在创建一个简单的JSF应用程序,它只有一个JSP页面(1个下拉列表,1个数据表&1 .提交按钮)。
当我从下拉列表中选择值时,我用数组列表填充表来显示表数据。这个表是可编辑的。现在,当我点击提交,我需要得到整个表到一个列表。为此,我使用了datatable的绑定属性。但是问题是getValue返回null。
请帮我解决这个问题,我已经浪费了很多时间。class UserBean {
.....
private HtmlDataTable _dataTable;
public void setDataTable(HtmlDataTable dataTable)
{
this._dataTable = dataTable;
}
public HtmlDataTable getDataTable()
{
return _dataTable;
}
...................
public String submit() {
List<User> userDetails = (ArrayList<User>)((HtmlDataTable)getDataTable()).getValue();
System.out.println(userDetails);
return "";
}
}
//JSP页面
<h:dataTable id="erdatatable"
var="row" value="#{UserBean.userDetails}"
binding="#{UserBean.dataTable}">
....
</h:dataTable>
<h:commandButton value="Submit" action="#{UserBean.submit}"></h:commandButton>
//faces.config <managed-bean>
<managed-bean-name>UserBean</managed-bean-name>
<managed-bean-class>com.datatable.UserBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
//web . xml
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
您可以尝试将managed-bean作用域更改为session。当调用操作(下拉选择)并填充数据表时,UserBean类的请求范围结束。当您再次按下提交按钮时,将创建UserBean的一个新实例。
-
如果您只需要表中的数据,则根本不需要(也可能不应该)绑定它。您的
userDetails
将包含用户编辑的所有数据,而无需任何额外的工作。 -
如果你使用会话范围,你会有bug,只要有人打开你的应用程序在两个选项卡中,从下拉菜单中选择一些东西,然后按下第二个按钮。一个常见的解决方案是使用视图作用域(它不能很好地与绑定一起工作,但是-正如我所说-你根本不应该使用它)