[Freemarker] 在Java中简单实现对Freemarker的引用
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的引用的更多相关文章
- 不用splitter控件 简单实现对mfc对话框的分割的方法
不用splitter控件 简单实现对mfc对话框的分割的方法 直接贴上源代码主要部分吧 这个是基于对话框的工程 进行对话框的分割实现 只是相应了三个消息函数,看一下就会明白的 我空间资源里边有现成的 ...
- JAVA中简单的for循环竟有这么多坑,你踩过吗
JAVA中简单的for循环竟有这么多坑,你踩过吗 实际的业务项目开发中,大家应该对从给定的list中剔除不满足条件的元素这个操作不陌生吧? 很多同学可以立刻想出很多种实现的方式,但你想到的这些实现方式 ...
- java中简单内存计算
今天面试遇到一个问题,假设一个类中只声明一个int类型,那么这个对象多大,这里先写出解决方案,首先引入内存计算工具lucene-core, <dependency> <groupId ...
- Java中带包(创建及引用)的类的编译
Java中带包(创建及引用)的类的编译与调试 java源程序的编译大家都知道,也就是cmd中到源文件所在目录下javac **.java即可,当程序中有包声明还能简简单单的直接javac **.jav ...
- Java中到底是值传递还是引用传递?
Java中到底是值传递还是引用传递? 我们先回顾一下基本概念 实参和形参 参数在编程语言中是执行程序需要的数据,这个数据一般保存在变量中.在Java中定义一个方法时,可以定义一些参数, 举个例子: p ...
- Java中“指针”的解释以及对“引用”的理解
Java中"指针"的解释以及对"引用"的理解 初学Java面对对象编程,对于一些概念还真的有点难以理解,主要是因为不由自主的联系到以前学过的C语言知识,时不时的 ...
- FreeMarker在JAVA中应用入门
在项目中通常有生成XML文件发送到另一个系统的需求,简单的办法可以是用一个XML模板,通过Freemarker替换其中的'Mark'(${}),生成最终的XML文件. 下面记录了一下简单的示例步骤: ...
- java中简单的反射
1.为什么会用到反射机制? 最近需要写定时服务,如果一个一个去写定时服务的话,后期维护是很烦人的,通过反射机制,我们就可以将定时服务的信息通过数据配置来实现,这样我们后期就可以将整个模块交给运维人员去 ...
- java中的正则表达式捕获组与引用的概念
今天群里有个人问,怎样用增则表达式匹配三角形的三边,其实只是要匹配三个数字而已,如 301 402 503 开始认为很简单,我就写了一个 "(([1-9]\\d?)\\s){2}$2&q ...
随机推荐
- numpy.matlib.randn(标准正态分布)
#网址 http://docs.scipy.org/doc/numpy/reference/generated/numpy.matlib.randn.html#numpy.matlib.randn n ...
- event.keyCode 事件属性
转自:http://www.runoob.com/jsref/event-key-keycode.html <!DOCTYPE html> <html> <head> ...
- JQuery 1.6之后,获取属性推荐用prop
今天在做界面,要获取CheckBox的是否被选中, var ck=$("#id").attr("checked"); 但是这样取得的值是undefined, 查 ...
- JDBC操作MySQL(crud)
这两天复习了一下JDBC操作MySQL,把crud操作的例子记一下, 类库链接(mysql-connector-java-5.1.37-bin.jar):http://files.cnblogs.co ...
- mongodb 查询数据
MongoDB概念解析: 等同于SQL的数据库表:collectiondocument:等同于SQL的数据记录行field:等同于SQL的数据字段表连接,MongoDB不支持主键,MongoDB自动将 ...
- JavaScript学习系列1 基础-变量
1. 在一次面试中,被问到JavaScript中使用严格模式有什么区别, 这里的严格模式指的是 ECMAScript5严格模式 我们首先来看看普通模式,也就是非严格模式 a = 5; console. ...
- JavaScript中函数作为值
function myfunc() { // .. } 这是个函数,这样理解, myfunc只是外层作用域的一个变量,指向刚刚声明的function. 也就是说,function本身就是一个值, 就像 ...
- 22. Bypass X-WAF SQL注入防御(多姿势)
0x00 前言 X-WAF是一款适用中.小企业的云WAF系统,让中.小企业也可以非常方便地拥有自己的免费云WAF. 本文从代码出发,一步步理解WAF的工作原理,多姿势进行WAF Bypass. 0x0 ...
- 修改TABLE中的Column的属性
删除主键名 这个主键名并不是列名,而是主键约束的名字,如果当时设置主键约束时没有制定约束的名字 设置主键的语句:ALTER TABLE P add constraint pk PRIMARY KEY ...
- asp.net Page.Controls对象(找到所有服务器控件)
前台 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="De ...