TemplateLoader的实现

作为一个模板文件加载的抽象,自然不能限制模板来自何方,在FreeMarker中由几个主要的实现类来体现,这些TemplateLoader是可以独立使用的,Webapp需要Servlet环境。当然你可以实现自己的TemplateLoader.

  • StringTemplateLoader 直接将内存中的String对象放入并使用
  • FileTemplateLoader 本地文件目录
  • ClassTemplateLoader ClassPath 加载
  • WebappTemplateLoader ServletContext
  • MultiTemplateLoader 多个TemplateLoader的叠加,顺序按照数组的顺序优先加载

StringTemplateLoader

内存字符串的使用。

@Test
public void testStringTL() throws IOException {
StringTemplateLoader stl = new StringTemplateLoader();
String template = "rrrrr${key}rrrrr";
stl.putTemplate("hello", template);
Object source = stl.findTemplateSource("hello");
Reader reader = stl.getReader(source, "utf-8");
String dest = IOUtils.toString(reader);
Assert.assertEquals(template, dest); }

例:

    public static void main(String[] args){
     // 读取项目下的文件
Resource resource = new ClassPathResource("sqls/xxx.sql");
InputStream inputStream = null;
String sql = null;
try {
inputStream = resource.getInputStream();
byte[] bytes = IOUtils.toByteArray(inputStream);
sql = new String(bytes);
sql = sql.replaceAll("\r\n\t"," ");
sql = sql.replaceAll("\r\n"," ");
sql = sql.replaceAll("\t","");
sql = sql.replaceAll("[ ]+"," ");
       // 替换参数
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("beginDate","20170901");
paramMap.put("futureEndDate","20170914");
paramMap.put("taskid","8a7a8282600731bb016007324d770000");
List<SqlListEntity> cycleList = new ArrayList<>();
SqlListEntity entity1 = new SqlListEntity();
entity1.setName("第1周");
cycleList.add(entity1);
SqlListEntity entity2 = new SqlListEntity();
entity2.setName("第2周");
cycleList.add(entity2);
paramMap.put("cycleList",cycleList);
Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
       //
StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
stringTemplateLoader.putTemplate(sql,sql);
configuration.setTemplateLoader(stringTemplateLoader);
Template temp = configuration.getTemplate(sql);
StringWriter queryStringWriter = new StringWriter();
temp.process(paramMap, queryStringWriter);
System.out.println(queryStringWriter.toString());
} catch(IOException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(inputStream);
}
}

MultiTemplateLoader

TemplateLoader是可以多种类型,同种类型组合起来使用的,查询顺序按照数组的顺序优先。

@Test
public void testMultiTL() throws IOException {
TemplateLoader ctl = new ClassTemplateLoader(TemplateLoaderTest.class,
"/");
TemplateLoader ftl1 = new FileTemplateLoader(new File(
System.getProperty("user.dir")));
MultiTemplateLoader mtl = new MultiTemplateLoader(new TemplateLoader[] {
ftl1,ctl }); Object source = mtl.findTemplateSource("test.ftl");
Reader reader = mtl.getReader(source, "utf-8");
String dest = IOUtils.toString(reader);
Assert.assertEquals("${hello}", dest);
}

通常在Configuration中使用,才能方便的处理FreeMarker的表达式

@Test
public void testInConfiguration() throws IOException {
Configuration configuration = new Configuration(
Configuration.VERSION_2_3_21);
configuration.setDefaultEncoding("utf-8");
TemplateLoader ctl = new ClassTemplateLoader(TemplateLoaderTest.class,
"/");
TemplateLoader ftl1 = new FileTemplateLoader(new File(
System.getProperty("user.dir")));
MultiTemplateLoader mtl = new MultiTemplateLoader(new TemplateLoader[] {
ftl1,ctl });
configuration.setTemplateLoader(mtl);
//configuration.getTemplate("test.ftl").process(data, out);
}

其它

缓存

模板加载通常是耗费资源的,默认是开启缓存的,缓存的实现,是否使用缓存取决于你

configuration.setCacheStorage(new freemarker.cache.NullCacheStorage());

configuration.clearTemplateCache();

