FreeMarker中如何查看变量赋值?类似JS console.log的调试方法
FreeMarker查看变量实际值的调试方法
FreeMarker没有和JavaScript里console.log()完全1:1对应的原生语法,但下面这几个方法完全可以实现等效的调试效果,开发时查变量值非常方便:
- 快速打印普通变量值
普通的字符串、数字、布尔值这类简单类型变量,直接用插值输出加转义就行,避免输出的内容打乱页面结构:<#-- 查看变量x的实际值,?html做HTML转义,避免特殊字符渲染异常 --> ${x?string?html} - 打印复杂对象/列表/哈希的完整结构
如果你用的是FreeMarker 2.3.27及以上版本,直接用内置的?dump函数就行,效果和JS里console.log打印对象的展开结构几乎一致,不仅能看单个变量,还能直接看整个数据模型的所有变量:
要是你用的FreeMarker版本比较老没有<#-- 打印单个变量x的完整结构,pre标签保留缩进换行格式 --> <pre>${x?dump?html}</pre> <#-- 打印当前模板上下文里所有可用变量的全集 --> <pre>${.data_model?dump?html}</pre>?dump,对于哈希/对象类型的变量,可以遍历它的所有可访问键值对逐个打印:<#if x?is_hash> <ul> <#list x?keys as prop> <li><strong>${prop?html}</strong>: ${x[prop]?string?html}</li> </#list> </ul> </#if> - 开发环境全局调试配置
本地开发时可以把FreeMarker的异常处理器配置为html_debug模式,一旦模板执行出错,错误页会自动展示当前执行栈、上下文内所有变量的取值和结构,不用手动在模板里加打印语句就能快速定位变量问题。 - 输出调试信息到服务端日志
如果你不想把调试内容打到渲染的页面上,可以提前在数据模型中注入一个日志实例,再封装个简单的自定义宏,就能实现和console.log几乎一致的调用体验,调试信息会直接打到服务端日志里:<#-- 提前定义通用日志宏 --> <#macro consoleLog val> <#assign _ = logger.debug("[FTL DEBUG] 变量值: {}", val?string) > </#macro> <#-- 需要调试时直接调用即可 --> <@consoleLog x />
注意:如果打印Java对象时发现某些属性看不到,先确认对应属性有没有提供公共的getter方法,FreeMarker是通过JavaBean规范访问对象属性的,没有公共访问权限的属性读不到属于正常情况。
内容的提问来源于stack exchange,提问作者Hemanth
相关产品推荐
相关产品推荐

