Kris, once again you have helped me get my work done. bean:size did the trick. I was looking over and over again for a JSTL tag or expression to do this; I probably never would have thought of bean:size.

To complete the post for any other reader who is as suicidal as I am after trying to figure this out:

<c:forEach items="myMap" var="currentEntry"><!-- where Map has String keys and array or List values -->
<bean-el:size collection="${currentEntry.value}" id="size"/><!-- page scope variable "size" (of type java.lang.Integer) will now contain the size of the array or list associated with the current Map key -->
. . .
<c:when test="${size > 5}"><!-- how to test how big the current array or List is -->
. . .
<c:forEach items="currentEntry.value" var="currentItemInArrayOrList" varStatus="iteratorStatus"><!--- how to iterate the current array or List -->
. . .
<c:out value="${currentItemInArrayOrList.someProperty}"/><!-- how to print some property of the current item in the current array or List -->
. . .
<c:when test="${iteratorStatus.index % 2 == 0}"><!-- how to tell if you are on an even-numbered row in your iteration -->


and so on . . .


Thank you, Erik

P.S. I would love to know how you learned all this (I suppose I must buy a JSTL book).

Erik


Kris Schneider wrote:

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






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



Reply via email to