From b8b2fc094d0313626224371dcbdf18784d56d51f Mon Sep 17 00:00:00 2001 From: Kai Moritz <km@juplo.de> Date: Mon, 1 Sep 2014 12:12:10 +0200 Subject: [PATCH] Umstellung auf Thymeleaf: Zwischenschritt - Fehler in Thymeleaf umschifft --- pom.xml | 5 ++ .../branding/web/ForceIncludeFilter.java | 55 +++++++++++++++++++ src/main/resources/spring/tiles.xml | 1 + src/main/webapp/WEB-INF/views/tiles.jsp | 5 ++ src/main/webapp/WEB-INF/web.xml | 14 +++++ .../webapp/thymeleaf/templates/layout.html | 2 + 6 files changed, 82 insertions(+) create mode 100644 src/main/java/de/juplo/branding/web/ForceIncludeFilter.java create mode 100644 src/main/webapp/WEB-INF/views/tiles.jsp diff --git a/pom.xml b/pom.xml index cf5f6688..256cbbc3 100644 --- a/pom.xml +++ b/pom.xml @@ -126,6 +126,11 @@ </exclusions> <scope>runtime</scope> </dependency> + <dependency> + <groupId>org.apache.tiles</groupId> + <artifactId>tiles-servlet</artifactId> + <version>${tiles.version}</version> + </dependency> <!-- Servlet --> <dependency> diff --git a/src/main/java/de/juplo/branding/web/ForceIncludeFilter.java b/src/main/java/de/juplo/branding/web/ForceIncludeFilter.java new file mode 100644 index 00000000..953e8b23 --- /dev/null +++ b/src/main/java/de/juplo/branding/web/ForceIncludeFilter.java @@ -0,0 +1,55 @@ +package de.juplo.branding.web; + +import java.io.IOException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.tiles.servlet.context.ServletUtil; + + + +/** + * Fixes a logic-bug in the colaboration of Thymeleaf and Tiles. + * + * Tiles 2.2.x tries to use RequestDispatcher.forward() whenever possible, but + * this breaks Thymeleaf, because the original response is marked as committed, + * when forwarding. Hence, Thymeleaf cannot render its result in the response + * and an empty page is returned. + * + * @author kai + */ +public class ForceIncludeFilter implements Filter +{ + + @Override + public void init(FilterConfig filterConfig) throws ServletException + { + } + + @Override + public void doFilter( + ServletRequest request, + ServletResponse response, + FilterChain chain + ) + throws + IOException, + ServletException + { + if ((response instanceof HttpServletResponse)) + ServletUtil.setForceInclude((HttpServletRequest)request, true); + + chain.doFilter(request, response); + } + + @Override + public void destroy() + { + } + +} diff --git a/src/main/resources/spring/tiles.xml b/src/main/resources/spring/tiles.xml index d9dd9a66..8439ff05 100644 --- a/src/main/resources/spring/tiles.xml +++ b/src/main/resources/spring/tiles.xml @@ -11,6 +11,7 @@ <definition name="*" template="templates/layout"> <put-attribute name="title" value="title/{1}"/> <put-attribute name="content" value="content/{1}"/> + <put-attribute name="tiles" value="/WEB-INF/views/tiles.jsp" type="jsp"/> </definition> <!-- diff --git a/src/main/webapp/WEB-INF/views/tiles.jsp b/src/main/webapp/WEB-INF/views/tiles.jsp new file mode 100644 index 00000000..cee460f7 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/tiles.jsp @@ -0,0 +1,5 @@ +<%@page contentType="text/html" pageEncoding="UTF-8" session="false"%> +<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> +<c:forEach begin="1" end="10"> +Hello World!<br/> +</c:forEach> \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 89be3285..af117549 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -21,6 +21,7 @@ <!-- UTF-8 --> + <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> @@ -40,6 +41,19 @@ </filter-mapping> + <!-- Fix a logic-bug in the colaboration of Thymeleaf and Tiles --> + + <filter> + <filter-name>forceIncludeFilter</filter-name> + <filter-class>de.juplo.branding.web.ForceIncludeFilter</filter-class> + </filter> + + <filter-mapping> + <filter-name>forceIncludeFilter</filter-name> + <url-pattern>*.html</url-pattern> + </filter-mapping> + + <!-- Handles all requests into the application --> <servlet> diff --git a/src/main/webapp/thymeleaf/templates/layout.html b/src/main/webapp/thymeleaf/templates/layout.html index f019b462..7d02e2b4 100644 --- a/src/main/webapp/thymeleaf/templates/layout.html +++ b/src/main/webapp/thymeleaf/templates/layout.html @@ -27,6 +27,8 @@ </p> </div> </div> + <!--/* Tiles attribute will be put here at runtime */--> + <div tiles:replace="tiles">TILES</div> <!--/* Standard layout can be mixed with Tiles */--> <div th:replace="templates/footer :: fragment">FOOTER</div> </body> -- 2.20.1