
Spring ViewComponent 允许您创建类型安全、可重用且封装的服务器渲染 UI 组件。
##### 目录
什么是 ViewComponent?
ViewComponent 将模板所需的逻辑整合到一个单一的类中, 从而形成一个易于理解的内聚对象。 (来源:Rails 的 ViewComponent)
Spring ViewComponent 是一个 Spring Bean,定义了我们模板的上下文:
Java
@ViewComponent
public class SimpleViewComponent { public record SimpleView(String helloWorld) implements ViewContext {
}
public SimpleView render() {
return new SimpleView("Hello World");
}
}
我们通过创建一个实现了 ViewContext 接口的记录来定义上下文
接下来,我们在一个类上添加 @ViewComponent 注解,并定义一个返回 SimpleView 记录的方法。
Kotlin
// SimpleViewComponent.kt
@ViewComponent
class SimpleViewComponent {
fun render() = SimpleView("Hello World") data class SimpleView(val helloWorld: String) : ViewContext
}
一个 ViewComponent 总是需要一个对应的 HTML 模板。 我们在 SimpleViewComponent.[html/jte/kte] 中定义模板, 与我们的 ViewComponent 类位于同一个包中。
我们可以使用 Thymeleaf
```html
// SimpleViewComponent.html
或 JTE
html
// SimpleViewComponent.jte
@param de.tschuehly.example.jte.web.simple.SimpleViewComponent.SimpleView simpleView
或 KTE
html
@param simpleView: de.tschuehly.kteviewcomponentexample.web.simple.SimpleViewComponent.SimpleView
This is the SimpleViewComponent
渲染 ViewComponent
然后我们可以在控制器中调用 render 方法来渲染模板。
Java
java@Controller public class SimpleController {
private final SimpleViewComponent simpleViewComponent;
public TestController(SimpleViewComponent simpleViewComponent) { this.simpleViewComponent = simpleViewComponent; }
@GetMapping("/") ViewContext simple() { return simpleViewComponent.render(); } }
Kotlin
kotlin
// Router.kt
@Controller
class SimpleController(
private val simpleViewComponent: SimpleViewComponent,
) {@GetMapping("/") fun simpleComponent() = simpleViewComponent.render() }
示例
如果您想立即开始,可以在此处找到所有可能语言组合的示例:
示例
嵌套 ViewComponents:
我们可以通过将 ViewContext 作为记录的属性传递来嵌套组件,
如果我们在渲染方法中也将其作为参数,就可以轻松创建布局:
Java
java@ViewComponent public class LayoutViewComponent {
private record LayoutView(ViewContext nestedViewComponent) implements ViewContext {
}
public ViewContext render(ViewContext nestedViewComponent) { return new LayoutView(nestedViewComponent); } }
Kotlin
kotlin
@ViewComponent
class LayoutViewComponent {
data class LayoutView(val nestedViewComponent: ViewContext) : ViewContextfun render(nestedViewComponent: ViewContext) = LayoutView(nestedViewComponent)
}
Thymeleaf
在 Thymeleaf 中,我们使用 view:component="${viewContext}" 属性来渲染传递的 ViewComponent。
html
JTE / KTE
在 JTE/KTE 中,我们可以直接在表达式中调用 LayoutView 记录:
html
@param layoutView: de.tschuehly.kteviewcomponentexample.web.layout.LayoutViewComponent.LayoutView
${layoutView.nestedViewComponent}
本地开发配置
您可以在开发中启用模板的热重载,您需要将 Spring Boot DevTools 作为依赖项。
properties
spring.view-component.local-development=true
安装
Thymeleaf:
Maven中央仓库上的 LATEST_VERSION
Gradle
kotlin
implementation("de.tschuehly:spring-view-component-thymeleaf:0.9.1")
sourceSets {
main {
resources {
srcDir("src/main/java")
exclude("/*.java")
}
}}
Maven
xml
JTE
Gradle
kotlin
plugins {
id("gg.jte.gradle") version("3.2.1")
}implementation("de.tschuehly:spring-view-component-jte:0.9.1")
jte{ generate() sourceDirectory.set(kotlin.io.path.Path("src/main/java")) }
Maven
xml
KTE
Gradle
kotlinplugins { id("gg.jte.gradle") version ("3.1.12") }
dependencies { implementation("de.tschuehly:spring-view-component-kte:0.9.1") }
jte { generate() sourceDirectory.set(kotlin.io.path.Path("src/main/kotlin")) } ```
技术实现
Spring ViewComponent 使用 AspectJ 切面封装 Spring MVC 容器,自动解析模板并将 ViewContext 放入 ModelAndViewContainer 中
--- Tranlated By Open Ai Tx | Last indexed: 2026-03-26 ---