2012-03-30 27 views
6

Tôi có bảng JSF này. Tôi muốn thêm số hàng.Làm thế nào để hiển thị số hàng trong bảng JSF?

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     > 
    <h:head> 
     <h:outputStylesheet library="css" name="table-style.css" /> 
    </h:head> 
    <h:body> 

     <h1>JSF 2 dataTable example</h1> 
     <h:form> 
      <h:dataTable value="#{order.orderList}" var="o" 
       styleClass="order-table" 
       headerClass="order-table-header" 
       rowClasses="order-table-odd-row,order-table-even-row" 
      > 
         <h:column> 

        <f:facet name="header">No</f:facet> 

        <h:inputText value="#{order.orderList.rowIndex + 1}" size="10" rendered="false" /> 

        <h:outputText value="#{order.orderList.rowIndex + 1}" rendered="#{not order.orderList.rowIndex + 1}" /> 

       </h:column> 
       <h:column> 

        <f:facet name="header">Order No</f:facet> 

        <h:inputText value="#{o.orderNo}" size="10" rendered="#{o.editable}" /> 

        <h:outputText value="#{o.orderNo}" rendered="#{not o.editable}" /> 

       </h:column> 

       <h:column> 

        <f:facet name="header">Product Name</f:facet> 

        <h:inputText value="#{o.productName}" size="20" rendered="#{o.editable}" /> 

        <h:outputText value="#{o.productName}" rendered="#{not o.editable}" /> 

       </h:column> 

       <h:column> 

        <f:facet name="header">Price</f:facet> 

        <h:inputText value="#{o.price}" size="10" rendered="#{o.editable}" /> 

        <h:outputText value="#{o.price}" rendered="#{not o.editable}" /> 

       </h:column> 

       <h:column> 

        <f:facet name="header">Quantity</f:facet> 

        <h:inputText value="#{o.qty}" size="5" rendered="#{o.editable}" /> 

        <h:outputText value="#{o.qty}" rendered="#{not o.editable}" /> 

       </h:column> 

       <h:column> 

        <f:facet name="header">Action</f:facet> 

        <h:commandLink value="Edit" action="#{order.editAction(o)}" rendered="#{not o.editable}" /> 

       </h:column> 

      </h:dataTable> 

      <h:commandButton value="Save Changes" action="#{order.saveAction}" /> 

     </h:form> 
    </h:body> 

</html> 


package com.mkyong; 

import java.io.Serializable; 
import java.math.BigDecimal; 
import java.util.ArrayList; 
import java.util.Arrays; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 

@ManagedBean(name="order") 
@SessionScoped 
public class OrderBean implements Serializable{ 

    private static final long serialVersionUID = 1L; 

    private static final ArrayList<Order> orderList = 
     new ArrayList<Order>(Arrays.asList(

     new Order("A0001", "Intel CPU", 
       new BigDecimal("700.00"), 1), 
     new Order("A0002", "Harddisk 10TB", 
       new BigDecimal("500.00"), 2), 
     new Order("A0003", "Dell Laptop", 
       new BigDecimal("11600.00"), 8), 
     new Order("A0004", "Samsung LCD", 
       new BigDecimal("5200.00"), 3), 
     new Order("A0005", "A4Tech Mouse", 
       new BigDecimal("100.00"), 10) 
    )); 

    public ArrayList<Order> getOrderList() { 

     return orderList; 

    } 

    public String saveAction() { 

     //get all existing value but set "editable" to false 
     for (Order order : orderList){ 
      order.setEditable(false); 
     } 

     //return to current page 
     return null; 

    } 

    public String editAction(Order order) { 

     order.setEditable(true); 
     return null; 
    } 

    public static class Order{ 

     String orderNo; 
     String productName; 
     BigDecimal price; 
     int qty; 
     boolean editable; 

     public Order(String orderNo, String productName, BigDecimal price, int qty) { 
      this.orderNo = orderNo; 
      this.productName = productName; 
      this.price = price; 
      this.qty = qty; 
     } 

     public boolean isEditable() { 
      return editable; 
     } 
     public void setEditable(boolean editable) { 
      this.editable = editable; 
     } 
     public String getOrderNo() { 
      return orderNo; 
     } 
     public void setOrderNo(String orderNo) { 
      this.orderNo = orderNo; 
     } 
     public String getProductName() { 
      return productName; 
     } 
     public void setProductName(String productName) { 
      this.productName = productName; 
     } 
     public BigDecimal getPrice() { 
      return price; 
     } 
     public void setPrice(BigDecimal price) { 
      this.price = price; 
     } 
     public int getQty() { 
      return qty; 
     } 
     public void setQty(int qty) { 
      this.qty = qty; 
     } 
    } 
} 

