0

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

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

2 回答 2

0

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

于 2013-04-11T08:17:58.597 回答
0
  1. 如果您只需要表中的数据,则根本不需要(并且可能不应该)绑定它。您userDetails将包含用户编辑的所有数据,无需任何额外工作。

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

于 2013-04-11T08:52:32.727 回答