JSF数据表绑定无法正常工作

时间:2013-04-11 08:03:17

标签: jsf binding datatable

我正在创建一个只有一个JSP页面的简单JSF应用程序(1个下拉列表,1个数据表和1个提交按钮)。

当我从下拉列表中选择值时,我使用arraylist填充表格以显示表格数据。该表是可编辑的。现在,当我点击提交时,我需要将整个表格放入列表中。为此,我使用了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>

2 个答案:

答案 0 :(得分:0)

您可以尝试将managed-bean-scope更改为session。当您调用操作(下拉选择)并填充数据表时,UserBean类的请求范围结束。再次按下提交按钮时,将创建一个新的UserBean实例。

答案 1 :(得分:0)

  1. 如果您只需要表中的数据,则根本不需要(也可能不需要)绑定它。您的userDetails将包含用户编辑的所有数据,无需任何额外工作。

  2. 如果您使用会话范围,只要有人在两个选项卡中打开您的应用程序,您就会遇到错误,从其中一个选项卡的下拉列表中选择一些内容,然后按下第二个选项卡上的按钮。一个常见的解决方案是使用视图范围(对于绑定不起作用,但是 - 正如我所说 - 你根本不应该使用它)