как заполнить h: selectOneMenu из таблицы базы данных в jsf?

у меня есть таблица категорий

 categoryId
 catName
 description
 image 

Я хочу заполнить <h:selectOneMenu> itemLabel categoryName, а его значение — categoryId.

Это должно быть сделано с помощью ManagedBean как я могу это сделать ??


person Hirren Gamit    schedule 14.12.2012    source источник
comment
Наведите указатель мыши на тег [selectonemenu], который вы (правильно!) разместили на вопросе, пока не появится черное информационное окно, а затем нажмите в нем ссылку info.   -  person BalusC    schedule 14.12.2012


Ответы (4)


вы можете использовать список SelectItem для этого. вам понадобится метод, который генерирует список элементов выбора, подобных следующему, в управляемом компоненте,

public List<SelectItem> getAllCatagories(){

   List<SelectItem> items = new ArrayList<SelectItem>();
   List<Category> categoryList = dao.getAllCategory();
    for(Category category: categotyList){
       items.add(new SelectItem(category.getCategoryId(), category.getName()));
   }
   return items;
}

и использовать его так

<h:selectOneMenu value="#{controllerBean.selectedCategory}" >
            <f:selectItems value="#{controllerBean.allCategories}"/>
</h:selectOneMenu>
person nayef    schedule 21.12.2012
comment
тогда где вы предполагаете, что я должен был это сделать? в другом методе? а затем вызвать это внутри геттера? - person nayef; 23.12.2012
comment
Просто в конструкторе бина (пост). См. также ссылку за комментарием. - person BalusC; 23.12.2012
comment
спасибо это помогло. Что произойдет, если в рабочем процессе с диалоговой областью действия я сначала загружу список из базы данных, но во время рабочего процесса в базу данных будут вставлены новые строки? список не будет обновляться, так как будет использоваться первоначальный список. тогда как если бы я загружал его каждый раз, когда вызывается геттер, этой проблемы не возникнет. ваш ответ будет очень признателен @BalusC - person nayef; 24.12.2012
comment
^ У меня такая же проблема. Мои данные обновляются позже. - person Makky; 17.04.2013

Вы должны использовать тег f:selectItems:

<h:selectOneMenu value="#{yourBean.itemValue}">                     
    <f:selectItems value="#{yourBean.yourItems}" />
</h:selectOneMenu>

Затем YourBean должно иметь поле Map, хранящее значения, полученные из базы данных, где ключ карты (который я предлагаю использовать в качестве строки) является меткой, а значением является связанный объект.

Map<String,YourObject> yourItems = new HashMap<String,YourObject>();

public Map<String,YourObject> getYourItems() {
    return yourItems;
}
person Fritz    schedule 14.12.2012

попробуй что-нибудь вроде этого

xhtml

    <h:form>
        <h:panelGrid>
            <h:selectOneMenu value="#{myMB.id}">
                <f:selectItem itemLabel="Please select one" itemValue="#{null}" />
                <f:selectItems value="#{myMB.items}" />
            </h:selectOneMenu>
        </h:panelGrid>
        <h:commandButton action="#{myMB.go}" value="Go"/>
    </h:form>

mb

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;

@ManagedBean
@ViewScoped
public class MyMB implements Serializable{

    private static final long serialVersionUID = 1L;
    private List<SelectItem> items = new ArrayList <SelectItem> ();
    private Long id;

    @PostConstruct
    public void init(){
        SelectItem si = new SelectItem();
        si.setLabel("My Label");
        si.setValue(666L);

        items.add(si);
    }

    public List<SelectItem> getItems() {
        return items;
    }

    public void setItems(List<SelectItem> items) {
        this.items = items;
    }

    public Long getId() {
        return id;
    }

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

    public void go(){
        System.out.println(id);
    }
}
person Community    schedule 19.01.2014

Вы можете просто использовать цикл для получения данных из вашего списка следующим образом:

<h:outputText value="Role :" />
<p:selectOneMenu value="#{myBean.id_Role}">
    <c:forEach var="role" items="#{myBean.rolesList}">
        <f:selectItem itemLabel="${role.name_Role}" itemValue="${role.id_Role}" />
    </c:forEach>
</p:selectOneMenu>

И в вашем bean:

private List<Role> rolesList;
//And then fill the list from database 

В моем случае я использую hibernate для получения данных из базы данных, у меня это сработало.

Я надеюсь, что это полезно!

person cнŝdk    schedule 23.05.2014