这是我第一次写博客。主要是想总结一下自己学习的知识!不足之处望大家指正!谢谢
FreeMarker 是一个模版引擎,一个基于文本的模板输出工具(生成任意的HTML表单代码)。它是一个Java package,面向Java程序员的class library。它本身并不是针对最终用户的应用,而是允许程序员将其嵌入到他们的产品中。
FreeMarker被设计用来生成HTML Web页面,特别是基于MVC(Model View Controller)模式的应用程序。使用 MVC 模式作为动态的WEB页面的想法,是为了分隔页面设计者 (HTML 设计者) 和程序员。.每个人做自己擅长的那一部分。设计者可以不通过程序员的改变或修改代码来改变网页的样子,因为应用逻辑(Java程序)和页面设计(FreeMarker 模版)是分开的。模板不会被复杂繁琐的程序框架所破坏。即使当一个项目的程序员和HIMTL页面的制作者是同一个人时,这种分隔也是很有用,因为这样有助于保持应用的清晰并易于维护。
当项目当有大量doc,xls文档生成的时候,我们很多时候都是用开源jar包自己去写这些文档,表格。例如jxl.*这些jar包去写这些格式,动态插入数据。可是当表格比较多,格式比较复杂,API不是很熟的时候,写这些表格会花费很多时间。
我在项目中,发现了一个新方法,开始将doc文档另存为xml格式,可是xml格式总的空格在导出的时候无法取出。最后我将doc或者xls文件另存为mhtml格式。用FreeMarker解析mhtl格式文件,然后再用流写出。
一下提供部分源码:
1.导入jar包
2.首先src下面配置freemaker.properties文件,配置内容如下
template_update_delay=1
datetime_format=yyyy-MM-dd HH:mm:ss#配置datetime_format时间格式
date_format=yyyy-MM-dd#配置date_format时间格式
time_format=HH:mm:ss#配置time_format格式
number_format=0.##;#配置数字格式化格式
boolean_format=true,false#Boolean值类型可自己设置
auto_import="/WEB-INF/ftl_lib/common/index.ftl" as p#模板标签
whitespace_stripping=true#
#default_encoding=GBK#模板解析编码
tag_syntax=auto_detect
url_escaping_charset=UTF-8
#struts.freemarker.templatesCache=true
#template_update_delay=60000
3.解析方法如下
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;
import org.apache.struts2.ServletActionContext;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
//freemaker生成器
public class FreemarkerGenerator {
Configuration cfg = null;
public FreemarkerGenerator(String templatePath) throws IOException {
cfg = new Configuration();//初始化freemaker配置,创建一个Configuration对象
cfg.setDefaultEncoding("UTF-8");//设置编码
cfg.setDirectoryForTemplateLoading(new File(templatePath));//设置freemaker模板位置
cfg.setObjectWrapper(new DefaultObjectWrapper());
}
/**
* 生成静态文件
*
* @param ftlTemplate
* ftl模版文件
* @param contents
* ftl要用到的动态内容
* @param savePath
* 文件保存路径
* @param saveFilename
* 保存文件名
* @throws IOException
* @throws TemplateException
*/
public void create(String ftlTemplate, Map contents, String savePath,
String saveFilename) throws IOException, TemplateException {
Template temp = cfg.getTemplate(ftlTemplate);//取得模板文件
/* Merge data model with template */
String realPath = ServletActionContext.getServletContext().getRealPath(
savePath);
File file = new File(realPath);
if (!file.exists())
file.mkdirs();
Writer out = new OutputStreamWriter(new FileOutputStream(realPath + "/"
+ saveFilename), "UTF-8");
temp.process(contents, out);//解析
out.flush();
}
/**
将模板文件解析成字符串
*/
public String parse(String ftlTemplate, Map contents) throws IOException,
TemplateException {
try {
Template temp = cfg.getTemplate(ftlTemplate);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer out = new OutputStreamWriter(baos);
temp.process(contents, out);
out.flush();
return baos.toString("utf-8");
}catch(Exception exception) {
exception.printStackTrace();
}
return "";
}
}
////////////////////////////////////////////////////////////////////
/**
*解析模板
*
* @param tempPath也就是你将doc,xls文档转换未mhtml的文件路径
* @param content模板里面需要的参数通过key-value的形式传入,在模板里面使用标签${value}填充表格需要最后显示的字段
* @return
*/
public String parseFtl(String tempPath, Map<object> content) {
FreemarkerGenerator fmGen;
String strSellCount = null;
try {
fmGen = new FreemarkerGenerator(contextHelper
.getAppRealPath("/WEB-INF/content/corpcenter/inc"));//如果不是web应用则可以不用的到真实路径
strSellCount = fmGen.parse(tempPath, content);
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
return strSellCount;
}
/**
*
* @param filePath//要生成德文件路径
* @param templatePath//mhtml文件路径
* @param fileName//生成的文件名
* @param exportType//生成的文件类型doc or xls
* @param content//mthl里面需要显示的内容 如:导出订单列表,你可以
Map content = new HashMap();
map.put("item",item);//在mhtml文件需要显示的地方${item.cartItems}即可
map.put("user",user);//要显示客户名称${user.userName}
此map可以put你页面想要的值或者对象。
* @return
*/
public File createFile(String filePath, String templatePath,
String fileName, String exportType, Map<object> content) {
String path = "";
if (exportType != null && exportType.equals(".doc")) {
path = filePath + fileName + ".doc";
} else {
path = filePath + fileName + ".xls";
}
File file = new File(path);
BufferedReader br = null;
BufferedWriter bw = null;
String strTemp = parseFtl(templatePath, content);
try {
br = new BufferedReader(new StringReader(strTemp));
bw = new BufferedWriter(new FileWriter(file));
char[] buf = new char[1024];
int len;
while ((len = br.read()) != -1) {
bw.write(buf, 0, len);
}
bw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return file;
}
4.这样你就可以将事先编辑好的文档按照正确的格式导出。注意一点就是,编码问题。doc或者xls是微软公司的产品,里面的编码是charset="us-ascii"会出现乱码,记得改成charset="us-utf-8"这样mhtml模板是乱码,但是通过IO流读出是编码是正确的,此编码问题我一只没有找到解决的方法。
</object></object>
FreeMarker 是一个模版引擎,一个基于文本的模板输出工具(生成任意的HTML表单代码)。它是一个Java package,面向Java程序员的class library。它本身并不是针对最终用户的应用,而是允许程序员将其嵌入到他们的产品中。
FreeMarker被设计用来生成HTML Web页面,特别是基于MVC(Model View Controller)模式的应用程序。使用 MVC 模式作为动态的WEB页面的想法,是为了分隔页面设计者 (HTML 设计者) 和程序员。.每个人做自己擅长的那一部分。设计者可以不通过程序员的改变或修改代码来改变网页的样子,因为应用逻辑(Java程序)和页面设计(FreeMarker 模版)是分开的。模板不会被复杂繁琐的程序框架所破坏。即使当一个项目的程序员和HIMTL页面的制作者是同一个人时,这种分隔也是很有用,因为这样有助于保持应用的清晰并易于维护。
当项目当有大量doc,xls文档生成的时候,我们很多时候都是用开源jar包自己去写这些文档,表格。例如jxl.*这些jar包去写这些格式,动态插入数据。可是当表格比较多,格式比较复杂,API不是很熟的时候,写这些表格会花费很多时间。
我在项目中,发现了一个新方法,开始将doc文档另存为xml格式,可是xml格式总的空格在导出的时候无法取出。最后我将doc或者xls文件另存为mhtml格式。用FreeMarker解析mhtl格式文件,然后再用流写出。
一下提供部分源码:
1.导入jar包
2.首先src下面配置freemaker.properties文件,配置内容如下
template_update_delay=1
datetime_format=yyyy-MM-dd HH:mm:ss#配置datetime_format时间格式
date_format=yyyy-MM-dd#配置date_format时间格式
time_format=HH:mm:ss#配置time_format格式
number_format=0.##;#配置数字格式化格式
boolean_format=true,false#Boolean值类型可自己设置
auto_import="/WEB-INF/ftl_lib/common/index.ftl" as p#模板标签
whitespace_stripping=true#
#default_encoding=GBK#模板解析编码
tag_syntax=auto_detect
url_escaping_charset=UTF-8
#struts.freemarker.templatesCache=true
#template_update_delay=60000
3.解析方法如下
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;
import org.apache.struts2.ServletActionContext;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
//freemaker生成器
public class FreemarkerGenerator {
Configuration cfg = null;
public FreemarkerGenerator(String templatePath) throws IOException {
cfg = new Configuration();//初始化freemaker配置,创建一个Configuration对象
cfg.setDefaultEncoding("UTF-8");//设置编码
cfg.setDirectoryForTemplateLoading(new File(templatePath));//设置freemaker模板位置
cfg.setObjectWrapper(new DefaultObjectWrapper());
}
/**
* 生成静态文件
*
* @param ftlTemplate
* ftl模版文件
* @param contents
* ftl要用到的动态内容
* @param savePath
* 文件保存路径
* @param saveFilename
* 保存文件名
* @throws IOException
* @throws TemplateException
*/
public void create(String ftlTemplate, Map contents, String savePath,
String saveFilename) throws IOException, TemplateException {
Template temp = cfg.getTemplate(ftlTemplate);//取得模板文件
/* Merge data model with template */
String realPath = ServletActionContext.getServletContext().getRealPath(
savePath);
File file = new File(realPath);
if (!file.exists())
file.mkdirs();
Writer out = new OutputStreamWriter(new FileOutputStream(realPath + "/"
+ saveFilename), "UTF-8");
temp.process(contents, out);//解析
out.flush();
}
/**
将模板文件解析成字符串
*/
public String parse(String ftlTemplate, Map contents) throws IOException,
TemplateException {
try {
Template temp = cfg.getTemplate(ftlTemplate);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer out = new OutputStreamWriter(baos);
temp.process(contents, out);
out.flush();
return baos.toString("utf-8");
}catch(Exception exception) {
exception.printStackTrace();
}
return "";
}
}
////////////////////////////////////////////////////////////////////
/**
*解析模板
*
* @param tempPath也就是你将doc,xls文档转换未mhtml的文件路径
* @param content模板里面需要的参数通过key-value的形式传入,在模板里面使用标签${value}填充表格需要最后显示的字段
* @return
*/
public String parseFtl(String tempPath, Map<object> content) {
FreemarkerGenerator fmGen;
String strSellCount = null;
try {
fmGen = new FreemarkerGenerator(contextHelper
.getAppRealPath("/WEB-INF/content/corpcenter/inc"));//如果不是web应用则可以不用的到真实路径
strSellCount = fmGen.parse(tempPath, content);
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
return strSellCount;
}
/**
*
* @param filePath//要生成德文件路径
* @param templatePath//mhtml文件路径
* @param fileName//生成的文件名
* @param exportType//生成的文件类型doc or xls
* @param content//mthl里面需要显示的内容 如:导出订单列表,你可以
Map content = new HashMap();
map.put("item",item);//在mhtml文件需要显示的地方${item.cartItems}即可
map.put("user",user);//要显示客户名称${user.userName}
此map可以put你页面想要的值或者对象。
* @return
*/
public File createFile(String filePath, String templatePath,
String fileName, String exportType, Map<object> content) {
String path = "";
if (exportType != null && exportType.equals(".doc")) {
path = filePath + fileName + ".doc";
} else {
path = filePath + fileName + ".xls";
}
File file = new File(path);
BufferedReader br = null;
BufferedWriter bw = null;
String strTemp = parseFtl(templatePath, content);
try {
br = new BufferedReader(new StringReader(strTemp));
bw = new BufferedWriter(new FileWriter(file));
char[] buf = new char[1024];
int len;
while ((len = br.read()) != -1) {
bw.write(buf, 0, len);
}
bw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return file;
}
4.这样你就可以将事先编辑好的文档按照正确的格式导出。注意一点就是,编码问题。doc或者xls是微软公司的产品,里面的编码是charset="us-ascii"会出现乱码,记得改成charset="us-utf-8"这样mhtml模板是乱码,但是通过IO流读出是编码是正确的,此编码问题我一只没有找到解决的方法。
</object></object>
发表评论
-
javascript常用函数search用法
2011-08-22 14:26 4012javascript常用函数总结 search 定义和用法 ... -
java变量初始化顺序
2011-08-04 15:28 16281.变量初始化顺序:静 ... -
Oracle数据库如何创建表空间
2011-08-04 11:40 12144oracle如何创建表空间和备份数据 1.创建数据表空间 ... -
java异常总结
2011-08-02 15:18 6171.No row with the given identif ... -
删除SVN历史用户密码记录
2011-03-31 14:05 1593C:\Documents and Settings\Admin ... -
Java数组的扩展
2010-11-20 10:00 5760package test; import java.lang ... -
常用链接
2010-08-31 22:26 0SVN: http://subclipse.tigris.or ... -
java模式
2010-08-17 22:43 0... -
oracle数据库权限总结
2010-08-16 21:59 1365今天我想就我最近学习oracle权限的笔记总结一下。 ... -
数据结构学习总结
2010-08-15 21:40 0最近我在学习数据结 ... -
hibernate list和iterate 的区别
2010-08-03 22:47 3408今天我想讲一下我前几天面试遇到的一个hibernate问 ... -
Effective java学习笔记
2010-08-01 17:26 11311.静态工厂方法代替构造函数 如:pub ...
相关推荐
### Freemarker 使用总结与详解 #### 一、Freemarker 概述 Freemarker 是一种用于生成动态页面的模板引擎。它不依赖任何 Web 容器,可以在任何 Java 应用程序中使用。Freemarker 的核心优势在于其简单易学且功能...
FreeMarker是一款开源的模板引擎,主要用于生成文本输出。它是用Java编写的,不过也能够用其他编程语言来...这些内容共同构成了FreeMarker使用手册的核心知识点,帮助开发者有效地利用FreeMarker生成所需的文本输出。
尚学堂提供的这本“Freemarker使用手册”是学习和理解这个模板语言的重要参考资料。以下将详细介绍Freemarker的核心概念、语法以及在实际开发中的应用。 1. **核心概念** - **模板(Templates)**:Freemarker模板是...
### Freemarker 使用例子详解 #### 一、Hashes(散列)操作 在Freemarker模板语言中,散列(Hashes)是一种非常常见的数据结构,它可以用来存储键值对。这种数据结构非常适合用于需要根据特定键来快速查找或更新值...
FreeMarker 是一个用Java语言编写的模板引擎,它基于模板输出文本。FreeMarker 与 Web 容器无关,即在Web运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java ...
FreeMarker使用Macro实例,很好的学习资料。
标题 "Spring+Freemarker 使用163发HTML格式的邮件" 描述的是一个使用Spring框架结合Freemarker模板引擎发送HTML格式邮件的过程。在这个场景中,开发人员可能需要通过编程方式向用户发送包含丰富格式内容的邮件,...
### Freemarker使用详解 Freemarker是一款功能强大的模板引擎,被广泛应用于Web开发中,用于动态生成HTML页面、邮件模板、报表等。它的设计目的是为了更高效、灵活地处理数据模型,并将其转换为最终的输出格式。...
**FreeMarker 使用详解** FreeMarker 是一款开源的模板引擎,主要应用于 Java 平台,用于生成动态 HTML、XML 或其他格式的文本。它与 Spring 框架结合使用时,可以方便地生成视图层内容,是MVC架构中常用的模板技术...
### FreeMarker使用详解 #### 一、快速入门:模板+数据模型=输出 FreeMarker是一种强大的模板引擎,专为Web开发设计,它基于一个核心理念:设计者和程序员应专注各自的专业领域,即设计者负责视觉表现,如HTML、...
freemarker使用示例源码
FreeMarker是一款模板引擎,即一种基于模板处理文本的技术...以上是FreeMarker使用文档的主要知识点。由于文档的篇幅限制,无法详细展示每一节的全部内容,但通过这些要点能够了解FreeMarker的基本使用方法和高级特性。
2. 数据模型设置:通过`ModelAndView`或`Map`将Java对象传递到视图,供Freemarker使用。 3. 视图解析:配置`ViewResolver`,例如`FreemarkerViewResolver`,确定模板路径和渲染逻辑。 四、Freemarker高级特性 1. ...
FreeMarker使用${...}表达式来插入变量,#{...}用于输出注释,以及、等控制结构进行条件判断和循环。然而,这些默认标签可能无法满足所有复杂的场景,因此自定义标签就显得尤为必要。 自定义FreeMarker标签通常涉及...
### FreeMarker 使用方法详解 #### 一、FreeMarker 概述与特性 ##### 1.1 通用目标 - **生成各种文本**:FreeMarker 的核心功能在于它能生成多种类型的文本输出,包括但不限于 HTML、XML、RTF、Java 源代码等。 -...
1. **模板语言FTL**: Freemarker使用的模板语言叫做FreeMarker Template Language (FTL),它是一种声明式的、非过程式的语言。FTL文件包含了一系列的指令和表达式,用于生成最终输出。例如,`<#if>`、`<#foreach>`、...
Java 使用 FreeMarker 模板技术导出 Word 是一种常见的数据动态生成文档的方法,它结合了 Java 的编程能力和 FreeMarker 模板引擎的强大功能,能够帮助开发者高效地生成结构化的 Word 文档。FreeMarker 是一个开源的...
1. **基本语法**:Freemarker使用简单的模板语言,主要包括变量表示(${})、控制结构(if/else、foreach)、条件表达式(?)和函数调用(例如,日期和时间的格式化)。 2. **模板设计模式**:如如何定义模板布局,...
1. **模板语言**:Freemarker使用简单的文本模板语言,其中包含指令和表达式。例如,`<#if>`、`<#foreach>`用于控制流,`${}`用于输出变量。 2. **数据模型**:Freemarker与Java对象交互,通过数据模型将Java对象...