Hi,
I am trying to use tiles for a simple header, content, menue templating of my web application. I know that there already a few post in this forum concerning this problem, but I just couldn’t extract the “ultimate� solution for this. There are few people which switched to sitemesh or another templating system, but I would like to keep tiles.
Main problem using tiles is that controllerClass definitions like:
don’t use beans defined in the springcontext.Code:<definition name="projectmanagement_list" extends="layout.example" controllerClass="de.adtech.swd.frontcontroller.ProjectManagementController" <put name="body" value="/projectmanagement_list.htm"/> </definition>
So if you would like to use a frontcontroller (from spring bean definition) or something in that way, there is no real “smooth� solution, isn’t it?
I tried to find a solution, have a look:
Swdtool is the name of my web application. So it can handle all request ending with *.htm and *.tiles. Destination is to use tiles mapping with *.tiles and controller mapping with *.htm
Web.xml:
As you can see in the urlMapping all *.tiles requests are handled by the viewController and the *.html request maps to the specific frontcontroller.Code:<servlet-mapping> <servlet-name>FacesServlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>FacesServlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>swdtool</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>swdtool</servlet-name> <url-pattern>*.tiles</url-pattern> </servlet-mapping>
Swdtool-servlet.xml:
Code:<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass"> <value>org.springframework.web.servlet.view.tiles.TilesJstlView</value> </property> </bean> <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles.TilesConfigurer"> <property name="factoryClass" value="org.apache.struts.tiles.xmlDefinition.I18nFactorySet"/> <property name="definitions"> <list> <value>/WEB-INF/tiles.xml</value> </list> </property> </bean> <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/projectmanagement_list.htm">ProjectManagementController</prop> <prop key="/*.tiles">viewController</prop> </props> </property> </bean> <bean id="viewController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>
Tilesdefiniton maps the first request to “projectmanagement_list.htm�. Then the Frontcontroller ProjectManagementController (defined in another applicationContext.xml) is called by the SimpleUrlHandlerMapping. The ProjectManagementController returns ModelAndView with param “ProjectManagementMain�. Now Tilesdefiniton maps to the real jsp / faces file.
Tiles.xml:
Starting request with:Code:<definition name="layout.example" path="/template/template.faces" > <put name="header" value="/common/header.faces" /> <put name="menu" value="/common/navigation.faces" /> </definition> <definition name="projectmanagement_list" extends="layout.example"> <put name="body" value="/projectmanagement_list.htm"/> </definition> <definition name="ProjectManagementMain" extends="layout.example"> <put name="body" value="/jsp/projectmanagement_list.faces"/> </definition>
Index.jsp:
This construct works except this stupid exception.Code:<c:redirect url="/projectmanagement_list.tiles"/>
This exception is also present when not using this “double mapping�, so even if I use a controllerClass definition in tiles.xml to prevent a second mapping execution.
Code:2005-10-21 10:46:12,937 ERROR [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/swdtool].[FacesServlet]] - <Servlet.service() for servlet FacesServlet threw exception> java.lang.IllegalStateException: Cannot forward after response has been committed at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:313) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301) at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:415) at - - - - org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:595) 2005-10-21 10:46:12,953 ERROR [org.apache.struts.taglib.tiles.InsertTag] - <ServletException in '/common/navigation.faces': Cannot forward after response has been committed> javax.servlet.ServletException: Cannot forward after response has been committed at javax.faces.webapp.FacesServlet.service(FacesServlet.java:109) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) - - - - at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:595) 2005-10-21 10:46:12,984 ERROR [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/swdtool].[jsp]] - <Servlet.service() for servlet jsp threw exception> javax.servlet.jsp.JspException: ServletException in '/common/navigation.faces': Cannot forward after response has been committed at org.apache.struts.taglib.tiles.InsertTag$InsertHandler.doEndTag(InsertTag.java:921) at org.apache.struts.taglib.tiles.InsertTag.doEndTag(InsertTag.java:460) at org.apache.jsp.template.template_jsp._jspx_meth_tiles_insert_0(org.apache.jsp.template.template_jsp:178) at org.apache.jsp.template.template_jsp._jspx_meth_f_subview_0(org.apache.jsp.template.template_jsp:156) - - - - org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:595) 2005-10-21 10:46:13,156 ERROR [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/swdtool].[FacesServlet]] - <Servlet.service() for servlet FacesServlet threw exception> javax.faces.FacesException: ServletException in '/common/navigation.faces': Cannot forward after response has been committed at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:421) at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:234) - - - - org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:595) Caused by: javax.servlet.ServletException: ServletException in '/common/navigation.faces': Cannot forward after response has been committed at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:848) at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781) - - - - org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301) at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:415) ... 32 more 2005-10-21 10:46:13,171 ERROR [org.springframework.web.servlet.DispatcherServlet] - <Could not complete request> javax.servlet.ServletException: ServletException in '/common/navigation.faces': Cannot forward after response has been committed at javax.faces.webapp.FacesServlet.service(FacesServlet.java:109) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) - - - - at java.lang.Thread.run(Thread.java:595) 2005-10-21 10:46:13,187 ERROR [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/swdtool].[swdtool]] - <Servlet.service() for servlet swdtool threw exception> javax.faces.FacesException: ServletException in '/common/navigation.faces': Cannot forward after response has been committed at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:421) at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:234) - - - - org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:595) Caused by: javax.servlet.ServletException: ServletException in '/common/navigation.faces': Cannot forward after response has been committed at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:848) . . .
I already deleted in the jsps all
And I used flush=�false�Code:<%@ page session="true" %>
Code:<tiles:insert attribute="menu" flush="false" />
Can anyone help me?
Btw: This way using tiles is like spring recommend. Would it be a better solution to use tiles strictly the myfaces way ?



Reply With Quote