2013-08-27 40 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。