开发中 有时候需要获取到 freemark 的数据
比如后台放入的数据为
List<HashMap<String, Object>> list = new ArrayList<>(); HashMap<String, Object> map1 = new HashMap<>(); map1.put("id",1); map1.put("name","张三"); map1.put("age",18); list.add(map1); HashMap<String, Object> map2 = new HashMap<>(); map2.put("id",2); map2.put("name","李四"); map2.put("age",19); list.add(map2); HashMap<String, Object> map3 = new HashMap<>(); map3.put("id",1); map3.put("name","王五"); map3.put("age",20); list.add(map3);
我们一般 ftl 页面解析如下
<#if list?? && (list?size > 0)> <#list list as item> <span>item.id</span> <span>item.name</span> <span>item.age</span> </#list> </#if>
但是有时候,我们想在页面直接获取到这个 list,可以通过 js 的方式获取到,存在变量中,然后可以放到页面隐藏的元素中,以便后续使用
<script> var listData = [] var itemData = {} <#if list??> <#list list as item> itemData.id = '${item.id}' itemData.name = '${item.name}' itemData.age = '${item.age}' itemData.date = '${item.date?string('yyyy-MM-dd')}' listData.push(item); </#list> </#if> </script>
也可以在后台 把对象转成 jsonstring
js 中直接当初字符串接收,然后转成 json 对象使用
// 对象转 jsonstring String jsonStr = JSONObject.toJSONString(obj) Map<String, Object> map = new HashMap(16); // freemark 后台put map.put("d1",jsonStr)
//js中处理 var dataStr = ${'d1'} //然后可将dataStr转成 JSONobj var obj = eval('(' + dataStr + ')'); 或者 var obj = JSON.parse(dataStr ); 或者 var obj = dataStr .parseJSON();
注意点
有时候模板报错
"freemarker.core.NonStringException: For \"${...}\" content: Expected a string or something automatically convertible to string (number, date or boolean), but this has evaluated to a sequence (wrapper: f.t.SimpleSequence)
Freemarker 会将通过 key 获取的 value 默认转为 string ,所以这里有上面你的两种处理方式
- 在模板中遍历
- 如果是在 js 中得话 ,后台可将对象转成 JSONSring,然后再 js 中处理
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于