代码之家  ›  专栏  ›  技术社区  ›  srzhio

在Freemarker模板中迭代HashMap将显示map的方法

  •  1
  • srzhio  · 技术社区  · 6 年前

    在Apache OfBiz应用程序中,我在控制器中有这样的代码:

       public static String runRequest(HttpServletRequest request, HttpServletResponse response) {
            Map<String, Long> typesToCount = getTypesToCount();
            request.setAttribute("types", typesToCount);
            return HttpFinals.RETURN_SUCCESS;
       }
    

    在freemarker模板中,它的处理/迭代如下:

    <table
    <#list requestAttributes.types as key, value>
        <tr>
            <td>${key}</td>
            <td>${value}</td>
        </tr>
    </#list>
    </table>
    

    对于值,它们根本不会呈现,错误如下:

    FreeMarker template error: For "${...}" content: Expected a string or something automatically convertible to string (number, date or boolean), or "template output" , but this has evaluated to a method+sequence (wrapper: f.e.b.SimpleMethodModel)
    

    我正在使用

    3 回复  |  直到 6 年前
        1
  •  3
  •   PRADEEP CHOUDHARY    6 年前

    方法返回一个集合( Set<Map.Entry<K, V>> )此映射中包含的映射的。所以我们可以使用Map.Entry的getKey()和getValue()方法迭代键值对 <K, V> . 此方法是最常见的,如果在循环中同时需要映射键和值,则应使用此方法。

    <table>
      <#list requestAttributes.entrySet() as requestAttribute>
      <tr>
        <td>${requestAttribute.getKey()}</td>
        <td>${requestAttribute.getValue()}</td>
      </tr>
      </#list>
    </table>
    
        2
  •  2
  •   srzhio    6 年前

    基本上,我只是在把地图包装好之后才设法遍历它 简单模型

       public static String runRequest(HttpServletRequest request, HttpServletResponse response) {
           Map<String, Long> typesToCount = getTypesToCount();
           request.setAttribute("types",  new SimpleMapModel(typesToCount, new DefaultObjectWrapper())));
           return HttpFinals.RETURN_SUCCESS;
        }
    

    和int ftl模板:

       <#list requestAttributes.types?keys as key>
       <tr>
           <td>${key}</td>
           <td>${requestAttributes.types[key]}</td>
       </tr>
       </#list>
    
        3
  •  1
  •   ddekany    6 年前

    如果FreeMarker配置为使用纯 BeansWrapper (相对于 DefaultObjectWrapper object_wrapper 设置,以及 BeansWrapper.simpleMapWrapper 属性保留其默认值, false . 不用说,这是一个非常有问题的配置。希望这不是OfBiz的默认设置。尽管对于旧的框架,这可能会发生,许多年前,这是一种绕过FreeMarker某些限制的方法,因为这样您就可以只使用 Map ?api 内置的技术使得这种攻击变得毫无必要。