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]>