Demo目录结构

├─src
│ ├─main
│ │ ├─java
│ │ │ └─demo
│ │ │ └─freemarker
│ │ │ ├─main
│ │ │ │ Test.java
│ │ │ │
│ │ │ ├─model
│ │ │ │ User.java
│ │ │ │
│ │ │ ├─output
│ │ │ │ 01.html
│ │ │ │
│ │ │ ├─template
│ │ │ │ 01.ftl
│ │ │ │
│ │ │ └─util
│ │ │ FreeMarkerUtil.java

1. 添加对freemarker的依赖

这里我使用的新建一个Maven Project,在pom.xml中添加dependency

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

2. 知道你喜欢看源码

3. 代码解读

FreeMarkerUtil.java

getTemplateByName(String name)

    public Template getTemplateByName(String name) {
Template template = null; try {
Configuration configuration = new Configuration(new Version("2.3.23"));
configuration.setClassForTemplateLoading(this.getClass(), "../template/");
template = configuration.getTemplate(name);
} catch (TemplateNotFoundException e) {
e.printStackTrace();
} catch (MalformedTemplateNameException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} return template;
}

由于引入的freemarker的version是2.3.23,这个版本中废弃(Deprecated)了Configuration空的构造函数,在2.3.20这个版本中还是OK的,目前这个版本需要传入一个Version对象,configuration中需要设置template模板存放的basePackagePath,然后通过传入的name在对应的basePackagePath中查找对应的ftl文件

