MyFaces 1.1.5, RichFaces 3.1.3, Tomcat 5.5.25.

I have a simple toy app with a datatable and a tabpanel.  It's working
reasonably well (for a toy).  I decided I wanted to be able to "repeat"
one of the tabs, so that the fields are the same, but the data varies
(and the tab title).  So, I set up the current contents of the tab in a
separate JSP, and added a jsp:include (with a single parameter) from
inside the tabpanel.  When I run this, it blows up with a stack overflow
error like the following.  Note the entries for
"org.apache.jsp.main_jsp" appearing twice in this stack.  This cycle
repeats many times in the stack trace (too long to include here in
full).  After this stack trace, I include all three of my JSP pages in
the application, with "main.jsp" in the state where it's not failing,
and my web.xml.  Reproduce the error by 

---------------------
SEVERE: Servlet.service() for servlet jsp threw exception
java.io.IOException: Stream closed
        at
org.apache.jasper.runtime.BodyContentImpl.ensureOpen(BodyContentImpl.jav
a:582)
        at
org.apache.jasper.runtime.BodyContentImpl.write(BodyContentImpl.java:142
)
        at
org.apache.jasper.runtime.BodyContentImpl.write(BodyContentImpl.java:159
)
        at
org.apache.jsp.main_jsp._jspx_meth_f_005fsubview_005f1(main_jsp.java:129
1)
        at
org.apache.jsp.main_jsp._jspx_meth_rich_005ftab_005f2(main_jsp.java:1260
)
        at
org.apache.jsp.main_jsp._jspx_meth_rich_005ftabPanel_005f0(main_jsp.java
:959)
        at
org.apache.jsp.main_jsp._jspx_meth_a4j_005fform_005f0(main_jsp.java:208)
        at
org.apache.jsp.main_jsp._jspx_meth_f_005fview_005f0(main_jsp.java:162)
        at org.apache.jsp.main_jsp._jspService(main_jsp.java:124)
        at
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.ja
va:331)
        at
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
        at
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
tionFilterChain.java:269)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
erChain.java:188)
        at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatc
her.java:691)
        at
org.apache.catalina.core.ApplicationDispatcher.processRequest(Applicatio
nDispatcher.java:469)
        at
org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDisp
atcher.java:403)
        at
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispat
cher.java:301)
        at
org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(S
ervletExternalContextImpl.java:419)
        at
org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspView
HandlerImpl.java:211)
        at
org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrappe
r.java:108)
        at
org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java
:216)
        at
org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderRespon
seExecutor.java:41)
        at
org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:132
)
        at
javax.faces.webapp.FacesServlet.service(FacesServlet.java:140)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
tionFilterChain.java:269)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
erChain.java:188)
        at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:307)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
tionFilterChain.java:215)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
erChain.java:188)
        at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatc
her.java:691)
        at
org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDisp
atcher.java:594)
        at
org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispat
cher.java:505)
        at
org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.ja
va:965)
        at
org.apache.jsp.main_jsp._jspx_meth_f_005fsubview_005f1(main_jsp.java:129
0)
        at
org.apache.jsp.main_jsp._jspx_meth_rich_005ftab_005f2(main_jsp.java:1260
)
        at
org.apache.jsp.main_jsp._jspx_meth_rich_005ftabPanel_005f0(main_jsp.java
:959)
      ... Many, many, more
----------------

----main.jsp------------
<%@ taglib uri="https://ajax4jsf.dev.java.net/ajax"; prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich"; prefix="rich"%>
<%@ taglib uri="http://java.sun.com/jsf/html"; prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core"; prefix="f"%>
<html>
<head>
<title>SimpleFaces</title>
</head>
<body>
<f:view>
        <a4j:form>
                <rich:messages layout="table" tooltip="true"
showDetail="true" showSummary="true"/>
                <h:panelGrid id="topPanelGrid" columns="5">
                        <h:outputText value="Loan ID"/>
                        <h:inputText id="loanID"
value="#{ratingRequest.loanID}"/>
                        <f:subview id="subview1">
                                <rich:message for="loanID"
showDetail="true"/>
                                <f:verbatim>&nbsp;</f:verbatim>
                        </f:subview>
                        <a4j:commandButton id="addPropertyButton"
value="Add Property"
        
action="#{ratingRequest.addProperty}"
                                           reRender="propertyTable,
tabPanel"/>
                                <a4j:commandButton id="deleteProperty1"
value="Delete"
        
action="#{ratingRequest.deleteCheckedProperties}"
        
reRender="propertyTable, tabPanel"/>
                </h:panelGrid>
                <rich:dataTable id="propertyTable"
value="#{ratingRequest.usedProperties}"
                                title="Properties" var="property"
                                                frame="border"
rules="all" rowKeyVar="rowNum"
        
onRowMouseOver="this.style.backgroundColor='#F1F1F1'"
        
onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColo
r}'">
                <rich:column>
                        <f:facet name="header">
                                <h:outputText id="propertyIDCol"
value="Property ID"/>
                        </f:facet>
                        <h:outputText id="propertyIDVal"
rendered="#{property.used}" value="#{property.propertyID}"/>
                        <f:facet name="footer">
                                        <h:outputText id="totalsLabel"
value="Totals"/>
                        </f:facet>
                </rich:column>
                <rich:column>
                        <f:facet name="header">
                                <h:outputText id="valueCol"
value="Value"/>
                        </f:facet>
                        <h:outputText id="valueVal"
rendered="#{property.used}" value="#{property.value}">
                                <f:convertNumber type="currency"
currencySymbol="$"/>
                        </h:outputText>
                        <f:facet name="footer">
                                        <h:outputText id="propertyTotal"
value="#{ratingRequest.propertyTotal}"/>
                        </f:facet>
                </rich:column>
                <rich:column>
                        <f:facet name="header">
                                <a4j:commandButton id="deleteProperty"
value="Delete"
        
action="#{ratingRequest.deleteCheckedProperties}"
        
reRender="propertyTable, tabPanel"/>
                        </f:facet>
                        <h:selectBooleanCheckbox id="propertyCheckBox"
value="#{property.checked}"/>
                </rich:column>
                </rich:dataTable>
                <rich:tabPanel id="tabPanel" switchType="client">
                        <rich:tab id="obligor" name="obligor"
label="Obligor">
                                <h:panelGrid id="obligorPanelGrid"
columns="3">
                                        <h:outputText id="field1Out"
value="Field1"/>
                                        <h:inputText id="field1In"
value="#{ratingRequest.field1}"/>
                                        <rich:message for="field1In"
showDetail="true"/>
                                </h:panelGrid>
                        </rich:tab>
                        <rich:tab id="loan" name="loan" label="Loan">
                                <h:panelGrid id="loanPanelGrid"
columns="3">
                                        <h:outputText id="field2Out"
value="Field2"/>
                                        <h:inputText id="field2In"
value="#{ratingRequest.field2}"/>
                                        <rich:message for="field2In"
showDetail="true"/>
                                </h:panelGrid>
                        </rich:tab>
                        <rich:tab id="property0"
        
name="#{ratingRequest.propertyList[0].propertyID}"
                                          label="Property:
#{ratingRequest.propertyList[0].propertyID}"
        
rendered="#{ratingRequest.propertyList[0].used}">
<%--
                                <f:subview id="propertysubview0">
                                        <jsp:include
page="/faces/propertyTab.jsp">
                                                <jsp:param
name="propertyIndex" value="0" />
                                        </jsp:include>
                                </f:subview>
 --%>
                                <h:panelGrid id="property0PanelGrid"
columns="3">
                                        <h:outputText id="propertyIDOut"
value="Property ID"/>
                                        <h:inputText id="propertyIDIn"
value="#{ratingRequest.propertyList[0].propertyID}">
                                                <a4j:support
id="propertyIDInSupport" event="onchange" reRender="propertyTable"/>
                                        </h:inputText>
                                        <rich:message for="propertyIDIn"
showDetail="true"/>
                                        <h:outputText id="valueOut"
value="Value"/>
                                        <h:inputText id="valueIn"
value="#{ratingRequest.propertyList[0].value}">
                  <f:converter converterId="javax.faces.BigDecimal" /> 
                                                <a4j:support
id="valueInSupport" event="onchange" reRender="propertyTable"/>
                                        </h:inputText>
                                        <rich:message for="valueIn"
showDetail="true"/>
                                </h:panelGrid>
                        </rich:tab>
                        <rich:tab id="ratings" name="ratings"
label="Ratings">
                                <h:panelGrid id="ratingsPanelGrid"
columns="3">
                                        <h:outputText id="field3Out"
value="Field3"/>
                                        <h:inputText id="field3In"
value="#{ratingRequest.field3}"/>
                                        <rich:message for="field3In"
showDetail="true" passedLabel=" "/>
                                        <a4j:commandButton
id="processRequest" value="Submit Request"
        
action="#{ratingRequest.processRequest}"
        
reRender="ratingValue, propertyIDVal, valueVal, tabPanel" />
                                        <f:subview id="subview2">
        
<f:verbatim>&nbsp;</f:verbatim>
                                        </f:subview>
                                        <f:subview id="subview3">
        
<f:verbatim>&nbsp;</f:verbatim>
                                        </f:subview>
                                        <h:outputText value="Rating"/>
                                        <h:outputText id="ratingValue"
value="#{ratingRequest.rating}"/>
                                </h:panelGrid>
                        </rich:tab>
                </rich:tabPanel>
        </a4j:form>
</f:view>
</body>
</html>
----------------

