在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功能。
有人可以提出解决方案吗?
答案 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
分支,无论如何都可以保存一些字符。)