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]

Reply via email to