You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Diego Louzán Martínez <di...@metalicana.org> on 2004/02/27 19:37:24 UTC

struts-faces doesn't update pages correctly when using tiles

I'm refactoring a Struts+JSTL application to use JSF too, and I have a
problem when using the struts-faces library. Everything works ok until I
use a ForwardAction to navigate to an action like this:

<action path="/MainPage"
  type="org.apache.struts.actions.ForwardAction"
  parameter=".mainPage"/>

.mainPage is a Tiles page defined like this:

<definition name=".base" page="/faces/DefaultLayout.jsp">
  <put name="title" value="/DefaultTitle.jsp"/>
  <put name="headerSpecific" value="/Blank.jsp"/>
  <put name="content" value="/Blank.jsp"/>
  <put name="footer" value="/DefaultFooter.jsp"/>
</definition>
<definition name=".mainPage" extends=".base">
  <put name="headerSpecific" value="/MainPageHeaderSpecific.jsp"/>
  <put name="content" value="/MainPageContent.jsp"/>
</definition>

I'm using my own RequestProcessor registered on the config file of
struts:

<controller  
processorClass="es.udc.fbellas.j2ee.miniportal.http.controller.frontcontroller.MiniPortalRequestProcessor"/>

The mapping works fine except for I have to load the browser url twice.
When I first load the page, it gives the following exception:

--------------------------------------------------------------------------------
org.apache.jasper.JasperException: Duplicate component ID 'title' found
in view.
        at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:254)
        at
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
        at
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
        at
org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:432)
        at
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:356)
        at
com.sun.faces.context.ExternalContextImpl.dispatchMessage(ExternalContextImpl.java:287)
        at
com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:144)
        at
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:89)
        at
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:209)
        at
javax.faces.webapp.FacesServlet.service(FacesServlet.java:196)
        at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
        at
org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:432)
        at
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:356)
        at
org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069)
        at
org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:274)
        at
org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:254)
        at
org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:309)
        at
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279)
        at
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
        at
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
        at
org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:432)
        at
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:356)
        at
org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:430)
        at org.apache.jsp.Index_jsp._jspService(Index_jsp.java:42)
        at
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:137)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:210)
        at
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
        at
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
        at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
        at
org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2417)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
        at
org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
        at
org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:193)
        at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:781)
        at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:549)
        at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:589)
        at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:666)
        at java.lang.Thread.run(Thread.java:534)

root cause

javax.servlet.ServletException: Duplicate component ID 'titleTile' found
in view.
        at
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:531)
        at
org.apache.jsp.DefaultLayout_jsp._jspService(DefaultLayout_jsp.java:91)
        at
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:137)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:210)
        at
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
        at
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
        at
org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:432)
        at
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:356)
        at
com.sun.faces.context.ExternalContextImpl.dispatchMessage(ExternalContextImpl.java:287)
        at
com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:144)
        at
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:89)
        at
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:209)
        at
javax.faces.webapp.FacesServlet.service(FacesServlet.java:196)
        at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
        at
org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:432)
        at
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:356)
        at
org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069)
        at
org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:274)
        at
org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:254)
        at
org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:309)
        at
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279)
        at
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
        at
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
        at
org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:432)
        at
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:356)
        at
org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:430)
        at org.apache.jsp.Index_jsp._jspService(Index_jsp.java:42)
        at
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:137)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:210)
        at
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
        at
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
        at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
        at
org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2417)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
        at
org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
        at
org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:193)
        at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:781)
        at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:549)
        at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:589)
        at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:666)
        at java.lang.Thread.run(Thread.java:534)
--------------------------------------------------------------------------------

When I load the URL again, everything is ok. The page code is:

--------------------------------------------------------------------------------
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
<%@ taglib prefix="t" uri="http://jakarta.apache.org/struts/tags-tiles"
%>
<%@ taglib prefix="s" uri="http://jakarta.apache.org/struts/tags-faces"
%>

<f:view>

<%-- Start of HTML. --%>

<s:html locale="true">

<fmt:setLocale
value='${sessionScope["org.apache.struts.action.LOCALE"]}'
        scope="session"/>

<%-- HTML header. --%>

<head>
  <title>
        <f:subview id="title">
            <t:insert attribute="title" flush="false"/>
        </f:subview>
  </title>
  <meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1">
</head>

<%-- Start of HTML body. --%>

<body text="#000000" bgcolor="#ffffff" link="#000ee0" vlink="#551a8b" 
      alink="#000ee0">

<%-- Body header. --%>

<table width="100%" border="0">
  <tr>
    <td align="left">
      <font face="Arial, Helvetica, sans-serif" size="+1"
color="#000099">
        <fmt:message key="DefaultTemplate.MiniPortal"/>
      </font>
    </td>
    <td align="right">
      <c:choose>
            <c:when test="${empty sessionScope.firstName}">
          <b><fmt:message key="DefaultTemplate.welcome"/></b>
            </c:when>
            <c:otherwise>
                  <b>
          <fmt:message key="DefaultTemplate.hello"/>
          <c:out value="${sessionScope.firstName}"/>
          </b>
            </c:otherwise>
          </c:choose>
      -
      <f:subview id="headerSpecific">
        <t:insert attribute="headerSpecific" flush="false"/>
      </f:subview>
    </td>
  </tr>
</table>

<hr>

<%-- Body content. --%>

<table width="100%" border="0">
  <tr valign="top">
    <td width="83%" height="490"> 
      <table width="100%" border="0">
        <tr valign="middle"> 
          <td height="490">
                <f:subview id="content">
                            <t:insert attribute="content"
flush="false"/>
                        </f:subview>
                  </td>
        </tr>
      </table>
    </td>
  </tr>
</table>

<hr>

<%-- Body footer. --%>

<table width="100%" border="0">
  <tr> 
    <td>
        <f:subview id="footer">
                  <t:insert attribute="footer" flush="false"/>
                </f:subview>
        </td>
  </tr>
</table>

<%-- End of HTML body. --%>

</body>

<%-- End of HTML. --%>

</s:html>

</f:view>
------------------------------------------------------------------------------------------

Any ideas?

-- 
Diego Louzán Martínez


---------------------------------------------------------------------
To unsubscribe, e-mail: struts-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: struts-user-help@jakarta.apache.org