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]

Reply via email to