showTemplate(String name, Map<String, Object> map)

    public void showTemplate(String name, Map<String, Object> map) {
try {
Template template = this.getTemplateByName(name);
template.process(map, new PrintWriter(System.out));
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

该方法用于在Console下打印出生成的视图,Template中有process方法是这一逻辑,也方便查看结果

createFile(String templateName, Map<String, Object> map, String fileName)

public void createFile(String templateName, Map<String, Object> map, String fileName) {
try {
FileWriter fileWriter = new FileWriter("src/main/java/demo/freemarker/output/" + fileName);
Template template = this.getTemplateByName(templateName);
template.process(map, fileWriter);
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
}
}

该方法用于生成输出文件

FTL中传入对象

首先修改ftl模板

<body>
Hello, ${userName}, welcome!!!
Users:
ID: ${user.id}
UserName: ${user.name}
Age: ${user.age}
</body>
        User user = new User();
user.setId(101);
user.setName("Tom");
user.setAge(12);
map.put("user", user);

看下生成的结果

FTL中传入集合试试

再次修改ftl模板

<body>
<div>
Input string:
Hello, ${userName}, welcome!!!
</div>
<div>
Input object:
ID: ${user.id}
UserName: ${user.name}
Age: ${user.age}
</div>
<div>
Input objects:
<table border="1">
<tr>
<th>ID</th>
<th>Name</th>
<th>Age</th>
</tr>
<#list users as user>
<tr>
<td>ID: ${user.id}</td>
<td>Name: ${user.name}</td>
<td>Age: ${user.age}</td>
</tr>
</#list>
</table>
</div>
</body>

传入User对象集合

        List<User> users = new ArrayList<User>();
User user1 = new User();
user1.setId(1);
user1.setName("User 1");
user1.setAge(10);
users.add(user1); User user2 = new User();
user2.setId(2);
user2.setName("User 2");
user2.setAge(11);
users.add(user2); User user3 = new User();
user3.setId(3);
user3.setName("User 3");
user3.setAge(3);
users.add(user3); map.put("users", users);

看下生成效果

发挥你的想象,ftl模板是不是很有用,有了它可以少写多少代码

[Freemarker] 在Java中简单实现对Freemarker的引用的更多相关文章

  1. 不用splitter控件 简单实现对mfc对话框的分割的方法

    不用splitter控件  简单实现对mfc对话框的分割的方法 直接贴上源代码主要部分吧 这个是基于对话框的工程 进行对话框的分割实现 只是相应了三个消息函数,看一下就会明白的 我空间资源里边有现成的 ...

  2. JAVA中简单的for循环竟有这么多坑,你踩过吗

    JAVA中简单的for循环竟有这么多坑,你踩过吗 实际的业务项目开发中,大家应该对从给定的list中剔除不满足条件的元素这个操作不陌生吧? 很多同学可以立刻想出很多种实现的方式,但你想到的这些实现方式 ...

  3. java中简单内存计算

    今天面试遇到一个问题,假设一个类中只声明一个int类型,那么这个对象多大,这里先写出解决方案,首先引入内存计算工具lucene-core, <dependency> <groupId ...

  4. Java中带包(创建及引用)的类的编译

    Java中带包(创建及引用)的类的编译与调试 java源程序的编译大家都知道,也就是cmd中到源文件所在目录下javac **.java即可,当程序中有包声明还能简简单单的直接javac **.jav ...

  5. Java中到底是值传递还是引用传递?

    Java中到底是值传递还是引用传递? 我们先回顾一下基本概念 实参和形参 参数在编程语言中是执行程序需要的数据,这个数据一般保存在变量中.在Java中定义一个方法时,可以定义一些参数, 举个例子: p ...

  6. Java中“指针”的解释以及对“引用”的理解

    Java中"指针"的解释以及对"引用"的理解 初学Java面对对象编程,对于一些概念还真的有点难以理解,主要是因为不由自主的联系到以前学过的C语言知识,时不时的 ...

  7. FreeMarker在JAVA中应用入门

    在项目中通常有生成XML文件发送到另一个系统的需求,简单的办法可以是用一个XML模板,通过Freemarker替换其中的'Mark'(${}),生成最终的XML文件. 下面记录了一下简单的示例步骤: ...

  8. java中简单的反射

    1.为什么会用到反射机制? 最近需要写定时服务,如果一个一个去写定时服务的话,后期维护是很烦人的,通过反射机制,我们就可以将定时服务的信息通过数据配置来实现,这样我们后期就可以将整个模块交给运维人员去 ...

  9. java中的正则表达式捕获组与引用的概念

    今天群里有个人问,怎样用增则表达式匹配三角形的三边,其实只是要匹配三个数字而已,如 301 402 503 开始认为很简单,我就写了一个   "(([1-9]\\d?)\\s){2}$2&q ...

随机推荐

  1. C++经典问题:狐狸找兔子

    问题描述: 围绕着山顶有10个洞,一只狐狸和一只兔子住在各自的洞里.狐狸想吃掉兔子.一天,兔子对狐狸说:"你想吃我有一个条件,先把洞从1-10编上号,你从10号洞出发,先到1号洞找我:第二次 ...

  2. Hadoop的namenode和secondnamenode分开部署在不同服务器

    一.系统环境:  Hadoop 0.20.2.JDK 1.6.Linux操作系统 二.使用背景  网上关于Hadoop的集群配置,很多情况下,都是把namenode和secondnamenode部署在 ...

  3. R语言中的字符处理

    R语言中的字符处理 (2011-07-10 22:29:48) 转载▼ 标签: r语言 字符处理 字符串 连接 分割 分类: R R的字符串处理能力还是很强大的,具体有base包的几个函数和strin ...

  4. Some of your uncommitted changes would be overwritten by syncing.Please commit your changes then try

    解决方法有三种,在GitHub shel中输入以下命令,任选一种方法就能解决问题 git reset --hard HEAD -- Destructive. When you do this you' ...

  5. js注册

    ScriptManager.RegisterStartupScript(this, GetType(), "", "alert('修改失败!')", true) ...

  6. wpf listboxitem添加下划线

    1.通过List<string>进行赋值,没有字段绑定 // 前台xaml <ListBox x:Name="list1"> <ListBox.Ite ...

  7. [CentOS7] ssh免密登录 scp免密传输

    我们采用RSA非对称加密算法,原理: 如果,A要和B通讯,则: (1). A通过RSA算法生成公钥(.pub)和私钥(公钥用于加密,私钥用于解密) (2). B将A的公钥文件(.pub)内容加入到au ...

  8. 网络请求返回HTTP状态码(404,400,500)

    HTTP状态码(HTTP Status Code) 一些常见的状态码为: - 服务器成功返回网页 - 请求的网页不存在 - 服务不可用 所有状态解释: 1xx(临时响应) 表示临时响应并需要请求者继续 ...

  9. PAT 1071【STL string应用】

    1.单case很多清空没必要的 2.string+ char 最好用pushback 3.string +string就直接+ #include <bits/stdc++.h> using ...

  10. 51nod1091(贪心)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1091 题意:中文题诶- 思路:贪心: 我们先将数据按照左端点 ...