My application object is a collection of name objects. The name objects look something like this:
public class MyName { private String name; public MyName(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean equals(Object obj) { if (null == obj) { return true; } if ((obj == null) || (getClass() != obj.getClass())) { return false; } MyName other = (MyName) obj; return new EqualsBuilder().append(this.name, other.name).isEquals(); } public int hashCode() { return new HashCodeBuilder(3, 13).append(this.name).toHashCode(); } public String toString() { return name; } }Note that I've implemented toString as well as the equals and hashCode methods. The builder classes are provided by Apache Commons Lang; I've blogged about them here.
The collection object uses the Java List to wrap the name objects:
public class MyNameList { private List<MyName> names = new ArrayList<MyName>(); public MyNameList (List<MyName> names) { setNames(names); } public static MyNameList getInstance(String csv) { if (csv == null) { return new MyNameList(); } String[] names = csv.split(","); List<MyName> nameList = new ArrayList(); for (String name : names) { nameList.add(new MyName(name)); } return new MyNameList(nameList ); } public List<MyName> getNames() { return names; } public void setNames(List<MyName> names) { this.names = names; } public String toString() { StringBuffer sb = new StringBuffer(); String comma = ""; for (MyName name: names) { sb.append(comma).append(name); comma = ","; } return sb.toString(); } }Here's what the JSF converter implementation might look like - there's not much there, as planned:
public class MyNameListConverter implements Converter { public Object getAsObject(FacesContext context, UIComponent component, String newValue) throws ConverterException { return MyNameList.getInstance(newValue); } public String getAsString(FacesContext context, UIComponent component, Object value) throws ConverterException { return value == null? "" : value.toString(); } }I must register the converter with JSF:
<converter> <description> Converter for CSV list of name values </description> <converter-id>MyNameListConverter</converter-id> <converter-class> com.mybiz.MyNameListConverter </converter-class> </converter>Finally I reference the converter in my JSF page:
<ice:inputText id="nameValues" partialSubmit="true" converter="MyNameListConverter" value="#{bean.nameList}"/>
Lots of moving parts are needed when working with JSF. But, the more I can encapsulate, the less it will cost to migrate to a different web framework down the road.
No comments:
Post a Comment