绑定变量的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 获得标签的所有属性

  1. public class TagSample extends GeneralVarTagBinding{
  2. @Override
  3. public void render(){
  4. int limit = Integer.parseInt((String) this.getAttributeValue("limit"));
  5. for (int i = 0; i < limit; i++){
  6. this.binds(i)
  7. this.doBodyRender();
  8. }
  9. }
  10. }
  11. //在某处注册一下标签TagSample
  12. //gt.registerTag("tag", TagSample.class);

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

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

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

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

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

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

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

通过var定义的变量只能在标签体中使用,如果想定义一个能在标签体外能使用的变量,需要使用export

  1. <#define limit="3" expor="value"/>
  2. ${value}

var 和 export 这个属性名代表了特殊意义,用于申明变量。也可以通过配置使用其他属性名字

  1. HTML_TAG_BINDING_ATTRIBUTE = var,export