FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写
FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序
虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成
页面,通过模板显示准备的数据
package com.xyj.com.tool.template;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import freemarker.cache.MruCacheStorage;
import freemarker.cache.MultiTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
/**
* @className:FreemarkerUtil.java
* @classDescription:freemarker操作类
* @author:xiayingjie
* @createTime:2010-12-2
*/
public class FreemarkerUtil {
private static String encoding="UTF-8";
private static Configuration cfg = null;
private static Template template = null;
/**
* 初始化配置对象
*
* @param dir
* @return
*/
public static Configuration initConfig() {
if(cfg==null){
cfg = new Configuration();
// 设置默认包装
setObjectWrapper();
// 设置缓存
setCache(20, 250);
// 设置cfg编码
setCfgEncoding(encoding);
}
return cfg;
}
// ------------------设置模版 ,三种模式----------------
/**
* 设置模板存在的目录(如果目录不存在则抛出异常)
*
* @param dir
* 模板存在的目录
*/
public static void setTemplet(String dir) {
try {
cfg.setDirectoryForTemplateLoading(new File(dir));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* class方式加载模板(比上一种要稳定和安全,你可以把资源文件或者图标打包到.jar文件中)
*
* @param object
* @param prefix
*/
public static void setTemplet(Class object, String prefix) {
cfg.setClassForTemplateLoading(object, prefix);
}
/**
* web应用上下文加载模板
*
* @param servletContext
* web应用上下文
* @param path
* 基路径(相对于WEB—INF目录)
*/
public static void setTemplet(Object servletContext, String path) {
cfg.setServletContextForTemplateLoading(servletContext, path);
}
/**
* 从多个位置加载模板 例: FileTemplateLoader ftl=new FileTemplateLoader(new
* File("temp/template")); FileTemplateLoader ft2=new FileTemplateLoader(new
* File("uses/template")); ClassTemplateLoader ct1=new
* ClassTemplateLoader(getClass(),""); TemplteLoader[]loaders=new
* TemplateLoader{ft1,ft2,ct1}; 加载模板会先从ft1中查找,如果没有则ft2,其次ct1
*
* @param loaders
* 多模板位置
*/
public static void SetMultiTemplet(TemplateLoader[] loaders) {
MultiTemplateLoader multiTemplate = new MultiTemplateLoader(loaders);
cfg.setTemplateLoader(multiTemplate);
}
// ---------------对config的设置--------------
/**
* 设置对象包装模式,这里设置成默认包装
*
*/
public static void setObjectWrapper() {
cfg.setObjectWrapper(new DefaultObjectWrapper());
}
/**
* 设置freemarker缓存(建议设置成非0的数值,不然每次生成会导致重复加载) 如果一级缓存满的话,使用的少的文件将推送到二级缓存
*
* @param strong
* 引用区域 (一级缓存)20
* @param soft
* 弱引用区域(二级缓存)250
*/
public static void setCache(int strong, int soft) {
cfg.setCacheStorage(new MruCacheStorage(strong, soft));
// cfg.setSetting(Configuration.CACHE_STORAGE_KEY,"strong:"+strong+",soft:"+soft);
}
/**
* 清除缓存
*/
public static void clearCache() {
cfg.clearTemplateCache();
}
/**
* 设置Configuration默认编码
*
* @param encoding
* 编码例如"UTF8","ISO8859-1"
*/
private static void setCfgEncoding(String encoding) {
cfg.setDefaultEncoding(encoding);
}
// ----------template操作----------
/**
* 获取模板(如果文件不存在则抛出异常)
*
* @param fileName
* 模板名
* @return Temlplate 模板对象
*/
public static Template getTemplate(String fileName) {
try {
template = cfg.getTemplate(fileName);
} catch (IOException e) {
e.printStackTrace();
}
return template;
}
/**
* 设置模板编码
*
* @param template
* 模板对象
* @param encoding
* 编码
*/
private static void setTempEncoding(String encoding) {
template.setEncoding(encoding);
}
/**
* 获取输出对象
*
* @param outFile
* 输出的文件路径
* @return Writer
*/
public static void process(Object object, String outFilePath,
String encoding) {
try {
File outFile = new File(outFilePath);
if (!outFile.exists()) {
outFile.createNewFile();
}
Writer out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outFile), encoding));
// 合并数据和模型
template.process(object, out);
// 清除缓存
out.flush();
out.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 获取输出对象
*
* @param outFile
* 输出的文件路径
* @return Writer
*/
public static String process(Object object) {
String outString=null;
StringWriter sw=new StringWriter();
try {
Writer out = new BufferedWriter(sw);
// 合并数据和模型
template.process(object, out);
// 清除缓存
out.flush();
out.close();
outString=sw.getBuffer().toString();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return outString;
}
/**
* 根据模版生成文件 简化操作
*
* @param directory
* template文件目录
* @param fileName
* 文件名
* @param outFilePath
* 输出文件
* @param object
* 模版
* @param encoding
* 编码
* @return
*/
public static String makeTemplate2Str(String directory, String fileName, Object object) {
String out = null;
try {
// 初始化config
initConfig();
// 设置模版路径
setTemplet(directory);
// 获取模板
getTemplate(fileName);
// 设置模版编码
setTempEncoding(encoding);
// 输出文件
out=process(object);
} catch (Exception e) {
e.printStackTrace();
}
return out;
}
/**
* 根据模版生成文件 简化操作
*
* @param directory
* template文件目录
* @param fileName
* 文件名
* @param outFilePath
* 输出文件
* @param object
* 模版
* @param encoding
* 编码
* @return
*/
public static boolean makeTemplate(String directory, String fileName,
String outFilePath, Object object) {
boolean flag = false;
try {
// 初始化config
initConfig();
// 设置模版路径
setTemplet(directory);
// 获取模板
getTemplate(fileName);
// 设置模版编码
setTempEncoding(encoding);
// 输出文件
process(object, outFilePath, encoding);
flag = true;
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
public static void main(String[]args){
String directory=System.getProperty("user.dir")+"/src/com/xyj/com/tool/template/";
System.out.println(directory);
String outPath="D:/aa.xml";
String fileName="search.xml";
List<Music> l=new ArrayList<Music>();
Music m1=new Music();
m1.setMusicName("一千个伤心的理由");
m1.setSinger("张学友");
m1.setUrl("http://www.txt.com/client-data!ff.action?id=90823");
Music m2=new Music();
m2.setMusicName("一路上&有你");
m2.setSinger("张学友");
m2.setUrl("http://gh.gh.com/yyc/client-data!esdown :!: .action?id=92671");
l.add(m1);
l.add(m2);
// 创建根哈希表
Map root = new HashMap();
// 在根中放入字符串"user"
root.put("musicList", l);
// 为"latestProduct"创建哈希表
// FreemarkerUtil.makeTemplate(directory,fileName,outFilePath,root);
long start=System.currentTimeMillis();
for(int i=0;i<100000;i++){
String s=FreemarkerUtil.makeTemplate2Str(directory,fileName,root);
}
//String t=FreemarkerUtil.makeTemplate2Str(directory,fileName,root);
System.out.println(System.currentTimeMillis()-start);
//System.out.println(s);
}
}
/**
* 页面格式: 集合: <#if 集合list??> <#list 集合list as 自定义对象object > <#if object.属性=="">
* ${object.属性} </#if> <#if 10<object.属性?length> ${object.属性[0..9]} <#else>
* ${object.属性} </#if> </#list> </#if>
*
* 对象: <#if object.属性==""> ${object.属性} </#if> <#if 10<object.属性?length>
* ${object.属性[0..9]} <#else> ${object.属性} </#if> hashMap:同上
*
* 条件判断: <#if condition> ... <#elseif condition2> ... <#else> ... </#if> 集合:
* <#list sequence as item> ... </#list> item_index:这是一个包含当前项在循环中的步进索引的数值。
* item_has_next:来辨别当前项是否是序列的最后一项的布尔值。 include指令:<#include "/common/navbar.html"
* parse=false encoding="UTF-8"> parse:true-表示解析导入文件语法 import指令:<#import
* "/libs/mylib.ftl" as my> <@my.copyright date="1999-2002"/>
* noparse指令:不会在这个指令之间进行解析 compress指令:删除多余的空格,一行的前后空格 escape指令:<#escape x as
* x?html>First name: ${firstName}Last name: ${lastName}</#escape> 等同于 First
* name: ${firstName?html}Last name: ${lastName?html}
* assign指令:创建一个新的变量,或者替换一个已经存在的变量<#assign name=value>
* global指令:在所有命名空间都可用<#global name=value> local指令 :定义 root 中局部对象<#local
* name=value> setting指令:格式化输出的值:<#setting
* name=value>-locale:en,en_US,en_US_MAC;
* number_format:number,computer,currency,percent;
* boolean_format:是"true,false"date_format,time_format,datetime_format:"short",
* "long_medium", "MM/dd/yyyy" url_escaping_charset:用来 URL 转义(比如${foo?url})的字符集;
*
* 函数:后面加问号表示 string?cap_first cap_first:转换首字母大写 lower_case:转换成小写
* upper_case:转换成大写 size:序列中元素的个数 trim:去掉字符 int:数字的整数部分 html: 字符串中所有的特殊 HTML
* 字符都需要用实体引用来代替(比如<代替<) 定义宏:<#macro copyright date> ${date}<#macro>
*/
分享到:
相关推荐
1. 使用模板缓存:为了提高性能,可以启用Freemarker的模板缓存,减少不必要的模板加载。 2. 避免复杂的模板逻辑:尽量将复杂的业务逻辑保留在Java代码中,模板主要负责布局和格式化。 3. 错误处理:合理处理模板...
3、示例有本地模板和远程模板之分,可杜绝pdf标题丢失的问题; 4、资源概要:先阅读README.md文档,然后根据文档中的资源示例运行代码,有postman和内部调用两种方式; 5、项目目录other/下面有示例文件可快速入手; ...
本主题将深入探讨如何利用Freemarker模板和wkhtmltox工具来实现这一功能。 **Freemarker模板** 是一个强大的Java模板引擎,用于动态生成文本输出,如HTML、XML或PDF。它支持变量替换、控制结构(如if/else)和复杂...
Java模板引擎之FreeMarker FreeMarker是一个开源的Java模板引擎,它被广泛应用于Web开发中,用于生成动态HTML、XML或其他格式的文本。这个强大的工具允许开发者将逻辑代码与表现层分离,使得网页设计人员可以专注于...
Freemarker模板生成pdf+javaFreemarker模板生成pdf+javaFreemarker模板生成pdf+javaFreemarker模板生成pdf+javaFreemarker模板生成pdf+java
2. **FreeMarker配置**: 在Java代码中,设置FreeMarker的配置,加载模板文件,并定义数据模型,该模型包含要填充到模板中的数据,比如图片路径。 3. **POI读取模板**: 使用Apache POI的`XWPFDocument`类打开模板文件...
FreeMarker是一个强大的、开源的Java模板引擎,常用于Web应用中的动态内容生成,尤其是在MVC架构中,作为视图层的技术。它与JSP、JSTL等技术不同,FreeMarker是模型和视图完全分离的,使得开发者可以专注于业务逻辑...
大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出‘.doc’ word文档。经测试这样方式生成的word文档完全符合office标准,...
### FreeMarker模板基本语法 #### 一、FreeMarker概述与基本用法 **FreeMarker**是一种强大的、基于Java的模板引擎,主要用于动态生成HTML页面,但也支持其他类型的文本格式(如XML、JavaScript、电子邮件等)。它...
Java模板引擎FreeMarker是一款强大的开源模板技术,常用于Web应用中的动态内容生成,尤其是在MVC架构中,作为视图层的解决方案。它与Spring、Struts等框架配合使用,能够将业务逻辑与页面展示分离,使得开发者可以...
Velocity和Freemarker模板技术比较 模板技术在现代软件开发中扮演着重要角色,而在目前最流行的两种模板技术中, Velocity 和 Freemarker 独占鳌头。在 WebWork2 中,我们可以随意选择使用 Freemarker 或 Velocity ...
本话题主要探讨的是如何利用可视化div布局来生成FreeMarker模板,并结合Spring MVC 3框架进行应用。下面将详细阐述这些概念及其相关知识点。 1. **FreeMarker模板引擎**:FreeMarker是一个开源的Java模板引擎,它...
它与Java语言紧密结合,但模板设计者并不需要了解Java,只需要熟悉FreeMarker的模板语言。在Android Studio(AS)中,FreeMarker API可以作为构建动态内容的有效工具。 FreeMarker的核心概念包括数据模型、模板和...
Freemarker是一个基于模板的、与语言无关的模板引擎,它的主要工作是将数据模型和模板结合,生成最终的输出。模板是由开发者设计的,包含了一些特殊的语法元素,这些元素会被Freemarker引擎替换为实际的数据值。 ...
FreeMarker概述 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 虽然FreeMarker具有一些编程的能力...
Freemarker是一个基于模板的语言,它的核心是模板文件,模板文件中包含了一系列控制结构(如条件语句、循环)和变量引用。这些变量是由后台Java代码提供,模板引擎会将这些变量替换为实际值,然后生成最终的输出文档...
FreeMarker是一个强大的、开源的Java模板引擎,常用于Web应用中的动态内容生成,尤其是在MVC(Model-View-Controller)架构中,它作为View层的一部分,将数据模型和HTML或其他类型的文档模板结合,生成最终的网页。...
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,FreeMarker被设计用来生成HTML Web页面(为了提高页面的访问速度,把页面静态化),特别是基于MVC模式的应用程序
附件包含了mybatis-plus自动生成代码,基于freemarker的模板。包括常规的curd。 【特点】针对每个接口都有对应的入参和出参,不公用entity。 如,add接口,则入参会自动生成为addEntityReq。具体可下载模板进行查看...
这个“freeMarker模板文件附件.zip”压缩包包含了一些关键资源,便于学习者深入理解并实践FreeMarker模板语言的用法。 1. **FreeMarker模板语言基础** FreeMarker是基于模板的,它与Java代码分离,使得视图层的...