前言
作为一个正在学习中的程序员小菜鸟,要学的东西很多,会读很多帖子博客。但是有很多东西都是边学边忘,今天偶然看到一篇文章写到好记性不如烂笔头,于是我决定也把学到的东西记录一下,也许多年后的某天翻出来看看会觉得,以前写的技术点怎么这么幼稚,但是想想也是一件有趣的事。
我理解的FreeMarker
FreeMarker是一种后台的模板引擎,由JAVA编译,和一些前端框架不同,类似于juicer这些前端模板引擎都是由JS引擎解析的。我学习FreeMarker是为了来制作代码生成器的。最初学习的时候网上都是将HTML作为例子来演示的,一度让我认为FreeMarker只能用来生成HTML,可以说是让我走了不少弯路。
FreeMarker的使用
建议在读这一部分的时候先读一下官方文档,因为我可能不会说的很细,我只写一下我觉得我需要记的。
使用FreeMarker最初当然是要先New一个Configuration对象,Configuration 是一个存放公共配置信息,以及模版(Template)可使用的全局共享变量的一个对象。建议将他设为一个单例对象,因为说过了他存放的是一些公共配置信息,这些信息激活全部都是一样的。所以说没有必要每次都New一个新的对象
Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
New了Configuration对象只有就可以给他公共配置信息了,比如下面这个就是告诉它我的模板文件都放在哪里。 一般配置文件和一些resource资源文件一样,放在和src同等级的目录下面,此处叫templates,并且以 ".ftl" 为后缀名。
configuration.setDirectoryForTemplateLoading(new File("templates"));
还有一个就是下面这句,相比很多人一看就懂了“UTF-8”嘛,一看就是设置字符编码的。
configuration.setDefaultEncoding("UTF-8");
现在配置完成了,下一步我们就是要来使用了,使用的第一步就是获取模板(Template)。这里我们获取一个模板,模板文件名称叫user.ftl。
Template temp = ConfigUtil.getInstance().getConfiguration().getTemplate("user.ftl");
他的内容如下
姓名:${userName}
年龄:${userAge}
性别:${sex}
可以看到它里面有几个${...}的占位符。其实他就是我们生成代码的关键了,${...}大括号中的值,其实就是一个key,模板引擎在编译的时候是通过其中的这个key来查找数据的。在模板当中有很多的,指令比如#list、#if,在后面我会慢慢说的。
接下来说说怎么将值传入模板,将值传入模板有两种方式,1、用map集合 2、用JavaBean传值。
先来说说Map集合传值,其实很简单,在之前介绍模板的时候说了,${..} 大括号中其实就是一个key,只要我们的map集合中的key和${...}中的key对应上,就能将map中的值,赋给模板中的${...}了。比如:
我们之前写的模板是
姓名:${userName}
年龄:${userAge}
性别:${sex}
那么我们的map集合就应该是
Map<String,Object> root =new HasMap<String,Object>();
root.put("userName","张三");
root.put("userAge",18);
root.put("sex",‘男’);
这就是用Map传值,需要注意的是,在New Map的时候值最好用Object,因为鬼知道我们会传什么什么类型值,可能是基本数据类型,可能是一个集合,还有可能是一个对象。如果用Map传值你已经会了,那么JavaBean就更简单了,只要JavaBean中的属性名和对应上就可以了,在这里就不多做赘述了。
现在模板已经写好了,传的值也准备好了,我们就来看看怎么将他们编译到一起吧。
在将他们编译到一次之前还需要准备一样东西。就是一个输出流,他决定了我们编译后的文件是什么类型,到哪里去。比如
我New一个这样的输出流 :
Writer out = new OutputStreamWriter(System.out);
他的意味着将我们编译后的数据输出到控制台中。
在或者
Writer out = new FileWriter("D:\\FreeMark\\freemark.txt");
这意味着将我们编译后数据输出到,本地磁盘D盘的FreeMarker文件夹下的freemark.txt文件中去。
通过这里我们知道了,其实我们生成的文件是什么类型,到哪里去都是在这里决定的。这也是在我最初学习的时候遇到的最困扰我的地方,那些教程让我认为她只能输出成HTML文件,可能是我太愚钝了吧。
好了言归正传,下面开始我们的最后一步。在这里就要用到之前建的模板对象了(temp)了。
temp.process(root,out);
OK!搞定了,到这一步你已经成功的写了一个FreeMarker的程序。是不是很简单。只需要调用模板对象的process()方法就可以了,方法中有两个值,第一个是我们传的JavaBean或者Map,第二个传输出流。需要注意的是模板中的传的值中,要包含模板中全部的key。不然会报错呦。