Hi

I am trying to output the contents of a set of nested Objects in a JSP
page using the <nested> taglib.

I have three objects that are persisted using Hibernate:

1. Student - (contains a HashSet of Project called 'projects')
2. Project - (contains a HashSet of Url called 'urls')
3. Url - (contains a string)

The Hibernate persistance seems to require the use of HashSets for
sub-objects to work.  I have tried using an ArrayList, but get Hibernate
errors.

I set a student bean in session scope in my action and then pass control
to the jsp.  The jsp looks something like:

<nested:root name="adamh">
  <nested:iterate id="element1" property="projects">

    <tr>
      <td>
        Name:
      </td>
      <td>
        <nested:write name="element1" property="name"/>
      </td>
    </tr>

    <tr>
      <td>
        Query:
      </td>
      <td>
        <nested:write name="element1" property="query"/>
      </td>
    </tr>

  </nested:iterate>
</nested:root>


When I run the above jsp code, it works fine and prints the name and query string of the project below the student details. However when I add the second level of iteration like this:


<nested:root name="adamh">

  <nested:iterate id="element1" property="projects">

    <tr>
      <td>
        Name:
      </td>
      <td>
        <nested:write name="element1" property="name"/>
      </td>
    </tr>

    <tr>
      <td>
        Query:
      </td>
      <td>
        <nested:write name="element1" property="query"/>
      </td>
    </tr>

    <nested:iterate name="element2" property="urls">
      <tr>
        <td>
          <nested:write name="element2" property="url"/>
        </td>
      </tr>
    </nested:iterate>

  </nested:iterate>
</nested:root>


I get the following error:

javax.servlet.ServletException: Cannot find bean element2 in any scope

This makes sense (sort of), but leaves me with little clue as to what I
should be doing instead.  All of the examples that I can find of using
the <nested:iterate> tag say that I should use the form:

COMPANY: <html:text property="companyName"/>
<nested:iterate property="departments">
    Department: <nested:text property="deptName"/>
        <nested:iterate property="employees">
            Employee: <nested:text property="empName"/>
            E-mail: <nested:text property="email"/>
        </nested:iterate>
</nested:iterate>

