是否可以在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中有类似的功能?
没有任何专门用于此目的的东西。如果要打印简单字符串,可以执行此操作:
<script>
var user = "${session.user?js_string}";
</script>
和类似的var someNumber = ${session.someNumber?c};
一样。但是没有用于转储复合对象的内置解决方案。
我想知道是否将?json
添加到FreeMarjer,它将任意对象转换为JSON(也是有效的JavaScript),这将是一个好主意(它经常需要),但安全隐患是可怕的。您将对象的内容递归地转储到客户端...当开发人员将getter添加到类时,他们没有必要意识到模板将通过它遍历整个对象图。
但是,您可以将方法添加到数据模型中,或者作为共享变量添加到执行该操作的Configuration
单例中。 var something = ${toJS(session.something)};
。 (或者实际上,#macro
也能做到这一点,但它更丑陋而且有点慢。)但是考虑一下你将如何处理暴露给客户的东西。