Freemarker 浅析
今天分享一下一个模板语言的使用,它就是Freemarker,有点类似与前些日子做Python的Django中的模板语言,其实原理上都是相似的。所以这里就不对那些基础性的语法类的直至进行讲解了,就拿几个实用的小例子来分析分析。
依赖
我们需要导入一个jar包,名为freemarker.jar。随便到网上下载一个就行,而且对其他诸如servlet等没有依赖,所以我们可以很轻松的进行移植操作。
工具类FreemarkerUtil.java
package main;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class FreemarkerUtil {
/**
* 根据给定的ftl(freemarker template language)来获得一个用于操作的模板
* @param name
* @return
*/
public Template getTemplate(String name) {
try {
// 通过Freemark而的Configuration读取到相应的模板ftl
Configuration cfg = new Configuration();
// 设定去哪里读取相关的模板FTL文件
cfg.setClassForTemplateLoading(this.getClass(), "/ftl");
// 在模板文件目录中找到名为name的文件
Template template = cfg.getTemplate(name);
return template != null ? template : null;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 通过控制台输出文件信息
*
* @param name
* @param root
*/
public void print(String name, Map<String, Object> root) {
try {
// 通过Template可以将模板文件输出到相应的流
Template template = this.getTemplate(name);
template.process(root, new PrintWriter(System.out));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 输出为HTML文件
*
* @param name
* @param root
* @param outfile
*/
public void htmlprint(String name, Map<String, Object> root, String outfile) {
FileWriter writer = null;
try {
// 使用一个路径实现将文件的输出
writer = new FileWriter(new File("src/"+ outfile));
Template template = this.getTemplate(name);
template.process(root, writer);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
案例分析一
我使用的第一个简单的模板01.ftl如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试</title>
</head>
<body>
<h1>你好${username}</h1>
</body>
</html>
测试代码如下:
/**
* 仅仅针对有一个数据的测试
*
* @throws Exception
*/
@Test
public void testftl1() throws Exception {
FreemarkerUtil util = new FreemarkerUtil();
Template template = util.getTemplate("01.ftl");
Map<String, Object> map = new HashMap<String, Object>();
map.put("username", "XIAO MARK");
// 默认输出到了控制台上
template.process(map, new OutputStreamWriter(System.out));
}
案例分析二
使用到的模板03.ftl
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>${user.id}-----${user.name}-----${user.age}</h1>
<#if user.age lt 12>
${user.name}还是一个小孩
<#elseif user.age lt 18>
${user.name}快成年
<#else>
${user.name}已经成年
</#if>
</body>
</html>
我们可以从模板中看到user.id,那就说明我们使用到了对象,所以UserBean 详情如下。
package main;
import java.io.Serializable;
public class User implements Serializable {
private int id;
private String name;
private int age;
private Group group;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + ", group=" + group + "]";
}
}
内有组合类Group的使用,
package main;
import java.io.Serializable;
public class Group implements Serializable{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Group [name=" + name + "]";
}
}
测试代码如下:
/**
* 控制台输出带有对象的模板使用案例
*
* @throws Exception
*/
@Test
public void testftl3() throws Exception {
FreemarkerUtil util = new FreemarkerUtil();
Template template = util.getTemplate("03.ftl");
Map<String, Object> map = new HashMap<String, Object>();
User user = new User();
user.setId(1);
user.setName(" 妈的智障 ");
user.setAge(21);
map.put("user", user);
template.process(map, new OutputStreamWriter(System.out));
}
/**
* 输出HTML文件形式的带有对象的测试案例
*
* @throws Exception
*/
@Test
public void testftl3outtofile() throws Exception {
FreemarkerUtil util = new FreemarkerUtil();
Template template = util.getTemplate("03.ftl");
Map<String, Object> map = new HashMap<String, Object>();
User user = new User();
user.setId(1);
user.setName(" 妈的智障 ");
user.setAge(21);
map.put("user", user);
util.htmlprint("03.ftl", map, "./../page/03ftloutfile.html");
}
案例分析三
使用到的模板05.ftl如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<hr/>
<#list users as user>
${user.id}---------${user.name}-------${user.age}<br/>
</#list>
</body>
</html>
测试代码如下:
/**
* 输出HTML文件形式的带有对象的测试案例
*
* @throws Exception
*/
@Test
public void testftl5outtofile() throws Exception {
FreemarkerUtil util = new FreemarkerUtil();
Template template = util.getTemplate("03.ftl");
Map<String, Object> map = new HashMap<String, Object>();
List<User> users = new ArrayList<User>();
for (int i = 1; i <= 10; i++) {
User user = new User();
user.setId(i);
user.setName(" 妈的智障 " + (i * i));
user.setAge((int) (Math.random() * 100));
users.add(user);
}
map.put("users", users);
util.htmlprint("05.ftl", map, "./../page/05ftloutfile.html");
}
案例分析四
使用到的模板文件06.ftl如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${user.id}-------${user.name}------${user.group!} <#-- !后为空就不输出 -->
<#--${user.group.name!}--><#-- 按照以上的方式加! freemarker仅仅只会判断group.name是不是空值 -->
${(user.group.name)!"1234"}
${(a.b)!"没有a.b元素"}
<#--
!:指定缺失变量的默认值
??:判断某个变量是否存在,返回boolean值
-->
<#if (a.b)??> <#--if后不用加$-->
不为空
<#else>
为空
</#if>
</body>
</html>
测试代码如下:
@Test
public void testftl6() throws Exception {
FreemarkerUtil util = new FreemarkerUtil();
Map<String,Object > map = new HashMap<String,Object>();
User user = new User();
Group group = new Group();
group.setName("1234");
user.setId(28);
user.setAge(27);
user.setName(" 妈的智障 ");
user.setGroup(group);
map.put("user", user);
util.print("06.ftl", map);
}
程序运行结果浏览
Freemarker 浅析的更多相关文章
- Freemarker 浅析 (zhuan)
http://blog.csdn.net/marksinoberg/article/details/52006311 ***************************************** ...
- Velocity浅析及与Jsp、Freemarker对比
转载自:http://www.cnblogs.com/petermsdn/archive/2011/05/06/2039178.html Velocity 是一个基于java 的模板引擎(templa ...
- Velocity浅析及与Jsp、Freemarker对比 分类: B1_JAVA 2014-07-21 09:14 637人阅读 评论(0) 收藏
转载自:http://www.cnblogs.com/petermsdn/archive/2011/05/06/2039178.html Velocity 是一个基于java 的模板引擎(templa ...
- GreenDao开源ORM框架浅析
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u011133213/article/details/37738943 Android程序开发中,避免 ...
- SQL Server on Linux 理由浅析
SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 高性能IO模型浅析
高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking ...
- netty5 HTTP协议栈浅析与实践
一.说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端.移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析.分拣后从不同的 ...
- spring源码分析之freemarker整合
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是一款程 ...
随机推荐
- ●洛谷P1903 [国家集训队]数颜色
题链: https://www.luogu.org/problemnew/show/P1903题解: 序列带修莫队, 推荐博客https://www.cnblogs.com/Paul-Guderian ...
- ●BZOJ 3143 [Hnoi2013]游走
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3143题解: 期望dp,高斯消元 首先有这样一种贪心分配边的编号的方案:(然后我没想到,233 ...
- ●BOZJ 1927 [Sdoi2010]星际竞速
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1927 题解: 显然是个DAG 建图和有向图最小路径覆盖的建图有些相似. 都是拆点为 u u' ...
- 洛谷4月月赛R1 Happy Poppin' Party Train
来自FallDream的博客,未经允许,请勿转载,谢谢. 听学长说的就来玩一玩,随便乱打打 没想到一堆人被取消了成绩,莫名混了个Rank3 还有第一题数据肯定是有问题 --------------- ...
- quartz入门详解
http://www.cnblogs.com/monian/p/3822980.html http://www.blogjava.NET/baoyaer/articles/155645.html 另: ...
- Tomcat 报错的解决方法:The APR based Apache Tomcat Native library which allows optimal
下载 http://tomcat.heanet.ie/native/1.1.12/binaries/win32/tcnative-1.dll将这个文件复制到C:\WINDOWS\system32\,. ...
- cookie读取、写入、删除
需求:用户访问页面之后出现弹框,点击关闭之后24小时内不会再出现.实现:cookie首先温习一点cookie的知识,明确以下几点:什么是cookie?cookie 是存储于访问者的计算机中的变量.每当 ...
- jsp&servlet——session监听
session监听,需要实现HttpSessionAttributeListener接口 attributeAdded:监听添加session attributeRemoved:监听删除session ...
- 关于html+ashx开发中几个问题的解决方法
在跟html+ashx打交道的园友们肯定会发现,这种模式虽然优美,但在开发中会遇到一些难处理的地方.我也不例外,下面是自己在实际开发中总结出来的几条经验,希望跟大家分享,更希望得到大家的建议和更好的解 ...
- Python中如何将二维列表转换成一维列表
已知:a = [(4,2,3), (5, 9, 1), (7,8,9)]希望将二维列表转换成一维列表:["4,2,3", "5, 9, 1", "7, ...