(this from the Struttin' with Struts tutorial -
http://www.reumann.net/struts/nested.do)

However my reading of the iterate taglib docs say that with a HashTable
I must use the id="something" property="object property" form.  As
mentioned, that works fine for one level of nesting, but not multiple
levels.

Any suggestions as to how I should be modifying my JSP?  Keeping in mind
that Hibernate appears to limit me to using a HashMap to store my nested
objects.  I expect that there is a simple answer, but can't for the life
of me find it.

I am using Struts 1.1 with Tomcat 4.0.6 / 4.1 on Win2k

Full listing of relevent files below.

Any assistance greatly appreciated.

Regards,
Langdon
---------------------


-- Student.java -- package adamh;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

/**
 * Created by IntelliJ IDEA.
 * Student: langdons
 * Date: 12/08/2004
 * Time: 18:58:49
 * To change this template use Options | File Templates.
 */

public class Student implements Serializable {
    private String id;
    private String parentId;
    private String emailAddress;
    private String password;
    private String nickname;
    private String yearOfBirth;
    private String country;
    private String state;
    private String gender;
    private java.util.Date firstContact;
    private String referredById;
    private String agreeToRules;
    private User user;
    private Role role;
    private Set projects = new HashSet();


public String getId() { return id; }

    public void setId(String string) {
         id = string;
    }


public String getParentId() { return parentId; }

    public void setParentId(String string) {
         parentId = string;
    }


public String getEmailAddress() { return emailAddress; }

    public void setEmailAddress(String string) {
         emailAddress = string;
    }


public String getPassword() { return password; }

    public void setPassword(String string) {
         password = string;
    }


public String getNickname() { return nickname; }

    public void setNickname(String string) {
         nickname = string;
    }


public String getyearOfBirth() { return yearOfBirth; }

    public void setYearOfBirth(String string) {
         yearOfBirth = string;
    }


public String getCountry() { return country; }

    public void setCountry(String string) {
         country = string;
    }


public String getState() { return state; }

    public void setState(String string) {
         state = string;
    }


public String getGender() { return gender; }

    public void setGender(String string) {
        gender = string;
    }


public Date getFirstContact() { return firstContact; }

    public void setFirstContact(Date date) {
        firstContact = date;
    }


public String getReferredById() { return referredById; }

    public void setReferredById(String string) {
        referredById = string;
    }


public String getAgreeToRules() { return agreeToRules; }

    public void setAgreeToRules(String string) {
        agreeToRules = string;
    }


public User getUser() { return user; }

    public void setUser(User user) {
        this.user = user;
    }


public Role getRole() { return role; }

    public void setRole(Role role) {
        this.role = role;
    }


public Set getProjects() { return this.projects; }

    public void setProjects(Set project) {
        this.projects = project;
    }

    public void addProject(Project project) {
        project.setStudent(this);
        projects.add(project);
    }

}

-- Project.java --

package adamh;

import java.util.Set;
import java.util.HashSet;

/**
 * Created by IntelliJ IDEA.
 * User: langdons
 * Date: 7/10/2004
 * Time: 20:39:14
 * To change this template use Options | File Templates.
 */
public class Project {

    private String id;
    private String student_id;
    private String name;
    private String query;
    private Student student;
    private Set urls = new HashSet();


public String getId() { return id; }

    public void setId(String string) {
        id = string;
    }


public String getStudent_id() { return student_id; }

    public void setStudent_id(String string) {
        student_id = string;
    }


public String getName() { return name; }

    public void setName (String string) {
        name = string;
    }


public String getQuery () { return query; }

    public void setQuery (String string) {
        query = string;
    }


public void setStudent(Student student){ this.student = student; }

    public Student getStudent() {
        return student;
    }


public Set getUrls() { return urls; }

    public void setUrls(Set set) {
        this.urls = set;
    }

    public void addUrls(Url url){
        url.getProjects().add(url);
        urls.add(url);
    }
}


-- Url.java --

package adamh;

import java.util.Set;
import java.util.HashSet;

/**
 * Created by IntelliJ IDEA.
 * User: langdons
 * Date: 7/10/2004
 * Time: 21:13:35
 * To change this template use Options | File Templates.
 */

public class Url {

    private String id;
    private String url;
    private Set projects = new HashSet();

    public String getId() {
        return id;
    }

    public void setId(String string) {
        id = string;
    }


public String getUrl() { return url; }

    public void setUrl (String string) {
        url = string;
    }


public Set getProjects () { return this.projects; }

    public void setProjects (Set set) {
        this.projects = set;
    }
}

-- home.jsp --

<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-nested" prefix="nested"%>

<html>
<head>
<title><bean:message key="studentHomePage.pageTitle" /></title>

</head>
<body>
<h1><bean:message key="studentHomePage.pageHeader" /></h1>

        <table>

        <tr>
            <td colspan=2>
                <html:messages id="message" message="true">
                    <%= message %>
                </html:messages>
            </td>
        </tr>


<tr> <td> <bean:message key="studentRegistrationWizard.referredById" />: </td> <td> <bean:write name="adamh" property="referredById" /> </td> </tr> <tr> <td> <bean:message key="studentRegistrationWizard.emailAddress" />: </td> <td> <bean:write name="adamh" property="emailAddress" /> </td> </tr> <tr> <td> <bean:message key="studentRegistrationWizard.password" />: </td> <td> <bean:write name="adamh" property="password" /> </td> </tr> <tr> <td> <bean:message key="studentRegistrationWizard.nickname" />: </td> <td> <bean:write name="adamh" property="nickname" /> </td> </tr> <tr> <td> <bean:message key="studentRegistrationWizard.yearOfBirth"/> </td> <td> <bean:write name="adamh" property="yearOfBirth" /> </td> </tr> <tr> <td> <bean:message key="studentRegistrationWizard.country"/> </td> <td> <bean:write name="adamh" property="country" /> </td> </tr> <tr> <td> <bean:message key="studentRegistrationWizard.state"/> </td> <td> <bean:write name="adamh" property="state" /> </td> </tr> <tr> <td> <bean:message key="studentRegistrationWizard.gender"/> </td> <td> <bean:write name="adamh" property="gender" /> </td> </tr> <tr> <td> Projects: </td> </tr>


<nested:root name="adamh"> <nested:iterate id="element1" property="projects"> <tr> <td> Name: </td> <td> <nested:write name="element1" property="name"/> </td> </tr> <tr> <td> Query: </td> <td> <nested:write name="element1" property="query"/> </td> </tr>

                    <nested:iterate name="element2" property="urls">
                        <tr>
                            <td>
                                <nested:write name="element2"
property="url"/>
                            </td>
                        </tr>
                    </nested:iterate>

                    <tr>
                        <td colspan="2">
                            <hr>
                        </td>
                    </tr>
            </nested:iterate>
        </nested:root>


</table> </body>



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



Reply via email to