Seam中使用selectItems and @Factory的三种方法

here are 3 possible examples how to initialize component:

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).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值