【问题标题】:Can FTL modify the request object setting an attribute?FTL 可以修改设置属性的请求对象吗?
【发布时间】:2012-11-17 09:09:19
【问题描述】:

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

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

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

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

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

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

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

谢谢

【问题讨论】:

    标签: servlet-filters freemarker


    【解决方案1】:

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

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

    【讨论】: