来自sql查询的JSF selectItems值

时间:2013-08-27 12:18:08

标签: sql jsf

我想用sql查询从数据库中提取的值填充selectOneMenu组件。 查询仅返回我要作为值输入的商店名称selectOneMenu

我得到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 bean的查询:

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数组/列表吗?

2 个答案:

答案 0 :(得分:1)

  

我应该以某种方式从resultSet转换为SelectItem数组/列表吗?

是的,这是解决方案之一。另见our h:selectOneMenu wiki page。如果值不是IllegalArgumentException或数组,SelectItemIterable的实例,则会引发Map

最终,您的JSF支持bean应该完全没有java(x).sql依赖项。即你的JSF代码中不应该只有一行import java(x).sql.Something;。否则,无论如何都是糟糕的设计(紧耦合)。了解如何创建适当的DAO类。

答案 1 :(得分:1)

为什么你认为JSF会知道如何从持久层转换ResultSet? JSF是一个表示层框架:)

是的,您需要将其转换为SelectItem-List,如下所示:

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。