Freemarker - 如何间接识别缺失列表

时间:2016-01-15 22:13:24

标签: freemarker

在Freemarker中,我如何间接识别缺失列表变量?间接地,我的意思是我有一个包含列表名称的字符串值;我需要将该字符串转换为(列表的)变量名称,然后检查列表是否存在。这种间接对我的申请至关重要。

例如,此代码有效:

<#assign existing_list      = ["a","b"]>
<#assign existing_list_name = "existing_list">
<#assign ref_existing_list  = existing_list_name?eval>

<#if ref_existing_list?has_content>
    Correctly identified existing list.
<#else>
    Failed to identify existing list.
</#if>

产生输出:

 Correctly identified existing list.

但是如果列表不存在,那么我无法将字符串转换为变量名来检查列表是否存在。例如:

<#assign nonexistent_list_name = "nonexistent_list">
<#assign ref_nonexistent_list  = nonexistent_list_name?eval>

<#if ref_nonexistent_list?has_content>
    Failed to identify that list was non-existent.
<#else>
    Correctly identified that list was non-existent.
</#if>

使用以下错误中止Freemarker:

<FreeMarker>[Error] freemarker.core.InvalidReferenceException: The following  has evaluated to null or missing:
==> nonexistent_list_name?eval  [in template "utilities\\mhc\\templates\\app\\app.h.ftl" at line 17, column 34]

似乎我需要能够将字符串转换为变量名,即使变量丢失,或者在空变量引用上执行eval而不中止。但是我无法找到其中任何一种Freemarker功能。

有人可以提出解决方案吗?

1 个答案:

答案 0 :(得分:1)

这里要认识到的关键是你不能为变量分配缺失的东西。但你可以这样做:

<#assign nonexistent_list_name = "nonexistent_list">

<#if .vars[nonexistent_list_name]?has_content>
  The list exists AND is not empty
<#else>
  The list doesn't exists OR it's empty
</#if>

<#-- The above is nicer, but this still works: -->
<#if nonexistent_list_name?eval?has_content>
  The list exists AND is not empty
<#else>
  The list doesn't exists OR it's empty
</#if>

另一件值得注意的事情是?has_content为现有但空的列表提供false。如果您只想检查列表是否存在,请改用??(例如<#if .vars[nonexistent_list_name]??>)。但是如果你确实想以同样的方式处理空列表和缺失列表,那么,毕竟你也可以进行赋值:

<#assign nonexistent_list_name = "nonexistent_list">
<#assign nonexistent_listref = .vars[nonexistent_list_name]!>

<#if nonexistent_listref?has_content>
  The list exists AND is not empty
<#else>
  The list doesn't exists OR it's empty
</#if>

(请注意#list可以为空列表设置#else分支,无论如何都可以保存一些字符。)