处理以下代码时:
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”,则整个设置工作正常。 我真的很想用'。'命名我的值。
答案 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.Page
和public String getTitle()
方法的公共Java类(例如public String getBody()
),并将该对象放入名为data
的{{1}},或者使用page
和Map<String, Object>
密钥创建包含Map
条目的"title"
,并将其放入名称为"body"
的{{1}}。然后data
等将起作用。或者,如果你真的需要使用点作为名称的一部分,你必须逃避点,以便它知道你并不意味着获得一个子变量:page
。
答案 2 :(得分:0)
我创建了一个名为“UrlEntity”的类,其中私有成员名为url,带有set和get方法,然后我创建了一个名为path的urlEntity.I由var redir = '${path.getUrl()}';
使用它并重新启动我的项目,然后问题解决了。