Javascript 在 Freemarker 模板引擎中可以内联吗?

Is Javascript inlining possible in Freemarker template engine?

是否可以在 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 添加到 class 时,他们没有必要意识到模板将遍历并通过它公开整个对象图。

但是,您可以将方法添加到数据模型或作为共享变量添加到执行此操作的 Configuration 单例。 var something = ${toJS(session.something)};。 (或者实际上,#macro 也可以做到这一点,但它更丑陋,而且速度稍慢。)但请考虑如何将暴露给客户的内容掌握在手中。