【问题标题】:How would I continuously render an FTL page, lets say with updates?我将如何持续呈现 FTL 页面,让我们说更新?
【发布时间】:2017-02-25 01:04:27
【问题描述】:

假设我有以下 Java 代码。

get("/", (request, response) -> {
    Map<String, Object> attributes = new HashMap<>();

    //attributes.put("message", "Hello World!");

    return new ModelAndView(attributes, "index.ftl");
}, new FreeMarkerEngine());

那来自 Spark。当我导航到 localhost:portnumber/ 时,我看到 index.ftl 呈现,让我们假设(此处未编码)显示来自该应用程序的数据库中的数据。但是假设我想动态更新 index.ftl。假设另一个用户从另一个应用程序实例更新了数据库(此处未编码),我想在第一个用户的页面上显示 index.ftl 中的新更改。在不必重新渲染页面的情况下如何做到这一点?

您不能简单地在 Java 端设置一个计时器,它每 10-20 毫秒提取一次新数据。这也将是对连接时间的巨大浪费。是否可以以某种方式 ping 数据库已更新的 Java 代码?像数据库的监听器一样?

这不仅是个问题,而且您如何能够将新收到的数据推送到 index.ftl 而无需重新渲染?

【问题讨论】:

  • 你的意思是像Server-Sent Events这样的东西吗?
  • 或者Websockets(根据this tutorial
  • @UnholySheep 这正是我的意思,但是对于 Java 后端。在 Javascript 中,AJAX 是要走的路。如何在 Spark 框架中发出服务器发送的请求?
  • @UnholySheep 我明白了。我前段时间确实遇到过那个教程。现在认为 WebSocket 技术已经过时了吗?一般来说,当然?它被认为是不好的做法吗?尤其是现在一切都是 AJAX?
  • 我不是当前趋势方面的专家,但 AJAX、Websockets 和 SSE 的 IMO 用法完全不同。 AJAX 适用于仅从客户端启动的所有内容(并且通常与 RESTful 服务结合使用),SSE 仅适用于服务器需要通知客户端,而 Websockets 适用于两种方式的(“实时”)通信。我认为它们中的任何一个都不应该被认为是过时的,这完全取决于您的用例

标签: java freemarker spark-java


【解决方案1】:

您可以使用 COMET 将数据推送到浏览器

您可以使用多种不同的 COMET 技术来实现该效果。我发现一个非常有用的comprehensive article 在它们之间进行比较和选择。


使用 COMET 后,您可以utilize this trick,这样您就只刷新&lt;div&gt; 标签内的内容


另一个reference

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多