http://www.iBeetl.com,beetl支持自定义标签;
使用自定义标签需要三个步骤。
1 )继承Tag类(或GeneralVarTagBinding类)实现render方法;
2 )注册标签:
beetlviewfactory.group template.register tag (' page ',PageTag.class );
3 )使用标签:
.
#page
Tag类的源代码:
引用
公共基础类标签
{
保护性对象[ ] args=null;
保护性组模板gt;
保护性上下文CTX;
保护性字节写入器bw;
保护语句Bs;
保护性void dobodyrender (
{
bs.execute(CTX );
}
protectedbodycontentgetbodycontent (
{
bytewriterwriter=CTX.byte writer;
bytewritertempwriter=CTX.byte writer.gettempwriter (;
ctx.byteWriter=tempWriter;
doBodyRender (;
ctx.byteWriter=writer;
return tempWriter.getTempConent (;
}
公共基础语音渲染器(;
公共void init (上下文CTX,对象[ ] args,语句ST ) )。
{
this.ctx=ctx;
this.bw=ctx.byteWriter;
this.gt=ctx.gt;
this.args=args;
this.bs=st;
}
}
其中args参数的开头是标签名称。 也就是说,自定义标签名称的第二个是Map,它保存自定义标签的属性名称,如下所示:
分页符标签,args={'tage ',Map[val=page]}
ctx是模板上下文,全局变量:ctx.getGloabl ('名称');
Beetl具有更易于使用的抽象类GeneralVarTagBinding。 这提供了getAttributeValue根据属性名称获取标签属性值的功能
通用可变绑定源代码:
引用
package org.beetl.core;
import java.util.Map;
//*
*这些子类可以用作html标记,除了可以实现bindVars初始化绑定的变量外,还允许在render方法中调用
*方法bing(name,value )绑定变量。 以下是一个例子
*
* publicclasstestgeneralvartagbindingextendsgeneralvartagbinding
{
公共语音渲染器(
{
for(intI=0; i 5; I )
{
this.bind('value ',I );
this.doBodyRender (;
}
}
}
在此示例中,标签体在循环中渲染五次,然后在每个循环中设置值。 模板的内容如下
$ {值}
#tag
*/
publicabstractclassgeneralvartagbindingextendstagimplementstagvarbinding
{
私有映射名称2索引=null;
@Override
公共对象[ ] bind vars (
{
//todo自动- generated method stub
返回空值;
}
公共语音映射名称2索引(映射映射)。
{
name 2索引=映射;
}
公共语音滨
d(String name, Object value){
if (name2Index == null)
{
throw new RuntimeException();
}
Integer index = name2Index.get(name);
if (index == null)
{
throw new RuntimeException();
}
ctx.vars[index] = value;
}
public Object getAttributeValue(String attrName)
{
Map map = (Map) this.args[1];
return map.get(attrName);
}
public String getHtmlTagName()
{
return (String) this.args[0];
}
}
下面是我写的分页标签的实现:
引用
public class PageTag extends GeneralVarTagBinding {
private long total = 0;
private int perSize = 0;
private int curNo = 0;
private int pageNum = 0;
private static final String SPAN = "span";
private static final String A = "a";
private void init(){
Page page = (Page)getAttributeValue("val");
total = page.getTotalNum();
perSize = page.getPerSize();
curNo = page.getCurNo();
pageNum = (int)(total / perSize);
if(pageNum * perSize < total){
pageNum++;
}
}
@Override
public void render(){
init();
StringBuilder paging = new StringBuilder("");
paging.append("
");if(curNo > 1){
paging.append(" ")
.append(" ");
if(curNo > 4){
paging.append("...");
}
if(curNo - 2 > 0){
paging.append("").append(curNo - 2).append("");
}
if(curNo - 1 > 0){
paging.append("").append(curNo - 1).append("");
}
}else if(curNo == 1){
paging.append(" ")
.append(" ");
}
paging.append("").append(curNo).append("");
if(curNo + 1 <= pageNum){
paging.append("").append(curNo + 1).append("");
}
if(curNo + 2 <= pageNum){
paging.append("").append(curNo + 2).append("");
}
if(pageNum - curNo > 2){
paging.append("...");
}
if(curNo >= pageNum){
paging.append(" ")
.append(" ");
} else{
paging.append(" ")
.append(" ");
}
paging.append("")
.append("共").append(pageNum).append("页").append(total).append("条记录 到第")
.append("页 ")
.append("
");try{
ctx.byteWriter.writeString(paging.toString());
this.doBodyRender();
ctx.byteWriter.writeString(paging.toString());
}catch (IOException e){
throw new RuntimeException(e);
}
}
}
doBodyRender()方法是输出标签内的HTML
最终效果
更详细的使用文档可以去Beetl在线文档上看http://ibeetl.com/guide/#_%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A0%87%E7%AD%BE
大小: 17.8 KB
分享到:
2014-08-05 10:51
浏览 4003
评论
1 楼
javamonkey
2014-08-05
写的挺好的,支持一个,
可以继承Tag,扩展接口友好的标签,比如如何获取属性,如何获取全局变量等