大家好,今天给大家分享一下FreeMarker的使用。
比如有一份代码,大部分都相同,但是有一些地方,固定的地方(如下红圈位置),会进行变化,那么我们如何去操作呢?
我们需要进行挖坑,将这些经常变化的地方,挖个坑,到时候再进行填坑。就类似于我们前端项目一样,比如你使用vue,创建一个文件出来,有很多地方,都不是直接写死数据的,而是将其从后台获取数据出来进行填坑。但是我们又不能搞一个vue这样的前后端获取数据,所以这里我们就使用了FreeMarker。
FreeMarker是什么?
一种用于生成动态内容的类库(或框架),通过将预定义的模板与特定数据合并,来生成最终的输出。
使用它的好处就是,我们只需要关心如何挖坑,设置数据可以,如何去填坑以及将数据和模板合并就交给了FreeMarker。
FreeMarker 官方文档:https://freemarker.apache.org/index.html
中文教程:http://freemarker.foofun.cn/toc.html
FreeMarker 教程网:http://www.freemarker.net/
快速入门
1.引入依赖
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.32</version>
</dependency>
2.流程步骤按照官方的来就可以,5个步骤
public class FreeMarkerTest {
@Test
public void test() throws IOException, TemplateException {
//1. new 出 Configuration 对象,参数为 FreeMarker 版本号
Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
//指定模板文件所在的路径
cfg.setDirectoryForTemplateLoading(new File("src/main/resources/templates"));
//设置模板文件使用的字符集
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
cfg.setNumberFormat("0.######");
//2.创建模板对象,加载指定模板
Template temp = cfg.getTemplate("myweb.html.ftl");
//3.指定数据
Map<String, Object> dataModel = new HashMap<>();
dataModel.put("currentYear", 2023);
List<Map<String, Object>> menuItems = new ArrayList<>();
Map<String, Object> menuItem1 = new HashMap<>();
menuItem1.put("url", "https://asdfasdf.cn");
menuItem1.put("label", "lihai");
Map<String, Object> menuItem2 = new HashMap<>();
menuItem2.put("url", "https://asdfasdf.com");
menuItem2.put("label", "niubi");
menuItems.add(menuItem1);
menuItems.add(menuItem2);
dataModel.put("menuItems", menuItems);
//指定生成的文件
Writer out = new FileWriter("myweb.html");
/* 将模板和数据放在一起 调用process方法,处理并生成文件*/
temp.process(dataModel, out);
// 生成文件后别忘了关闭哦
out.close();
}
}
其他用法
1.分支判断
<#if loop>
while (scanner.hasNext()) {
</#if>
// 读取输入元素个数
int n = scanner.nextInt();
// 读取数组
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = scanner.nextInt();
}
// 处理问题逻辑,根据需要进行输出
// 示例:计算数组元素的和
int sum = 0;
for (int num : arr) {
sum += num;
}
System.out.println("${outputText!'sum = '}" + sum);
<#if loop>
}
</#if>
2.指定数据
MainTemplateConfig mainTemplateConfig = new MainTemplateConfig();
mainTemplateConfig.setLoop(false);
mainTemplateConfig.setAuthor("Edwin");
mainTemplateConfig.setOutputText("输出结果是");
template.process(mainTemplateConfig , out);
好了,今天的内容就分享到这里,谢谢大家