Well I'm out of ideas. I can get this error with this jsp code if I removed the <@ taglib> definition for c.tld - but you have it in your jsp and if the tld was a problem you wouldn't see the <c:forEach> working when you remove the indexed="true" attribute.
Obviously its something in your environment but I don't know whats not right - its got to be something to do with either Struts, JSTL or the servlet container your using thats either the wrong version or not configured properly. Niall ----- Original Message ----- From: "Paul Barry" <[EMAIL PROTECTED]> To: "Struts Users Mailing List" <[EMAIL PROTECTED]> Sent: Friday, May 07, 2004 2:58 PM Subject: Re: indexed="true" is only valid within an enclosing iterate tag > Sorry if this is confusing, I'll explain what I am trying to do. I want > to give the use a form with a number of "interests" and I want to track > which ones they check off. The way I thought to do it is have a form > with a List property called interests. I would have an action > prepopulate the interests property with Interest objects. I guess the > Interest object would have to have a boolean "selected" property that is > initially set to false, which would make all the options appear > unchecked, and then when the user submits the form to a different > action, I would store the interests in the database where selected is > true. Is that how you normally handle an indexed property like this? I > haven't really gotten very far in figuring this out yet because of the > problem with the indexed attribute. > > I just made up this JSP example because it illustrates the point that no > matter what I do, I seem to get the "must be in an interate tag" > exception. I put your code into my jsp page: > > <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %> > <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %> > <html:html> > <body> > <% > java.util.ArrayList interests = new java.util.ArrayList(); > java.util.HashMap map = new java.util.HashMap(); > map.put("code","ABC"); > interests.add(map); > request.setAttribute("interests",interests); > %> > <c:forEach var="interest" items="${interests}"> > <p>Interest: <html:text indexed="true" name="interest" > property="code"/></p> > </c:forEach> > </body> > </html:html> > > Still get the same exception. > > Niall Pemberton wrote: > > > No worries. Your stuff's a bit confusing. On your <html:form> you have an > > action named "interest" and you don't specify a "name" attribute on your > > <html:checkbox>. That means the checkbox tag is going to try and get the > > form associated with your "interest" action (if it doesn't exist, it'll try > > and create it) and then try to retrieve the property you named which is > > "${interest.code}", plus the fact you are storing a "interests" object in > > request scope. > > > > I changed your code and the following worked for me, the only difference is > > I don't use the "el" versions of the struts tags - just the standard ones: > > > > <% > > java.util.ArrayList interests = new java.util.ArrayList(); > > java.util.HashMap map = new java.util.HashMap(); > > map.put("code","ABC"); > > interests.add(map); > > request.setAttribute("interests",interests); > > %> > > <c:forEach var="interest" items="${interests}"> > > <p>Interest: <html:text indexed="true" name="interest" > > property="code"/></p> > > </c:forEach> > > > > ... and it produced: > > > > <p>Interest: <input type="text" name="interest[0].code" > > value="ABC"></p> > > > > Niall > > > > ----- Original Message ----- > > From: "Paul Barry" <[EMAIL PROTECTED]> > > To: "Struts Users Mailing List" <[EMAIL PROTECTED]> > > Sent: Thursday, May 06, 2004 8:55 PM > > Subject: Re: indexed="true" is only valid within an enclosing iterate tag > > > > > > > >>Sorry for replying directly to you Niall. I meant to reply to the whole > >>list. I think when you reply to a message you are replying to the user > >>list and me individually, because I get two copies of each message that > >>you post. The reply-to on one of them it set to the struts user list, > >>and the reply-to on the other is set to your address, so I guess I > >>replied to the wrong one. > >> > >>Anyway, here is the full code: > >> > >><%@ taglib uri="http://jakarta.apache.org/struts/tags-html-el" > >>prefix="html" %> > >><%@ taglib uri="http://jakarta.apache.org/struts/tags-logic-el" > >>prefix="logic" %> > >><%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %> > >><html:html> > >> <body> > >> <% > >> java.util.ArrayList interests = new java.util.ArrayList(); > >> java.util.HashMap map = new java.util.HashMap(); > >> map.put("code","ABC"); > >> interests.add(map); > >> request.setAttribute("interests",interests); > >> %> > >> <html:form action="interest"> > >> <c:forEach var="interest" varStatus="loop" items="${interests}"> > >> <html:checkbox indexed="true" property="${interest.code}"/> > >> </c:forEach> > >> </html:form> > >> </body> > >></html:html> > >> > >> > >>The JSP scriplet fakes what normally happens in a action before getting > >>to the JSP. Here is the exceptioin I get: > >> > >>javax.servlet.jsp.JspException: indexed="true" is only valid within an > >>enclosing iterate tag > >>at > >> > > > > org.apache.struts.taglib.html.BaseHandlerTag.prepareIndex(BaseHandlerTag.jav > > a:663) > > > >>at > >>org.apache.struts.taglib.html.CheckboxTag.doStartTag(CheckboxTag.java:188) > >>at > >> > > > > org.apache.strutsel.taglib.html.ELCheckboxTag.doStartTag(ELCheckboxTag.java: > > 531) > > > >>at _test__jsp._jspService(/test.jsp:14) > >>at com.caucho.jsp.JavaPage.service(JavaPage.java:75) > >>at com.caucho.jsp.Page.subservice(Page.java:506) > >>at > >>com.caucho.server.http.FilterChainPage.doFilter(FilterChainPage.java:182) > >>at com.caucho.server.http.Invocation.service(Invocation.java:315) > >>at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:246) > >>at > >>com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:163) > >>at com.caucho.server.TcpConnection.run(TcpConnection.java:139) > >>at java.lang.Thread.run(Thread.java:536) > >> > >> > >>Is it possible that this problem has something to do with me using > >>resin? Guess I could download and setup tomcat to test... > >> > >>Niall Pemberton wrote: > >> > >> > >>>Well it works fine for me - so I'm at a loss to explain. Maybe you > > > > should > > > >>>post the actual jsp code you are using - you said the jsp code looked > > > > like > > > >>>this: > >>> > >>> <c:forEach var="item" items="${items}"> > >>> <html:text name="item" property="code"/> > >>></c:forEach> > >>> > >>>but the exception you show is for the EL version of the checkbox tag. > >>> > >>>Also its better if you post to the struts user list rather than directly > > > > to > > > >>>me - someone who knows more than me or has experienced your problem may > > > > jump > > > >>>in if you post to the list. > >>> > >>>Niall > >>> > >>> > >>>----- Original Message ----- > >>>From: "Paul Barry" <[EMAIL PROTECTED]> > >>>To: "Niall Pemberton" <[EMAIL PROTECTED]> > >>>Sent: Thursday, May 06, 2004 1:42 PM > >>>Subject: Re: indexed="true" is only valid within an enclosing iterate > > > > tag > > > >>> > >>> > >>>>I am using Struts 1.1, I just copied jstl.jar, struts.jar and > >>>>struts-el.jar into my project lib directory to be sure. Still getting > >>>>the exception: > >>>> > >>>>javax.servlet.jsp.JspException: indexed="true" is only valid within an > >>>>enclosing iterate tag > >>>>at > >>>> > >>> > >>> > > org.apache.struts.taglib.html.BaseHandlerTag.prepareIndex(BaseHandlerTag.jav > > > >>>a:663) > >>> > >>> > >>>>at > >> > >>>org.apache.struts.taglib.html.CheckboxTag.doStartTag(CheckboxTag.java:188 ) > >>> > >>>>at > >>>> > >>> > >>> > > org.apache.strutsel.taglib.html.ELCheckboxTag.doStartTag(ELCheckboxTag.java: > > > >>>531) > >>> > >>> > >>>>I checked the source code around line 663 of BaseHandlerTag, here is > >>>>what it looks like: > >>>> > >>>>// Look for JSTL loops > >>>>if (iterateTag == null) { > >>>> Integer i = getJstlLoopIndex(); > >>>> if (i != null) { > >>>>index = i.intValue(); > >>>>found = true; > >>>> } > >>>>} else { > >>>> index = iterateTag.getIndex(); > >>>> found = true; > >>>>} > >>>> if (!found) { > >>>> // this tag should only be nested in iteratetag, if it's > >>>>not, throw exception > >>>> JspException e = new > >>>>JspException(messages.getMessage("indexed.noEnclosingIterate")); > >>>> RequestUtils.saveException(pageContext, e); > >>>> throw e; > >>>> } > >>>> > >>>> > >>>>Seems as though getJstlLoopIndex() isn't doing it's job, any ideas why? > >>>> I have tried it with declaring the Loop Status in the c:forEach with > >>>>varStatus="loop" and without, still get the exception. > >>>> > >>>>Niall Pemberton wrote: > >>>> > >>>> > >>>> > >>>>>Hmmm. The thinking behind my suggestion was "is jstl working properly > >>> > >>>for > >>> > >>> > >>>>>you or is the indexed thing just hinding some other root cause" > >>>>> > >>>>>I'm out of ideas - the only other thing I can think of is what version > >>> > >>>of > >>> > >>> > >>>>>Struts are you using - I believe jstl was only catered for from Struts > >>> > >>>1.1 - > >>> > >>> > >>>>>so if you were using a version before that you would get the message > >>> > >>>you're > >>> > >>> > >>>>>seeing. > >>>>> > >>>>>Niall > >>>>> > >>>>>----- Original Message ----- > >>>>>From: "Paul Barry" <[EMAIL PROTECTED]> > >>>>>To: "Struts Users Mailing List" <[EMAIL PROTECTED]> > >>>>>Sent: Wednesday, May 05, 2004 10:21 PM > >>>>>Subject: Re: indexed="true" is only valid within an enclosing iterate > >>> > >>>tag > >>> > >>> > >>>>> > >>>>>>Yeah, if I remove the indexed="true", my JSP code looks like this: > >>>>>> > >>>>>><c:forEach var="item" items="${items}"> > >>>>>> <html:text name="item" property="code"/> > >>>>>></c:forEach> > >>>>>> > >>>>>>I get a bunch of HTML inputs like this: > >>>>>> > >>>>>><input type="text" name="code" value="ABC" /> > >>>>>> > >>>>>>With different values but all named code. Code is a property of item, > >>>>>>and each item in items has a different code. > >>>>>> > >>>>>>Niall Pemberton wrote: > >>>>>> > >>>>>> > >>>>>> > >>>>>> > >>>>>>>What happens if you remove the "indexed" attribute from all the > >>>>>>><html:text> - does it work properly then (except for the "name" > >>>>> > >>>>>attribute) > >>>>> > >>>>> > >>>>> > >>>>>>>is the html page generated OK? > >>>>>>> > >>>>>>>Niall > >>>>>>> > >>>>>>>----- Original Message ----- > >>>>>>>From: "Paul Barry" <[EMAIL PROTECTED]> > >>>>>>>To: <[EMAIL PROTECTED]> > >>>>>>>Sent: Wednesday, May 05, 2004 9:49 PM > >>>>>>>Subject: indexed="true" is only valid within an enclosing iterate tag > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>>>I am trying to use indexed properties in a form, as described in > > > > James > > > >>>>>>>>Turner's Article "Succeeding With Struts: Indexed Properties and > > > > Beans > > > >>>>>>>>as Properties" at > >>> > >>>http://www.developer.com/java/ejb/article.php/2233591 > >>> > >>> > >>>>>>>>The example shows you can use c:forEach with <html:text > >>>>>>>>indexed="true"/>, like this: > >>>>>>>> > >>>>>>>><c:forEach var="lines" items="${purchaseOrderBeanForm.map.lines}" > > >>>>>>>><TR><TD><html:text indexed="true" name="lines" > >>>>>>>>property="partNumber"/></TD> > >>>>>>>><TD><html:text indexed="true" name="lines" > >>> > >>>property="quantity"/></TD> > >>> > >>>>>>>><TD><html:text indexed="true" name="lines" > >>>>> > >>>>>property="price"/></TD></TR> > >>>>> > >>>>>>>></c:forEach> > >>>>>>>> > >>>>>>>>But when I try to do that, I get this error: > >>>>>>>> > >>>>>>>>indexed="true" is only valid within an enclosing iterate tag > >>>>>>>> > >>>>>>>>Is my code wrong or is the example wrong? > >>>>>>>> > >> > >>>>>>>--------------------------------------------------------------------- > >>>>>>> > >>>>>>>>To unsubscribe, e-mail: [EMAIL PROTECTED] > >>>>>>>>For additional commands, e-mail: [EMAIL PROTECTED] > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>>--------------------------------------------------------------------- > >>>>>>>To unsubscribe, e-mail: [EMAIL PROTECTED] > >>>>>>>For additional commands, e-mail: [EMAIL PROTECTED] > >>>>>>> > >>>>>> > >>>>>>--------------------------------------------------------------------- > >>>>>>To unsubscribe, e-mail: [EMAIL PROTECTED] > >>>>>>For additional commands, e-mail: [EMAIL PROTECTED] > >>>>>> > >>>>>> > >>>>>> > >>>>> > >>>>> > >>>>> > >>>> > >>> > >>> > >>>--------------------------------------------------------------------- > >>>To unsubscribe, e-mail: [EMAIL PROTECTED] > >>>For additional commands, e-mail: [EMAIL PROTECTED] > >>> > >> > >>--------------------------------------------------------------------- > >>To unsubscribe, e-mail: [EMAIL PROTECTED] > >>For additional commands, e-mail: [EMAIL PROTECTED] > >> > >> > >> > > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]