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]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]