Freemarker模板未被数据模型替换的技术问题咨询
这种情况我之前也碰到过好几次,大概率是模板渲染的上下文数据没正确传递,或者变量解析的配置出了问题,给你几个具体的排查方向:
确认上下文数据是否正确传递
先检查你传给模板引擎的上下文对象里,是不是真的包含user这个键,而且对应的值不是null或者空字符串。举个例子:如果用Freemarker,你有没有把user放到Map或者TemplateHashModel里?如果是Thymeleaf,是不是忘记把数据添加到Model对象中了?
可以在渲染模板前加一行调试代码,打印上下文里的user值,比如Java里用System.out.println(context.get("user")),或者前端用console.log(context),确认数据确实存在。检查模板引擎的变量语法配置
有些模板引擎支持自定义变量分隔符,比如Freemarker默认是${},但如果你的代码里修改了分隔符(比如改成{{}}),那模板里的${user}自然不会被解析。
还要确认你调用HTML打印的代码,和Demo里用的是同一个模板引擎实例,配置完全一致——Demo里可能默认开启了变量解析,但你自己的代码里可能不小心禁用了规则,或者改了解析逻辑。排查HTML模板的加载与处理方式
如果你是直接读取HTML文件内容作为字符串传给引擎,要检查读取过程中有没有编码问题,导致${user}被转义成\${user}或者出现乱码。
另外,有些框架会把HTML当成静态文本处理,跳过模板解析步骤。比如在Spring项目里,如果用@ResponseBody直接返回HTML字符串,模板引擎根本没机会处理变量,自然会输出空值。要确保是通过模板引擎的渲染方法输出HTML,而不是直接返回原始内容。检查变量名的拼写与大小写
这是最容易忽略的点:比如你上下文里的键是username,但模板里写的是user;或者大小写不匹配(比如Uservsuser),这种情况模板引擎不会抛出异常,只会输出空值。仔细核对变量名的每一个字符。排查模板缓存的影响
很多模板引擎默认开启缓存,如果你修改了模板但缓存没更新,可能还是在用旧版本的模板(比如旧模板里user变量被注释掉了)。可以临时关闭缓存测试,比如Freemarker里设置template.setCacheStorage(null),看看变量能不能正常解析。
内容的提问来源于stack exchange,提问作者Rache

