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. zabbix http服务监控实例

    1在被监控主机安装http服务 ,监听80端口 systemctl start httpd.service       启动服务  80端口已经启动 设定,监控80端口,当服务不当时先自动重启服务 2 ...

  2. selenium课程笔记

    selenium课程笔记第一天(2017-7-1) 一.配置火狐浏览器 运行:firefox.exe -p -no -remote selenium课程笔记第二天 用Eclipse+java+sele ...

  3. c#代码文件上传和下载

    public JsonResult UploadFile(DriverFileManager filem)        {                       var hfc = Syste ...

  4. SQL注入——SQL Injection

    本文部分内容转自:https://www.cnblogs.com/rush/archive/2011/12/31/2309203.html http://www.diybl.com/course/7_ ...

  5. String.IsNullorEmpty()方法的使用

    != null 就是不为null !string.IsNullOrEmpty  不是null且不是""(string.Empty)

  6. M × N Puzzle POJ - 2893(奇数码)

    The Eight Puzzle, among other sliding-tile puzzles, is one of the famous problems in artificial inte ...

  7. POJ 2455 Secret Milking Machine 【二分】+【最大流】

    <题目链接> 题目大意: FJ有N块地,这些地之间有P条双向路,每条路的都有固定的长度l.现在要你找出从第1块地到第n块地的T条不同路径,每条路径上的路段不能与先前的路径重复,问这些路径中 ...

  8. Apache系列:Centos7.2下安装与配置apache

    Centos7.2下安装与配置apache(一) 配置机:腾讯云服务器,centos7.2 一.安装Apache服务(Apache软件安装包叫httpd) yum install httpd -y 二 ...

  9. 004.MySQL双主+Keepalived高可用

    一 基础环境 主机名 系统版本 MySQL版本 主机IP Master01 CentOS 6.8 MySQL 5.6 172.24.8.10 Master02 CentOS 6.8 MySQL 5.6 ...

  10. Mysql You can change this value on the server by setting the max_allowed_packet' variable. 异常

    MySQL根据配置文件会限制server接受的数据包大小. 有时候大的插入和更新会被max_allowed_packet 参数限制掉,导致失败. 查看目前配置, Windows 系统 配置文件为 my ...