FreeMarker(1)基本使用

2018-03-29  本文已影响226人  NoChangeNoValue

Freemarker的使用方法

Maven工程添加依赖

<dependency>
  <groupId>org.freemarker</groupId>
  <artifactId>freemarker</artifactId>
  <version>2.3.23</version>
</dependency>

添加了jar包依赖后,首先我们需要了解下 原生方法如何使用。

使用步骤

@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();
    }

我们可以看到上述的方法 核心就是三个步骤

在第二个步骤,源码一定会设计一个接口用来获取模板加载路径,这个接口就是

所以很显然 下面加载模板路径的方法是对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

后续实现类的使用会补上............

简单使用

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

上一篇下一篇

猜你喜欢

热点阅读