2013-08-27 46 views
0

我想使用sql查詢從數據庫中提取值來填充selectOneMenu組件。 查詢僅返回,我想進入的值selectOneMenu用於來自sql查詢的JSF selectItems值

我得到java.lang.IllegalArgumentException異常與堆棧開始商店名稱:

java.lang.IllegalArgumentException at   com.sun.faces.renderkit.SelectItemsIterator.initializeItems(SelectItemsIterator.java:216) 
at com.sun.faces.renderkit.SelectItemsIterator.hasNext(SelectItemsIterator.java:135) 
at com.sun.faces.renderkit.html_basic.MenuRenderer.renderOptions(MenuRenderer.java:762) 

這是我的XHTML代碼(這是唯一使用的selectItems的):

<h:selectOneMenu id="storeName" value="#{shoplist.store}"> 
    <f:selectItems value="#{buyHistory.stores}" /> 
</h:selectOneMenu> 

這是buyHistory豆查詢:

public ResultSet getStores() throws SQLException { 
... 
PreparedStatement getStores = connection.prepareStatement( 
       "SELECT distinct STORE_NAME " 
       + "FROM BuyingHistory ORDER BY STORE_NAME"); 
CachedRowSet rowSet = new com.sun.rowset.CachedRowSetImpl(); 
rowSet.populate(getStores.executeQuery()); 
return rowSet; 
} 

我在做什麼錯?我應該以某種方式從resultSet轉換爲SelectItem數組/列表?

回答

1

我應該以某種方式從resultSet轉換爲SelectItem數組/列表嗎?

是的,這是解決方案之一。另見our h:selectOneMenu wiki page。當值不是SelectItem或數組,或IterableMap的實例時,將會拋出IllegalArgumentException

最終,您的JSF支持bean應完全沒有java(x).sql依賴關係。即您的JSF代碼中應該沒有單一行import java(x).sql.Something;。否則,無論如何這是一個糟糕的設計(緊密耦合)。學習如何創建適當的DAO類。

+0

謝謝!什麼是一個好的設計?可以創建單獨的類來執行SQL查詢,並讓JSF託管的bean調用它們的方法嗎?這些查詢的位置應該放在什麼類型的類中?另外,將所有查詢放在同一個數據庫中是否是一個好的設計? – qwerty

+0

如果您仍在使用「純JDBC」進行設計,本文可能對設計「DAO層」有所幫助:http://balusc.blogspot.com/2008/07/dao-tutorial-data-layer.html但最終,你應該真的開始看JPA和EJB。另見http://stackoverflow.com/questions/13011392/jsf-service-layer – BalusC

1

爲什麼你認爲JSF會知道如何從持久層轉換ResultSet? JSF是一個表現層框架:)

是的,你需要將其轉換爲一個SelectItem名錄如下:

private List<SelectItem> transformToSelectItems(ResultSet resultSet) { 
    List<SelectItem> selectItems = new ArrayList<SelectItem>(); 

    while(resultSet.next()) { 
     String storeName = resultSet.getString("STORE_NAME"); 
     SelectItem item = new SelectItem(storeName, storeName); 
     selectItems.add(item); 
    } 

    return selectItems; 
} 

一定要注意BalusC的答案。這只是一個如何構建動態SelectItem-List的例子。但是你應該在你的JSF-ManagedBeans中定義沒有ResultSet。