How to use JSF h:selectOneMenu with a custom converter. Full example included.
=========================================================
XHTML page:
==========================================================
Converter:
=========================================================
Managed Bean:
=========================================================
Domain Object (POJO):
=========================================================
References:
http://javaserverfaces-spec-public.java.net/nonav/snapshots/jsf-spec-2.0-20090304/javadocs/javax/faces/model/SelectItem.html
http://www.crazysquirrel.com/computing/java/jsf/converters.jspx
http://balusc.blogspot.com/2007/09/objects-in-hselectonemenu.html
=========================================================
XHTML page:
<h:selectOneMenu converter="fooConverter" value="#{managedBean.boo.foo}"> <f:selectItems value="#{managedBean.fooItems}" var="item" itemLabel="#{item.getLabel()}" itemValue="#{item.getValue().getId()}" /> </h:selectOneMenu>
==========================================================
Converter:
@FacesConverter( value="fooConverter" ) public class FooConverter implements Converter { public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) { if (submittedValue.trim().equals("")) { return null; } else { try { Integer fooId = Integer.parseInt(submittedValue); Foo foo = /*use fooId to get foo from DAO or Service Layer*/; return foo; } catch(Exception e) { e.printStackTrace(); throw new ConverterException(new FacesMessage( FacesMessage.SEVERITY_ERROR, "Conversion Error - Not a valid Foo", e.getMessage())); } } } public String getAsString(FacesContext facesContext, UIComponent component, Object value) { if (value == null) return null; else return ""+((Foo)value).getId(); } }
=========================================================
Managed Bean:
//annotations public class ManagedBean implements Serializable { public ListgetFoos() { List selectItems = new ArrayList (); for(Foo foo: findAllFoos() /*get all foos from DAO or Service Layer*/ ) { selectItems.add(new SelectItem(foo, foo.getName())); } return selectItems; } }
=========================================================
Domain Object (POJO):
class Boo { private Foo foo; //constructor.. /getters/setters... } class Foo { private Integer id; private String name; //constructor... //getters/setters... }
=========================================================
References:
http://javaserverfaces-spec-public.java.net/nonav/snapshots/jsf-spec-2.0-20090304/javadocs/javax/faces/model/SelectItem.html
http://www.crazysquirrel.com/computing/java/jsf/converters.jspx
http://balusc.blogspot.com/2007/09/objects-in-hselectonemenu.html
No comments:
Post a Comment