1. Using @Unwrap with method returning object - method doesn't have to be getter:
@Name("search") public class SearchAction { // can't be used with @Out @Unwrap public Map<String,Integer> initList() { System.out.println("In-method initList"); Map<String,Integer> list = new TreeMap<String,Integer>(); list.put("one", 1); list.put("two", 2); list.put("three", 3); return list; } }
to use this component on the page you need to call it search:
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:s="http://jboss.com/products/seam/taglib" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:rich="http://richfaces.org/rich" template="layout/template.xhtml"> <ui:define name="body"> <h:form id="search" styleClass="edit"> <h:selectOneMenu> <s:selectItems value="#{search}"/> </h:selectOneMenu> </h:form> </ui:define> </ui:composition>
2. Using @Factory with method returning void - method doesn't have to be getter and @Out must be used to outject object to page:
@Name("search") public class SearchAction { // use with @Out because creation method is returning void @Out private Map<String,Integer> list; @Factory("list") public void initList() { System.out.println("In-method initList"); list = new TreeMap<String,Integer>(); list.put("one", 1); list.put("two", 2); list.put("three", 3); list.put("six", 6); } }
to use this component on the page you need to call it list:
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:s="http://jboss.com/products/seam/taglib" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:rich="http://richfaces.org/rich" template="layout/template.xhtml"> <ui:define name="body"> <h:form id="search" styleClass="edit"> <h:selectOneMenu> <s:selectItems value="#{list}"/> </h:selectOneMenu> </h:form> </ui:define> </ui:composition>
3. Using @Factory with method returning object - method mut be getter, @Out is not needed
@Name("search") public class SearchAction { // without @Out annotation @Factory("list") public Map<String,Integer> getList() { System.out.println("In-method initList"); Map<String,Integer> list = new TreeMap<String,Integer>(); list.put("one", 1); list.put("two", 2); list.put("three", 3); return list; } }
component usage is like in example (2.)
Additionally class used in all these examples doesn't have to be EJB bean - they only have to be Seam component (marked by @Name annotation).
Each of these method is different - details can be found in http://chiralsoftware.com/jboss-seam-book/unwrap.seam as previously mentioned Thiago Rocha (thanks).