Web Analytics

spring-view-component

⭐ 234 stars English by tschuehly

image

Spring ViewComponent allows you to create typesafe, reusable & encapsulated server-rendered UI components.

##### Table of Contents

What’s a ViewComponent?

ViewComponents consolidate the logic needed for a template into a single class, resulting in a cohesive object that is easy to understand. (Source: ViewComponent for Rails)

A Spring ViewComponent is a Spring Bean that defines the context for our Template:

Java


@ViewComponent
public class SimpleViewComponent {

public record SimpleView(String helloWorld) implements ViewContext {

}

public SimpleView render() { return new SimpleView("Hello World"); } }

We define the context by creating a record that implements the ViewContext interface

Next, we add the @ViewComponent annotation to a class and define a method that returns the SimpleView record.

Kotlin

// SimpleViewComponent.kt
@ViewComponent
class SimpleViewComponent {
    fun render() = SimpleView("Hello World")

data class SimpleView(val helloWorld: String) : ViewContext }

A ViewComponent always needs a corresponding HTML Template. We define the Template in the SimpleViewComponent.[html/jte/kte] In the same package as our ViewComponent class.

We can use Thymeleaf

```html // SimpleViewComponent.html


or JTE
html // SimpleViewComponent.jte @param de.tschuehly.example.jte.web.simple.SimpleViewComponent.SimpleView simpleView
${simpleView.helloWorld()}

or KTE
html @param simpleView: de.tschuehly.kteviewcomponentexample.web.simple.SimpleViewComponent.SimpleView

This is the SimpleViewComponent

${simpleView.helloWorld}

Render a ViewComponent

We can then call the render method in our controller to render the template.

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() }


Examples

If you want to get started right away you can find examples for all possible language combinations here: Examples

Nesting ViewComponents:

We can nest components by passing a ViewContext as a property of our record, if we also have it as a parameter of our render method we can easily create layouts:

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

In Thymeleaf we render the passed ViewComponent with the view:component="${viewContext}" attribute.

html

This is a footer

JTE / KTE

In JTE/KTE we can just call the LayoutView record directly in an expression:

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

Local Development Configuration

You can enable hot-reloading of the templates during development by including Spring Boot DevTools as a dependency.

properties spring.view-component.local-development=true

Installation

Thymeleaf:

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

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

LATEST_VERSION on Maven Central

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")) } ```

Technical Implementation

Spring ViewComponent wraps the Spring MVC container using an AspectJ Aspect and automatically resolves the template and puts the ViewContext in the ModelAndViewContainer

image

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