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]



Reply via email to