11

我想查看 freemarker 数据模型中的所有变量,就像 struts2debug标记显示值堆栈一样。

freemarker有没有办法做到这一点?

4

3 回答 3

24

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

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

如果数据模型只是一个普通的Map或 JavaBean,这可以工作,但对于更复杂的数据模型,它取决于数据模型实现是否支持?keys并且它是否确实返回了所有内容。

您还拥有在模板中设置的变量,可以像上面一样列出,只是代替.data_modeluse .globals, .namespace(表示当前模板命名空间)和.locals.

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

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

于 2013-09-26T21:40:20.087 回答
2

更详细的方法是这个宏:

<#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/>

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

于 2019-02-23T15:09:36.173 回答
0

这是修改为发出 JSON 的 @lemhannes 宏定义。在一个相当简单的数据模型上进行了轻微测试

<#macro dump_object object debug=false>
  <#compress>
    <#if object??>
      <#attempt>
        <#if object?is_node>
          <#if object?node_type == "text">${object?json_string}
          <#else>${object?node_name}<#if object?node_type=="element" && object.@@?has_content><#list object.@@ as attr>
            "${attr?node_name}":"${attr?json_string}"</#list></#if>
             <#if object?children?has_content><#list object?children as item>
                <@dump_object object=item/></#list><#else>${object}</#if>"${object?node_name}"</#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?json_string}":<@dump_object object=item/><#if !item?is_last>, </#if></#list>}
             <#else>
              "${object?string?json_string}"
             </#if>
      <#recover>
        <#if !debug>"<!-- </#if>LOG: Could not parse object <#if debug><pre>${.error}</pre><#else>-->"</#if>
      </#attempt>
    <#else>
      null
    </#if>
  </#compress>
</#macro>
于 2021-09-09T00:17:12.457 回答