HTML 片段

HTMXHotwire Turbo 强调了一种“HTML over the wire”的方法,其中客户端接收以HTML而不是JSON格式的服务器更新。这允许获得单页应用程序 (SPA) 的好处,而无需编写太多甚至任何JavaScript。有关良好的概述和更多信息,请访问它们的各自网站。

在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.with("posts").fragment("comments").build();
}
@GetMapping
fun handle(): FragmentsRendering {
	return FragmentsRendering.with("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的类型来实现相同的功能。