此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cadn.net.cn

HTML 片段

HTMXHotwire Turbo 强调 HTML over-the-wire 方法,其中客户端以 HTML 而不是 JSON 格式接收服务器更新。 这允许 SPA(单页应用程序)的好处,而无需编写太多甚至 任何 JavaScript。如需良好的概述和了解更多信息,请访问他们各自的 网站。spring-doc.cadn.net.cn

在 Spring MVC 中,视图渲染通常涉及指定一个视图和一个模型。 但是,在 HTML-over-the-wire 中,一个常见的功能是发送多个 HTML 片段,这些片段 浏览器可用于更新页面的不同部分。为此,控制器方法 可以返回Collection<ModelAndView>.例如:spring-doc.cadn.net.cn

@GetMapping
List<ModelAndView> handle() {
	return List.of(new ModelAndView("posts"), new ModelAndView("comments"));
}
@GetMapping
fun handle(): List<ModelAndView> {
	return listOf(ModelAndView("posts"), ModelAndView("comments"))
}

也可以通过返回 dedicated type 来完成相同的作FragmentsRendering:spring-doc.cadn.net.cn

@GetMapping
FragmentsRendering handle() {
	return FragmentsRendering.fragment("posts").fragment("comments").build();
}
@GetMapping
fun handle(): FragmentsRendering {
	return FragmentsRendering.fragment("posts").fragment("comments").build()
}

每个 fragment 都可以有一个独立的模型,并且该模型从 请求的共享模型。spring-doc.cadn.net.cn

HTMX 和 Hotwire Turbo 支持通过 SSE(服务器发送的事件)流式传输更新。 控制器可以使用SseEmitter发送ModelAndView要按事件渲染一个 Fragment,请执行以下作:spring-doc.cadn.net.cn

@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>或任何其他类型适应性强 传递给 Reactive StreamsPublisher通过ReactiveAdapterRegistry.spring-doc.cadn.net.cn