freemarker 多模板拼接
时间: 2023-08-22 09:42:15 浏览: 46
Freemarker 支持多模板拼接,可以通过 include 指令来实现。
首先,需要定义多个模板文件,每个文件中包含自己的模板内容。然后,在主模板文件中使用 include 指令,将多个子模板文件引入进来,拼接成最终的结果。
例如,假设有三个模板文件:header.ftl、body.ftl 和 footer.ftl,分别表示网页的头部、主体和底部。可以在主模板文件中这样引入它们:
```
<#include "header.ftl">
<#include "body.ftl">
<#include "footer.ftl">
```
这样,Freemarker 就会自动将三个模板文件的内容拼接在一起,生成最终的网页。
需要注意的是,引入的模板文件路径需要根据实际情况进行调整。如果模板文件在当前目录下,则可以直接使用文件名进行引入;否则需要使用相对或绝对路径进行引入。
相关问题
用freemarker模板拼接分页,${sql} limit #{pageSize} offset #{start}
使用 FreeMarker 模板拼接分页的方法如下所示,其中 `${sql}` 表示 SQL 查询语句,`#{pageSize}` 和 `#{start}` 分别表示每页大小和起始位置:
```
<#assign pageSize = 10>
<#assign start = (pageNo - 1) * pageSize>
<#assign sql = "SELECT * FROM table_name WHERE condition ORDER BY column_name">
<#assign sqlWithLimit = sql + " LIMIT " + pageSize + " OFFSET " + start>
<#-- 执行 sqlWithLimit 查询语句,获取分页数据 -->
```
在上述代码中,我们首先定义了每页大小和起始位置,然后通过字符串拼接的方式将 `LIMIT` 和 `OFFSET` 关键字加入到查询语句中,得到了最终的分页查询语句 `sqlWithLimit`。最后,我们可以执行 `sqlWithLimit` 查询语句,获取分页数据。
需要注意的是,上述代码中的 `pageNo` 变量表示当前页码,需要在模板中传入。另外,`table_name`、`condition` 和 `column_name` 都需要根据实际情况进行修改。
优化这段代码: File file = new File(firstDocPath); InputStream ins = new FileInputStream(file); //注册xdocreport实例并加载FreeMarker模板引擎 IXDocReport report = XDocReportRegistry.getRegistry().loadReport(ins, TemplateEngineKind.Freemarker); //创建xdocreport上下文对象 IContext context = report.createContext(); //创建要替换的文本变量 context.put("casePersons", casePersonList); context.put("bookResults", bookResultList);//创建字段元数据 FieldsMetadata fm = report.createFieldsMetadata();fm.load("shortVideoResults", ShortVideoAnalysisResultDto.class, true); fm.load("softwareResults", SoftwareAnalysisResultDto.class, true); report.setFieldsMetadata(fm);response.setCharacterEncoding("utf-8"); response.setContentType("application/vnd.msword"); //response.setContentType("application/octet-stream"); String fileName = reportName + ".docx"; response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8")))); report.process(context, response.getOutputStream());
以下是对代码的优化建议:
1. 将文件操作的代码封装在一个方法中,以便复用和维护。
2. 使用try-with-resources自动关闭InputStream和OutputStream,可以避免手动关闭时出现的异常。
3. 使用常量或枚举类型代替魔法值,提高代码可读性。
4. 将重复的字符串拼接操作提取出来,避免在代码中重复出现。
5. 使用Lambda表达式简化代码,提高可读性。
下面是优化后的代码:
```java
private void exportDocxFile(String firstDocPath, String reportName, List<CasePerson> casePersonList, List<BookResult> bookResultList) {
try (InputStream ins = new FileInputStream(firstDocPath);
OutputStream os = response.getOutputStream()) {
IXDocReport report = XDocReportRegistry.getRegistry().loadReport(ins, TemplateEngineKind.Freemarker);
IContext context = report.createContext();
context.put("casePersons", casePersonList);
context.put("bookResults", bookResultList);
FieldsMetadata fm = report.createFieldsMetadata();
fm.load("shortVideoResults", ShortVideoAnalysisResultDto.class, true);
fm.load("softwareResults", SoftwareAnalysisResultDto.class, true);
report.setFieldsMetadata(fm);
response.setCharacterEncoding("utf-8");
response.setContentType("application/vnd.msword");
String fileName = reportName + ".docx";
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString()));
report.process(context, os);
logger.info("导出成功:" + fileName);
} catch (Exception e) {
logger.error("导出失败:" + e.getMessage());
}
}
```