2011-05-09 73 views
0

我無法使用h:dataTable獲取表值。h:dataTable實現中的問題

請回復?

Bean類: -

public class Employee implements Serializable{ 
     private int eId; 
     private String eName; 
     private ResultSet viewEmployee; 
    public Connection getVConnection() throws Exception{ 
      String driver = "oracle.jdbc.driver.OracleDriver"; 
      String url = "jdbc:oracle:thin:@localhost:1521:globldb3"; 
      String username = "scott"; 
      String password = "tiger"; 
      Class.forName(driver); 
      Connection conn = DriverManager.getConnection(url, username, password); 
      return conn; 
      } 

public ResultSet getViewEmployee() throws Exception{ 
      Connection conn = null; 
      PreparedStatement pstmt = null; 
      try { 
       conn = getVConnection(); 
       String query = "select * from employee where e_id>?"; 
       pstmt = conn.prepareStatement(query); // create a statement 
       pstmt.setInt(1,this.eId); // set input parameter 
       result = pstmt.executeQuery(); 
       return result; 
      }finally { 
       try { 
       result.close(); 
       pstmt.close(); 
       conn.close(); 
       } catch (Exception e) { 
       e.printStackTrace(); 
       } 
      } 
     } 
    public String v2(){ 
     try{ 
      getViewEmployee(); 
      return "view-employee-p.xhtml"; 
     }catch(Exception e){ 
      e.printStackTrace(); 
      return "home.xhtml"; 
     } 
    } 

JSF頁面1: -

<h:panelGrid columns="3" cellpadding="2" border="2" styleClass="panelGridColums">   Id 
<h:inputText id="id" label="&#160;" value="#{employee.eId}" 
    required="true" requiredMessage="Field cannot be left blank" 
    converterMessage="Not a valid id, id must be betwenn 1 and 9999." maxlength="4"> 
    <f:convertNumber/>  
</h:inputText>  
<h:message for="id" styleClass="errorMessages" showDetail="false" showSummary="true"/> 
</h:panelGrid> 
<h:commandButton value="View" action="view-page.xhtml"/> 

視圖page.xhtml:

 <h:dataTable value="#{employee.viewEmployee}" var="e"> 
<h:column> 
    <f:facet name="header">Employee id</f:facet> 
    #{e.E_ID}; 
</h:column> 

<h:column> 
    <f:facet name="header">Employee id</f:facet> 
    #{e.E_Name}; 
</h:column> 
</h:dataTable> 

在此先感謝。

+0

你可以停止在標題中放置「一個非常小的問題」或類似的東西嗎?它並沒有給出一見到具體問題的清晰畫面。我已經將它們編輯了幾次。請自己拿出一個明確的標題,用一句話總結具體問題,然後點擊「編輯」鏈接。 – BalusC 2011-05-09 00:57:05

+0

@BalusC:好的,謝謝你的建議。 – Adnan 2011-05-09 01:05:02

回答

1

您需要提供正常獲取和設置方法。 EL不會按字段訪問屬性,只能由getter訪問它們,並僅由setter對它們進行變異。如果你懶得打字,你甚至可以讓你的IDE(例如Eclipse/Netbeans/IntelliJ)自動生成它們。

public class Employee { 

    private Integer id; 
    private String name; 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

隨着

<h:inputText value="#{employee.id}" /> 

<h:dataTable value="#{bean.employees}" var="employee"> 
    <h:column>#{employee.id}</h:column> 
    <h:column>#{employee.name}</h:column> 
</h:dataTable> 

請注意,它是區分大小寫和應遵循的規則Javabeans spec#{employee.id}預計採用public Object getId()方法(其中Object是您希望的任何類型)。在你的例子中,你有#{employee.eId},它不可能是有效的。如果標識符public Object getEId()的前兩個字符是大寫字母,則應通過#{employee.EId}訪問它。但畢竟,使用匈牙利或前綴符號是沒有意義的。剛剛擺脫e前綴。它使代碼更加自我記錄。

不要忘記改變你的JDBC代碼相應

preparedStatement.setInt(1, employee.getId()); 

Employee employee = new Employee(); 
employee.setId(resultSet.getInt("id")); 
employee.setName(resultSet.getString("name")); 

注意身邊路過ResultSet作爲方法的返回值是一個壞主意。一旦你在返回之前關閉它,你不能再從它那裏獲取值。而當你不關閉它,那麼你正在泄漏資源。您需要在與您打開並關閉它相同的方法塊內處理它。在上面的例子中,只要做return employee;

要了解如何開始使用基本DAO,請選擇this article

+0

謝謝。你能否給我一些關於實現列表方法的提示,在你的答案中提到。 – Adnan 2011-05-09 01:18:01

+0

只要讓它返回列表。在構造函數或postconstruct中執行預加載作業。 – BalusC 2011-05-09 11:16:57