------index.jsp-------<% session.invalidate(); %>
<jsp:forward page="/faces/main.jsp"/>
------------------

------propertyTab.jsp----------
<%@ taglib uri="https://ajax4jsf.dev.java.net/ajax"; prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich"; prefix="rich"%>
<%@ taglib uri="http://java.sun.com/jsf/html"; prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core"; prefix="f"%>
<f:subview id="includedPropertyPage">
        <h:panelGrid id="propertyPanelGrid" columns="3">
                <h:outputText id="propertyIDOut" value="Property ID"/>
                <h:inputText id="propertyIDIn"
        
value="#{ratingRequest.propertyList[0].propertyID}">
                        <a4j:support id="propertyIDInSupport"
event="onchange" reRender="propertyTable"/>
                </h:inputText>
                <rich:message for="propertyIDIn" showDetail="true"/>
                <h:outputText id="valueOut" value="Value"/>
                <h:inputText id="valueIn"
        
value="#{ratingRequest.propertyList[0].value}">
                        <a4j:support id="valueInSupport"
event="onchange" reRender="propertyTable"/>
                </h:inputText>
                <rich:message for="valueIn" showDetail="true"/>
        </h:panelGrid>
</f:subview>
--------------------------

--------web.xml-----------
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd";>
    <display-name>TabPanel</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>server</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.validateXml</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.verifyObjects</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
                <description>
                        Validate managed beans, navigation rules and
ensure that forms are not nested.
                </description>
        <param-name>org.apache.myfaces.VALIDATE</param-name>
        <param-value>true</param-value>
    </context-param>
  <context-param>
    <description>A class implementing the
        
org.apache.myfaces.shared.renderkit.html.util.AddResource
                    interface. It is responsible to
                        place scripts and css on the right position in
your HTML document.
            Default:
"org.apache.myfaces.shared.renderkit.html.util.DefaultAddResource"
            Follow the description on the MyFaces-Wiki-Performance page
to enable
            StreamingAddResource instead of DefaultAddResource if you
want to
            gain performance.
    </description>
    <param-name>org.apache.myfaces.ADD_RESOURCE_CLASS</param-name>
 
<param-value>org.apache.myfaces.renderkit.html.util.DefaultAddResource</
param-value>
 
<!--param-value>org.apache.myfaces.component.html.util.StreamingAddResou
rce</param-value-->
  </context-param>

  <context-param>
    <description>
        A very common problem in configuring MyFaces-web-applications
        is that the Extensions-Filter is not configured at all
        or improperly configured. This parameter will check for a
properly
        configured Extensions-Filter if it is needed by the web-app.
        In most cases this check will work just fine, there might be
cases
        where an internal forward will bypass the Extensions-Filter and
the check
        will not work. If this is the case, you can disable the check by
setting
        this parameter to false.
    </description>
    <param-name>org.apache.myfaces.CHECK_EXTENSIONS_FILTER</param-name>
    <param-value>true</param-value>
  </context-param>

  <context-param>
    <description>
        Change the url-pattern from the ExtensionsFilter
        Default is "/faces/myFacesExtensionResource"
        Note: The filter-mapping for ExtensionsFilter, the url-pattern
is
        this value + "/*", else there comes a exception
    </description>
    <param-name>org.apache.myfaces.RESOURCE_VIRTUAL_PATH</param-name>
    <param-value>/faces/extensionResource</param-value>
  </context-param>
        <context-param>
                <param-name>org.richfaces.SKIN</param-name>
                <param-value>blueSky</param-value>
        </context-param>
        <filter>
                <display-name>RichFaces Filter</display-name>
                <filter-name>richfaces</filter-name>
                <filter-class>org.ajax4jsf.Filter</filter-class>
        </filter>
        <filter-mapping>
                <filter-name>richfaces</filter-name>
                <servlet-name>Faces Servlet</servlet-name>
                <dispatcher>REQUEST</dispatcher>
                <dispatcher>FORWARD</dispatcher>
                <dispatcher>INCLUDE</dispatcher>
        </filter-mapping>
<!-- 
        <listener>
                <listener-class>
                        com.sun.faces.config.ConfigureListener
                </listener-class>
        </listener>
 -->
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
                <load-on-startup>1</load-on-startup>
    </servlet>
        <servlet-mapping>
                <servlet-name>Faces Servlet</servlet-name>
                <url-pattern>/faces/*</url-pattern>
        </servlet-mapping>
        <session-config>
                <session-timeout>35</session-timeout>
        </session-config>
        <mime-mapping>
                <extension>html</extension>
                <mime-type>text/html</mime-type>
        </mime-mapping>
        <mime-mapping>
                <extension>txt</extension>
                <mime-type>text/plain</mime-type>
        </mime-mapping>
        <login-config>
                <auth-method>BASIC</auth-method>
        </login-config>
</web-app>
------------------

Reply via email to