1.编写标签类

  1. package com.pccw.business.fnd.common.filegen;
  2.  
  3. import java.io.IOException;
  4. import java.io.Writer;
  5. import java.util.Map;
  6.  
  7. import freemarker.core.Environment;
  8. import freemarker.template.TemplateDirectiveBody;
  9. import freemarker.template.TemplateDirectiveModel;
  10. import freemarker.template.TemplateException;
  11. import freemarker.template.TemplateModel;
  12. import freemarker.template.TemplateModelException;
  13.  
  14. public class FinalReport2Directive implements TemplateDirectiveModel {
  15.  
  16. /**
  17. * @param env
  18. * 上下文变量
  19. * @param params
  20. * 标签参数
  21. * @param loopVars
  22. * @param body
  23. * 标签体
  24. */
  25. public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
  26. throws TemplateException, IOException {
  27. TemplateModel prjojectNumTM = (TemplateModel)params.get("projectNum");
  28. System.out.println(prjojectNumTM.toString());
  29.  
  30. body.render(new FinalReportCustomWriter(env.getOut()));
  31.  
  32. }
  33.  
  34. private static class FinalReportCustomWriter extends Writer {
  35.  
  36. private final Writer out;
  37.  
  38. FinalReportCustomWriter(Writer out) {
  39. this.out = out;
  40. }
  41.  
  42. public void write(char[] cbuf, int off, int len) throws IOException {
  43.  
  44. StringBuffer buf = new StringBuffer();
  45. buf.append("<tr><td>11</td></tr>");
  46. for (int i = 0; i < 50; i++) {
  47. buf = new StringBuffer();
  48. buf.append("<tr><td>" + i + "orderName" + "</td></tr>");
  49. buf.append("<tr><td>" + i + "orderNum" + "</td></tr>");
  50. buf.append("<tr><td>" + i + "orderQuantity" + "</td></tr>");
  51. buf.append("<tr><td>" + i + "orderPrice" + "</td></tr>");
  52. out.write(buf.toString());
  53. }
  54. }
  55.  
  56. public void flush() throws IOException {
  57. out.flush();
  58. }
  59.  
  60. public void close() throws IOException {
  61. out.close();
  62. }
  63. }
  64. }

2.  编写文件生成类,单例

  1. package com.pccw.business.fnd.common.filegen;
  2.  
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.FileOutputStream;
  6. import java.io.OutputStreamWriter;
  7. import java.io.Writer;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10.  
  11. import javax.servlet.ServletContext;
  12.  
  13. import freemarker.template.Configuration;
  14. import freemarker.template.Template;
  15.  
  16. public class HtmlFileBuild {
  17.  
  18. private static HtmlFileBuild htmlFileBuild = null;
  19. private Configuration configuration;
  20.  
  21. private HtmlFileBuild(){
  22. configuration = new Configuration();
  23. }
  24.  
  25. public static HtmlFileBuild getInsance(){
  26. if(htmlFileBuild == null){
  27. htmlFileBuild = new HtmlFileBuild();
  28. }
  29. return htmlFileBuild;
  30. }
  31.  
  32. /**
  33. *
  34. * @param context
  35. * 上下文
  36. * @param data
  37. * 绑定数据
  38. * @param templateFileName
  39. * 模板名称
  40. * @param targetHtmlFileName
  41. * 生成目标文件名称
  42. * @return 生成html文件路径
  43. * @throws Exception
  44. */
  45. public String crateHTML(ServletContext context, Map<String, Object> data, String templateFileName,
  46. String targetHtmlFileName) throws Exception {
  47.  
  48. try {
  49. // 模板存放路径
  50. this.configuration.setDirectoryForTemplateLoading(new File(
  51. "D:/projects/FAS/trunk/dev/arch/WebRoot/business/template"));
  52.  
  53. // 模板文件名称
  54. Template template = this.configuration.getTemplate(templateFileName);
  55. template.setEncoding("UTF-8");
  56. // 静态页面要存放的路径
  57. String htmlPath = targetHtmlFileName;
  58. File htmlFile = new File(htmlPath);
  59. Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8"));
  60. // 处理模版 map数据 ,输出流
  61. data.put("projectNum", "B00002");
  62. template.process(data, out);
  63. out.flush();
  64. out.close();
  65. return targetHtmlFileName;
  66. } catch (Exception e) {
  67. e.printStackTrace();
  68. throw e;
  69. }
  70. }
  71.  
  72. // test
  73. public static void main(String arg[]) throws Exception {
  74. new HtmlFileBuild().crateHTML(null, new HashMap(), "finalReport2.ftl", "E:/tmp/freemarker/finalReport2.html");
  75. }
  76. }

