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程序辨别系统是16位or32位

    方法: 32位处理器就是一次只能处理32位,也就是4个字节的数据,虚拟地址空间的最大大小是4G,而64位处理一次就能处理64位,即8个字节的数据,最大虚拟地址空间的最大大小是16T.最明显的是指针大小 ...

  2. error C2144: 语法错误:“int”的前面应有“;”

    error C2144: 语法错误:"int"的前面应有";" C++- error C2144 syntax error : 'int' should be ...

  3. 7.SSRF漏洞绕过IP限制

    绕过SSRF过滤的几种方法 下文出现的192.168.0.1,10.0.0.1全部为服务器端的内网地址. 1.更改IP地址写法 一些开发者会通过对传过来的URL参数进行正则匹配的方式来过滤掉内网IP, ...

  4. PHP中ob_start()函数的用法

    ob_start()函数用于打开缓冲区,比如header()函数之前如果就有输出,包括回车/空格/换行/都会有"Header had all ready send by"的错误,这 ...

  5. debian系Linux中文系统目录改为英文目录的解决方法

    之前给笔记本装的kali是英文版,系统安装好了后再修改系统语言为中文,或者直接就用英文系统,也是可以的. 后来笔记本的硬盘坏掉了,换ssd,然后安装kali的中文版,中文是方便,但是进去后就不爽了. ...

  6. Flask 入门(第一篇)

    1. 认识 Flask Flask 是一个微型 Web 框架,依赖于 jinjia2 模板系统和 Werkzeug WSGI(本质为 Socket 服务端) 服务,默认情况不支持数据库抽象层.表单验证 ...

  7. nginx访问日志中添加接口返回值

    因为nginx作为web服务器时,会代理后端的一些接口,这时访问日志中只能记录访问接口的status码,也就是说,只能获得200.404 这些的值 那么如何获得接口返回的response值呢? 下面开 ...

  8. 机器学习十大算法之EM算法

    此文已由作者赵斌授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 由于目前论坛的Markdown不支持Mathjax,数学公式没法正常识别,文章只能用截图上传了...     ...

  9. Note: Bimodal Content Defined Chunking for Backup Streams

    CDC算法给出了一个chunk的大小的最小值.最大值.平均值的界定. Method Using chunk existence information breaking-apart algorithm ...

  10. window下安装composer步骤(linux待研究)

    window下安装composer步骤--注意(安装完之后需要重启电脑才能生效) 转发:https://blog.csdn.net/wengedexiaozao/article/details/798 ...