本帖最后由 is_zhoufeng 于 2012-06-09 16:01:15 编辑

解决方案 »

  1.   


            <#list quotemap?keys as hotel>
                $("tbody").append("<tr hid='${hotel.id?c}'><td class='hname' ><span class='h_name'><@etdsmacro.i18n _obj=hotel _express="name" /></span></tr>");
               <#list quotemap[hotel]?keys as room>  //这里遍历有问题
                  $("tbody").append("<tr><td>${room.id }</td></tr>");
                </#list>
            </#list> 
      

  2.   

     这里quotemap[hotel] 不会为NUll吧
      

  3.   


    freeer 遍历map对象时, 如果key为对象类型。  会有问题。我当时解决的办法好是 改用List了。
      

  4.   

    那楼主遍历过Map<String,Map<String,Object>>类型的吗?取value值报错
      

  5.   

    看了一下文档 。复制给你看看14.  为什么在 myMap[myKey]表达式中不能使用非字符串的键?
    那现在应该怎么做? 
      FreeMarker 模板语言(FTL)的“哈希表”类型和Java 的Map 是不同的。FTL 的哈希表
    也是一个关联数组,但是它仅仅使用字符串的键。这是因为它是为子变量而引入的(比如
    user.password 中的password,它和user["password"]是相同的),而变量
    名是字符串。 
      所以FTL 的哈希表不是通常目的上的,可以被用来使用任意类型的键查找值的关联数组。
    而且,它有方法。方法是数据模型的一部分,它们也可以执行所有和计算有关的各种数据模
    型,当然你可以为 Map 查找在数据模型中添加一些方法。不好的消息是数据模型的构建,
    作为一个应用程序的具体问题,是使用 FreeMarker 程序员的任务,所以他们的任务是保证
    这样的方法可以服务于模板设计者并呈现出来。(然而,当模板开发人员需要调用不是用来
    呈现内容的方法时,那么就要考虑数据模型是否足够的简单。也许你应该在数据模型构建阶
    段做一些后台运算。在理想的情况下,数据模型包含应该被展示的内容,而不是那些为后期
    运算而服务的基本内容。) 
      如果你阅读过程序开发指南,那么在技术上你就明白了,数据模型是
    freeer.template.TemplateModel 对象的树。通常(非必须)由自动包装
    (包含)普通Java 对象到TemplateModel 对象方式的数据模型的构建。进行对象包装
    的对象是对象包装器,当你配置 FreeMarker 时它就被指定了。FreeMarker 本身有一部分即
    装 即 用 的 对 象 包 装 器 实 现 , 也 许 它 们 当 中 使 用 最 多 的 一 个 就 是
    freeer.ext.beans.BeansWrapper(可以阅读程序开发指南/其它/Bean 的
    包装部分获取更多内容,译者注)。如果你使用了它的实例作为对象包装器,那么你向数据
    模型中放置的 java.util.Map 将会作为一个方法,那么你可以在模板中编写
    myMap(myKey),在内部就会调用Map.get(myKey)方法。对myKey 的类型没有严
    格的限制,正如 Map.get(Object key)也没有这样的限制。如果 myKey 的值由
    BeansWrapper 来包装或其他支持解包的对象包装器,或在模板中是以文字形式给出的,
    那么值在真正调用Map.get(Object key)方法之前将会被自动解包成普通Java 对象,
    所以它不会和TemplateModel 一起调用。 
      但是那仍然会有问题。Java 的Map 对键的确切的类非常专注,所以对于在模板中计算
    的数字类型的键,你不得不将它们转换成合适的 Java 类型,否则其中的项就不能被发现。
    比 如 ,如 果你 在 Map 中 使用 Integer 类型 的键 , 那么 你就 必须 书 写
    ${myMap.get(123?int)}。这是由 FTL 的有意简化的仅有单独数字类型的类型系统
    导致的非常丑陋的写法,而Java 区分很多数字类型。(理想情况下,在上述情况中,程序员
    保证get 方法自动转换键到Integer 类型,所以这不是模板开发者的问题。这可以由定
    制包装器来完成,但是包装器必须知道特定的使用Integer 类型键的Map 对象,假设是
    应用程序的特定知识。)注意,当键值直接从数据模型(也就是说,你不用在模板中使用算
    数运算来改变它的值)中获取时是不需要转换的,包含当它是方法返回值的情况,而且在包
    装之前要是合适的类,因为这样解包的结果将会是原始的类型。