前言:因为工作需要用到,所以临时才简单的学了下freemarker,发现和 JSP页面一样简单。主要是类似JSP中使用JSTL标签一样。freemarker也有属于它的标签。
freemarker也是有很多要学的,但是我学的只是足够用工作的,没那么深入,所以是比较简单的,如同“hello world”例子。
下面的程序,会基于 中文API 来说的,如果有更好的代码或实现方法,请再评论留言,一起讨论学习。
freemarker中文API地址: http://t.bdtool.net/freemarker/pgui.html
上代码,亲测可用。
FreemarkerUtil.java
package com.testExample.freemarker;
import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.FileTemplateLoader;
import freemarker.cache.MultiTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
/**
* freemarker 工具类
*
*/
public class FreemarkerUtil {
//单例,为什么用单例,详情看 图1
private static final Configuration cfg; //模版配置对象
//初始化FreeMarker配置,详情看 图1
static {
//创建一个Configuration实例,建议带参,
//不带参的构造方法被标明为过期了,这里我用的是 freemarker-2.3.23.jar
//可以从 maven repository 官网下载 jar 包 ,不会下载请拉最后
cfg = new Configuration(Configuration.VERSION_2_3_23);
//设置FreeMarker的模版文件夹位置,只到文件夹,不带文件,
//如:C:/freemarker_ftl/xxx.ftl 那么只需要 C:/freemarker_ftl
try {
//三者选一,另外两个注释
one_dir1();//一个文件夹路径
one_dir2();//一个文件夹路径
more_dir();//多个文件夹路径
} catch (IOException e) {
e.printStackTrace();
}
// 设置默认编码
cfg.setDefaultEncoding("utf-8");
//错误控制器,控制异常,详情看图4
//RETHROW_HANDLER :错误信息会输出到控制台
//HTML_DEBUG_HANDLER : 错误信息会输出到你要生成的html页面,详情看图4_1
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
//cfg.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);
}
//所有模板都在一个文件夹路径,详情看 图1 或 图2
private static void one_dir1() throws IOException {
cfg.setDirectoryForTemplateLoading(new File("C:/freemarker_ftl"));
}
//所有模板都在一个文件夹路径,详情看 图2
private static void one_dir2() throws IOException {
//ftl模板文件统一放至 com.testExample.freemarker.template 包下面
cfg.setClassForTemplateLoading(FreemarkerUtil.class,"/com/testExample/freemarker/template/");
}
// 所有模板分别在多个文件夹路径,详情看 图3
private static void more_dir() throws IOException {
//建议,就算不同文件夹,但是模板文件名也不能相同,详情看 图3
FileTemplateLoader ftl1 = new FileTemplateLoader(new File("C:/freemarker_ftl"));
FileTemplateLoader ftl2 = new FileTemplateLoader(new File("E:/freemarker_ftl"));
ClassTemplateLoader ctl = new ClassTemplateLoader(FreemarkerUtil.class, "/com/testExample/freemarker/template/");
TemplateLoader[] loaders = new TemplateLoader[] { ftl1, ftl2, ctl };
MultiTemplateLoader mtl = new MultiTemplateLoader(loaders);
cfg.setTemplateLoader(mtl);
}
private void process(String templateName, String targetFileName, Map root) throws Exception {
Writer out = null;
try{
File file = new File(targetFileName);
if(!file.exists()) {
file.createNewFile();
//因为是生成到 Linux 上,需要设置权限,自己写的
file.setExecutable(true, false);//设置可执行权限,第二个参数默认为true(表示root权限才可以执行该文件,false为所有人都可以)
file.setReadable(true, false);//设置可读权限,第二个参数默认为true(同上)
file.setWritable(true);//设置可写权限,第二个参数默认为true(这里可以省略不写)
}
//创建模版对象,详情看 图5
Template t = cfg.getTemplate(templateName);
//设置输出流,详情看 图6
//out = new OutputStreamWriter(System.out); //-> 输出到控制台
out = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");//设置编码 UTF-8
//在模版上执行插值操作,并输出到制定的输出流中,详情看 图5
t.process(root, out);//root 是模板ftl中的变量的值
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != out) {
try {
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 从模板生成静态html页面
* @param templateName 模板文件名
* @param targetFileName 目标文件名,即 html 的文件名,包含路径,绝对路径
* @param root 模板里面变量的值
*/
public static void generatorHtmlFromTemplate(String templateName, String targetFileName, Map root) {
FreemarkerUtil hf = new FreemarkerUtil();
try {
hf.process(templateName, targetFileName, root);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
Map root = new HashMap<>();
root.put("username", "美女");
root.put("age", 18);
root.put("sex", "男");
FreemarkerUtil.generatorHtmlFromTemplate("test.ftl", "E:/abc.html", root);
}
}
test.ftl
Hello world!
name : ${username}
age : ${age}
sex : ${sex}
----------------------------------------------------------------------------------------
图1 http://t.bdtool.net/freemarker/pgui_quickstart_createconfiguration.html
----------------------------------------------------------------------------------------
图2 http://t.bdtool.net/freemarker/pgui_config_templateloading.html
----------------------------------------------------------------------------------------
图3 同图2链接
----------------------------------------------------------------------------------------
图4 http://t.bdtool.net/freemarker/pgui_config_errorhandling.html
----------------------------------------------------------------------------------------
图4_1
----------------------------------------------------------------------------------------
图5 http://t.bdtool.net/freemarker/pgui_quickstart_gettemplate.html
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
如果不懂如何从maven上下载jar包,请看我的另一篇博客:
链接:如何从 maven repository 下载 jar 包