freemarker支持显示数据模型中的所有变量吗?

时间:2013-09-26 12:30:37

标签: freemarker

我希望在freemarker数据模型中看到所有变量,就像struts2 debug标签一样,以显示值堆栈。

freemarker有办法做到这一点吗?

2 个答案:

答案 0 :(得分:18)

没有可能的通用解决方案,但您可以尝试

<#list .data_model?keys as key>
  ${key}
</#list>

如果数据模型只是通常的Map或JavaBean,这是有效的,但对于更复杂的数据模型,如果它支持?keys并且确实返回它,则由数据模型实现决定一切。

您还拥有在模板中设置的变量,这些变量可以像上面一样列出,而不是.data_model使用.globals.namespace(这意味着当前的模板名称空间)和.locals

您可能还有Configuration级别的共享变量,并且无法完全从FTL中列出这些变量(您可以为其编写一个自定义TemplateMethodModel来读取Configuration.getSharedVariableNames(),并且从模板中调用它。

当然,理想情况下,FreeMarker应该有一个<#show_variables>指令或其他东西,尽最大努力展示所有这些...但遗憾的是还没有这样的东西。

答案 1 :(得分:0)

一个更详细的方法是该宏:

<#macro dump_object object debug=false>
    <#compress>
        <#if object??>
            <#attempt>
                <#if object?is_node>
                    <#if object?node_type == "text">${object?html}
                    <#else>&lt;${object?node_name}<#if object?node_type=="element" && object.@@?has_content><#list object.@@ as attr>
                        ${attr?node_name}="${attr?html}"</#list></#if>&gt;
                        <#if object?children?has_content><#list object?children as item>
                            <@dump_object object=item/></#list><#else>${object}</#if> &lt;/${object?node_name}&gt;</#if>
                <#elseif object?is_method>
                    #method
                <#elseif object?is_sequence>
                        [<#list object as item><@dump_object object=item/><#if !item?is_last>, </#if></#list>]
                <#elseif object?is_hash_ex>
                        {<#list object as key, item>${key?html}=<@dump_object object=item/><#if !item?is_last>, </#if></#list>}
                <#else>
                    "${object?string?html}"
                </#if>
            <#recover>
                <#if !debug><!-- </#if>LOG: Could not parse object <#if debug><pre>${.error}</pre><#else>--></#if>
            </#attempt>
        <#else>
            null
        </#if>
    </#compress>
</#macro>

<@dump_object object=.data_model/>

这为您提供了数据模型的完整转储。