Posted on 2010-03-06 15:54
云自無(wú)心水自閑 閱讀(2255)
評(píng)論(0) 編輯 收藏 所屬分類:
Java 、
心得體會(huì) 、
Tapestry
在教程的第四部分(http://www.aygfsteel.com/usherlight/archive/2009/06/20/283396.html)我們已經(jīng)粗略地介紹了Tapestry的前綴,其中提及最常用的兩種literal和prop。這里順便再介紹一下其他的幾個(gè)前綴.
1、context,這個(gè)經(jīng)常在引用圖片的時(shí)候用到。比如:<img src="${context:images/icon.png}"/> 這樣就能夠在頁(yè)面上顯示在web-inf/images/icon.png
2、message,這個(gè)是需要I18N的應(yīng)用必用的前綴。${message:some-key}
3、var,用于定義生成一個(gè)臨時(shí)變量。比如:<li t:type="loop" source="1..10" value="var:index">${var:index}</li>。如果沒有加這個(gè)前綴var:的話,就需要在頁(yè)面類中添加一個(gè)property: index以及相應(yīng)的getter和setter。
我們這次介紹自定義一個(gè)cycle前綴,這個(gè)可以用于在表格中顯示不同背景的行(也就是斑馬條)。
比如:
<t:grid .... rowClass="cycle:line1,line2">
...
</t:grid>
或者
<t:loop ...>
<div class="${cycle:line1,line2}">aaaa</div>
</tloop>
自定義prefix一般來(lái)說(shuō)是3個(gè)步驟,
1、定義一個(gè)BindingFactory,這個(gè)需要實(shí)現(xiàn)BindingFactory接口
2、定義一個(gè)Binding繼承AbstractBinding
3、注冊(cè)這個(gè)Binding
看一下具體的prefix的類:
1
import java.util.ArrayList;
2
import java.util.List;
3
4
import org.apache.tapestry5.Binding;
5
import org.apache.tapestry5.BindingConstants;
6
import org.apache.tapestry5.ComponentResources;
7
import org.apache.tapestry5.ioc.Location;
8
import org.apache.tapestry5.services.BindingFactory;
9
import org.apache.tapestry5.services.BindingSource;
10
11
/** *//**
12
* Implementation of the cycle: binding prefix -- we parse list of bindings
13
* and generate delegate bindings for each element<br>
14
* default binding is literal, other bindings can be used by specifying prefix.<br>
15
* example: "cycle:prop:name,prop:lastName,sth,sth else"
16
*/
17
public class CycleBindingFactory implements BindingFactory
{
18
private final BindingSource _bindingSource;
19
20
public CycleBindingFactory(BindingSource source)
{
21
this._bindingSource = source;
22
}
23
24
public Binding newBinding(String description, ComponentResources container, ComponentResources component,
25
String expression, Location location)
26
{
27
List<Binding> delegates = new ArrayList<Binding>();
28
String[] bindingNames = expression.split(",");
29
30
for (String bindingName : bindingNames)
{
31
String defaultBinding = BindingConstants.LITERAL;
32
33
Binding binding = _bindingSource.newBinding(description, container, component, defaultBinding, bindingName, location);
34
delegates.add(binding);
35
}
36
37
CycleBinding cycleBinding = new CycleBinding(delegates);
38
container.addPageLifecycleListener(cycleBinding);
39
40
return cycleBinding;
41
}
42
}
1
import java.util.List;
2
3
import org.apache.tapestry5.Binding;
4
import org.apache.tapestry5.internal.bindings.AbstractBinding;
5
import org.apache.tapestry5.runtime.PageLifecycleListener;
6
7
8
public class CycleBinding extends AbstractBinding implements PageLifecycleListener
{
9
private final List<Binding> delegates;
10
private int index = 0;
11
12
public CycleBinding(List<Binding> delegates)
{
13
this.delegates = delegates;
14
}
15
16
public Object get()
{
17
Object ret = delegates.get(index).get();
18
index ++;
19
if(index>=delegates.size()) index = 0;
20
return ret;
21
}
22
23
@Override
24
public boolean isInvariant()
{
25
return false;
26
}
27
28
@Override
29
public Class<Object> getBindingType()
{
30
return Object.class;
31
}
32
33
34
public void containingPageDidDetach()
{
35
index=0;
36
}
37
38
public void containingPageDidAttach()
{/**//*not interested*/}
39
40
public void containingPageDidLoad()
{/**//*not interested*/}
41
}
Binding和BindingFactory寫好了,注冊(cè)后就可以使用了,注冊(cè)的過(guò)程是在AppModel中添加以下一段代碼:
1
public static void contributeBindingSource(
2
MappedConfiguration<String, BindingFactory> configuration,
3
BindingSource bindingSource
4
)
5
{
6
configuration.add("cycle",new CycleBindingFactory(bindingSource));
7
}