|
此版本仍在开发中,尚未稳定。如需最新的稳定版本,请使用 Spring Framework 7.0.6! |
HTML 片段
HTMX 和 Hotwire Turbo 强调了一种通过网络发送HTML的方略,即客户端接收的是HTML形式的服务器更新而非JSON。这使得在无需编写大量甚至任何JavaScript代码的情况下,也能享受到单页面应用(SPA)的好处。欲了解更多详情,请访问它们各自的官方网站。
在Spring MVC中,视图渲染通常涉及指定一个视图和一个模型。然而,在HTML-over-the-wire中,一个常见的功能是发送多个HTML片段,浏览器可以使用这些片段更新页面的不同部分。为此,控制器方法可以返回Collection<ModelAndView>。例如:
-
Java
-
Kotlin
@GetMapping
List<ModelAndView> handle() {
return List.of(new ModelAndView("posts"), new ModelAndView("comments"));
}
@GetMapping
fun handle(): List<ModelAndView> {
return listOf(ModelAndView("posts"), ModelAndView("comments"))
}
同样也可以通过返回专门的类型FragmentsRendering来实现:
-
Java
-
Kotlin
@GetMapping
FragmentsRendering handle() {
return FragmentsRendering.fragment("posts").fragment("comments").build();
}
@GetMapping
fun handle(): FragmentsRendering {
return FragmentsRendering.fragment("posts").fragment("comments").build()
}
每个片段都可以拥有一个独立的模型,并且该模型从请求的共享模型中继承属性。
HTMX与Hotwire Turbo支持通过SSE(服务器发送事件)进行流式更新。
控制器可以使用SseEmitter来发送ModelAndView,以便每个事件渲染一个片段:
-
Java
-
Kotlin
@GetMapping
SseEmitter handle() {
SseEmitter emitter = new SseEmitter();
startWorkerThread(() -> {
try {
emitter.send(SseEmitter.event().data(new ModelAndView("posts")));
emitter.send(SseEmitter.event().data(new ModelAndView("comments")));
// ...
}
catch (IOException ex) {
// Cancel sending
}
});
return emitter;
}
@GetMapping
fun handle(): SseEmitter {
val emitter = SseEmitter()
startWorkerThread{
try {
emitter.send(SseEmitter.event().data(ModelAndView("posts")))
emitter.send(SseEmitter.event().data(ModelAndView("comments")))
// ...
}
catch (ex: IOException) {
// Cancel sending
}
}
return emitter
}
同样的操作也可以通过返回Flux<ModelAndView>,或者其他任何可通过ReactiveAdapterRegistry转换为 Reactive Streams Publisher 的类型来实现。