I guess the first thing to make sure you understand is that, when iterating over a Map, the object exposed by JSTL via the var attribute is of type Map.Entry. It's equivalent to doing a map.entrySet().iterator(). As for getting the size of an array, Collection, or Map, use the <bean:size> tag.
Quoting Erik Weber <[EMAIL PROTECTED]>: > OK, I'll take ANY WAY TO DO THIS AT ALL. > > I have a c:forEach over a Map. The value for each key in the Map can be > an array of objects, or I can make it a List. I don't care at this point. > > All I want to do is get the length of this array or List, before I start > iterating over *it*, during the current iteration of the Map. I am told > that I access the array or List like this: > > 1) Given this Map iteration: > <c:forEach items="myMap" > var="currentMapEntryWhichIsBothAKeyAndAValueTogether"> > > 2) access the value of the current Map entry (which will be either an > array or a List) like this: > ${currentMapEntryWhichIsBothAKeyAndAValueTogether.value} > > But I have tried all of these, none of them work: > > <c:when > test="${currentMapEntryWhichIsBothAKeyAndAValueTogether.value.length > > 0}"><!-- where the value of the Map entry is an array --> > > <c:when > test="${currentMapEntryWhichIsBothAKeyAndAValueTogether.value.size > > 0}"><!-- where the value of the Map entry is a List --> > > <c-rt:when > test="${fn:length(currentMapEntryWhichIsBothAKeyAndAValueTogether.value) > > 0}"><!-- where the value of the Map entry is either an array or a > List --> > > Not that they would have worked, because I was merely guessing in every > case. > > This is the type of thing that makes me sorry I ever got involved with > tag libraries. > > I have a Map of Lists. I didn't invent this. This is a common structure > to use in Java. So someone please show me a single document that tells > you how to work with JSTL tags (or any other tags) to do such a simple > thing as to do a nested iteration of a Map of Lists or a Map of arrays! > > Here is the Java equivalent of what I need to do: > > //Map, stored as request attribute, has String keys, MyClass[] values > > Map map = getMapWhichIsARequestAttribute(); > > Iterator i = map.keySet().iterator(); > > while (i.hasNext()) { > > String key = (String) i.next(); > > MyClass[] values = (MyClass[]) map.get(key); > > int size = values.length; // *HOW DO I GET THIS VALUE USING TAGS?* > > if (size > 0) { // *HOW DO I IMPLEMENT THIS TEST USING TAGS?* > > if (size > 5) { > > //do setup for a big array > > for (int x = 0; x < size; x++) { > > //do output for each item in array > > } > > } > > <> else { > > <> //do setup for a small array > > for (int x = 0; x < size; x++) { > > //do output for each item in array > > } > } > > } > > else { > > //no records found for this key > > } > > } > > > > Failing that, I would appreciate it if someone could show me how to do > this using Struts tags. If I had used scriptlets, I would have been done > hours ago. > > Thanks, > Erik > > > > Erik Weber wrote: > > > I have a c:forEach where "items" refers to a Map, and "var" refers to > > the current Map entry. > > > > <c:forEach items="myMap" var="currentEntry"> > > > > The value for each Map entry is an array. How do I switch on the > > length of this array? I tried this: > > > > <c:when test="${currentEntry.value.length > 5}"> > > > > But I get a syntax error; it says I supplied the "." operator with an > > index value of type "java.lang.String" to be applied to an array, but > > that the value cannot be converted to an integer. > > > > Is there some sort of way I can use "items.length" or "items.size" or > > something similar? More importantly, WHERE IS THIS DOCUMENTED? > > > > I have searched the Internet for decent documents on JSTL and cannot > > find a simple complete guide to tag usage -- something similar to what > > Struts has for its tags. For example, where is a document that > > explains what you can do with "var", "varStatus", "items", etc. on a > > c:forEach tag, and covers all the tags? The Sun web services tutorial > > does not do this, it only gives examples. > > > > Thank you, > > Erik > > > > > > > > Erik Weber wrote: > > > >> Thanks again. > >> Erik > >> > >> Kris Schneider wrote: > >> > >>> <c:forEach> supports a "varStatus" attribute. The value of that > >>> atrribute is a > >>> String that names an instance of > >>> javax.servlet.jsp.jstl.core.LoopTagStatus. The > >>> LoopTagStatus instance has nested visibility so that it's only > >>> available within > >>> the enclosing <c:forEach> tag. LoopTagStatus exposes a number of > >>> properties, > >>> but the one you're probably interested in is "index": > >>> > >>> .. > >>> <c:forEach var="bean" varStatus="status" items="${entry.value}"> > >>> <%-- ${status.index} is the current index --%> > >>> ... > >>> </c:forEach> > >>> .. > >>> > >>> Quoting Erik Weber <[EMAIL PROTECTED]>: > >>> > >>> > >>> > >>>> How can I refer to the index of the current iteration with > >>>> c:forEach (analogous to the indexId attribute to logic:iterate)? > >>>> > >>>> Thanks, > >>>> Erik > >>>> > >>>> > >>>> Kris Schneider wrote: > >>>> > >>>> > >>>>> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> > >>>>> > >>>>> <c:forEach var="entry" items="${map}"> > >>>>> <%-- ${entry.key} is the current key --%> > >>>>> <%-- ${entry.value} is the associated bean array --%> > >>>>> <c:forEach var="bean" items="${entry.value}"> > >>>>> ... > >>>>> </c:forEach> > >>>>> </c:forEach> > >>>>> > >>>>> Quoting Erik Weber <[EMAIL PROTECTED]>: > >>>>> > >>>>> > >>>>> > >>>>> > >>>>>> I could use some Struts-EL/JSTL tag help, please. > >>>>>> > >>>>>> I have a Map with each entry having a String as the key and a > >>>>>> bean array as the value. > >>>>>> > >>>>>> I need two iterations, one nested inside the other. > >>>>>> > >>>>>> For the outer iteration, I want to iterate the keySet of the Map. > >>>>>> I don't know what the keys are going to be or how many there will > >>>>>> be. > >>>>>> > >>>>>> Within that iteration, for each key in the keySet, I need to > >>>>>> iterate over the buckets of the array that is the value for that > >>>>>> key. > >>>>>> > >>>>>> To make this more clear, let's say I will produce a table of > >>>>>> tables, somewhat like this: > >>>>>> > >>>>>> <table> > >>>>>> > >>>>>> <!-- start outer iteration here; iterate over the keySet of the > >>>>>> Map --> > >>>>>> > >>>>>> <!-- Map key #0 --> > >>>>>> > >>>>>> <tr> > >>>>>> > >>>>>> <td> > >>>>>> > >>>>>> <table> > >>>>>> > >>>>>> <!-- start inner iteration #1 here; iterate over the Object[] that > >>>>>> > >>>> is > >>>> > >>>>>> the value for key #1 in the Map --> > >>>>>> > >>>>>> <!-- Object[bucket #0] --> > >>>>>> > >>>>>> <tr> > >>>>>> > >>>>>> <td><!-- Object[bucket #0].property A --></td> > >>>>>> > >>>>>> <td><!-- Object[bucket #0].property B --></td> > >>>>>> > >>>>>> </tr> > >>>>>> > >>>>>> <!-- end Object[bucket #0] --> > >>>>>> > >>>>>> <!-- Object[bucket #1] --> > >>>>>> > >>>>>> <tr> > >>>>>> > >>>>>> <td><!-- Object[bucket #1].property A --></td> > >>>>>> > >>>>>> <td><!-- Object[bucket #1].property B --></td> > >>>>>> > >>>>>> </tr> > >>>>>> > >>>>>> <!-- end Object[bucket #1] --> > >>>>>> > >>>>>> </table> > >>>>>> > >>>>>> </td> > >>>>>> > >>>>>> </tr> > >>>>>> > >>>>>> <!-- end Map key #0 --> > >>>>>> > >>>>>> <!-- Map key #1 --> > >>>>>> > >>>>>> <tr> > >>>>>> > >>>>>> <td> > >>>>>> > >>>>>> <table> > >>>>>> > >>>>>> <!-- start inner iteration #2 here; iterate over the Object[] that > >>>>>> > >>>> is > >>>> > >>>>>> the value for key #2 in the Map --> > >>>>>> > >>>>>> <!-- Object[bucket #0] --> > >>>>>> > >>>>>> <tr> > >>>>>> > >>>>>> <td><!-- Object[bucket #0].property A --></td> > >>>>>> > >>>>>> <td><!-- Object[bucket #0].property B --></td> > >>>>>> > >>>>>> </tr> > >>>>>> > >>>>>> <!-- end Object[bucket #0] --> > >>>>>> > >>>>>> <!-- Object[bucket #1] --> > >>>>>> > >>>>>> <tr> > >>>>>> > >>>>>> <td><!-- Object[bucket #1].property A --></td> > >>>>>> > >>>>>> <td><!-- Object[bucket #1].property B --></td> > >>>>>> > >>>>>> </tr> > >>>>>> > >>>>>> <!-- end Object[bucket #1] --> > >>>>>> > >>>>>> </table> > >>>>>> > >>>>>> </td> > >>>>>> > >>>>>> </tr> > >>>>>> > >>>>>> <!-- end Map key #1 --> > >>>>>> > >>>>>> <!-- end outer iteration --> > >>>>>> > >>>>>> </table> > >>>>>> > >>>>>> > >>>>>> Could someone show me some skeleton JSTL or Struts-el code? > >>>>>> > >>>>>> I would appreciate it very much, > >>>>>> Erik -- Kris Schneider <mailto:[EMAIL PROTECTED]> D.O.Tech <http://www.dotech.com/> --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]