我有一个Java应用程序,我开始使用Spring Boot,我添加了一个.jsp文件,提供一个网站来监控应用程序的状态。
当应用程序更改其状态时,是否有可能自动更新网站?目前,我必须按F5或使用自动刷新插件。但是,我的印象是应该有技术允许这种情况,而不是每隔几秒就重新加载一个完整的网站。
我甚至不知道谷歌的用途,所以任何提示都会非常有用。
答案 0 :(得分:1)
我继续搜索并找到了解决方案。在HTML5中引入了Server-sent Events(SSE),它允许将数据从服务器发送回当前正在查看该网站的任何客户端。然后可以使用一些JavaScript来相应地更新网站。
在Spring Boot中使用SSE非常简单:
@Controller
必须存储SseEmitter
列表,并将更新的数据发送到每个发射器。另外还需要另一个请求映射,以允许客户端自行注册。
private final List<SseEmitter> sseEmitter = new LinkedList<>();
@RequestMapping (path = "/register", method = RequestMethod.GET)
public SseEmitter register() throws IOException {
log.info("Registering a stream.");
SseEmitter emitter = new SseEmitter();
synchronized (sseEmitter) {
sseEmitter.add(emitter);
}
emitter.onCompletion(() -> sseEmitter.remove(emitter));
return emitter;
}
.jsp文件需要一些JavaScript来注册自己。该页面加载时应该执行该功能。
var connect = function () {
var source = new EventSource('/register');
// Reconnect if the connection fails
source.addEventListener('error', function (e) {
console.log('Disconnected.');
if (e.readyState == EventSource.CLOSED) {
connected = false;
connect();
}
}, false);
};
@Controller
可以通过向所有已知发射器发送数据来请求更新:
synchronized (sseEmitter) {
sseEmitter.forEach((SseEmitter emitter) -> {
try {
emitter.send(state, MediaType.APPLICATION_JSON);
} catch (IOException e) {
emitter.complete();
sseEmitter.remove(emitter);
}
});
}
最后,网站接受该消息并处理它。以下内容也将添加到connect()
函数:
source.addEventListener('message', function (e) {
var state = JSON.parse(e.data);
console.log("New state: " + state.text);
var element = document.getElementById("state");
element.innerHTML = state.text;
}, false);
我已将一个简单的示例项目上传到GitHub。
答案 1 :(得分:0)
从春季启动1.3开始,有一个新工具 spring-devtools 。
https://spring.io/blog/2015/06/17/devtools-in-spring-boot-1-3
有http://livereload.com可从Chrome,Firefox和Safari免费使用的浏览器扩展程序。