解决方案 »
- 三个月内能不能同时把Spring,structs,hibernate学个大概
- 初学者的问题
- HSSF对Excel的支持问题
- 在java中, 我想作一个自动产生的订单编号,,就是把当前日期转化为为数字,如何作,,,谢谢了,,,,在家给看看,
- 如何在TOMCATE的SERVER.XML配置数据源时指定characterEncoding=GBK?
- 使用struts开发时,碰到使用window.open()新开窗口时,原窗口的session丢失,500分。
- 有人在solaris下用过fop吗?
- 偶来献分了!!!!!JDBC新手问题!!
- java mail异常T T
- html代码中使用正则匹配字符串
- 关于IE8下载docx的文件,会变成下载zip文件的疑问。
- jdbc如何使用 Insert into Table2 select ,SELECT vale1和 value2 into Table2 from Table1
<#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>
freeer 遍历map对象时, 如果key为对象类型。 会有问题。我当时解决的办法好是 改用List了。
那现在应该怎么做?
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 对象,假设是
应用程序的特定知识。)注意,当键值直接从数据模型(也就是说,你不用在模板中使用算
数运算来改变它的值)中获取时是不需要转换的,包含当它是方法返回值的情况,而且在包
装之前要是合适的类,因为这样解包的结果将会是原始的类型。