Please help!
Regards
Helmut
----- Original Message -----
*From:* Helmut Swaczinna <mailto:[EMAIL PROTECTED]>
*To:* MyFaces Discussion <mailto:[email protected]>
*Sent:* Friday, April 27, 2007 6:06 PM
*Subject:* Re: [Tobago] c:forEach doesn't work anymore with myFaces
1.1.5
Hi,
I was able to create a (not really) simple example to reproduce the
described behavior but with two differences: First, I
get only the second exception and second, the exception is also
thrown with myFaces 1.1.4. With a really simple
example there's no problem. But life isn't such simple like tests
and demos...
Here comes the source code:
test.jsp
<%@ taglib uri="http://myfaces.apache.org/tobago/component" prefix="tc"
%><%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"
%><%@ page contentType="text/html;charset=UTF-8" language="java"
%><%@ page pageEncoding="UTF-8"
%><f:view
><tc:page id="testPage1" width="300px" height="200px">
<tc:button label="Foreach test"
action="#{controller.foreachTest}" />
</tc:page>
</f:view>
foreach.jsp
<%@ taglib uri="http://myfaces.apache.org/tobago/component" prefix="tc"
%><%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"
%><%@ page contentType="text/html;charset=UTF-8" language="java"
%><%@ page pageEncoding="UTF-8"
%><f:view
><tc:page id="testPage2" width="300px" height="200px">
<jsp:include page="foreach1.jsp"/>
</tc:page>
</f:view>
foreach1.jsp
<%@ taglib uri="http://myfaces.apache.org/tobago/component" prefix="tc"
%><%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"
%><%@ page contentType="text/html;charset=UTF-8" language="java"
%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"
%><%@ page pageEncoding="UTF-8"
%><f:subview id="foreachView"
><tc:panel>
<f:facet name="layout">
<tc:gridLayout rows="fixed;*"/>
</f:facet>
<%@ include file="foreach2.jsp" %>
<tc:cell/>
</tc:panel>
</f:subview>
foreach2.jsp
<%@ page pageEncoding="UTF-8" %>
<tc:panel id="foreachPanel">
<f:facet name="layout">
<tc:gridLayout
rows="fixed;#{controller.layoutRows}fixed"
columns="1*;1*"/>
</f:facet>
<tc:label value="Column 1"/>
<tc:label value="Column 2"/>
<c:forEach items="${controller.list}"
varStatus="status" begin="0">
<tc:panel id="panel_${status.index}">
<f:facet name="layout">
<tc:gridLayout cellspacing="0"
rows="fixed"
columns="1*;1*"/>
</f:facet>
<tc:in id="column1_${status.index}_1"
rendered="true"
value="#{controller.list[${status.index}].column1}"/>
<tc:in id="column1_${status.index}_2"
rendered="false"
value="#{controller.list[${status.index}].column1}"/>
</tc:panel>
<tc:in id="column2_${status.index}"
value="#{controller.list[${status.index}].column2}"/>
</c:forEach>
<tc:button id="insertButton"
label="insert"
action="#{controller.insert}"/>
<tc:button id="deleteButton"
label="delete"
action="#{controller.delete}"/>
</tc:panel>
Controller.java
package de.wlps.test.tobago;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Controller {
private static final Log LOG = LogFactory.getLog(Controller.class);
private List<Row> list = new ArrayList<Row>();
public Controller() {
LOG.debug("Controller");
list.add(new Row("Value 1/1", "Value 2/1"));
}
public String foreachTest() {
LOG.debug("foreachTest");
return "foreach";
}
public String insert() {
LOG.debug("insert");
list.add(new Row("Value 1/" + (list.size()+1), "Value 2/" +
(list.size()+1)));
return "foreach";
}
public String delete() {
LOG.debug("delete");
if (list.size() > 0) {
list.remove(list.size() - 1);
}
return "foreach";
}
public List<Row> getList() {
LOG.debug("getList");
return list;
}
public String getLayoutRows() {
LOG.debug("getLayoutRows");
String rows = "";
for (int i = 0; i < list.size(); i++) {
rows += "fixed;";
}
return rows;
}
public class Row {
private String column1;
private String column2;
public Row(String column1, String column2) {
super();
this.column1 = column1;
this.column2 = column2;
}
public String getColumn1() {
return column1;
}
public void setColumn1(String column1) {
this.column1 = column1;
}
public String getColumn2() {
return column2;
}
public void setColumn2(String column2) {
this.column2 = column2;
}
}
}
faces-config.xml
<faces-config>
<application>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>de</supported-locale>
</locale-config>
</application>
<managed-bean>
<managed-bean-name>controller</managed-bean-name>
<managed-bean-class>de.wlps.test.tobago.Controller</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/test.jsp</from-view-id>
<navigation-case>
<from-outcome>foreach</from-outcome>
<to-view-id>/foreach.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
Start with test.jsp, press the "Foreach test" button and then press
the "insert" button. This should insert a new row
in the list. But you will get this exception:
2007-04-27 17:47:07 http-8080-Processor23 ERROR -
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/tobago-test].[jsp]:704
- Servlet.ser
vice() for servlet jsp threw exception
java.lang.IllegalStateException: Client-id : _idJsp6 is duplicated
in the faces tree. Component : testPage2:foreachView:_idJsp6, path:
{Component-Path
: [Class: org.apache.myfaces.tobago.component.UIViewRoot,ViewId:
/foreach.jsp][Class: org.apache.myfaces.tobago.component.UIPage,Id:
testPage2][Class
: javax.faces.component.UINamingContainer,Id: foreachView][Class:
org.apache.myfaces.tobago.component.UIPanel,Id: _idJsp0][Class:
org.apache.myfaces.t
obago.component.UICell,Id: _idJsp6]}
at
org.apache.myfaces.application.jsp.JspStateManagerImpl.checkForDuplicateIds(JspStateManagerImpl.java:350)
Because the duplicate id is a generated id there must be a problem
with the id generator or with the foreach tag.
If you make the example simplier, for example remove the panel in
the foreach loop or remove one of the includes,
the problem disappers.
Maybe this problem has nothing to do with Tobago. If so, please
forward it to the myFaces developers.
Regards
Helmut
----- Original Message -----
*From:* Helmut Swaczinna <mailto:[EMAIL PROTECTED]>
*To:* [email protected] <mailto:[email protected]>
*Sent:* Wednesday, April 25, 2007 3:55 PM
*Subject:* [Tobago] c:forEach doesn't work anymore with myFaces
1.1.5
Hi,
I use the c:forEach tag in some pages and it worked with myFaces
1.1.4. Now I had to switch to myFaces 1.1.5
(because there was an other bug with Tobago and myFaces 1.1.4)
and it doesn't work anymore. When the page is
displayed for the first time everything is ok. But when the
number of rows in the underlying list changes and the
page is redisplayed I always get an exception:
java.lang.ArrayIndexOutOfBoundsException: 5
at
org.apache.myfaces.tobago.util.LayoutInfo.getSpaceForColumn(LayoutInfo.java:206)
at
org.apache.myfaces.tobago.renderkit.html.scarborough.standard.tag.GridLayoutRenderer.setColumnWidths(GridLayoutRenderer.java:706)
at
org.apache.myfaces.tobago.renderkit.html.scarborough.standard.tag.GridLayoutRenderer.layoutWidth(GridLayoutRenderer.java:543)
at
org.apache.myfaces.tobago.renderkit.html.scarborough.standard.tag.GridLayoutRenderer.layoutEnd(GridLayoutRenderer.java:493)
at
org.apache.myfaces.tobago.renderkit.html.scarborough.standard.tag.GridLayoutRenderer.encodeChildrenOfComponent(GridLayoutRenderer.java:233)
or
java.lang.IllegalStateException: Client-id : _idJsp350 is
duplicated in the faces tree. Component :
editPage:detailView:anteileView2:_idJsp350, path:
{Component-Path : [Class:
org.apache.myfaces.tobago.component.UIViewRoot,ViewId:
/edit.jsp][Class: org.apache.myfaces.tobago.component.UIPage,Id:
edit
Page][Class: org.apache.myfaces.tobago.component.UIPanel,Id:
panel][Class: org.apache.myfaces.tobago.component.UIPanel,Id:
mainPanel][Class: org.apach
e.myfaces.tobago.component.UICell,Id: _idJsp86][Class:
javax.faces.component.UINamingContainer,Id: detailView][Class:
org.apache.myfaces.tobago.compon
ent.UIPanel,Id: panel][Class:
org.apache.myfaces.tobago.component.UITabGroup,Id:
_idJsp87][Class: org.apache.myfaces.tobago.component.UIPanel,Id:
ante
ileTab][Class: javax.faces.component.UINamingContainer,Id:
anteileView2][Class:
org.apache.myfaces.tobago.component.UIPanel,Id: panel][Class:
org.apac
he.myfaces.tobago.component.UIPanel,Id: copartnerPanel][Class:
org.apache.myfaces.tobago.component.UICell,Id: _idJsp349][Class:
org.apache.myfaces.tob
ago.component.UIPanel,Id: _idJsp350]}
at
org.apache.myfaces.application.jsp.JspStateManagerImpl.checkForDuplicateIds(JspStateManagerImpl.java:329)
Do I have to change my code when I switch to myFaces 1.1.5? Do I
need a new jstl version?
I'm using jstl 1.1.0 and Tobago 1.0.11 snapshot from a week ago.
Regards
Helmut