JSTL <c:forEach> tag problems.

I am having problems with tag in my application.  Firstly in my action class (struts BTW) i call a function that returns a list of Entry objects from a  DB

   request.setAttribute("entries", entries);

On the next JSP page i am doing this

            <c:forEach var="ent" items="${entries}" varStatus="status">
                <c:choose>
                    <c:when test="${status.count % 2 != 0}">
                        <tr class="oddRow">
                    </c:when>
                    <c:otherwise>
                        <tr class="evenRow">
                    </c:otherwise>
                </c:choose>
                    <td>
                        <c:url value="goToUpdateForm" var ="url">
                            <c:param name="id" value="${ent.teamId}"/>
                            <c:param name="dispatch" value="goToUpdateForm"/>
                       </c:url>
                       <a href ='<c:out value="${url}"/>'><c:out value="${ent.teamId}"/></a>
                    </td>
                    <td><c:out value="${ent.eventClass}"/></td>
                    <td><c:out value="${ent.nameOne}"/></td>
                    <td><c:out value="${ent.nameTwo}"/></td>
                    <td><c:out value="${ent.location}"/></td>
               </tr>
            </c:forEach>

But this will not run properly and i end up getting the error

   Unable to find a value for "teamId" in object of class "java.lang.String" using operator "."

I know that the c:forEach is treating this list as a list of strings and therefore failing but i can't seem to find out how to how to tell my app to treat this as a list of entries.

Any ideas?

Regards

James
phuzzyAsked:
Who is Participating?
 
bloodredsunConnect With a Mentor Commented:
Make sure that you have a method in Entry called getTeamId() for this to work.

here's a proof of concept that may help you:

JSTL_list.jsp
-----------------------------
<%@ page import="java.util.*, com.bloodredsun.examples.Person" %>
<%@ taglib uri='http://java.sun.com/jstl/core' prefix='c' %>
<html>
<head><title>JSTL c:forEach example</title></head>
<body>
<%

ArrayList arrList = new ArrayList() ;
arrList.add( new Person("friend" , 30) ) ;
arrList.add( new Person("enemy" , 34) ) ;
arrList.add( new Person("mother" , 50) ) ;
arrList.add( new Person("father" , 55) ) ;

request.setAttribute("myList", arrList );

%>

<c:forEach var='alItem' items='${requestScope.myList}' varStatus='status'>
      Status:<c:out value='${alItem.status}' />
      Age:<c:out value='${alItem.age}' />
      Count: <c:out value='${status.count}'/>
      <br />
</c:forEach>


Person.java
--------------------------
package com.bloodredsun.examples;

import java.util.HashMap;

public class Person {
      
      public Person(String string) {
      }

      public Person(){}
      
      public Person(String pStatus, int pAge){
            setStatus( pStatus ) ;
            setAge( pAge ) ;
      }
      
      private String status ;
      private int age ;

      public String getStatus() {
            return status;
      }

      public void setStatus(String pStatus) {
            status = pStatus;
      }

      public int getAge() {
            return age;
      }

      public void setAge(int pAge) {
            age = pAge;
      }
}


----------
This outputs
----------
 Status:friend Age:30 Count: 1
Status:enemy Age:34 Count: 2
Status:mother Age:50 Count: 3
Status:father Age:55 Count: 4


as it successfully iterates over the ArrayList.
0
 
bloodredsunCommented:
If you've set the object in the request scope you'll need to call  

<c:forEach var="ent" items="${requestScope.entries}" varStatus="status">

else you are calling it from the pageContext...
0
 
phuzzyAuthor Commented:
Nope that didn't make a difference, still getting the same error.

The thing is it's finding the list but treating it as a list of strings and therefore printing out the pointer information to the objects.
0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
suprapto45Commented:
Hi James,

Are you sure that you are passing the right type of class? It seems that you are passing a String instead of List or etc.

Regards
Dave
0
 
suprapto45Commented:
Hi James,

Please post how do you query your "entries" in your java class.

Regards
Dave
0
 
phuzzyAuthor Commented:
Sorry for the delay on this.  I have been away for the weekend.

By "query" do you mean how i get it from the DB?  If so i somply call my Marathon Service whihc uses iBatis that returns a list of entry objects.  I can access and manipulate this list through other methods but i can't access it via this JSP page.

Is that enough info. I can post more source when i return to work tomorrow.

James
0
 
phuzzyAuthor Commented:
It is definaltey a list of entry objects as I also used a custom tag that calls the Entry Service and outputs the list which works fine.
0
 
phuzzyAuthor Commented:
Hi,

Just tried replacing c:forEach with a logic:iterate and got a similar error,

javax.servlet.jsp.JspException: Cannot find bean [com.mourne2day.Entry@a56214, com.mourne2day.Entry@1ca1588, com.mourne2day.Entry@4bb369] in any scope.

Hope this helps.
0
All Courses

From novice to tech pro — start learning today.