Beetl学习笔记

Beetl学习笔记

Beetl


一、什么是Beetl

1.1 概念

Beetl是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,超过当前流行的模板引擎。而且还易学易用。

1.2 优缺点

1.2.1 优点:

易整合、性能强
性能测试对比
性能测试对比

1.2.2 缺点:

文档蛋疼、用例少、与html标签结合略显混乱

二、Beetl语法

参考官网语法 (http://ibeetl.com/guide/#beetl)

在线体验 (http://ibeetl.com/beetlonline/)


三、第一个例子:与SpringBoot集成

3.1 创建Spring boot项目(1.5.3.RELEASE)

 
  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>1.5.3.RELEASE</version>
  5. <relativePath/>
  6. </parent>

3.2 添加启动器依赖

 
  1. <dependency>
  2. <groupId>com.ibeetl</groupId>
  3. <artifactId>beetl-framework-starter</artifactId>
  4. <version>1.1.60.RELEASE</version>
  5. </dependency>

3.3 关于启动器的说明

starter 自动处理以btl结尾的视图,模板根目录是Spring Boot默认的templates目录。

3.4 使用默认配置

  • 创建HelloController(return "/hello.btl";)
  • 在templates下创建 hello.btl

3.5 启动运行效果

Hello,This is a BTL file, The time is 2018-09-05 10:09:12


四、探究Beetl模板资源加载器

4.1 字符串模板加载器

在创建GroupTemplate过程中,如果传入的是StringTemplateResourceLoader,则允许通过调用gt.getTemplate(String template)来获取模板实例对象

4.2 文件资源模板加载器

更通常情况下,模板资源是以文件形式管理的,集中放在某一个文件目录下(如webapp的模板根目录就可能是WEB-INF/template里),因此,可以使用FileResourceLoader来加载模板实例,如下代码:

 
  1. String root = System.getProperty("user.dir")+File.separator+"template";
  2. FileResourceLoader resourceLoader = new FileResourceLoader(root,"utf-8");
  3. Configuration cfg = Configuration.defaultConfiguration();
  4. GroupTemplate gt = new GroupTemplate(resourceLoader, cfg);
  5. Template t = gt.getTemplate("/s01/hello.txt");
  6. String str = t.render();
  7. System.out.println(str);

4.3 Classpath资源模板加载器

还有种常情况下,模板资源是打包到jar文件或者同Class放在一起,因此,可以使用ClasspathResourceLoader来加载模板实例

 
  1. ClasspathResourceLoader resourceLoader = new ClasspathResourceLoader("org/beetl/sample/s01/");
  2. Configuration cfg = Configuration.defaultConfiguration();
  3. GroupTemplate gt = new GroupTemplate(resourceLoader, cfg);
  4. Template t = gt.getTemplate("/hello.txt");
  5. String str = t.render();
  6. System.out.println(str);

第1行代码指定了模板根目录,即搜索模板的时候从根目录开始,如果new ClasspathResourceLoader("template/"),则表示搜索template下的模板。此处用空构造函数,表示搜索路径是根路径,且字符集默认字符集UTF-8.

4.4 WebApp资源模板加载器

WebAppResourceLoader 是用于web应用的资源模板加载器,默认根路径是WebRoot目录。也可以通过制定root属性来设置相对于WebRoot的的模板根路径,从安全角考虑,建议放到WEB-INF目录下

4.5 自定义资源模板加载器

有时候模板可能来自文件系统不同目录,或者模板一部分来自某个文件系统,另外一部分来自数据库,还有的情况模板可能是加密混淆的模板,此时需要自定义资源加载,继承ResouceLoader才能实现模板功能


五、Beetl的高级用法

5.1 模板配置文件

常用的配置其实就只有几个,其他的几乎不用改动

 
  1. #取值开始符号
  2. DELIMITER_PLACEHOLDER_START=${
  3. #取值结束符号
  4. DELIMITER_PLACEHOLDER_END=}
  5. #beetl代码开始符号
  6. DELIMITER_STATEMENT_START=<%
  7. #beetl代码结束符号
  8. DELIMITER_STATEMENT_END=%>

5.2 自定义视图名与模板位置

在application.properties中配置模版路径,beetl解析的视图名以及spring mvc的视图后缀,不建议使用Spring mvc视图前缀,直接通过模板名称与spring mvc视图后缀组合定位具体模板

 
  1. #配置模板的位置为templates下的views文件夹
  2. beetl.templatesPath=templates/views
  3. #配置beetl的默认解析的视图名为html
  4. beetl.suffix=html
  5. #配置spring mvc的后缀为.html
  6. spring.mvc.view.suffix=.html

通过以上配置,在HelloController中 return "hello"; 则表示为渲染的视图文件为 classpath:templates/views/hello.html

5.3 启动器定制GroupTemplate

新建一个java类,并将BeetlTemplateCustomize注解,注意:不要将类名称命名为BeetlConfig 别问我怎么知道的。

 
  1. @Configuration
  2. public class MyConfig{
  3. @Bean
  4. //配置自定义GroupTemplate
  5. public BeetlTemplateCustomize beetlTemplateCustomize(){
  6. return new BeetlTemplateCustomize(){
  7. public void customize(GroupTemplate groupTemplate){
  8. /*开始你的表演*/
  9. }
  10. };
  11. }
  12. }

5.4 注册全局共享变量

全局共享变量可以在任何一个模板的任何一个位置使用,比如可以将后台或前台路径的path注册为全局共享变量

 
  1. Map<String,Object> map = new HashMap<String,Object>();
  2. map.put("name", "GouDan Li");
  3. groupTemplate.setSharedVars(map);

5.5 配置BeetlGroupUtilConfiguration和BeetlSpringViewResolver

使用Starter来配置已经够用,如果你想自己配置模板引擎, 通过java config来配置beetl需要的BeetlGroupUtilConfiguration,和 BeetlSpringViewResolver,参考代码如下

 
  1. @Configuration
  2. public class BeetlConf {
  3. //模板根目录 ,比如 "templates"
  4. @Value("${beetl.templatesPath}") String templatesPath;
  5. @Bean(name = "beetlConfig")
  6. public BeetlGroupUtilConfiguration getBeetlGroupUtilConfiguration() {
  7. BeetlGroupUtilConfiguration beetlGroupUtilConfiguration = new BeetlGroupUtilConfiguration();
  8. //获取Spring Boot 的ClassLoader
  9. ClassLoader loader = Thread.currentThread().getContextClassLoader();
  10. if(loader==null){
  11. loader = BeetlConf.class.getClassLoader();
  12. }
  13. //额外的配置,可以覆盖默认配置,一般不需要
  14. beetlGroupUtilConfiguration.setConfigProperties(extProperties);
  15. ClasspathResourceLoader cploder = new ClasspathResourceLoader(loader,templatesPath);
  16. beetlGroupUtilConfiguration.setResourceLoader(cploder);
  17. beetlGroupUtilConfiguration.init();
  18. //如果使用了优化编译器,涉及到字节码操作,需要添加ClassLoader
  19. beetlGroupUtilConfiguration.getGroupTemplate().setClassLoader(loader);
  20. return beetlGroupUtilConfiguration;
  21.  
  22. }
  23.  
  24. @Bean(name = "beetlViewResolver")
  25. public BeetlSpringViewResolver getBeetlSpringViewResolver(@Qualifier("beetlConfig") BeetlGroupUtilConfiguration beetlGroupUtilConfiguration) {
  26. BeetlSpringViewResolver beetlSpringViewResolver = new BeetlSpringViewResolver();
  27. beetlSpringViewResolver.setContentType("text/html;charset=UTF-8");
  28. beetlSpringViewResolver.setOrder(0);
  29. beetlSpringViewResolver.setConfig(beetlGroupUtilConfiguration);
  30. return beetlSpringViewResolver;
  31. }
  32. }

5.6 自定义方法

新建类实现Fucntion接口,覆盖call方法,由于call方法返回的类型为Object,所以可以实现任何返回值的方法。

 
  1. public class MyMethod implements Function{
  2. @Override
  3. public Object call(Object[] paras, Context ctx) {
  4. //此处仅演示输出固定的String
  5. return "Called My Method";
  6. }
  7. }

将该方法注册的方式分为两种,一种是在beetl.properties中通过FN(Function) 配置

 
  1. #配置自定义函数,myFn为你注册的方法名,后面是它所在的Class位置
  2. FN.myFn = com.xyx.demo.fn.MyFn

另外一种是在自定义GroupTemplate 时将该方法注册

 
  1. groupTemplate.registerFunction("myFn", new MyFn());

在页面中直接使用“你注册的方法名”调用

 
  1. ${myFn()}

5.7 导入静态工具类

普通的java类中的方法亦可以被模板调用,该方法需声明为 public static,页面中调用需要把包名写上: ${@com.xyx.demo.utils.MyUtils.myUtilMethod()}

不想写包名?可以在beetl.properties中通过IMPORT_PACKAGE 配置,可以导入多个包

 
  1. #导入自定义静态方法类
  2. IMPORT_PACKAGE= com.xyx.demo.utils.;\
  3. com.xyx.demo.anotherutils.;

页面中调用,直接 类名.方法名

 
  1. ${@MyUtils.myUtilMethod()}
  2. ${@MyAnotherUtils.myAnotherUtilMethod()}

5.8 注册方法包

有时候,我们想把某个工具类中的所有方法在页面中直接调用,也是可以的,首先需要创建一个普通的java类,里面定义好所有的方法。

 
  1. public class MyFnPac {
  2. public String MyFnPacTest() {
  3. return "Called MyFuntionPackageTest Method";
  4. }
  5. public String MyFnPacTest2() {
  6. return "Called MyFuntionPackageTest2 Method";
  7. }
  8. }

注册方式同样有两种,第一种是在beetl.properties中通过FNP(Function Package)配置

 
  1. #自定义的功能包
  2. FNP.myFnPac = com.xyx.demo.fnpackage.MyFnPac

第二种是将该类在GroupTemplate中注册

 
  1. //注册方法包
  2. groupTemplate.registerFunctionPackage("myFnPac", new MyFnPac());

页面中调用采用“注册的包名”.“方法名”

 
  1. //调用方式采用“注册的包名”.“方法名”
  2. ${myFnPac.MyFnPacTest()}
  3. ${myFnPac.MyFnPacTest2()}

5.9 模板文件作为方法

一个html文件,也可以作为方法,比如在分页时很有用。

默认情况下,需要将模板文件放到Root的functions目录下,且扩展名为.html(可以配置文件属性来修改这俩个默认值) 方法参数分别是para0,para1…..

新建一个functions目录下的模板文件page.html

 
  1. <%
  2. //para0,para1 由函数调用传入
  3. var current = para0,total = para1;
  4. %>
  5. 当前页面 ${current},总共${total}

模板中调用

 
  1. <%
  2. page(1,10);
  3. %>

允许使用return 表达式返回一个变量给调用者,如now.html,方法名为now

 
  1. <%
  2. return date();
  3. %>

5.10 自定义格式化函数

新建类实现Format接口,覆盖format方法,由于format方法返回的类型为Object,所以可以实现任何返回值的方法。

 
  1. public class MyFormat implements Format{
  2. @Override
  3. public Object format(Object data, String pattern) {
  4. /*安排的妥妥的*/
  5. return data;
  6. }
  7. }

5.11 自定义标签

标签形式有俩种,一种是标签函数,第二种是html tag。第二种实际上在语法解析的时候会转化成第一种,其实现是HTMLTagSupportWrapper,此类将会寻找root/htmltag目录下同名的标签文件作为模板来执行。
自定义标签的位置默认在root下的htmltag文件夹内,并以.tag为结尾,可修改。

 
  1. 定义: 在htmltag目录下创建mytag.tag文件
  2.  
  3. 使用: 模板中<#mytag />

5.12 布局示例

在root下创建include文件夹,创建需要引入的页面
在root下创建layout文件夹,创建需要引入的页面

 
  1. //引入头部页面
  2. <% include('/include/header.html'){} %>
  3. //引入左侧页面
  4. <% include('/include/left.html'){} %>
  5. //引入主页面(layoutContent 是默认变量)
  6. <div class = "content">${layoutContent}</div>
  7. //引入脚部页面
  8. <% include('/include/footer.html'){} %>

在主页面使用layout方法采用此布局

 
  1. <% layout("/layout/layout.html"){ %>
  2. //开始你的表演
  3. <% } %>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值