`
woainichenxueming
  • 浏览: 44299 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Freemaker的使用

阅读更多
  这是我第一次写博客。主要是想总结一下自己学习的知识!不足之处望大家指正!谢谢
  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 &amp;&amp; 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>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics