freeMark的Map取值问题

https://www.jianshu.com/p/289e15a49f56

FreeMark除了基本数据类型之外,还有类似于java对象的类型叫容器,主要分为以下三种:

- 哈希表
- 序列
- 集

哈希表从java角度来说,可以是普通的对象,也可以是HashMap。当是普通的对象的时候,直接Object.value这种形式调用即可,但当是java里面的HashMap的时候,尤其数据量比较多的时候,就必须按照键值对的形式来获取数据:

myMap[myKey]

但是,这里有一个比较隐含的条件就是:myKey必须是字符串,否则freeMark就会自动的将非字符串的键转换为字符串,然后再获取myKey对应的value,

文档里是这么描述原因的:

FreeMarker 模板语言( FTL)的“哈希表”类型和 Java 的 Map 是不同的。 FTL 的哈希表也是一个关联数组,但是它仅仅使用字符串的键。这是因为它是为子变量而引的(比如user.password 中的 password,它和 user["password"]是相同的),而变量名是字符串。

这里隐式的自动转换会带来一个严重的问题,比如java中map是这么定义的:

Map<Long, Object> myMap = new HashMap<~>();

此时,在freeMark中写myMap(myLong)就会报错,因为隐式转换为字符形式的时候,会自动加分隔符 , ,比如123345就会被转换为"123,45",从而导致错误的myKey的产生,获取不到value而报错。

解决办法,调用c方法转换:

myMap(myLong?c)

通常来说,也是不推荐自动隐式转换的。比如,如果你在Map中使用Integer类型的键,那么你就必须书写${myMap.get(123?int)}这样子。

作者:杨比轩
链接:https://www.jianshu.com/p/289e15a49f56
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

原文地址:https://www.cnblogs.com/linus-tan/p/11103923.html

时间: 2024-10-08 23:25:39

freeMark的Map取值问题的相关文章

java的map取值

第一种方法根据键值的名字取值 import java.util.HashMap; import java.util.Map; /**   * @param args   */  public static void main(String[] args) {   // TODO Auto-generated method stub         Map<String, Object> map=new HashMap<String, Object>();         map.p

【freemaker】之文本,html文本,去除空格,字母大小写,循环数组,字符串截取,map取值,遍历map

测试代码 @Test public void test06(){ try { root.put("emp", "<span color='red'>你好张三</span>"); freemakerUtil.print(root, "06.ftl"); freemakerUtil.fprint(root, "06.ftl", fn+"06.html"); } catch (Except

map 取值

1>可以取出Map中所有的键所在的Set集合:再通过Set的迭代器获取到每一个键,之后再用get();方法获得对应的值. public static void main(String[] args) { Map<String, String> map=new HashMap<String, String>(); map.put("诶诶", "战神"); map.put("是啥", "发ver");

闲扯json取值,联想map取值。

将list转json(list中的Bean的属性名称为变量,若为常量没必要采用此方式,直接转实体类即可) JSONArray json = JSONArray.fromObject(list); for (Object object : json)        {            // 将json字符串转换成jsonObject              JSONObject jsonObject = JSONObject.fromObject(object);             

js 定义像java一样的map方便取值

js 定义像java一样的map方便取值. 百度有位大神说"js对象本身就是一种Map结构",这真是一段让人欢天喜地的代码. <script> //定义一个全局map var map = {}; var key0 = '0'; var key1 = '1'; map[key0] = '0-真实报文'; map[key1] = '1-虚拟报文'; //row 获取这行的值 ,index 获取索引值 function testJsMap(key){ //如果遍历map for(

Map 遍历取值及jstl的取值

Map 遍历取值及jstl的取值 学习了:http://blog.csdn.net/yanjiaye520/article/details/17354239 1.Java map的便利取值 Java代码 收藏代码 Map<String,String> map = new HashMap<String,String>(); map.put("key1", "value1"); map.put("key2", "va

freemaker中取map的值

freemaker取map数据时,先判断map是否为null值   用assign标签获取${}取值即可 <#if map??&&(map?size gt 0)> <#assign value = (map['key'])> 或 ${examInfoMap['key']} </#if> 原文地址:https://www.cnblogs.com/xiaotong1223/p/9197605.html

小程序中map的取值和赋值

1.初始化 resultMap: { "near": [], "join": [], "publish": [] } 2.js中直接取 const val = this.data.apiMap[key]; 3.页面取值 wx:for="{{resultMap.near}}" 4.赋值 let key = "resultMap." + keyName; this.setData({[key]: newList

使用Struts框架的Java Web项目中的两个Session的区别和常见的Session取值为空的错误

我的百度知道回答,感觉这个知识很有意义,专门贴出来. 不过还有待验证的地方,就是 ActionContext.getContext().getSession("name", "Tom"); //如果在JSP中通过 EL 或者 Struts2 标签怎么显示? 以下是回答正文. 很多初学Java Web的同学因为使用 Strut2框架而分不清两个 Session的区别. 1.   JSP/Servlety有个原生的 session 对象,这是9大内置对象中的一个,书上写