Beetl模板引擎之自定义html标签嵌套子标签

经过自定义html标签的使用,此时要是有需求先执行父标签的java代码再把需要的值传递给字标签呢?怎么做?先来看看官方文档

2.24. 绑定变量的HTML标签

对于html标签(参考上一节),Beetl还 支持将标签实现类(java代码)里的对象作为临时变量,被标签体引用。此时需要实现GeneralVarTagBinding (此类是Tag的子类) 该类提供另外3个个方法 - void binds(Object… array) 子类在render方法里调用此类以实现变量绑定,绑定顺序同在模板中声明的顺序 - void bind(String name, Object value) 子类在render方法里调用此类以实现变量绑定,name是模板中声明的变量名,用此方法绑定不如binds更灵活,不再推荐 - Object getAttributeValue 获得标签的属性 - Map getAttributes 获得标签的所有属性

public class TagSample extends GeneralVarTagBinding{
        @Override
        public void render(){
                int limit = Integer.parseInt((String) this.getAttributeValue("limit"));
                for (int i = 0; i < limit; i++){
                        this.binds(i)
                        this.doBodyRender();
                }
        }
}
//在某处注册一下标签TagSample
//gt.registerTag("tag", TagSample.class);

如上例子,render方法将循环渲染标签体limit次,且每次都将value赋值为i。我们再看看模板如何写的

<#tag limit="3";value>
        ${value}
</#tag>

类似于常规html标签,需要在标签的最后的属性定义后面加上分号 ";" 此分号表示这个是一个需要在标签运行时需要绑定变量的标签。后跟上要绑定的变量列表,如上例只绑定了一个value变量,如果需要绑定多个变量,则用逗号分开,如var1,var2 上。如果后面没有变量列表,只有分号,则默认绑定到标签名同名的变量上. 如果标签有namesapce,则默认绑定订的变量名不包含namespace

注意,由于标签使用因为太长可能换行或者是文本格式化导致换行,目前beetl只允许在属性之间换行,否则,将报标签解析错误。

默认情况下,如果标签属性出现了var(可以通过配置文件改成其他属性名),也认为是绑定变量的标签,如上面的例子也可以这么写

<#tag limit="3" var="value">
        ${value}
</#tag>

var属性的值可以是个以逗号分开的变量名列表,如var="total,customer,index"

3.4. 自定义标签

标签形式有俩种,一种是标签函数,第二种是html tag。第二种实际上在语法解析的时候会转化成第一种,其实现是HTMLTagSupportWrapper,此类将会寻找root/htmltag目录下同名的标签文件作为模板来执行。类似普通模板一样,在此就不详细说了

3.4.1. 标签函数

标签函数类似jsp2.0的实现方式,需要实现Tag类的render方法即可

public class DeleteTag extends Tag{
        @Override
        public void render(){
                // do nothing,just ignore body
                ctx.byteWriter.write("被删除了,付费可以看")
        }
}

如上一个最简单的Tag,将忽略tag体,并输出内容

public class XianDeDantengTag extends Tag{
        @Override
        public void render(){
                doBodyRender();
        }
}

此类将调用父类方法doBodyRender,渲染tag body体

public class CompressTag extends Tag{
        @Override
        public void render(){
                BodyContent  content = getBodyContent();
                String content = content.getBody();
                String zip = compress(conent);
                ctx.byteWriter.write(zip);
        }
}

此类将调用父类方法getBodyContent ,获得tag body后压缩输出

tag类提供了如下属性和方法供使用

  • args 传入标签的参数
  • gt GroupTemplate
  • ctx Context
  • bw 当前的输出流
  • bs 标签体对应的语法树,不熟悉勿动
从文档中我们知道需要继承  GeneralVarTagBinding 类,但是翻了文档貌似没看到自定义html标签嵌套子标签的的说明,

通过debug发现,首先是调用了父标签的java类,在render方法中调用 

BodyContent bodyContent = this.getBodyContent();
String body = bodyContent.getBody();
此代码原本想看看获取到的body是什么数据,在调用  this.doBodyRender();的时候会去调用子标签的java了,此时会进入

子标签java类中render方法,那怎么父标签的值传统到子标签去呢,抱着试一试的态度试了一下,还真行了。

在父标签java类中调用 this.doBodyRender(); 前先把先把参数绑定到父标签上,然后通过${value}传递给子标签,

说了那么多,还是直接上代码看得快些吧








var="value"此处用于父标签绑定传递的值,test="${value}"此处是将父标签传递的值使得子标签通过

String test = (String)this.getAttributeValue("test");
获取父标签传递的值


在代码中可以看得 this.bind("value",test); 已经过时,替代的是 this.bind(test); ,不通过指定的 name 绑定数据,

它是按照数组形式循环绑定

到此自定义html标签嵌套子标签完成。希望更多的人分享自己踩过坑让别人少走点弯路





评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值