java-Freemarker TemplateLoader实现模版
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实现模版的更多相关文章
- Java安全之freemaker模版注入
Java安全之freemaker模版注入 freemaker简介 FreeMarker 是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等 ...
- Java使用IText(VM模版)导出PDF
Java使用IText(VM模版)导出PDF: public String createPDF(ProjectManageBase projectManageBase) { Map map = new ...
- Java Freemarker生成word
Java Freemarker生成word freeMaker 简介: FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代 ...
- Java安全之Velocity模版注入
Java安全之Velocity模版注入 Apache Velocity Apache Velocity是一个基于Java的模板引擎,它提供了一个模板语言去引用由Java代码定义的对象.它允许web 页 ...
- SpringBoot下配置FreeMarker配置远程模版
需求产生原因 要求在同一个接口中,根据不同的参数,返回不同的视图结果 所有的视图中的数据基本一致 要求页面能静态化,优化SEO 例如:A接口返回客户的信息 客户A在调用接口时,返回其个性化定制的页面A ...
- Java: FreeMarker的配置和使用
初学什么都不可以忽略的地方就是这个东西的官方网站:http://freemarker.org/.下载或者API都可以参考这里. FreeMarker是什么 非常的简单明了.FreeMarker是一个j ...
- java+jxls利用excel模版进行导出
大多时候会出现需要导出excel的功能,利用poi可以实现简单的导出,可以说poi的功能非常强大可以做到细节的定制化操作,但相对于在office操作excel,利用poi完全生成excel会显得非常复 ...
- JAVA FreeMarker工具类
FreeMarkerUtil.java package pers.kangxu.datautils.utils; import java.io.File; import java.io.StringW ...
- 三、freemarker数据、模版指令
数据类型 1. 直接指定值(字符串.数值.布尔值.集合.Map对象) 2. 字符串:直接指定字符串使用单引号.双引号,字符中间可以使用转义符“\”,如果字符内有大量特殊 ...
- JAVA Freemarker + Word 模板 生成 Word 文档 (普通的变量替换,数据的循环,表格数据的循环,以及图片的东替换)
1,最近有个需求,动态生成 Word 文当并供前端下载,网上找了一下,发现基本都是用 word 生成 xml 然后用模板替换变量的方式 1.1,这种方式虽然可行,但是生成的 xml 是在是太乱了,整理 ...
随机推荐
- 简单的线程Thread使用
static void Main(string[] args) { for (int i = 0; i < 5; i++) { aa a = new aa(); a.age = i; Threa ...
- JS获取验证码后倒计时不受刷新及关闭影响
HTML部分 <input type="button" id="code_btn" value="获取验证码"> JS部分 // ...
- 用greenlet实现协程消费者生产者
代码: from greenlet import greenlet import random def pro(): 生产者 while True: item = random.randint(0,9 ...
- react-antd 按需加载报错
基于create-react-app 搭建的 react 项目 引入 antd UI 配置按需加载 但是报一下错误 .翻译过了一下 是内嵌JavaScript选项没有开启什么的 大白话就是 les ...
- 【python】面向对象编程
No1: 类和实例 __init__方法的第一个参数永远是self,表示创建的实例本身:init相当于构造函数 No2: 数据封装 No3: 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下 ...
- hdu 2553 n皇后问题【DFS递归解法】
<题目链接> 题目大意: Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45 ...
- 前后端通过API交互
前两篇已经写好了后端接口,和前段项目环境也搭建好了 现在要通过接口把数据展示在页面上 先占位置写架子 创建一个头部组件和底部组件占位置 <template> <h1>这是头部组 ...
- GCD 与 LCM UVA - 11388
题目链接: https://cn.vjudge.net/problem/23709/origin 本题其实有坑 数据大小太大, 2的32次方,故而一定是取巧的算法,暴力不可能过的 思路是最大公因数的倍 ...
- BZOJ.5288.[AHOI/HNOI2018]游戏(思路 拓扑)
BZOJ LOJ 洛谷 考虑如何预处理每个点能到的区间\([l,r]\). 对于\(i,i+1\)的一扇门,如果钥匙在\(i\)的右边,连边\(i\to i+1\),表示从\(i\)出发到不了\(i+ ...
- BZOJ.4559.[JLOI2016]成绩比较(DP/容斥 拉格朗日插值)
BZOJ 洛谷 为什么已经9点了...我写了多久... 求方案数,考虑DP... \(f[i][j]\)表示到第\(i\)门课,还有\(j\)人会被碾压的方案数. 那么\[f[i][j]=\sum_{ ...