Freemarker的使用方法
Maven工程添加依赖
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
添加了jar包依赖后,首先我们需要了解下 原生方法如何使用。
使用步骤
- 第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。
- 第二步:设置模板文件所在的路径。
- 第三步:设置模板文件使用的字符集。一般就是utf-8.
- 第四步:加载一个模板,创建一个模板对象。
- 第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。
- 第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。
- 第七步:调用模板对象的process方法输出文件。
- 第八步:关闭流。
@Test
public void genFile() throws Exception {
// 第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。
Configuration configuration = new Configuration(Configuration.getVersion());
// 第二步:设置模板文件所在的路径。
configuration.setDirectoryForTemplateLoading(new File("D:/workspaces-itcast/term197/e3-item-web/src/main/webapp/WEB-INF/ftl"));
// 第三步:设置模板文件使用的字符集。一般就是utf-8.
configuration.setDefaultEncoding("utf-8");
// 第四步:加载一个模板,创建一个模板对象。
Template template = configuration.getTemplate("hello.ftl");
// 第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。
Map dataModel = new HashMap<>();
//向数据集中添加数据
dataModel.put("hello", "this is my first freemarker test.");
// 第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。
Writer out = new FileWriter(new File("D:/temp/term197/out/hello.html"));
// 第七步:调用模板对象的process方法输出文件。
template.process(dataModel, out);
// 第八步:关闭流。
out.close();
}
我们可以看到上述的方法 核心就是三个步骤
- 创建配置类
- 为配置类添加模板加载路径
- 为模板绑定数据
在第二个步骤,源码一定会设计一个接口用来获取模板加载路径,这个接口就是
-
TemplateLoader有多个实现类 对应多种不同的使用场景
image.png
所以很显然 下面加载模板路径的方法是对FileTemplateLoader实现类的再封装
// 第二步:设置模板文件所在的路径。
configuration.setDirectoryForTemplateLoading(new File("D:/workspaces-itcast/term197/e3-item-web/src/main/webapp/WEB-INF/ftl"));
下面介绍TemplateLoader不同接口实现类的使用
StringTemplateLoader
@Test
public void doTest() {
// System.out.println(test);
StringWriter writer = new StringWriter();
String sql = "要显示的内容${test}";
Configuration freeMarkConf = new Configuration(Configuration.getVersion());//初始化Configuration
StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();//配置模板加载器
stringTemplateLoader.putTemplate("sql", sql);
freeMarkConf.setTemplateLoader(stringTemplateLoader);
try {
Template template = freeMarkConf.getTemplate("sql", "UTF-8"); //获取模板加载器中的模板
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("test", "helloWorld");
template.process(paramsMap, writer);
System.out.println(writer.toString());
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
}
输出:
image.png
后续实现类的使用会补上............
简单使用
- 对于上述的templateLoader实现类的使用,sdk提供了三种封装的便捷使用方法
在Configuration中可以使用下面的方法来方便建立三种模板加载。(每种方法都会在其内部新建一个模板加载器对象,然后创建Configuration实例来使用它。)
void setDirectoryForTemplateLoading(File dir);
//第一种方法在磁盘的文件系统上设置了一个明确的目录,它确定了从哪里加载模板。不要说可能,File参数肯定是一个存在的目录。否则,将会抛出异常。
void setClassForTemplateLoading(Class cl, String prefix);
//第二种调用方法使用了一个Class类型的参数和一个前缀。这是让你来指定什么时候通过相同的机制来加载模板,
//不过是用Java的ClassLoader来加载类。这就意味着传入的Class参数会被用来调用Class.getResource()方法来找到模板。参数
//prefix是给模板的名称来加前缀的。在实际运行的环境中,类加载机制是首选用来加载模板的方法,因为通常情况下,从类路径
//下加载文件的这种机制,要比从文件系统的特定目录位置加载安全而且简单。在最终的应用程序中,所有代码都使用.jar文件打包也是不错的,这样用户就可以直接执行包含所有资源的.jar文件了。
void setServletContextForTemplateLoading(Object servletContext, String path);
<!--第三种调用方式需要Web应用的上下文和一个基路径作为参数,这个基路径是Web应用根路径(WEB-INF目录的上级目录)的
相对路径。那么加载器将会从Web应用目录开始加载模板。尽管加载方法对没有打包的.war文件起作用,因为它使用了ServletContext.getResource()
方法来访问模板,注意这里我们指的是“目录”。如果忽略了第二个参数(或使用了””),那么就可以混合存储静态文件(.html,.jpg等)和.ftl文件,
只是.ftl文件可以被送到客户端执行。当然必须在WEB-INF/web.xml中配置一个Servlet来处理URI格式为*.ftl的用户请求,
否则客户端无法获取到模板,因此你将会看到Web服务器给出的秘密提示内容。在站点中不能使用空路径,这将成为一个问题,
你应该在WEB-INF目录下的某个位置存储模板文件,这样模板源文件就不会偶然地被执行到,这种机制对servlet应用程序来加载模板来说,
是非常好用的方式,而且模板可以自动更新而不需重启Web应用程序,但是对于类加载机制,这样就行不通了。-->
范例1:
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(new File("/home/user/template"));
cfg.getTemplate("Base.ftl");
范例2:
基于WebRoot下的。比如: setServletContextForTemplateLoading(context, "/ftl") 就是 /WebRoot/ftl目录。
范例3:
Configuration cfg = new Configuration();
cfg.setClassForTemplateLoading(FreemarkerUtil.class, "/template");
cfg.getTemplate("Base.ftl");
其实这个方法是根据类加载路径来判断的,最终会执行以下代码:
FreemarkerUtil.class.getClassLoader().getResource("/template/");
- 当设置完了模板路径后
// 第四步:加载一个模板,创建一个模板对象。
Template template = configuration.getTemplate("hello.ftl");
// 第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。
Map dataModel = new HashMap<>();
//向数据集中添加数据
dataModel.put("hello", "this is my first freemarker test.");
// 第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。
Writer out = new FileWriter(new File("D:/temp/term197/out/hello.html"));
// 第七步:调用模板对象的process方法输出文件。
template.process(dataModel, out);
// 第八步:关闭流。
out.close();
接下来的步骤便是 根据模板名 加载模板路径下的模板;将模板和数据绑定并输出;template.process(dataModel, out); 的第二个参数用的writer接口 可以定义StringWriter输出测试
。
网友评论