2013-04-11 91 views
0

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

当我从下拉列表中选择值时,我使用arraylist填充表格以显示表格数据。该表是可编辑的。现在当我点击提交时,我需要将整个表格放入列表中。为此,我使用了datatable的binding属性。但问题是null从getValue返回。

请帮我解决这个问题,因为我浪费了很多时间。

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> 

回答

0

你可以尝试改变托管bean-范围到会话。当调用操作(下拉选择)并填充数据表时,UserBean类的请求范围结束。当你再次按下提交按钮时,会创建一个新的UserBean实例。

+0

非常感谢...它得到解决..谢谢非常多:) – Soheb 2013-04-11 08:30:44

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

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

+0

嗨, 根据你的观点2我面临的问题,你告诉。 我正在使用JSF 1.2是否有任何其他解决方案可以解决此问题。 – Soheb 2013-04-13 02:51:12