Select jsf 数据表中的一行
Select a row in jsf datatable
这是我的 table:
<h:dataTable var="book" value="#{ordersBean.userOrders}"
binding="#{ordersBean.htmlDataTable}">
<h:column>
<f:facet name="header">order ID</f:facet>
<h:outputText value="#{book[0]}"/>
</h:column>
<h:column>
<f:facet name="header">Book Title</f:facet>
<h:outputText value="#{book[1]}"/>
</h:column>
<h:column>
<f:facet name="header">Cost</f:facet>
<h:outputText value="#{book[2]}"/>
</h:column>
<h:column>
<f:facet name="header">Remove Order</f:facet>
<h:commandButton action="#{ordersBean.deleteOrder}" image="resources/images/del.gif"/>
</h:column>
</h:dataTable>
我需要获取 Order ID
用户单击其 Remove Order
图标的那一行,然后从 DAO
中删除该订单。
这里是 deleteOrder()
:
@ManagedBean
@SessionScoped
public class OrdersBean {
private List<Book> userOrders = new ArrayList<Book>();
private HtmlDataTable htmlDataTable;
@Transactional
public void deleteOrder() {
Book selectedBook = (Book) htmlDataTable.getRowData(); // class cast exception (168)
}
//For populating table
@Transactional
public List<Book> userAllOrders() {
userOrders = bookDao.getTitleCostQty(String.valueOf(currentUser.getId())).list();
return userOrders;
}
public HtmlDataTable getHtmlDataTable() {
return htmlDataTable;
}
public void setHtmlDataTable(HtmlDataTable htmlDataTable) {
this.htmlDataTable = htmlDataTable;
}
//getter/setters
但是我得到这个错误:
javax.servlet.ServletException: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.obs.model.Book
javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
javax.faces.el.EvaluationException: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.obs.model.Book
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.obs.model.Book
com.obs.bean.OrdersBean.deleteOrder(OrdersBean.java:168)
value="#{ordersBean.userOrders}"
for h:dataTable
应该是 DataModel 类型,包括模型类型的 WrappedData 以避免转换异常。按如下操作:
private DataModel userOrders = new ListDataModel();
public DataModel getUserOrders() {
userOrders = new ListDataModel();
/* populate your list of Book in another list and setWrappedData for userOrders. */
List<Book> bookList = userAllOrders();
if (bookList != null && bookList.size() > 0){
userOrders.setWrappedData(bookList);
}
return bookList;
}
public void setUserOrders(DataModel userOrders) {
this.userOrders = userOrders;
}
现在,这里不会通过任何转换异常:
Book selectedBook = (Book) htmlDataTable.getRowData();
您使用 JSF 2.2 吗?也许它从 2.0 开始有效 ...
所以你可以在你的 commandButton 中传递实际的书:
<h:commandButton actionListener="#{ordersBean.deleteOrder(book)}" ... />
并在您的 bean 中接收所选书籍作为参数:
public void deleteOrder(Book selectedBook) {
// ...
}
这是我的 table:
<h:dataTable var="book" value="#{ordersBean.userOrders}"
binding="#{ordersBean.htmlDataTable}">
<h:column>
<f:facet name="header">order ID</f:facet>
<h:outputText value="#{book[0]}"/>
</h:column>
<h:column>
<f:facet name="header">Book Title</f:facet>
<h:outputText value="#{book[1]}"/>
</h:column>
<h:column>
<f:facet name="header">Cost</f:facet>
<h:outputText value="#{book[2]}"/>
</h:column>
<h:column>
<f:facet name="header">Remove Order</f:facet>
<h:commandButton action="#{ordersBean.deleteOrder}" image="resources/images/del.gif"/>
</h:column>
</h:dataTable>
我需要获取 Order ID
用户单击其 Remove Order
图标的那一行,然后从 DAO
中删除该订单。
这里是 deleteOrder()
:
@ManagedBean
@SessionScoped
public class OrdersBean {
private List<Book> userOrders = new ArrayList<Book>();
private HtmlDataTable htmlDataTable;
@Transactional
public void deleteOrder() {
Book selectedBook = (Book) htmlDataTable.getRowData(); // class cast exception (168)
}
//For populating table
@Transactional
public List<Book> userAllOrders() {
userOrders = bookDao.getTitleCostQty(String.valueOf(currentUser.getId())).list();
return userOrders;
}
public HtmlDataTable getHtmlDataTable() {
return htmlDataTable;
}
public void setHtmlDataTable(HtmlDataTable htmlDataTable) {
this.htmlDataTable = htmlDataTable;
}
//getter/setters
但是我得到这个错误:
javax.servlet.ServletException: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.obs.model.Book
javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
javax.faces.el.EvaluationException: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.obs.model.Book
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.obs.model.Book
com.obs.bean.OrdersBean.deleteOrder(OrdersBean.java:168)
value="#{ordersBean.userOrders}"
for h:dataTable
应该是 DataModel 类型,包括模型类型的 WrappedData 以避免转换异常。按如下操作:
private DataModel userOrders = new ListDataModel();
public DataModel getUserOrders() {
userOrders = new ListDataModel();
/* populate your list of Book in another list and setWrappedData for userOrders. */
List<Book> bookList = userAllOrders();
if (bookList != null && bookList.size() > 0){
userOrders.setWrappedData(bookList);
}
return bookList;
}
public void setUserOrders(DataModel userOrders) {
this.userOrders = userOrders;
}
现在,这里不会通过任何转换异常:
Book selectedBook = (Book) htmlDataTable.getRowData();
您使用 JSF 2.2 吗?也许它从 2.0 开始有效 ...
所以你可以在你的 commandButton 中传递实际的书:
<h:commandButton actionListener="#{ordersBean.deleteOrder(book)}" ... />
并在您的 bean 中接收所选书籍作为参数:
public void deleteOrder(Book selectedBook) {
// ...
}