3. finalReport2.ftl

  1. <#assign fr2 = "com.pccw.business.fnd.common.filegen.FinalReport2Directive"?new()>
  2. <table style="border:1px">
  3. <@fr2 projectNum="${projectNum}">
  4.  
  5. </@fr2>
  6. </table>

freemarker 自定义标签的更多相关文章

  1. freemarker自定义标签报错(六)

    freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Encountered "\"\u4f60\u597d\uff01\& ...

  2. freemarker自定义标签报错(五)

    freemarker自定义标签 1.错误描述 六月 05, 2014 11:40:49 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严 ...

  3. freemarker自定义标签报错(四)

    freemarker自定义标签 1.错误描述 六月 05, 2014 11:31:35 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严 ...

  4. freemarker自定义标签(一)

    freemarker自定义标签 1.自定义标签说明 宏变量存储模板片段可以被用作自定义指令macro 2.示例说明 <html> <head> <meta http-eq ...

  5. freemarker自定义标签报错(三)

    freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Encountered " " at line 14, column ...

  6. freemarker自定义标签报错(二)

    freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Unexpected end of file reached. at freemarker ...

  7. freemarker自定义标签报错(一)

    freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Token manager error: freemarker.core.TokenMgr ...

  8. freemarker自定义标签报错(七)

    1.错误描述 六月 09, 2014 11:11:09 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...

  9. freemarker自定义标签(三)-nested指令

    freemarker自定义标签 1.nested指令 是可选的,可以在<#macro>和</#macro>之间使用在任何位置和任意次数 2.示例说明 <#macro ta ...

  10. freemarker自定义标签(二)

    freemarker自定义标签 1.自定义标签 通过自定义标签,写一个重复指定字符串 2.实现源码 <html> <head> <meta http-equiv=&quo ...

随机推荐

  1. HDU 4972 Bisharp and Charizard 想法题

    Bisharp and Charizard Time Limit: 1 Sec  Memory Limit: 256 MB Description Dragon is watching NBA. He ...

  2. 向table添加水平滚动条

    转自:http://www.cnblogs.com/linjiqin/p/3148225.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4. ...

  3. Spring的国际化资源messageSource

    Spring中可以使用两个类加载资源文件:ReloadableResourceBundleMessageSource和ResourceBundleMessageSource. 可配置如下message ...

  4. 移动零售批发行业新的技术特色-智能PDA手持移动扫描打印销售开单收银仪!!

    提起便利店或者超市,大家的第一印象一定是前台那个笨重的POS机和站在POS机后的收银员.传统的零售店中,笨重的POS机随处可见. 变革前,零售盘点多烦忧 一个顾客要结账,就需要通过POS机.小票打印机 ...

  5. 转:EasyHook远程代码注入

    EasyHook远程代码注入 最近一段时间由于使用MinHook的API挂钩不稳定,经常因为挂钩地址错误而导致宿主进程崩溃.听同事介绍了一款智能强大的挂钩引擎EasyHook.它比微软的detours ...

  6. stack+DFS ZOJ 1004 Anagrams by Stack

    题目传送门 /* stack 容器的应用: 要求字典序升序输出,所以先搜索入栈的 然后逐个判断是否满足答案,若不满足,回溯继续搜索,输出所有符合的结果 */ #include <cstdio&g ...

  7. BZOJ3919 : [Baltic2014]portals

    预处理出每个点上下左右能延伸到的最远点以及到它们的距离的最小值md. 然后spfa,一个点除了可以以1的代价到达四周的点之外,还可以以md+1的代价到达四个方向能到达的最远点. #include< ...

  8. HDU 1241 (DFS搜索+染色)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=1241 题目大意:求一张地图里的连通块.注意可以斜着连通. 解题思路: 八个方向dfs一遍,一边df ...

  9. 【BZOJ】2802: [Poi2012]Warehouse Store(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2802 自己yy了一下... 每一次如果够那么就买. 如果不够,考虑之前买过的,如果之前买过的比当前花 ...

  10. 深入理解JVM—性能监控工具

    (转自:http://yhjhappy234.blog.163.com/blog/static/31632832201222691738865/) 我们知道,在JVM编译期和加载器,甚至运行期已经做了 ...