java-Freemarker TemplateLoader实现模版的更多相关文章

  1. Java安全之freemaker模版注入

    Java安全之freemaker模版注入 freemaker简介 FreeMarker 是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等 ...

  2. Java使用IText(VM模版)导出PDF

    Java使用IText(VM模版)导出PDF: public String createPDF(ProjectManageBase projectManageBase) { Map map = new ...

  3. Java Freemarker生成word

    Java Freemarker生成word freeMaker 简介: FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代 ...

  4. Java安全之Velocity模版注入

    Java安全之Velocity模版注入 Apache Velocity Apache Velocity是一个基于Java的模板引擎,它提供了一个模板语言去引用由Java代码定义的对象.它允许web 页 ...

  5. SpringBoot下配置FreeMarker配置远程模版

    需求产生原因 要求在同一个接口中,根据不同的参数,返回不同的视图结果 所有的视图中的数据基本一致 要求页面能静态化,优化SEO 例如:A接口返回客户的信息 客户A在调用接口时,返回其个性化定制的页面A ...

  6. Java: FreeMarker的配置和使用

    初学什么都不可以忽略的地方就是这个东西的官方网站:http://freemarker.org/.下载或者API都可以参考这里. FreeMarker是什么 非常的简单明了.FreeMarker是一个j ...

  7. java+jxls利用excel模版进行导出

    大多时候会出现需要导出excel的功能,利用poi可以实现简单的导出,可以说poi的功能非常强大可以做到细节的定制化操作,但相对于在office操作excel,利用poi完全生成excel会显得非常复 ...

  8. JAVA FreeMarker工具类

    FreeMarkerUtil.java package pers.kangxu.datautils.utils; import java.io.File; import java.io.StringW ...

  9. 三、freemarker数据、模版指令

    数据类型 1.         直接指定值(字符串.数值.布尔值.集合.Map对象) 2.         字符串:直接指定字符串使用单引号.双引号,字符中间可以使用转义符“\”,如果字符内有大量特殊 ...

  10. JAVA Freemarker + Word 模板 生成 Word 文档 (普通的变量替换,数据的循环,表格数据的循环,以及图片的东替换)

    1,最近有个需求,动态生成 Word 文当并供前端下载,网上找了一下,发现基本都是用 word 生成 xml 然后用模板替换变量的方式 1.1,这种方式虽然可行,但是生成的 xml 是在是太乱了,整理 ...

随机推荐

  1. fillder--客户端指定访问IP段

  2. 011 pandas的常见操作

    一:对索引进行操作 1.reindex重新索引 pandas提供了一个方法来创建一个适应新索引的新对象. Series通过调用reindex方法会根据新的索引顺序重新排序,如果新的索引中存在原索引不存 ...

  3. 003 python中的内置函数

    一:如何查看内置函数 1.命令 dir(__builtins__) 2.效果 二:具体的用法 1.input 简单使用: 2.type 返回变量的类型 3.str 将类型转变为字符串 4.isinst ...

  4. 20165235 实验二Java面向对象程序设计

    20165235 Java面向对象程序设计 姓名:祁瑛 学号:20165235 班级:1652 实验课程:JAVA程序设计 实验名称:Java面向对象程序设计 实验时间:2018.4.14 指导老师: ...

  5. php(apache)切换版本

    php(apache)切换版本 1.brew link php@7.1 2.上两行写入 ~/.bash_profile文件 3.source ~/.bash_profile 4.sudo vi /et ...

  6. spring框架等web程序在tomcat下的启动顺序

    http://www.cnblogs.com/panxuejun/p/5847774.html

  7. 如何将.SQL文件的数据导入到Mysql的数据库中

    一.用cmd的调试环境导入.sql文件中的数据: WinR键打开cmd输入: MySQL -u root -p 进入MySQL后MySQL>use DR;   MySQL> source  ...

  8. Qt5.11.1安装与VS2017配置

    Qt5.11.1安装与VS2017配置 转 https://blog.csdn.net/gaojixu/article/details/82185694 文章目录 Qt5.11.1安装与VS2017配 ...

  9. Trace 2018徐州icpc网络赛 (二分)(树状数组)

    Trace There's a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xx ...

  10. BZOJ-8-2115: [Wc2011] Xor

    https://www.lydsy.com/JudgeOnline/problem.php?id=2115 题意 : 给出一个连通无向图,求从1到n异或和最小的路径. 思路 :随意找一条简单路径 1- ...