近期需要实现一个小 Case 二级联动列表
在进入页面的时候已经初始化一级列表 二级列表需要根据一级的内容变化而展示不同列表 那么可以在一级列表的 option 里面存储 对应的二级列表要展示的数据 放在 data-** 或者 任意非内置属性中 这个属性值应该在模板渲染后就存储进去,故需要将对应的 java 的 list or array 对象转成 String 存进去。 下边的模板宏方法可以实现上面的需求
#macro(VelListToJSON $list )
#set($myList = $list )
{##
#foreach($key in $myList.keySet())
"$key": ##
#set($x = $myList.get($key)) ##
#VelToJSON($x)
#if(($foreach.count) < $myList.keySet().size())
,##
#end
#end
}##
#end
#macro(VelArrayToJSON $arr)
#set($myArr = $arr)
[##
#foreach($x in $myArr)
#VelToJSON($x) ##
#if($foreach.count < $myArr.size())
,##
#end
#end
]##
#end
##TODO: Make it not treat numbers as strings
#macro(VelToJSON $item)
#if($item.keySet())
#VelListToJSON($item)
#elseif($item.size())
#VelArrayToJSON($item)
#elseif($item == true || $item ==false)
$item ##
#else
"$item" ##
#end
#end
后续 -- 我真傻
其实完全可以在 server 端用 fastjson 或者 json-lib 将 对象转为 jsonObject 然后 toString; 再通过 velocity 模版语言的 $variable 传递给 js 的一个变量,在浏览器解析后就是一个 json 对象。
将转化步骤提前到Java程序步骤,瞬间思路明晰了。