Web Analytics

spring-view-component

⭐ 234 stars Japanese by tschuehly

image

Spring ViewComponent は、型安全で再利用可能かつカプセル化されたサーバーサイドレンダリングUIコンポーネントを作成することを可能にします。

##### 目次

ViewComponentとは?

ViewComponentは、テンプレートに必要なロジックを単一のクラスに統合し、 理解しやすい一貫したオブジェクトを生み出します。 (出典: ViewComponent for Rails

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では、渡されたViewComponentをview:component="${viewContext}"属性でレンダリングします。

html

This is a footer

JTE / KTE

JTE/KTEでは、レイアウトビューのレコードを式内で直接呼び出すことができます:

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 Centralの最新バージョン

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 CentralのLATEST_VERSION

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 ---