开篇唠叨一下个人感言,之前做的项目有使用到 jsp 自定义标签,jsp自定义标签感觉麻烦,现在想找一个简单好用的模板引擎看看自定义标签怎么写,所以百度到了Beetl,逛了一下官网,感觉写法也挺简单的,然后尝试自定义标签,看文档蒙圈啊,都不知道怎么用,进群了,问了一下没人搭理,感觉很无奈都想放弃学习Beetl,觉得文档写的也不咋滴。但还是坚持百度了,逛了码云上的开源项目,终于看到有人自定义标签了正是自己想要的,现在终于领悟了一点,继续使用Beetl吧

说了那么多来看看官方怎么说的吧,使用的是2.7.12版本,下文来自官方文档

2.23. HTML标签

Beetl 也支持HTML tag形式的标签, 区分beetl的html tag 与 标准html tag。如设定HTML_TAG_FLAG=#,则如下html tag将被beetl解析

${html} …其他模板内容 #richdeitor>

如对于标签footer,Beetl默认会寻找WebRoot/htmltag/footer.tag(可以通过配置文件修改路径和后缀) ,内容如下:

if(style==’simple’){ %>

请联系我 ${session.user.name}

else{ %>

请联系我 ${session.user.name},phone:${session.user.phone}

如下还包含了自定义html标签一些一些规则

可以在自定义标签里引用标签体的内容,标签体可以是普通文本,beetl模板,以及嵌套的自定义标签等。如上

HTML自定义标签 的属性值均为字符串 如,在input.tag文件里 变量value的类型是字符串

可以在属性标签里引用beetl变量,如,此时在input.tag里,value的类型取决于user.age

在属性里引用beetl变量,不支持格式化,如,如果需要格式化,需要在input.tag文件里自行格式化

在标签属性里传json变量需要谨慎,因为json包含了"}",容易与占位符混合导致解析出错,因此得使用"\"符号,如age:25} }” />

html tag 属性名将作为 其对应模板的变量名。

默认机制下,全局变量都将传给html tag对应的模板文件,这个跟include一样。当然,这机制也可以改变,对于标签来说,通常是作为一个组件存在,也不一定需要完全传送所有全局变量,而只传送(request,session,这样变量),因此需要重新继承org.beetl.ext.tag.HTMLTagSupportWrapper.并重载callHtmlTag方法。并注册为htmltag标签。具体请参考https://github.com/javamonkey/beetl2.0/blob/master/beetl-core/src/test/java/org/beetl/core/tag/HtmlTagTest.java

如果采用模板来写html标签功能不够强大,beetl支持写标签函数(参考上一节)来实现html标签,标签函数args[0]表示标签名,这通常没有什么用处,args[1] 则是标签的属性,参数是个map,key是html tag的属性,value是其属性值,如下用java完成的html 标签用于输出属性值

public class SimpleHtmlTag extends Tag{

@Override

public void render(){

String tagName = (String) this.args[0];

Map attrs = (Map) args[1];

String value = (String) attrs.get("attr");

try{

this.ctx.byteWriter.writeString(value);

}catch (IOException e){

}

}

}

如果注册gt.registerTag("simpleTag", SimpleHtmlTag.class); 则如下模板输出了attr属性值abc

#simpleTag>

HTML_TAG_FLAG默认为#用来区别是否是beetl的html tag,你也可以设置成其他符号,比如 "my:",这样,\\ 其实是一个指向table.tag的标签实现

看了上文描述中提到如果注册gt.registerTag("simpleTag", SimpleHtmlTag.class);,

尝试在注入 BeetlGroupUtilConfiguration 的时候调用 init()方法 beetlGroupUtilConfiguration.init();初始化

然后调用 groupTemplate.registerTag("simpleTag", SimpleHtmlTag.class);进行注册标签,但是访问页面的时候,

总是去htmlTag目录下找simpleTag.tag文件,找不到就报错了,

花了不少时间真不知道怎么实现自定义标签,哎,好无奈啊!还好百度到了开源项目,又对使用beetl的使用增加了信息。

官方所描述的gt.registerTag("simpleTag", SimpleHtmlTag.class);是可以注册自定义标签的

其实报错是因为我踩了一个坑,因为我注入BeetlGroupUtilConfiguration的时候

在@Bean中指定了initMethod = "init",罪魁祸首就是他了,

我注入的 BeetlGroupUtilConfiguration:

@Bean(initMethod = "init")

public BeetlGroupUtilConfiguration getBeetlGroupUtilConfiguration(){ ... }

一但指定了,当你访问页面的时候,

beetl会从tagFactory中根据标签名称获取tagFactory工厂,如果不为空就创建tag,否则查找根目录下

htmltag目录下的后缀为tag的标签文件

在Beetl源码HTMLTagSupportWrapper类中第25行如下 :

public voidrender() {

if(this.args.length != 0&& this.args.length <= 2) {

String child = (String)this.args[0];TagFactory tagFactory = null;String functionTagName = child.replace(':','.');tagFactory = this.gt.getTagFactory(functionTagName);if(tagFactory == null) {

String path = this.getHtmlTagResourceId(child);this.callHtmlTag(path);} else{

this.callTag(tagFactory);}

} else{

throw newRuntimeException("参数错误,期望child,Map .....");}

}

进入正题如何自定义标签:

首先按方法文档给出的实例来建一个 SimpleHtmlTag类并继承Tag (完全把示例SimpleHtmlTag复制过来用)

代码复制到项目中后,在配置文件beetl.yml中加上TAG.simpleTag: cn.codesign.data.SimpleHtmlTag

TAG固定写法

TAG.前面的simpleTag 就是你自定义标签的名称然后就是指定类的全限定名了

然后在页面中添加

#simpleTag>

启动项目访问页面就会输出:abc

原来是这么使用自定义html标签啊,这是一种方法,

如果不在 beetl.yml中添加 TAG.simpleTag: com.czw.beetl.tag.SimpleHtmlTag

还可以根据文档描述那样注册标签

当注入BeetlGroupUtilConfiguration的时候 在 @Bean中不能出现initMethod = "init" 即@Bean(initMethod = "init")

注意获取GroupTemplate前必须先调用init方法,否则获取到的GroupTemplate为 null

@Bean(name = "beetlConfig")

public BeetlGroupUtilConfiguration getBeetlGroupUtilConfiguration() {

BeetlGroupUtilConfiguration beetlGroupUtilConfiguration = new BeetlGroupUtilConfiguration();

//获取Spring Boot 的ClassLoader

ClassLoader loader = Thread.currentThread().getContextClassLoader();

ResourcePatternResolver patternResolver = ResourcePatternUtils.getResourcePatternResolver(new DefaultResourceLoader());

try {

// WebAppResourceLoader 配置root路径是关键

ClasspathResourceLoader cploder = new ClasspathResourceLoader(SpringbootApplication.class.getClassLoader(),"templates/");

beetlGroupUtilConfiguration.setResourceLoader(cploder);

} catch (Exception e) {

e.printStackTrace();

}

//读取配置文件信息

beetlGroupUtilConfiguration.setConfigFileResource(patternResolver.getResource("classpath:beetl.yml"));

beetlGroupUtilConfiguration.init();

GroupTemplate groupTemplate = beetlGroupUtilConfiguration.getGroupTemplate();

//注册自定义标签

groupTemplate.registerTag("simpleTag", SimpleHtmlTag.class);

return beetlGroupUtilConfiguration;

}

beetl html模板,Beetl模板引擎之自定义html标签相关推荐

  1. beetl模板引擎之自定义html标签,Beetl模板引擎自定义分页标签

    1)在beetl.properties文件中配置tag TAG.page = xx.xx.xx.xx.PageTag 2)在模板中引用标签 3)增加标签类继承自GeneralVarTagBinding ...

  2. beetl模板引擎之自定义html标签,分享:beetl模板引擎绑定变量的HTML标签的用法

    首先写个tag类: @IocBean public class CmsChannelListTag extends GeneralVarTagBinding { @Inject private Cms ...

  3. 2011级-csdn-java-张侃—自定义JSP标签(一)

    自定义JSP标签概述 •         自定义JSP标签就是程序员定义的一种JSP标签,这种标签把那些信息显示逻辑封装在一个单独的Java类中,通过一个XML文件来描述它的使用.当页面中需要使用类似 ...

  4. 使用 .NET Core模板引擎创建自定义的模板和项目

    本文要点 .NET CLI 包含了一个模板引擎,它可以直接利用命令行创建新项目和项目项.这就是"dotnet new"命令. 默认模板集涵盖了默认控制台和基于 ASP.NET 的应 ...

  5. 类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

     1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPush ...

  6. html自定义标签模板,javascript – 模板与HTML自定义元素的使用

    我刚刚开始学习HTML自定义元素,并通过阅读一系列介绍,教程和文档,我认为我对它的工作方式有很好的处理,但我对使用或不使用的正确方法有一个哲学问题标签. 自定义元素使您能够封装新功能,简化HTML文档 ...

  7. django-DIL模板自定义过滤器,自定义标签,自定义包含标签

    django-DIL模板自定义过滤器,自定义标签,自定义包含标签 自定义过滤器 DTL模板语言生来只是为了方便的展示信息,所以与编程语言相比显得有点薄弱,有时候不能满足我们的需求.因此django提供 ...

  8. 关于java,word表格,通过将模板表格的属性附加到自定义表格上,也就是修改表格的属性(通过模板表格的属性)。

    需求:有一个可修改属性样式的模板表格,然后生成的word文档中所有的表格的属性都使用该模板表格的属性样式. 本质就是获取二个参数,一个模板表格的html和自定义表格的html,全部转化为string类 ...

  9. c++模板 --- 类模板、自定义类型当做模板参数

    生成一个类模板 类中用到了未知类型叫做类模板 用 template 修饰的类,这个类就是一个模板类 多用在数据结构中,忽略类型的问题 只要被 template 修饰,就是一个模板类,有没有用未知类型都 ...

  10. 测试文档模板_学会word2007创建自定义模板的方法,让你新建的文档结构都一致...

    我们有时自己设计好了一个文档,想在今后的新建文档中可以在此文档基础上进行设计修改,这个怎么办?你只需将你的文档保存成模板就可以了,以后在新建文档选择你建好的模板就可以了.下面我们一起操作演示一下. 新 ...

最新文章

  1. vim介绍,vim颜色显示,vim一般模式下移动光标,vim一般模式下的复制、剪切和粘贴...
  2. centos7挂载windows共享文件夹
  3. python特征工程插件_手把手教你用Python实现自动特征工程
  4. Android amr语音编解码解惑 【转http://blog.csdn.net/xyz_lmn/article/category/922246】
  5. 什么样才能叫精通java_Java学到什么程度才能叫精通?
  6. 字节跳动的一面内容记录
  7. Elasticsearch--进阶-Query DSL基本使用和match_all---全文检索引擎ElasticSearch工作笔记010
  8. PL/SQL中,declare定义变量和variable定义变量的区别?
  9. 关机应用程序无法关闭计算机,电脑关机时怎么设置自动结束没有响应的应用程序?...
  10. IIS中防止MDB被下载的办法
  11. python数据存储系列教程——python中redis数据库操作:连接、增删查改、多级路径
  12. 01单片机——基础知识
  13. 弹性云服务器是什么意思?弹性体现在哪里
  14. hbase1.2.1配置kerberos
  15. CH Dream(侠客行)
  16. Remix 完全本地化部署
  17. 『原创』用C++开发WM应用系列(2)——拨打电话
  18. DSPE-PEG-N3 磷脂PEG叠氮
  19. MySQL--变量、if语句、while循环以及存储过程的使用
  20. 这些编程笑话,你get得到笑点吗?

热门文章

  1. python云计算有哪些岗位_云计算就业前景怎么样,包括哪些岗位,各岗位主要工作是什么?...
  2. XML的三大解析方式解析
  3. Elasticsearch系列:番外篇-Fielddata
  4. 25个常用Matplotlib图的Python代码,干货收藏!
  5. 公司官网建站笔记(四):从阿里云将域名转出,并将域名转入腾讯云
  6. WebView 监听 H5 下载
  7. openg离线包_OpenGL离线渲染和缓冲区对象
  8. Shopify速度优化
  9. kubernetes实践之三十: SonarQube和SonarQube Runner
  10. 【maya】学习历程