Tôi đã thêm #{order.orderList.rowIndex + 1} để đếm số hàng và hiển thị số. Nhưng khi tôi chạy trang JSF, tôi nhận được lỗi này:

java.lang.NumberFormatException: For input string: "rowIndex" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:481) 
    at java.lang.Integer.parseInt(Integer.java:514) 
    at javax.el.ListELResolver.toInteger(ListELResolver.java:409) 
    at javax.el.ListELResolver.getValue(ListELResolver.java:202) 
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) 
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) 
    at com.sun.el.parser.AstValue.getValue(AstValue.java:138) 
    at com.sun.el.parser.AstValue.getValue(AstValue.java:183) 
    at com.sun.el.parser.AstNot.getValue(AstNot.java:63) 
    at com.sun.el.parser.AstPlus.getValue(AstPlus.java:59) 
    at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:224) 
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109) 
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) 
    at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:413) 
    at javax.faces.component.UIData.iterate(UIData.java:1993) 
    at javax.faces.component.UIData.processDecodes(UIData.java:1161) 
    at javax.faces.component.UIForm.processDecodes(UIForm.java:225) 
    at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176) 
    at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176) 
    at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:933) 
    at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
    at java.lang.Thread.run(Thread.java:679) 

Tôi nghĩ rằng không tìm thấy rowIndex. Làm thế nào tôi có thể sửa lỗi này?

Trân

Trả lời

14

Các rowIndex là một tài sản của <h:dataTable> thành phần chính nó, không có giá trị java.util.List của nó.

<h:dataTable binding="#{table}" ...> 
    <h:column>#{table.rowIndex + 1}</h:column> 
    ... 
</h:dataTable> 

Trường hợp ngoại lệ mà bạn có được về cơ bản nói rằng bạn đang cố gắng truy cập vào một mục List bởi một chỉ số chuỗi như vậy orderList.get("rowIndex"), đây là không hợp lệ. Cách hợp lệ duy nhất để truy cập một mục danh sách là sử dụng ký hiệu cú đúp như vậy #{order.orderList[0]} để giải quyết thành orderList.get(0), nhưng sau cùng thì đây không phải là điều bạn cần.

Cách khác là quấn orderList vào thuộc tính DataModel và cung cấp giá trị đó thay thế, ví dụ:

<h:dataTable value="#{order.orderModel}" ...> 
    <h:column>#{order.orderModel.rowIndex + 1}</h:column> 
    ... 
</h:dataTable> 

với

private transient DataModel orderModel; 

public DataModel getOrderModel() { 
    if (orderModel == null) { 
     orderModel = new ListDataModel(orderList); 
    } 
    return orderModel; 
} 

Nó sẽ được hiển thị chỉ ra. Sẽ không có ý nghĩa khi hiển thị nó trong một thành phần đầu vào vì không thể đặt một tổng làm một biểu thức giá trị duy nhất. Cũng sử dụng nó trong thuộc tính rendered theo cách bạn đã làm không hợp lệ vì nó không trả về boolean, nhưng dài.

+0

bạn có biết ví dụ tốt hơn của DataTable. Một trong những mà tôi có không phải là rất tốt và tôi thấy điều này: http://balusc.blogspot.com/2006/06/using-datatables.html Nó chỉ là những gì tôi cần nhưng nó cho JSF 1.2. Có một phiên bản hiện đại? –

+1

Đọc phần "thông báo" ở trên cùng. – BalusC

+0

Có Tôi đã mở ví dụ cho JSF 2.0 nhưng tôi gặp lỗi khi tôi nhập mã vào Netbeans tại dòng này: private Item item = new Item(); Có mã nguồn hoàn chỉnh của ví dụ không? –

4

lựa chọn khác là sử dụng phương pháp indexOf()List 's:

<h:outputText value="#{order.orderList.indexOf(o) + 1}"/> 
+1

Lưu ý rằng điều này đòi hỏi EL 2.2. Hơn nữa, việc tra cứu chỉ mục riêng của mục trong danh sách cha mẹ mỗi khi làm chậm hiệu suất hiển thị trong trường hợp các danh sách lớn và các đối tượng phức tạp. – BalusC

Các vấn đề liên quan