FreeMarker使用

FreeMarker模板引擎实战指南
本文介绍了如何使用FreeMarker在Java代码中向FTL模板添加数据,包括通过ProjectDescToStringUtil工具类填充模板,详细讲解了FTL模板中的取值、判断语句的使用,并指导在Windows环境下创建FTL模板。

使用FreeMarker实现向ftl模板中添加数据

Java代码中实现向list中添加数据

JSONObject map  = new JSONObject();
map.put("username", username);//放入map中
map.put("maxputoutdays", maxputoutdays);//放入map中

JSONObject result = new JSONObject();
JSONArray retArray = new JSONArray();
retArray.add(map);
result.put("array", retArray);//array提供为页面使用
//greatTempFile方法是将result里面的数据填充到projectdesc.ftl模板
ProjectDescToStringUtil.greatTempFile(null, result,"projectdesc.ftl");

ProjectDescToStringUtil工具类实现数据填充到模板

  • 需要jar包支持
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
</dependency>
  • 代码实现
public static String greatTempFile(HttpServletRequest request, JSONObject object,String templateFileName) {
        StringWriter writer = null;
        try {

            Configuration cfg = new Configuration();

            String url = ProjectDescToStringUtil.class.getClassLoader().getResource("/").getPath();
            //动态获取path
            String path = url.substring(url.indexOf("/"), url.lastIndexOf("/classes"))+"/ftl";;

            File dir = new File(path);
            cfg.setDirectoryForTemplateLoading(dir);
            Template t = cfg.getTemplate(templateFileName, "UTF-8"); // 模板文件名
            writer = new StringWriter();

            t.process(object, writer);

        } catch (Exception e) {
           //出异常,记录日志
        }

        return writer.toString();

    }

ftl模板中取值

  • 获取传递变量值:${item.username!},使用!防止空值报错

ftl模板中使用判断语句

  • <#if condition>中的condition条件应直接使用item.maxputoutdays取值,不能使用$符号类似这种${item.maxputoutdays!},负责会报错,无法识别。
<#list array as item> <#if item.maxputoutdays == '0'>满标当日
<#elseif item.maxputoutdays == '1'>满标次日
<#else>
满标第${item.maxputoutdays!}日
</#if>
</#list> 
  • 代码中的array类型为JSONObject extends HashMap implements Map
  • JSONArray extends ArrayList implements List

ftl模板制作(Windows环境)

  • 新建一个普通的txt文档,修改后缀为ftl即可
  • 以下为一个简单的ftl模板,内容为html代码片段
<#list array as item>
    <ul class="tabs">
        <li id="decsearch">
            <table width="500" border="1"
                style="border-collapse: collapse; border-spacing: 0; line-height: 30px;">
                <tr>
                    <td style="text-align: center;">借款用途</td>
                    <td style="padding-left: 5px;">${item.loanPurpose!}</td>
                </tr>
                <tr>
                    <td style="text-align: center;">募集期</td>
                    <td style="padding-left: 5px;">${item.investday!}天</td>
                </tr>
                <tr>
                    <td style="text-align: center;">起息日</td>
                    <td style="padding-left: 5px;">
                        <#if item.maxputoutdays == '0'>
                          募集满标当日
                        <#elseif item.maxputoutdays == '1'>
                         募集满标次日
                        <#else>
                          募集满标第${item.maxputoutdays!}日
                        </#if>
                    </td>
                </tr>
            </table>
        </li>
    </ul>
</#list>
### 使用FreeMarker模板引擎进行Java开发 #### 配置环境 为了使用FreeMarker,在项目中需引入依赖库。对于Maven项目,可以在`pom.xml`文件中加入如下配置: ```xml <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.31</version> </dependency> ``` #### 初始化Configuration对象 创建并初始化`Configuration`实例来设置模板路径和其他参数。 ```java import freemarker.template.Configuration; import freemarker.template.Template; public class TemplateEngine { private Configuration cfg; public TemplateEngine() throws Exception { // 创建一个新的配置实例 cfg = new Configuration(Configuration.VERSION_2_3_30); // 设置模板加载器,默认从类路径下读取模板文件 cfg.setClassForTemplateLoading(this.getClass(), "/templates/"); cfg.setDefaultEncoding("UTF-8"); cfg.setLocale(Locale.US); cfg.setOutputFormat(HtmlMarkupOutputFormat.INSTANCE); } } ``` #### 加载模板与数据模型处理 通过`cfg.getTemplate()`方法获取指定名称的模板,并准备要传递给模板的数据模型。 ```java Map<String, Object> dataModel = Maps.newHashMap(); dataModel.put("title", "Hello World!"); dataModel.put("message", "Welcome to FreeMarker!"); // 获取名为 'index.html' 的模板 Template temp = cfg.getTemplate("index.html"); Writer out = new OutputStreamWriter(System.out); try { // 将数据渲染到输出流 temp.process(dataModel, out); } finally { out.flush(); } ``` 当访问不存在变量或null值时,FreeMarker会将其视为错误终止执行[^3]。因此建议开发者在编写模板前充分考虑这些情况,可以利用内置函数如`${variable!default_value}`为可能为空的对象提供默认显示内容。 #### 处理HTML资源位置约定优于配置原则 按照惯例而非配置的方式工作意味着框架能够自动识别位于特定目录下的`.html`文档作为视图页面而无需额外设定。例如,如果定义了常量`DEFAULT_PREFIX="classpath:/templates/"` 和 `DEFAULT_SUFFIX=".html"` ,那么只需编辑resources/templates 文件夹内的 HTML 文件即可让Thymeleaf 自动呈现它们[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值