0

我知道 FTL 纯粹是一个渲染引擎,这应该在控制器中完成,但在我的场景中,我需要提供相同数据的多个表示。

我可以轻松编写呈现 XML 的 FTL,然后在自定义过滤器需要时将其转换为 JSON。然而,我们有大量的 FTL 要做。数据模型将是通用的。虽然 XML 方法是一种选择,但我不想一遍又一遍地重复相同的 XML 元素,(不同的团队成员编写手工 xml 元素是错误的根源,我们需要确保标记是相同的,等等)

但是我想知道我是否可以在我的 FTL 中填充一个对象

//假设 FreMarkerResolver 已将我的输出元模型作为模型的一部分公开 someObject.addRecords(Records)

//这里的一些逻辑 request.setAttribute("data",someObject);

那么我的 Servlet 过滤器只会将数据对象转换为 JSON、xml、YAML 或任何我想要的。

我在某处读过,例如会话不能从 FTL 修改,但是请求呢?我们至少可以设置一个新属性吗?

谢谢

4

1 回答 1

0

FreeMarker 本身对 Servlet 或 HTTP 一无所知。即使您只能读取请求或会话对象,这已经是更高级别的 Web 应用程序框架正在做的事情。是否以及如何从模板中查看这些对象完全取决于 Web 应用程序框架,因此是否有修改它们的方法取决于它。现在我假设你的情况没有。

您可以创建一个TemplateDirectiveModel封装Request并执行您想要的操作,然后将其放入数据模型中,例如使用 name storeInRequest,这样您就可以<@storeInRequest data=someObject />在模板中执行类似的操作。或者您可以找出其他可以更好地表达您在该应用程序中想要的东西。关键是,由于TemplateDirectiveModel是用 Java 实现的,因此您可以在其中执行任何操作。(同样,你可以用 实现类似函数的东西TemplateMethodModelEx,但是如果你需要一个副作用而不是返回值,那么TemplateDirectiveModel更好。另外它有命名参数......)

于 2012-11-17T10:29:32.570 回答