美文网首页
FreeMarker(1)基本使用

FreeMarker(1)基本使用

作者: NoChangeNoValue | 来源:发表于2018-03-29 08:47 被阅读226次

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

    相关文章

      网友评论

          本文标题:FreeMarker(1)基本使用

          本文链接:https://www.haomeiwen.com/subject/jgdycftx.html