Class ThymeleafView

java.lang.Object
org.apache.juneau.rest.server.view.thymeleaf.ThymeleafView
All Implemented Interfaces:
View

public final class ThymeleafView extends Object implements View
Immutable value class returned from @RestOp-annotated methods to ask the framework to render a Thymeleaf template.

Companion to ThymeleafMixin and ThymeleafViewRenderer: the mixin sets up the /thymeleaf/* mount and registers the renderer; the renderer detects ThymeleafView returns in the response-processor chain and asks the configured org.thymeleaf.TemplateEngine to process(templateName, context, writer) directly onto the response writer.

Usage:

@RestGet("/hello/{name}") public View hello(@Path String name) { return ThymeleafView.of("hello") .attr("name", name) .attr("ts", Instant.now()); }

The template name is engine-relative — the configured ClassLoaderTemplateResolver (or whatever resolver the active org.thymeleaf.TemplateEngine carries) prepends its own prefix and appends its own suffix (typically .html). With the bridge's default engine + basePath("/templates/"), ThymeleafView.of("hello") resolves to /templates/hello.html on the classpath.

Immutability:

Each attr(...) / attrs(...) / header(...) call returns a new ThymeleafView carrying the additional binding; the original instance is unchanged. This keeps ThymeleafView a value type safe to share across requests (e.g. as a static singleton built once and returned from many handlers).

See Also:
Since:
10.0.0
  • Method Details

    • of

      public static ThymeleafView of(String templateName)
      Creates a new ThymeleafView carrying the given template name and no attributes.

      The template name is engine-relative; the configured org.thymeleaf.TemplateEngine resolver supplies the prefix and suffix. For the bridge's default engine: "hello" resolves to <basePath>hello.html.

      Parameters:
      templateName - The template name (engine-relative, no extension). Must not be null or blank.
      Returns:
      A new ThymeleafView instance.
      Throws:
      IllegalArgumentException - If templateName is null or blank.
    • attr

      public ThymeleafView attr(String key, Object value)
      Returns a copy of this view with the given attribute added (or replaced if a binding for key already exists).

      Each attribute is exposed to the template as a named variable (e.g. th:text="${name}" resolves the "name" key from the populated Context). null values are rejected at build-time because a Thymeleaf Context silently drops null-valued bindings, masking what is typically a caller bug; rejecting up-front surfaces the mistake at the call site.

      Parameters:
      key - The attribute key (exposed inside the template as ${key}). Must not be null or blank.
      value - The attribute value. Must not be null.
      Returns:
      A new ThymeleafView carrying the additional attribute.
      Throws:
      IllegalArgumentException - If key is null or blank, or value is null.
    • attrs

      public ThymeleafView attrs(Map<String,?> values)
      Returns a copy of this view with all entries from the given map added (or replaced if a binding for any key already exists).
      Parameters:
      values - The attributes to add. null is treated as an empty map (the result is the same instance with no entries added).
      Returns:
      A new ThymeleafView carrying the additional attributes.
      Throws:
      IllegalArgumentException - If any entry has a null/blank key or a null value.
    • header

      public ThymeleafView header(String name, String value)
      Returns a copy of this view with the given response header set on the rendered response.

      Typical usage: .header("Content-Type", "text/html; charset=UTF-8") or .header("Cache-Control", "no-store"). The renderer applies these headers via HttpServletResponse.setHeader(...) before writing the rendered output.

      Parameters:
      name - The header name. Must not be null or blank.
      value - The header value. Must not be null.
      Returns:
      A new ThymeleafView carrying the additional response header.
      Throws:
      IllegalArgumentException - If name is null or blank, or value is null.
    • getTemplateName

      Description copied from interface: View
      The name of the template to render — typically a path relative to the mixin-configured base path.

      For example, "hello.jsp" with a JSP mixin basePath("/WEB-INF/views/") resolves to "/WEB-INF/views/hello.jsp" on the request dispatcher.

      Specified by:
      getTemplateName in interface View
      Returns:
      The template name. Never null.
    • getAttributes

      Description copied from interface: View
      The attributes to expose to the template.

      Each entry is forwarded to the templating engine as a named binding accessible from inside the template (e.g. ${name} in JSP / EL, th:text="${name}" in Thymeleaf).

      Specified by:
      getAttributes in interface View
      Returns:
      The attributes map. Never null; returns an immutable empty map when no attributes are bound.
    • getResponseHeaders

      Description copied from interface: View
      Optional response headers applied by the renderer before forwarding to the templating engine.

      Typical use cases: setting Content-Type (e.g. "text/html; charset=UTF-8") or Cache-Control on the rendered response. The default implementation returns an empty map so most View impls don't need to override it.

      Specified by:
      getResponseHeaders in interface View
      Returns:
      An immutable map of headers to apply. Never null; defaults to an empty map.
    • toString

      public String toString()
      Overrides:
      toString in class Object