Beetl基础篇

新接触一个模板框架Beetl,它自称性能是freemarker的5~6倍,是jsp的2倍,或许以后可以称为世界上最好的模板框架。

所谓模板,大概就像下面这样:

模板:I LOVE ${name}

装配:name = 'YOU'

结果:I LOVE YOU

jsp是这样,freemarker是这样,Beetl也不例外。它们的目的都是根据模板装填参数,形成新的字符串(jsp实质上是servlet)。

只是它们的装配效率不一样,装配方式不一样,还有各自特殊的功能不一样。

对于上面最简单的功能,由Beetl直接实现的话就像这样:

//数据加载器,有字符串加载器,classpath加载器,file加载器等	
StringTemplateResourceLoader loader = new StringTemplateResourceLoader();
//配置中心
Configuration config = Configuration.defaultConfiguration();
//这算是个模板工厂吧
GroupTemplate template = new GroupTemplate(loader,config);
//模板
Template te = template.getTemplate("hello,${va}");
//装配
te.binding("va", "world");
//输出hello,world
System.out.println(te.render());

本文采用依赖:


            com.ibeetl
            beetl-framework-starter
            1.2.5.RELEASE
 

这是个springboot的starter,它直接依赖了beetl3.0.5

 上面的例子,稍微有些编程基础的人都能看懂是什么意思,但它的用处不多。一般有用的是下面这个例子:

 

我们先在类路径下新建个index.html.(什么是类路径?src/main/java下就算是吧),内容如下:

111111
<%
	var a = 1;
	var b = 2;
	var c = a + b;
%>
${c}
${list[0].id}

然后再建个Student学生类

public class Student {
	private int id;
	
	private String name;

..getter/setter

接下来执行下面的方法 

public static void main(String[] args) throws IOException {
		List list = new ArrayList<>();
		list.add(new Student(1, "tom"));
		list.add(new Student(2, "jim"));
		list.add(new Student(3, null));
		ClasspathResourceLoader loader  = new ClasspathResourceLoader();
		Configuration config = new Configuration();
		GroupTemplate gt = new GroupTemplate(loader, config);
		Template template = gt.getTemplate("index.html");
		template.binding("list", list);
		System.out.println(template.render());
}

可以看到打印了

111111
3
1

那么接下来是对这个结果进行分析的详细流程:

在main方法里,beetl使用了index.html这个模板,同时将包含3个Student的list给装配到参数map里。

beetl在拿到index.html后开始进行解析,它解析规则大概这样:

1。只要是<%和%>中间的,我就当成javascript方法来执行(它当然不是js,只是语法接近罢了。),并且将里面产生的对象也放到参数map里。

2、只要是碰到${},那么我便从参数map里去取并赋值。

那么根据上面这两条,beetl解析html做了下面的事情:

1.index.html的第一行11111还是11111什么都没有变。

2.<%%>里将a=1,b=2,c=3放到了参数里。

3.将3替换掉${c},将list的第一个元素的id替换掉${list[0].id}

所以它最终打印了上述内容。

在这个例子里有几个问题是要说的:

1.如果这个index.html不是直接在类路径下,而是在类路径下/static/里,怎么写?

可以ClasspathResourceLoader loader  = new ClasspathResourceLoader(“static”);这样写代表着这个loader只读static下面的。

2.我如果想在<%%>里操作传入的list怎么写?千万不要这样写,下面的这个例子是错误的。

<%
	var a = 1;
	var b = 2;
	var c = a + b;
	var d = ${list[0]};
	d.id = 100;
%>

你应该这样写:

var d = list[0];

 

你可能感兴趣的:(模板)