FreeMarker(1)基本使用

Freemarker的使用方法

Maven工程添加依赖


  org.freemarker
  freemarker
  2.3.23

添加了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 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);

范例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输出测试

你可能感兴趣的:(FreeMarker(1)基本使用)