Object in SelectItem
Hi!
I'm trying to use a SelectOneMenu component, but i have some problems. I want to populate the SelectOneMenu with a List of SelectItems. When i read the specification on the SelectItem it says that i can put in an object and a String as parameters. I have a Category object which i want to put in the SelectItem object. But it looks like it's not possible.
I want the selected item in the SelectOneMenu component to be accessed in the backing bean this way:
SelectItem si;
Category c=(Category)si.getValue();
Is that possible? If not, could anyone please tell me how it's done?
[620 byte] By [
Ibbernika] at [2007-11-27 4:55:15]

# 1
The h:selectOneMenu works as follows:
JSF<h:form>
<h:selectOneMenu value="#{myBean.selectedItem}">
<f:selectItems value="#{myBean.selectItems}" />
</h:selectOneMenu>
<h:commandButton value="submit" action="#{myBean.action}" />
</h:form>
MyBeanprivate T selectedItem; // + getter + setter
private List<SelectItem> selectItems; // + getter
public void action() {
System.out.println(selectedItem); // The selected item is just filled by the JSF lifecycle.
}
public List<SelectItem> getSelectItems() {
if (selectItems == null) { // Do your preloading thing.
selectItems = new ArrayList<SelectItem>();
selectItems.add(new SelectItem(t1, "label1");
selectItems.add(new SelectItem(t2, "label2");
selectItems.add(new SelectItem(t3, "label3");
}
return selectItems;
}
Where the t1, t2, t3 are instances of the same object type T (in your case, the Category). If this object type has a human readable #toString() implementation which can represent the label, then you can leave the 2nd parameter of SelectItem away.
# 4
Hmmm. I still can't get it to work. My code looks like:
Snippet from my jsf page:
<h:panelGrid columns="6">
<h:outputText value="#{msg.name}"/><h:inputText value="#{adminkategoribean.navn}"/>
<h:outputText value="#{msg.ocategory}"/>
<h:selectOneMenu value="#{adminkategoribean.tilfojItem}">
<f:selectItems value="#{adminkategoribean.list}" />
</h:selectOneMenu>
<h:commandButton actionListener="#{adminkategoribean.tilfoj}" value="#{msg.add}"/>
<h:outputText value="#{adminkategoribean.error1}" />
</h:panelGrid>
Snippet from my backing bean:
private List<SelectItem> list;
private Kategori tilfojItem;
private Kategori redigerItem;
private Kategori sletItem;
private Funktionalitet fkt;
public AdminKategoriBean(){
fkt=new Funktionalitet();
List l=fkt.fyldListe();
list= new ArrayList<SelectItem>();
for(int i=0;i<l.size();i++){
Kategori k=(Kategori)l.get(i);
list.add(new SelectItem(k,k.getKategorinavn()));
}
}
The fkt attribute is referenceing a domain layer class.
The method fkt.fyldListe() fill in Kategori objects from the database via hibernate.
There are getters and setters for all the attributes except the fkt attribute!
I get the following exception when i try to load the page:
java.lang.IllegalArgumentException: Value is no String (class=dk.butikmarian.model.Kategori, value=noget) and component _idJsp0:_idJsp6with path: {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /adminKategori.jsp][Class: javax.faces.component.html.HtmlForm,Id: _idJsp0][Class: javax.faces.component.html.HtmlPanelGrid,Id: _idJsp2][Class: javax.faces.component.html.HtmlSelectOneMenu,Id: _idJsp6]} does not have a Converter
org.apache.myfaces.shared_impl.renderkit.RendererUtils.getConvertedStringValue(RendererUtils.java:536)
org.apache.myfaces.shared_impl.renderkit.RendererUtils.getConvertedStringValue(RendererUtils.java:555)
org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.renderSelectOptions(HtmlRendererUtils.java:398)
org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.internalRenderSelect(HtmlRendererUtils.java:298)
org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.renderMenu(HtmlRendererUtils.java:252)
org.apache.myfaces.shared_impl.renderkit.html.HtmlMenuRendererBase.encodeEnd(HtmlMenuRendererBase.java:54)
javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:536)
org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChild(RendererUtils.java:442)
org.apache.myfaces.shared_impl.renderkit.html.HtmlGridRendererBase.renderChildren(HtmlGridRendererBase.java:216)
org.apache.myfaces.shared_impl.renderkit.html.HtmlGridRendererBase.encodeEnd(HtmlGridRendererBase.java:98)
javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:536)
javax.faces.webapp.UIComponentTag.encodeEnd(UIComponentTag.java:495)
javax.faces.webapp.UIComponentTag.doEndTag(UIComponentTag.java:363)
org.apache.myfaces.shared_impl.taglib.UIComponentBodyTagBase.doEndTag(UIComponentBodyTagBase.java:54)
org.apache.jsp.adminKategori_jsp._jspx_meth_h_005fpanelGrid_005f0(adminKategori_jsp.java:275)
org.apache.jsp.adminKategori_jsp._jspx_meth_h_005fform_005f0(adminKategori_jsp.java:174)
org.apache.jsp.adminKategori_jsp._jspx_meth_f_005fview_005f0(adminKategori_jsp.java:138)
org.apache.jsp.adminKategori_jsp._jspService(adminKategori_jsp.java:86)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:416)
org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:234)
org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:384)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:138)
org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:691)
org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:661)
org.apache.jsp.index_jsp._jspService(index_jsp.java:46)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
thanks for your help>