是否可以在Freemarker模板引擎中对复杂对象执行Javascript内联以实现Thymeleaf可以完成的工作?例如,如Thymeleaf tutorial中所述,如果我们具有以下代码:
<script th:inline="javascript">
var user = [[${session.user}]];
</script>
${session.user}
表达式的结果为User对象,Thymeleaf会将其正确转换为Javascript语法:
<script th:inline="javascript">
var user = {'age':null,'firstName':'John','lastName':'Apricot',
'name':'John Apricot','nationality':'Antarctica'};
</script>
Freemarker中是否有类似功能?
答案 0 :(得分:1)
没有任何专门用于此目的的东西。如果要打印一个简单的字符串,可以执行以下操作:
<script>
var user = "${session.user?js_string}";
</script>
,并类似地var someNumber = ${session.someNumber?c};
输入一个数字。但是,没有内置的用于转储复合对象的解决方案。
我想知道将?json
添加到FreeMarjer(将任意对象转换为JSON(也是有效的JavaScript))是否是一个好主意(经常需要),但是安全隐患却令人恐惧。您可以将对象的内容递归地转储到客户端...当开发人员将吸气剂添加到类中时,他们不必意识到模板将遍历整个对象图。
但是,您可以将方法添加到数据模型中,也可以将共享方法添加到Configuration
单例中,以实现此目的。 var something = ${toJS(session.something)};
。 (或者实际上,#macro
也可以做到这一点,但是它比较丑陋,而且速度稍慢。)但是请考虑如何与客户保持联系。