FreeMarker用法注意:指令<#local>的问题


在FreeMarker页面中可以使用<#local...>定义新的变量,但要注意的是<#local>指令的使用必须要在<#macro>和<#function>中,如果你在宏或函数中使用了<#include>指令引入了外部的文件,而在外部文件中使用<#local>指令却没有包含在<#macro>和<#function>标签中,FreeMarker解析时不认为你在宏和函数中使用<#local>,会出现如下错误信息:

FreeMarker template error (DEBUG mode; use RETHROW in production!): Template inclusion failed (for parameter value "/article/nav.ftl"): Syntax error in template "article/nav.ftl" in line 1, column 1: Local variable assigned outside a macro. ---- FTL stack trace ("~" means nesting-related): - Failed at: #include "/article/nav.ftl" [in template "article/index.ftl" in macro "blockArticleMain" at line 5, column 5] - Reached through: @blockArticleMain [in template "article/layout.ftl" in macro "blockContent" at line 25, column 33] - Reached through: @blockContent [in template "layout.ftl" at line 138, column 29] - Reached through: #include "/layout.ftl" [in template "article/layout.ftl" at line 3, column 1] - Reached through: #include "/article/layout.ftl" [in template "article/index.ftl" at line 1, column 1] ---- Java stack trace (for programmers): ---- freemarker.core._MiscTemplateException: [... Exception message was already printed; see it above ...] at freemarker.core.Include.accept(Include.java:164) at

FreeMarker中<#local>的使用如下:

<#macro blockArticleMain>
<#local currentNavCategory = categoryCode /> # 这个用法是正确的 <#include '/artile/nav.ftl/>

 article/nav.ftl的内容:

<#local currentNavCategory = categoryCode!'N/A' /> # 这里的使用就是错误的
<#assign rootCategory = (rootCategory.code)!'N/A' />
    ....

由于nav.ftl中使用<#local>没有<#macro>和<#function>标签,页面生成会发生:Local variable assigned outside a macro.这样的错误。特此记录一下。