Web Analytics

spring-view-component

⭐ 234 stars Simplified Chinese by tschuehly

image

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
${simpleView.helloWorld()}
KTE
html @param simpleView: de.tschuehly.kteviewcomponentexample.web.simple.SimpleViewComponent.SimpleView

This is the SimpleViewComponent

${simpleView.helloWorld}

渲染 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) : ViewContext

fun render(nestedViewComponent: ViewContext) = LayoutView(nestedViewComponent)

}


Thymeleaf

在 Thymeleaf 中,我们使用 view:component="${viewContext}" 属性来渲染传递的 ViewComponent。

html

This is a footer

JTE / KTE

在 JTE/KTE 中,我们可以直接在表达式中调用 LayoutView 记录:

html @param layoutView: de.tschuehly.kteviewcomponentexample.web.layout.LayoutViewComponent.LayoutView ${layoutView.nestedViewComponent}
This is a footer

本地开发配置

您可以在开发中启用模板的热重载,您需要将 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 de.tschuehly spring-view-component-thymeleaf 0.9.1 src/main/java /*.html src/main/resources maven-resources-plugin 3.3.0

JTE

Maven Central上的最新版本

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 de.tschuehly spring-view-component-jte 0.9.1 gg.jte jte-maven-plugin 3.1.12 ${project.basedir}/src/main/java Html generate-sources generate

KTE

MAVEN中央库上的最新版本

Gradle
kotlin

plugins { 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 中

image

--- Tranlated By Open Ai Tx | Last indexed: 2026-03-26 ---