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]