【发布时间】:2018-11-14 20:39:21
【问题描述】:
我配置了一个 Eventbus,它将使用监视器事件更新 Map。因此,对于每个名称,地图将始终包含最新的监视器事件。作为用户,您可以访问 URL“/overview”查看最近的事件,该 URL 显示一个基本的 HTML 页面。
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
@Controller
public class OverviewController {
private final Map<String, MonitorResponse> monitorEvents;
@Autowired
public OverviewController(EventBus eventBus) {
monitorEvents = new HashMap<>();
eventBus.register(this);
}
@RequestMapping("/overview")
public String overview(Model model) {
model.addAttribute("monitorResponseMap", monitorEvents);
return "overview";
}
@Subscribe
public void subscribe(MonitorEvent monitorEvent) {
monitorEvents.put(monitorEvent.getName(), monitorEvent.getMonitorResponse());
}
}
HTML:
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Getting Started: Serving Web Content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link rel="stylesheet" href="/bootstrap-4.0.0/css/bootstrap.min.css"/>
<link rel="stylesheet" href="/css/styles.css"/>
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-sm-"
th:each="monitorevent : ${monitorResponseMap}"
style="margin: 10px;padding:20px;border-radius: 10px;"
th:classappend="${monitorevent.value.getMonitorStatus().name()}">
<div class="card-title" style="font-weight: bolder" th:text="${monitorevent.key}"></div>
<p th:text="${monitorevent.value.getMessage()}"></p>
</div>
</div>
</div>
<script src="/jquery-3.3.1.min.js"></script>
<script src="/bootstrap-4.0.0/js/bootstrap.min.js"></script>
</body>
</html>
当有新事件时,当调用订阅方法时,动态更新 UI 的最简单方法是什么? 现在我对页面进行自动 Javascript 刷新(使用标记 meta(http-equiv=refresh),但这对用户来说很烦人。使用 websockets?Ajax?
【问题讨论】:
-
服务器端事件可能是更好的选择,因为它是单向的(服务器到客户端)并且有一些开销。这里有一些例子github.com/aliakh/demo-spring-sse
标签: javascript spring spring-boot thymeleaf guava