Freemaker初接触(五)导入公共ftl文件

来源:互联网 发布:hadoop数据目录配置 编辑:程序博客网 时间:2024/04/30 13:54
这是调用类
package com.joker.test;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class TestImport {
 public static void main(String[] args) {
  String templateLoaderPath = "/";
  String templateName = "testImport.ftl";
  Configuration cfg = new Configuration();
  String htmlPath = "D:/freemakerTest";
  String htmlName = "testimport.html";
  Writer out = null;
  Map<String, Object> parms = new HashMap<String, Object>();
  User user1 = new User();
  user1.setBorthDate(new Date());
  HashMap<String, String>hashNames = new HashMap<String,String>();
  hashNames.put("1", "name1");
  hashNames.put("2", "name2");
  hashNames.put("3", "name3");
  user1.setHashNames(hashNames);
  parms.put("user", user1);
  ArrayList<User> users = new ArrayList<User>();
  User user2 = new User();
  user2.setId(2);
  user2.setAge(2);
  user2.setName("name2");
  User user3 = new User();
  user3.setId(3);
  user3.setAge(3);
  user3.setName("name3");
  User user4 = new User();
  user4.setId(4);
  user4.setAge(4);
  user4.setName("name4");
  User user5 = new User();
  user5.setId(5);
  user5.setAge(5);
  user5.setName("name5");
  User user6 = new User();
  user6.setId(6);
  user6.setAge(6);
  user6.setName("name6");
  users.add(user2);
  users.add(user3);
  users.add(user4);
  users.add(user5);
  users.add(user6);
  parms.put("users", users);
  try {
   cfg.setClassForTemplateLoading(TestMrco.class, templateLoaderPath);
   Template temp = cfg.getTemplate(templateName);
   out = new BufferedWriter(new OutputStreamWriter(
     new FileOutputStream(htmlPath + "/" + htmlName), "UTF-8"));
   temp.process(parms, out);
  } catch (IOException e) {
   e.printStackTrace();
  } catch (TemplateException e) {
   e.printStackTrace();
  } finally {
   if (null != out) {
    try {
     out.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 }
}

这是testImport.ftl
<#-- include的方式会将原数据覆盖
<#include "/fm1.ftl">
<#include "/fm2.ftl"/> 
这样只会打印出fm2中的sameName值
${sameName}
-->
<#import "/fm1.ftl" as fm1 />
<#import "/fm2.ftl" as fm2/>
用空间命名去调用各自空间命名中的方法
<@fm1.test1 "123"></@fm1.test1>
<@fm2.test1 "123"></@fm2.test1>
${fm2.sameName}
${fm1.sameName}
<#assign testName="testImportName"/>
<#--可以在不同的命名空间中定义变量,相同的变量不会被覆盖-->
<#assign testName="testImportNameInFm1" in fm1/>
<#assign testName="testImportNameInFm2" in fm2/>
${testName}
<br>
${fm1.testName}
<br>
${fm2.testName}
<br>

这是fm1.ftl的内容
<html>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
</head>
<body>
 <#macro test1 str>
 <h1>${str}</h1>
 </#macro>
 <#assign sameName="sameNameinFm1"/>
</body>
</html> 
这是fm2.ftl的内容
<html>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
</head>
<body>
 <#macro test1 str>
 <h2>${str}</h2>
 </#macro>
 <#assign sameName="sameNameinFm2"/>
</body>
</html> 

值得注意的是,fm1和fm2的内容如果有错误的话,导入会有问题的,一句话,所有的ftl文件都要保证正确。
ps :补充一下对el表达式中空的判断:例如${user.name??}可以判断user不为空,但是name为空的情况,但是如果user为空的话,这么写就会报错,所以对空的判断应该是逐级的。先判断user是否为空,再判断对应的属性。

0 0
原创粉丝点击