Freemarker使用入门
一、概述:
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写
Template + data_model = output
FreeMarker也是与Web容器无关的,也就是FreeMarker并不一定需要运行在Web容器中:FreeMarker同样可以应用于非Web应用程序环境.而且,FreeMarker并不是只能生成HTML页面,它也可以生成各种文本,如XML,RTF,Java源代码等.
二、前期准备:
下载jar包:freemarker-2.3.16.jar
三、HelloWorld:
A、调用代码:
/**
* 本示例未依赖WEB环境,仅简单按照模板生成文件
* Freemarker指令也非本文讨论内容
* Template + data_model = output
*/
public void testFreemarker() { try { String dir = "D:/TEST/freemarker/test"; //Freemarker模板存放的路径,可随意设置 Configuration cfg = new Configuration(); //Freemarker的起始类,要使用Freemarker功能必须通过该类 cfg.setDirectoryForTemplateLoading(new File(dir));//freemarker从什么地方加载模板文件 cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);//忽略异常 Template template = cfg.getTemplate("test01.ftl","UTF-8"); //加载模板 ,这里即从D:/TEST/freemarker/test下加载名称为test01.ftl的模板,编码可以不指定 //定义数据 ,这里将一个List放到了Map中,该Map即为所谓的data_model
Map<String, List<String>> root = new HashMap<String, List<String>>();
List<String> list = new ArrayList<String>();
for(int i=0; i<10; i++){
list.add("listvalue"+i);
}
root.put("list", list); //定义输出 ,这里只要指定输出即可,在web环境下,可以指定为response.getWriter();此处的做法是生成一个静态文件
Writer out = new FileWriter(dir + "/test01_out.txt"); //执行合并,会将合并后的文本输出到指定的地方
template.process(root, out); } catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
}
B、ftl文件:test01.ftl(后缀名可以为其他,如html)
listvalue:<#-- 正常显示的文本信息 --> <#list list as v>
${v} - ${v_index} [${v_has_next?string("y","n")}]
</#list>
C、生成的文本:test01_out.txt
listvalue: listvalue0 - 0 [y]
listvalue1 - 1 [y]
listvalue2 - 2 [y]
listvalue3 - 3 [y]
listvalue4 - 4 [y]
listvalue5 - 5 [y]
listvalue6 - 6 [y]
listvalue7 - 7 [y]
listvalue8 - 8 [y]
listvalue9 - 9 [n]
四、与WEB容器整合:
通常我们会在WEB容器中使用Freemarker,用于生成前台需要的页面,这里介绍Freemarker与spring的整合步骤.
在spring中提供了一个类org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer,可以通过在Controller中注入该类获取Freemarker的Configuration获取到Configuration后即可按照需求生成所要的页面和结果。
A、spring中的配置信息:
<bean id="text_cut" class="com.test.TextCutDirective"/><!--实现了freemarker.template.TemplateDirectiveModel接口-->
<bean id="freemarkerTest" class="com.test.FreemarkerTest">
<property name="freeMarkerConfigurer">
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="freemarkerVariables">
<!--
FreeMarkerConfigurer.setFreemarkerVariables(Map<String,Object> variables)
底层调用了FreeMarker的Configuration.setAllSharedVariables()方法。
因为更好的实践是将常用的指令作为共享变量放到Configuration中,使用方式见下面的示例。
[@text_cut source='abcdefghijklmnopqrstuvwxyz' length='12'/]
即从Configuration中获取text_cut对应的处理类,执行TemplateDirectiveModel.execute(...)
-->
<map>
<entry key="text_cut" value-ref="text_cut"/><!--本文只提供该类的实现,其他如process_time类似-->
<entry key="process_time" value-ref="process_time"/>
</map>
</property>
<!--模板的加载路径-->
<property name="templateLoaderPath" value="/WEB-INF" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">0</prop><!--模板刷新的时间,如果经常调试就用0 了-->
<prop key="defaultEncoding">UTF-8</prop>
<prop key="url_escaping_charset">UTF-8</prop>
<prop key="locale">zh_CN</prop>
<prop key="boolean_format">true,false</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="time_format">HH:mm:ss</prop>
<prop key="number_format">0.######</prop>
<prop key="whitespace_stripping">true</prop>
<prop key="auto_import">/ftl/index.ftl as p</prop>
<!--auto_import这个是关键了,就是自动加载的模板,我们为了减少手动加载,大可以在这里让程序自动加载,
但是又不能在这里写太多的文件名,所以就可以使用include指令,在index.ftl中include其他的ftl文件加载,
这样就可以将项目中所有的ftl文件加载进来-->
</props>
</property>
</bean>
</property>
</bean>
B、FreeMarkerTest代码:
@Service
public class FreeMarkerTest { private Configuration conf; //只需提供setter即可
public void setFreeMarkerConfigurer(
FreeMarkerConfigurer freeMarkerConfigurer) {
this.conf = freeMarkerConfigurer.getConfiguration();
} /**
* 对外提供的接口
* @throws IOException
* @throws TemplateException
*/
public void excute(String tplName, Map<String, Object> data, HttpServletResponse response) throws TemplateException, IOException { Writer out = null; try { //...此处可以根据需求指定模板的名称
Template template = conf.getTemplate(tplName); //此处指定输出到客户端
out = response.getWriter();
template.process(data, response.getWriter()); } catch (IOException e) {
e.printStackTrace();
} finally { if(out != null) {
out.flush();
out.close();
}
}
} }
C、TextCutDirective代码:
public class TextCutDirective implements TemplateDirectiveModel{ @SuppressWarnings("unchecked")
public void execute(Environment env, Map params, TemplateModel[] loopVars,
TemplateDirectiveBody body) throws TemplateException, IOException { //模板指令中传递的参数
String s = DirectiveUtils.getString("source", params);
Integer len = DirectiveUtils.getInt("length", params); if(s != null && s.length() < len) {
s = s.substring(0, len);
} if (s != null) {
Writer out = env.getOut();
if (len != null) {
out.append(s);
} else {
out.append(s);
}
}
} }
D、ftl文件:test02.ftl(后缀名可以为其他,如html)
[@text_cut source='abcdefghijklmnopqrstuvwxyz' length='12'/]
E、运行结果:
abcdefghijkl
Freemarker使用入门的更多相关文章
- FreeMarker 快速入门
FreeMarker 快速入门 FreeMarker是一个很值得去学习的模版引擎.它是基于模板文件生成其他文本的通用工具.本章内容通过如何使用FreeMarker生成Html web 页面 和 代码自 ...
- springboot2.0整合freemarker快速入门
目录 1. 快速入门 1.1 创建工程pom.xml文件如下 1.2 编辑application.yml 1.3 创建模型类 1.4 创建模板 1.5 创建controller 1.6 测试 2. F ...
- FreeMarker简单入门到使用
FreeMarker freemarker是一个用java开发的模版引擎,百度百科: 常用的java模版还有快要被抛弃的Jsp(熟悉).Thymeleaf(了解).Velocity(不知) freem ...
- freemarker技术入门例子(结合struts2)
由于最近项目里面要求要使用freemarker技术来做展现层,所以在网上搜索了好多资料,基础知识是看了李刚原来写的那本<struts2权威指南>.一直想在网上找一个很基础的例子来入门,但是 ...
- FreeMarker快速入门
虽然当前比较推荐使用thymeleaf替代jsp作为java网页开发的模板语言,不过公司推荐使用freemarker,那就顺势而为,速度学一发,然后迅速开始新项目了. 简介 FreeMarker第一个 ...
- freemarker基本入门教程
copy自http://demojava.iteye.com/blog/800204 以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主 ...
- freemarker从入门到精通
目录 一:概述 二:Freemarker的Helloworld 三:freemarker模板语法 1.访问map中的key 2.访问POJO中的属性 3.取集合中的数据 4.判断 5.日期 6.Nul ...
- 【JavaWeb】FreeMarker快速入门
FreeMarker Freemarker是免费开源的模板引擎技术: Freemarker脚本为Freemarker Template Language: Freemarker提供了大量内建函数来简化 ...
- 【FreeMarker】FreeMarker快速入门(一)
什么是 FreeMarker FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具. 它不是面向最终用户 ...
随机推荐
- 开源中国git使用方法
1.添加公匙. 打开开源中国git公匙管理 用TortoiseGit Puttygen生成公匙文件 生成过程中 不断移动点击鼠标(因为生成密匙过程是记录鼠标变化作为加密过程) ...
- python之路一
Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC ...
- centos 终端 字体颜色
默认情况下,没有颜色. https://www.centos.org/docs/2/rhl-gsg-en-7.2/ls-color.html git也默认没有颜色,破解如下: git config - ...
- JAVA 回调机制(callback)
序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回 ...
- Git引用
原文: http://gitbook.liuhui998.com/7_3.html git中,分支(branch), 远程跟踪分支(remote-tracking branch)以及标签(tag)都是 ...
- C# 读写ini文件
1.添加引用 using System.IO; using System.Runtime.InteropServices; 2.声明API函数 #region API函数声明 [DllImport(& ...
- sql server 行转列(转载)
SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...
- EF没有同步更新(转)
不知道这算不算一个bug,当你新建一个从数据库生成的edmx时,他能正确的生成所有的tt文件,但是当你从数据库更新表结构时,他不能正确的更新tt文件,以建立Model1.edmx为例,在解决方案中展开 ...
- HDU 5996 dingyeye loves stone ---BestCoder Round #90
题目链接 设根节点的深度为0,将所有深度为奇数的节点的石子数目xor起来,则先手必胜当且仅当这个xor和不为0. 证明同阶梯博弈.对于偶深度的点上的石子,若对手移动它们,则可模仿操作:对于奇深度上的石 ...
- IOS - socket 编程初体验
#import "ViewController.h" @interface ViewController () <NSStreamDelegate, UITextFieldD ...