FreeMarker嵌套数据:解析时出错

时间:2015-12-18 09:55:19

标签: templates freemarker

处理以下代码时:

template.process(data, filewriter);

template是freemarker.template.Template类的对象。由

创建
Configuration cfg = new Configuration(new Version("2.3.23"));
cfg.setDefaultEncoding("UTF-8");
try {
    cfg.setDirectoryForTemplateLoading(new File(
            "dir/to/templates"));
} catch (IOException e) {
    e.printStackTrace();
}

this.template = cfg.getTemplate(path);

filewriter是FileWriter对象

数据是一张地图,填充为

key ->"page.title", value ->"Dummy Page title"
key ->"page.body", value ->"Dummy Page Body"

我使用了以下模板

<html>
<head>
<title>${page.title}</title>
</head>
<body>
<p>This page is generated using freemarker
</p>
<p>
${page.body}
</p>
</body>
</html>

处理时,我收到以下错误:

FreeMarker template error:
The following has evaluated to null or missing:
==> page  [in template "default.ftl" at line 3, column 10]

----
Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
    - Failed at: ${page.title}  [in template "default.ftl" at line 3, column 8]
----

请说明我做错了什么?

PS:如果我在两个地方将名称“page.title”更改为“pagetitle”,将“page.body”更改为“pagebody”,则整个设置工作正常。 我真的很想用'。'命名我的值。

3 个答案:

答案 0 :(得分:1)

作为例外:

FTL stack trace ("~" means nesting-related):
    - Failed at: ${page.title}  [in template "default.ftl" at line 3, column 8]

freemarker会将${page.title}解析为嵌套对象,您可以尝试使用dataModel

${.dataModel["page.title"]}

答案 1 :(得分:1)

创建一个具有com.example.Pagepublic String getTitle()方法的公共Java类(例如public String getBody()),并将该对象放入名为data的{​​{1}},或者使用pageMap<String, Object>密钥创建包含Map条目的"title",并将其放入名称为"body"的{​​{1}}。然后data等将起作用。或者,如果你真的需要使用点作为名称的一部分,你必须逃避点,以便它知道你并不意味着获得一个子变量:page

答案 2 :(得分:0)

我创建了一个名为“UrlEntity”的类,其中私有成员名为url,带有set和get方法,然后我创建了一个名为path的urlEntity.I由var redir = '${path.getUrl()}';使用它并重新启动我的项目,然后问题解决了。