gpt4 book ai didi

java - 我如何在 FreeMarker 模板中连接两个东西?

转载 作者:行者123 更新时间:2023-11-30 11:12:59 25 4
gpt4 key购买 nike

我是 Java 的初学者,但我一直面临着修改现有软件的问题。如果能得到任何帮助,我将不胜感激。

我拥有的 FreeMarker 模板向 restful API 发出请求,并取回一些表示论坛上最近二十个回复的 XML。然后它遍历它们,一个接一个地显示。

  <#assign recent = rest(restContext + "/boards/id/352/replies/recent").messages />

有一个单独的 API 端点可以获取最近发布的 20 个话题。两个调用都返回格式相同的 XML。

我想做的是将这两件事合二为一,这样我就可以显示“最新的帖子和主题”。我会按 response.messages.post_time 对组合项进行排序。

我的问题是:我将如何在模板中执行此操作,这是我唯一可以访问的代码片段? rest 是 FreeMarker 中内置的东西吗?我力不从心,希望能得到一些帮助,Java 对我来说还是个新手。

最佳答案

这看起来很眼熟……Lithium REST API v1 请求,不是吗?

您基本上可以在正确的位置合并两个响应对象(v1 的响应结构往往不是很直观...)但是正常的 rest() 上下文对象响应不能简单地合并到 FreeMarker 中(使用+ 在相同的数据类型上,例如散列或序列),所以你需要的是 Lithium v​​14.12 或更高版本和 restd() 上下文对象......你的代码应该看起来像这样:

<#assign replies = restd("/replies/recent", "json")?replace("\\/", "/")?replace(':null', ':"null"')?eval />
<#assign threads = restd("/topics/recent", "json")?replace("\\/", "/")?replace(':null', ':"null"')?eval />
<#assign merged = replies.response.messages.message + threads.response.messages.message />
<#assign objects = [] />

<#list merged as obj>
<#-- to sort we have to create our own object with a more simple structure (right now the post_time is deeply nested and not accessible with ?sort_by) -->
<#assign object = {
"subject": obj.subject.$,
"href": obj.href,
"post_time": obj.post_time.$,
"author": obj.author.login.$
} />

<#assign objects = objects + [object] />
</#list>

<#-- now we can sort the objects we created above, you probably want the newest objects on top, right? if not, just remove the ?reverse -->
<#assign objects = objects?sort_by("post_time")?reverse />

<ul>
<#-- now we list again (yes...) over the sorted objects and output them -->
<#list objects as obj>
<li><a href="${obj.href}">${obj.subject}</a> on ${obj.post_time} from ${obj.author}</li>
</#list>
</ul>

上面代码的解释基本上是我们需要来自 Lithium 的 REST API 的东西可以转换为“正常”的 FreeMarker 对象/数据类型,JSON 恰好或多或少类似于 FreeMarker 哈希/序列,具有很少有异常(exception)(比如空值......),这就是为什么我们需要这些 ?replace 内置函数来“清理”传入的 JSON 字符串,然后调用 ?eval (是的,这是邪恶的,但有时我们需要邪恶来对抗邪恶 =D ) 在该字符串上创建 FreeMarker 对象。

之后,我们可以简单地将对象合并到正确的位置(在您的例子中是 response.messages.message 节点)并从中创建一个新对象,然后我们可以使用它来模板化我们的组件。

排序部分使得有必要基本上“重新构造”我们刚刚合并的对象,因为 FreeMarker 内置 ?sort_by() 无法处理我们现在拥有的深层嵌套对象...所以我们循环(列表)通过合并的对象并创建一个具有我们需要的属性的新对象序列,之后我们可以在新的对象序列上使用 ?sort_by 以按所需字段对其进行排序。然后对序列进行排序并准备好在另一个循环中进行模板化。

关于java - 我如何在 FreeMarker 模板中连接两个东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26610408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com