写在前面的话
从2016年开始工作到现在, 从来没有整理汇总过自己所学。 所以趁着现在在做新项目,打算把自己所接触到的技术点通过文档的形式记录下来。
一方面是巩固下之前所学,加深印象。另一方面也是为了形成自己的知识库, 方便以后查看。
那么就先从Freemarker开始
什么是Freemarker
Freemarker是一款模板生成引擎, 是一种基于模板生成静态文件的通用技术。比如生成静态html文件, 代码生成器中生成通用Java文件等等。现在也用来替代jsp进行数据展示
Freemarker是采用Java语言编写的
Freemarker 使用步骤
- 首先需要定义模板页面 freemarker文件后缀为.ftl
- 后台读取模板页面,已键值对的形式给Freemarker传递数据替换模板中的取值表达式
- 根据配置的路径生成静态文件
实例代码: 生成一个java文件
环境: maven生成的java项目
org.freemarker
freemarker
2.3.23
- FreemarkerUtil 包含对Freemarker的配置和生成文件的工具
public class FreemarkerUtil {
/**
* 获取Freemarker的Template
*
* @param fileName 模板名称
* @return
* @throws IOException
*/
public Template getTemplate(String fileName) throws IOException {
Configuration cfg = new Configuration();
// 定义模版的位置
//从指定文件夹中获取
//cfg.setDirectoryForTemplateLoading(new File(""));
//从类路径中
cfg.setClassForTemplateLoading(getClass(), "/templates");
// 设置对象包装器
cfg.setObjectWrapper(new DefaultObjectWrapper());
// 设置异常处理器
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
return cfg.getTemplate(fileName);
}
/**
* 输出文件
* @param fileName 模板名称
* @param map 数据
* @param path 生成后的文件路径
*/
public void out(String fileName, Map map, String path) {
PrintWriter printWriter = null;
try {
Template template = getTemplate(fileName);
printWriter = new PrintWriter(new FileWriter(path));
//生成文件
template.process(map, printWriter);
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
} finally {
if (printWriter != null) {
printWriter.close();
}
}
}
}
- 在resources中新建templates文件夹, 在其中配置App.ftl模板文件
<#-- 我是freemarker中的注释 -->
<#-- 生成文件 -->
public class App {
public static void main(String[] args) {
System.out.println("${name}");
}
}
很简单的java输出文件
- Junit进行测试
public class App {
FreemarkerUtil mFreemarkerUtil;
@Before
public void before() {
mFreemarkerUtil = new FreemarkerUtil(); //初始化
}
@Test
public void outFile() {
//传递数据
Map map = new HashMap() {{
put("name", "hello world");
}};
//在D盘下生成App.java文件
mFreemarkerUtil.out("App.ftl", map, "D:\\tmp\\App.java");
}
}
- 展示:完美生成可执行的java文件。 就这样简单的小例子,先熟悉下Freemarker的用法
Freemarker是通过键值对的方式传递数据, 所以在ftl中间中要展示后台传递的数据 只需要${key}
的形式即可 类似于jsp的EL表达式
常用指令
list指令
对传递过来的集合数据进行迭代
语法
//普通数据
<#list lists as item> //lists:集合数据 item:循环变量 item_index: 循环索引
${item}
#list>
//循环map
<#list maps?keys as key>
${maps[key]}
#list>
//循环集合中的对象
<#list lists as item>
${item.字段}
#list>
//其他属性
${lists?size} //获取集合的长度
if else 指令
主要是做if判断用的,要注意的是条件等式必须用括号括起来。
语法
<#if 条件>
//一个判断
<#elseif 条件>
//另外一种判断
<#else>
//除以上之外的其他判断
#if>
注意点:
- elseif 和 else 必须包含在 if 中
- if 中不是必须出现elseif 和else 也可以单独if 判断,然后结束
小实例:结合list指令和if else指令 展示列表 并隔行换色
template1.ftl文件 (节省篇幅 只贴出有用代码)
<#-- 我是freemarker中的注释 -->
<#--循环-->
<#list list as l>
<#if (l_index + 1) % 2 == 0> <#--判断 循环索引于2的余数是否为0-->
-
<#elseif (l_index + 1) % 3 == 0> <#--判断 循环索引于3的余数是否为0-->
-
<#else>
-
#if>
${l}- ${l_index + 1}
#list>