I'm coming into the thread late, so that's why I'm replying to a random
message in it...

How about adding indexName and indexProperty attributes.   If indexed is
true it will use those properties to find a bean containing the current
index value.  If indexed is true and those other attributes are not set,
then it defaults to the current mechanism for determining the index
value.

<c:forEach var="item" items="${items}" varStatus="status">
  <html:checkbox indexed="true" indexName="status" indexProperty="index"
.../>
</c:forEach>

That way you don't have any direct dependency on JSTL, and it might work
with some other third-party looping tags (for whatever that's worth).

I'm not actually using JSTL yet (or Struts 1.1 for that matter) so maybe
this doesn't work, but it's a thought.
-- 
Tim Moore / Blackboard Inc. / Software Engineer
1899 L Street, NW / 5th Floor / Washington, DC 20036
Phone 202-463-4860 ext. 258 / Fax 202-463-4863


> -----Original Message-----
> From: Martin Cooper [mailto:[EMAIL PROTECTED]] 
> Sent: Saturday, January 04, 2003 4:37 PM
> To: Struts Developers List
> Subject: RE: Another bright idea, make "indexed" work with 
> JSTL forEach and friends
> 
> 
> 
> 
> On Sat, 4 Jan 2003, James Turner wrote:
> 
> > On Sat, 4 Jan 2003, Martin Cooper wrote:
> >
> > > If you want to do this, I'd rather see it happen in the html-el 
> > > taglib than the regular html taglib. Struts-EL already depends on 
> > > JSTL, and is designed to work in cooperation with it, so 
> it's a much 
> > > more natural fit
> > > than trying to sneak JSTL functionality into the regular tags.
> >
> > I mildly disagree.  EL is to allow struts HTML tags to use 
> EL syntax.
> 
> Yes. And why would you want to do that? Because you're 
> already using JSTL tags in your pages, and you want the two 
> to work together.
> 
> > This deals with letting the standard tags find JSTL looping 
> > constructs.
> 
> Yes. And why would you want to do that? Because you're 
> already using JSTL tags in your pages, and you want the two 
> to work together.
> 
> Notice the remarkable similarity in the two reasons for using 
> these pieces of functionality? ;-)
> 
> That's why I think your suggestion fits much better in 
> Struts-EL than in the Struts core. Once we require Servlets 
> 2.3 / JSP 1.2 for Struts, then I'm all for having this in the 
> core, along with the rest of Struts-EL. Prior to that, I just 
> don't like the idea of muddying the core html taglib with 
> references to JSTL, especially when you have to do it all 
> through reflection.
> 
> --
> Martin Cooper
> 
> 
> > As is, you can "*almost* entirely eliminate all the Struts 
> tags except 
> > for the HTML tags in favor of JSTL substitutes, since only the HTML 
> > tags deal with things like actions.  By implementing this, we can 
> > eliminate having to use the logic taglibs at all.  And the 
> change is 
> > pretty darn innocuous, here's the revisted code from 
> BaseHandlerTag, 
> > which works very nicely.  Note that I'm not even referencing 
> > org.apache stuff.  And the JSTL stuff is only ever invoked 
> if it fails 
> > to find the Iterate tag.
> >
> > One thing I'm considering is caching the classes and 
> methods so that 
> > the reflection doesn't need to happen on every invokation.
> >
> >     protected void prepareIndex(StringBuffer handlers, String name) 
> > throws JspException {
> >     int index = 0;
> >     boolean found = false;
> >
> >         // look for outer iterate tag
> >         IterateTag iterateTag = (IterateTag) 
> > findAncestorWithClass(this, IterateTag.class);
> >     // Look for JSTL loops
> >     if (iterateTag == null) {
> >         try {
> >             Class loopClass = 
> > Class.forName("javax.servlet.jsp.jstl.core.LoopTagSupport");
> >             Object loopTag = findAncestorWithClass(this, loopClass);
> >             if (loopTag != null) {
> >                 Method getStatus =
> >                     loopClass.getDeclaredMethod("getLoopStatus",
> > null);
> >                 Object status = getStatus.invoke(loopTag, null);
> >                 Class statusClass =
> >
> > Class.forName("javax.servlet.jsp.jstl.core.LoopTagStatus");
> >                 Method getIndex =
> >                     statusClass.getDeclaredMethod("getIndex", null);
> >                 Integer ind = (Integer) getIndex.invoke(status,
> > null);
> >                 index = ind.intValue();
> >                 found = true;
> >             }
> >         }
> >         catch (ClassNotFoundException ex) {}
> >         catch (NoSuchMethodException ex) {}
> >         catch (IllegalAccessException ex) {}
> >         catch (IllegalArgumentException ex) {}
> >         catch (InvocationTargetException ex) {}
> >         catch (NullPointerException ex) {}
> >         catch (ExceptionInInitializerError ex) {}
> >     } 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;
> >         }
> >         if (name != null)
> >             handlers.append(name);
> >         handlers.append("[");
> >         handlers.append(index);
> >         handlers.append("]");
> >         if (name != null)
> >             handlers.append(".");
> >     }
> >
> >
> >
> > --
> > To unsubscribe, e-mail:   
> <mailto:struts-dev-> [EMAIL PROTECTED]>
> > For 
> additional commands, 
> e-mail: 
> > <mailto:[EMAIL PROTECTED]>
> >
> >
> 
> 
> --
> To unsubscribe, e-mail:   
> <mailto:struts-dev-> [EMAIL PROTECTED]>
> For 
> additional commands, 
> e-mail: <mailto:[EMAIL PROTECTED]>
> 
> 

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to