This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch docs
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/docs by this push:
     new a40ccdb403 docs: typed-handler View return docs for all four view 
modules (TODO-97/107/108/109)
a40ccdb403 is described below

commit a40ccdb403d6ee10e7c32e9594b252fd28b4f0e9
Author: James Bognar <[email protected]>
AuthorDate: Wed May 27 13:22:42 2026 -0400

    docs: typed-handler View return docs for all four view modules 
(TODO-97/107/108/109)
    
    Co-authored-by: Cursor <[email protected]>
---
 pages/release-notes/9.5.0.md                 | 49 +++++++++++++++++++++++++++-
 pages/topics/10.14d.JspViewSupport.md        | 30 +++++++++++++++--
 pages/topics/10.14e.ThymeleafViewSupport.md  | 25 ++++++++++++--
 pages/topics/10.14f.MustacheViewSupport.md   | 25 ++++++++++++--
 pages/topics/10.14g.FreemarkerViewSupport.md | 25 ++++++++++++--
 5 files changed, 145 insertions(+), 9 deletions(-)

diff --git a/pages/release-notes/9.5.0.md b/pages/release-notes/9.5.0.md
index d890634825..8b3e5592c8 100644
--- a/pages/release-notes/9.5.0.md
+++ b/pages/release-notes/9.5.0.md
@@ -2261,7 +2261,8 @@ public class AppResource extends RestServlet {
 ```
 
 This is the foundational fix that unblocks the typed-handler View-return path 
for all four
-view modules (TODO-97 / TODO-107 / TODO-108 / TODO-109).
+view modules — the per-engine typed-handler integration test matrices landed 
alongside
+this change (see the `juneau-rest-server-view-*` entries below).
 
 #### Framework-internal `@Value` adoption (TODO-92)
 
@@ -4226,6 +4227,26 @@ public class AppResource extends RestServlet {
 }
 ```
 
+#### Typed-handler View-return integration (`JspView_TypedHandler_Test`)
+
+`@RestGet` methods returning `JspView` now reach `JspViewRenderer` rather than 
being
+bean-serialized, thanks to the `ResponseProcessorList` partition pass.  To use 
`JspView`
+from a host class without the mixin, add `JspViewRenderer.class` to the host's
+`responseProcessors`:
+
+```java
+@Rest(responseProcessors={JspViewRenderer.class})
+public class AppResource extends BasicRestServlet {
+    @RestGet("/hello/{name}")
+    public View hello(@Path String name) {
+        return JspView.of("hello.jsp").attr("name", name);
+    }
+}
+```
+
+Full JSP rendering requires a real servlet container; the MockRest test 
verifies that the
+renderer is reached and the response body is not a bean-JSON dump of `JspView`.
+
 See [JSP View Support](/docs/topics/JspViewSupport) for the full topic — 
engine-selection matrix, Spring Boot fat-jar caveats, and known limitations.
 
 ### juneau-rest-server-view-thymeleaf (new module)
@@ -4282,6 +4303,14 @@ public class AppResource extends RestServlet {
 }
 ```
 
+#### Typed-handler View-return integration (`ThymeleafView_TypedHandler_Test`)
+
+`@RestGet` methods returning `ThymeleafView` now reach `ThymeleafViewRenderer` 
rather than
+being bean-serialized.  Because Thymeleaf renders directly to a `Writer` with 
no
+servlet-container dependency, attribute interpolation (`th:text="${name}"` → 
`"Alice"`) is
+fully assertable under MockRest.  Add `ThymeleafViewRenderer.class` to the 
host's
+`responseProcessors` to use `ThymeleafView` without the mixin.
+
 See [Thymeleaf View Support](/docs/topics/ThymeleafViewSupport) for the full 
topic — engine-selection matrix, Spring Boot integration notes, path-traversal 
hardening, and known limitations.
 
 #### Security
@@ -4336,6 +4365,14 @@ public class AppResource extends RestServlet {
 }
 ```
 
+#### Typed-handler View-return integration (`MustacheView_TypedHandler_Test`)
+
+`@RestGet` methods returning `MustacheView` now reach `MustacheViewRenderer` 
rather than
+being bean-serialized.  mustache.java renders directly to a `Writer` with no
+servlet-container dependency, so `{{name}}` → `"Alice"` is fully assertable 
under MockRest.
+Add `MustacheViewRenderer.class` to the host's `responseProcessors` to use 
`MustacheView`
+without the mixin.
+
 See [Mustache View Support](/docs/topics/MustacheViewSupport) for the full 
topic — engine-selection matrix, Spring Boot integration notes (Spring Boot's 
official starter ships `jmustache`, not `mustache.java`), path-traversal 
hardening, and known limitations.
 
 ### juneau-rest-server-view-freemarker (new module)
@@ -4387,6 +4424,16 @@ public class AppResource extends RestServlet {
 }
 ```
 
+#### Typed-handler View-return integration (`FreemarkerView_TypedHandler_Test`)
+
+`@RestGet` methods returning `FreemarkerView` now reach 
`FreemarkerViewRenderer` rather than
+being bean-serialized.  FreeMarker renders directly to a `Writer` with no 
servlet-container
+dependency, so `${name}` → `"Alice"` is fully assertable under MockRest.  Add
+`FreemarkerViewRenderer.class` to the host's `responseProcessors` to use 
`FreemarkerView`
+without the mixin.  Spring Boot's `spring-boot-starter-freemarker` 
autoconfigures a
+`freemarker.template.Configuration` bean that the bridge picks up 
automatically via
+`BeanStore.getBean(Configuration.class)` — no additional wiring required.
+
 See [FreeMarker View Support](/docs/topics/FreemarkerViewSupport) for the full 
topic — engine-selection matrix, Spring Boot integration notes 
(`spring-boot-starter-freemarker` autoconfigures a `Configuration` bean the 
bridge picks up automatically), `.ftl` vs `.ftlh` auto-escape selection, 
template caching, path-traversal hardening, and known limitations.
 
 ### juneau-bean-rfc7807 (new module)
diff --git a/pages/topics/10.14d.JspViewSupport.md 
b/pages/topics/10.14d.JspViewSupport.md
index c8a9b47af4..c41b31f8a0 100644
--- a/pages/topics/10.14d.JspViewSupport.md
+++ b/pages/topics/10.14d.JspViewSupport.md
@@ -127,6 +127,32 @@ public class AppResource extends RestServlet {
 `JspView` return, copies the `name` attribute onto the request, and forwards 
to the JSP
 engine at `/WEB-INF/views/hello.jsp`.
 
+### Typed handler integration
+
+To use `JspView` from a host-class `@RestGet` *without* adopting the full 
mixin, add
+`JspViewRenderer.class` directly to the host's `responseProcessors`:
+
+```java
+@Rest(responseProcessors={JspViewRenderer.class})
+public class AppResource extends BasicRestServlet {
+    @RestGet("/hello/{name}")
+    public View hello(@Path String name) {
+        return JspView.of("hello.jsp").attr("name", name);
+    }
+}
+```
+
+The `ResponseProcessorList` partition pass (added in 9.5.0) automatically 
repositions
+`JspViewRenderer` to run before `SerializedPojoProcessor`, so 
`JspView`-returning methods
+reach the renderer rather than being bean-serialized.  The complementary 
negative case —
+a host *without* the renderer bean-serializes the `JspView` — is verified by
+`JspView_TypedHandler_Test#a05`.
+
+> **JSP note:** Full template rendering (`${name}` substitution) requires a 
real servlet
+> container with a JSP engine.  Under MockRest the dispatcher is absent so the 
renderer
+> reaches a 500; the invariant tested is that the renderer *was reached* 
(response body does
+> not contain `"templateName"` as a bean-serialized field).
+
 ### REST resource — raw-JSP mount
 
 The mixin also installs a default `/jsp/*` mount that forwards raw `.jsp` 
requests under
@@ -179,8 +205,8 @@ known constraints that aren't bridge-module bugs but worth 
documenting up front:
 
 1. **Servlet-mapping conflicts.** Juneau's `RestServlet` is mapped at `/*`, 
which can
    intercept `RequestDispatcher.forward(...)` calls intended for the 
container's JSP
-   servlet. The Spring Boot integration tests for this scenario are tracked as 
`TODO-97`
-   (real-container integration tests).
+   servlet.  Register the JSP servlet at `*.jsp` with higher precedence, or 
mount Juneau
+   at a sub-path such as `/api/*`.
 
 **Response-processor ordering** (previously a known limitation, resolved in 
9.5.0 by
 `TODO-96`): `JspViewRenderer` now implements
diff --git a/pages/topics/10.14e.ThymeleafViewSupport.md 
b/pages/topics/10.14e.ThymeleafViewSupport.md
index 3e7e01d678..f1f1c7b176 100644
--- a/pages/topics/10.14e.ThymeleafViewSupport.md
+++ b/pages/topics/10.14e.ThymeleafViewSupport.md
@@ -133,6 +133,27 @@ public class AppResource extends RestServlet {
 `ThymeleafView` return, populates a Thymeleaf `Context` from the view's 
attributes, and asks
 the active `TemplateEngine` to render `/templates/hello.html` directly onto 
the response.
 
+### Typed handler integration
+
+To use `ThymeleafView` from a host-class `@RestGet` *without* adopting the 
full mixin, add
+`ThymeleafViewRenderer.class` directly to the host's `responseProcessors`:
+
+```java
+@Rest(responseProcessors={ThymeleafViewRenderer.class})
+public class AppResource extends BasicRestServlet {
+    @RestGet("/hello/{name}")
+    public View hello(@Path String name) {
+        return ThymeleafView.of("templates/hello.html").attr("name", name);
+    }
+}
+```
+
+The `ResponseProcessorList` partition pass (added in 9.5.0) automatically 
repositions
+`ThymeleafViewRenderer` to run before `SerializedPojoProcessor`.  Because 
Thymeleaf renders
+directly to a `Writer` with zero servlet-container dependencies, attribute 
interpolation
+works under MockRest — verified end-to-end by
+`ThymeleafView_TypedHandler_Test#a04_renderInterpolatesAttributesFromTypedHandler`.
+
 ### REST resource — raw-template mount
 
 The mixin also installs a default `/thymeleaf/*` mount that renders raw 
`.html` templates
@@ -196,8 +217,8 @@ required.
 automatically positioned before `SerializedPojoProcessor` by the 
`ResponseProcessorList`
 partition pass (TODO-96).  A `@RestOp` method returning `ThymeleafView` 
reaches the renderer
 without any extra configuration — the mixin registers the renderer and the 
framework ensures
-ordering.  Real-container integration tests under embedded Tomcat / Jetty are 
tracked as
-`TODO-107`.
+ordering.  MockRest-level typed-handler integration is verified by
+`ThymeleafView_TypedHandler_Test` (attribute interpolation asserted 
end-to-end).
 
 ## Multiple base paths
 
diff --git a/pages/topics/10.14f.MustacheViewSupport.md 
b/pages/topics/10.14f.MustacheViewSupport.md
index c3ee0b04dc..22b3c4620c 100644
--- a/pages/topics/10.14f.MustacheViewSupport.md
+++ b/pages/topics/10.14f.MustacheViewSupport.md
@@ -134,6 +134,27 @@ public class AppResource extends RestServlet {
 `MustacheView` return, hands the view's attributes to the active 
`MustacheFactory`, and asks
 the compiled `Mustache` to render `/templates/hello.mustache` directly onto 
the response.
 
+### Typed handler integration
+
+To use `MustacheView` from a host-class `@RestGet` *without* adopting the full 
mixin, add
+`MustacheViewRenderer.class` directly to the host's `responseProcessors`:
+
+```java
+@Rest(responseProcessors={MustacheViewRenderer.class})
+public class AppResource extends BasicRestServlet {
+    @RestGet("/hello/{name}")
+    public View hello(@Path String name) {
+        return 
MustacheView.of("mustache-templates/hello.mustache").attr("name", name);
+    }
+}
+```
+
+The `ResponseProcessorList` partition pass (added in 9.5.0) automatically 
repositions
+`MustacheViewRenderer` to run before `SerializedPojoProcessor`.  Because 
mustache.java
+renders directly to a `Writer` with zero servlet-container dependencies, 
attribute
+interpolation (`{{name}}` → `"Alice"`) works under MockRest — verified 
end-to-end by
+`MustacheView_TypedHandler_Test#a04_renderInterpolatesAttributesFromTypedHandler`.
+
 ### REST resource — raw-template mount
 
 The mixin also installs a default `/mustache/*` mount that renders raw 
templates under the
@@ -201,8 +222,8 @@ no additional plumbing is required.
 automatically positioned before `SerializedPojoProcessor` by the 
`ResponseProcessorList`
 partition pass (TODO-96).  A `@RestOp` method returning `MustacheView` reaches 
the renderer
 without any extra configuration — the mixin registers the renderer and the 
framework ensures
-ordering.  Real-container integration tests under embedded Tomcat / Jetty are 
tracked as
-`TODO-108`.
+ordering.  MockRest-level typed-handler integration is verified by
+`MustacheView_TypedHandler_Test` (attribute interpolation asserted end-to-end).
 
 ## Multiple base paths
 
diff --git a/pages/topics/10.14g.FreemarkerViewSupport.md 
b/pages/topics/10.14g.FreemarkerViewSupport.md
index cb7f99bb91..c0a886ebd5 100644
--- a/pages/topics/10.14g.FreemarkerViewSupport.md
+++ b/pages/topics/10.14g.FreemarkerViewSupport.md
@@ -148,6 +148,27 @@ data model, and asks the resolved `Template` to render 
`/templates/hello.ftlh` d
 the response writer. The `.ftlh` suffix is appended idempotently because the 
builder
 declared it.
 
+### Typed handler integration
+
+To use `FreemarkerView` from a host-class `@RestGet` *without* adopting the 
full mixin, add
+`FreemarkerViewRenderer.class` directly to the host's `responseProcessors`:
+
+```java
+@Rest(responseProcessors={FreemarkerViewRenderer.class})
+public class AppResource extends BasicRestServlet {
+    @RestGet("/hello/{name}")
+    public View hello(@Path String name) {
+        return 
FreemarkerView.of("freemarker-templates/hello.ftlh").attr("name", name);
+    }
+}
+```
+
+The `ResponseProcessorList` partition pass (added in 9.5.0) automatically 
repositions
+`FreemarkerViewRenderer` to run before `SerializedPojoProcessor`.  Because 
FreeMarker renders
+directly to a `Writer` with zero servlet-container dependencies, attribute 
interpolation
+(`${name}` → `"Alice"`) works under MockRest — verified end-to-end by
+`FreemarkerView_TypedHandler_Test#a04_renderInterpolatesAttributesFromTypedHandler`.
+
 ### REST resource — raw-template mount
 
 The mixin also installs a default `/freemarker/*` mount that renders raw 
templates under
@@ -236,8 +257,8 @@ is bypassed entirely when the starter is on the classpath.
 automatically positioned before `SerializedPojoProcessor` by the 
`ResponseProcessorList`
 partition pass (TODO-96).  A `@RestOp` method returning `FreemarkerView` 
reaches the renderer
 without any extra configuration — the mixin registers the renderer and the 
framework ensures
-ordering.  Real-container integration tests under embedded Tomcat / Jetty are 
tracked as
-`TODO-109`.
+ordering.  MockRest-level typed-handler integration is verified by
+`FreemarkerView_TypedHandler_Test` (attribute interpolation asserted 
end-to-end).
 
 ## Multiple base paths
 

Reply via email to