新接触一个模板框架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());
本文采用依赖:
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>beetl-framework-starter</artifactId>
<version>1.2.5.RELEASE</version>
</dependency>这是个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<Student> 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];