FreeMarker(1)基本使用

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容

  • 亲爱的孩子,还有两天你就16岁了,这是对么如花的年纪啊,但是我儿去在受着抑郁症的折磨,最让妈妈难受的是,明...
    我爱天使2001阅读 324评论 0 1
  • 我承认 这一刻 爱上了 这冬日里的暖阳 爱上了 这一抹光 我和影子捉着迷藏 心里边不经意间开出了花 即使只有影子作...
    Jiebabe阅读 606评论 0 0
  • 充实的一天,陪伴孩子,处理工作上的事情,还帮助朋友咨询解决孩子上学的问题。晚上给家人们做美味的晚饭!陪儿子读五本书!
    幸运的王亚男阅读 105评论 0 1
  • 《朗读者》最火的第一期,你看了吗?现在到了第六期,你还在看吗?朗读带来的情感激荡之后,你做了什么? 2月18日星期...
    策划师与小王子阅读 873评论 0 6