A few comments: 1. I got runtime errors when I declared a DynaActionForm bean of type Map; I had to declare it of type HashMap.
2. You may be using JSTL, but it still looks like scripting to me..... 3. Strictly speaking, JavaBeans do not contain a constructor and implement Serializable. Mark -----Original Message----- From: Rick Reumann [mailto:[EMAIL PROTECTED] Sent: Tuesday, July 15, 2003 11:44 PM To: Struts Users Mailing List Subject: [OT] Re: 4th Of July Struts Challenge... Kris... this was just awesome! Thanks. You da 'man:) On Tue, Jul 15,'03 (11:25 AM GMT-0400), Kris wrote: > As it turns out, some of my ideas about a "standard" property of type > Map versus a "mapped property" were a bit off. So, if you're still > interested, here's something I hacked together. You'll notice I used a > session scoped form so that Struts doesn't choke when it tries to > populate the form. > > struts-config.xml: > ------------------ > > <form-beans> > <form-bean name="employeesForm" > type="org.apache.struts.action.DynaActionForm"> > <form-property name="employeesMap" type="java.util.Map"/> > </form-bean> > </form-beans> > > <action-mappings> > <action path="/employees/edit" > type="com.dotech.EditEmployeesAction" > name="employeesForm" > scope="session" > validate="false"> > <forward name="success" path="/editEmployees.jsp"/> > </action> > <action path="/employees/save" > type="org.apache.struts.actions.ForwardAction" > parameter="/viewEmployees.jsp" > name="employeesForm" > scope="session" > validate="false"/> > </action-mappings> > > > editEmployees.jsp: > ------------------ > > <%@ taglib prefix="bean" > uri="http://jakarta.apache.org/struts/tags-bean" %><%@ taglib > prefix="c" uri="http://java.sun.com/jstl/core" %><%@ taglib > prefix="html" uri="http://jakarta.apache.org/struts/tags-html" %> > > <%-- dynamically get a handle to the form --%> > <bean:struts id="mapping" mapping="/employees/save"/> > <c:set var="attribute" value="${mapping.attribute}"/> > <c:set var="scope" value="${mapping.scope}"/> > <c:choose> > <c:when test="${scope eq 'request'}"> > <c:set var="form" value="${requestScope[attribute]}"/> > </c:when> > <c:otherwise> > <c:set var="form" value="${sessionScope[attribute]}"/> > </c:otherwise> > </c:choose> > > <html> > > <head><title>Edit Employees</title></head> > > <body> > <html:form action="/employees/save"> > <table> > <c:forEach var="entry" items="${form.map.employeesMap}"> > <tr> > <td><c:out value="${entry.key}"/></td> > <td> > <input type="text" > name="<c:out > value="employeesMap(${entry.key}).name"/>" > value="<c:out value="${entry.value.name}"/>"> > </td> > <td> > <input type="text" > name="<c:out > value="employeesMap(${entry.key}).age"/>" > value="<c:out value="${entry.value.age}"/>"> > </td> > </tr> > </c:forEach> > <tr> > <td align="center" colspan="3"><html:submit/></td> > </tr> > </table> > </html:form> > </body> > > </html> > > > EmployeeBean.java: > ------------------ > > package com.dotech; > > public class EmployeeBean { > > private String name; > private String age; > > public EmployeeBean(String name, String age) { > this.name = name; > this.age = age; > } > > public String getName() { return this.name; } > public void setName(String name) { this.name = name; } > > public String getAge() { return this.age; } > public void setAge(String age) { this.age = age; } > } > > > EditEmployeesAction.java: > ------------------------- > > package com.dotech; > > import java.util.*; > import javax.servlet.http.*; > import org.apache.commons.beanutils.*; > import org.apache.struts.action.*; > > public class EditEmployeesAction extends Action { > > public ActionForward execute(ActionMapping mapping, > ActionForm form, > HttpServletRequest request, > HttpServletResponse response) throws > Exception { > Map empMap = new HashMap(); > empMap.put("1111", new EmployeeBean("John Doe", "33")); > empMap.put("2222", new EmployeeBean("Loser Boy", "22")); > PropertyUtils.setProperty(form, "employeesMap", empMap); > return mapping.findForward("success"); > } > } > > > viewEmployees.jsp: > ------------------ > > <%@ taglib prefix="bean" > uri="http://jakarta.apache.org/struts/tags-bean" %><%@ taglib > prefix="c" uri="http://java.sun.com/jstl/core" %> > > <%-- dynamically get a handle to the form --%> > <bean:struts id="mapping" mapping="/employees/save"/> > <c:set var="attribute" value="${mapping.attribute}"/> > <c:set var="scope" value="${mapping.scope}"/> > <c:choose> > <c:when test="${scope eq 'request'}"> > <c:set var="form" value="${requestScope[attribute]}"/> > </c:when> > <c:otherwise> > <c:set var="form" value="${sessionScope[attribute]}"/> > </c:otherwise> > </c:choose> > > <html> > > <head><title>View Employees</title></head> > > <body> > <table> > <c:forEach var="entry" items="${form.map.employeesMap}"> > <tr> > <td><c:out value="${entry.key}"/></td> > <td><c:out value="${entry.value.name}"/></td> > <td><c:out value="${entry.value.age}"/></td> > </tr> > </c:forEach> > </table> > </body> > > </html> > > Quoting Kris Schneider <[EMAIL PROTECTED]>: > > > Okay, so that's way too much work ;-). I'm not sure, but I think one > > of the issues you're running into is the difference between a > > "standard" property of type Map and a "mapped property". The first > > is declared like: > > > > public Map getEmployeesMap() > > public void setEmployeesMap(Map m) > > > > The second is declared like: > > > > public Object getEmployeeMapped(String key) > > public void setEmployeeMapped(String key, Object value) > > > > For a mapped property, you'd use a reference like > > "employeeMapped(1111)" to get the object stored under the "1111" > > key. I really haven't played much with either > > of the above cases, so I may be off base... > > > > Quoting Rick Reumann <[EMAIL PROTECTED]>: > > > > > Ok stupid subject line, but now I can get back to something I was > > > curious about that I posted around a week ago. I'm really curious > > > how to do accomplish this and yes have tried it a bunch of > > > different ways... > > > > > > Here's the challenge.... > > > > > > First challenge is just with a regular ActionForm... > > > > > > 1) Your ActionForm has to have a property of type Map. For this > > > adventure call it employeesMap. > > > > > > 2) Each map will hold for the key and employeeID ( String ssn - > > > social security number whatever). The value will be an > > > EmployeeBean. For testing sake just have it have two properties > > > String name, String age. > > > > > > 3) Put two employees into the Map and put this Map into your > > > ActionForm: HashMap empMap = new HashMap(); > > > empMap.put( "1111", new EmployeeBean("John Doe", "33" ) ); > > > empMap.put( "2222", new EmployeeBean("Loser Boy", "22" ) ); > > > setEmployeesMap( empMap ); > > > > > > 4) Now have a jsp form iterate over this Map and provide text > > > fields to edit the name and age of each employee. When the form is > > > submitted there should be a way that it will submit this Map with > > > updated EmployeeBeans with the new names and ages for each key > > > (1111 and 2222 ). Pull the map out of the action you submit to and > > > print the properties of the EmployeeBeans to test. > > > > > > > > > Second challenge... is do the above using your employeesMap as a > > > property of a DynaActionForm. > > > > > > Preferably use JSTL and/or struts-el also would be nice. > > > > > > (First one to successfully complete this challenge will win 100 > > > dollars for each person that they forward this e-mail to, as > > > Microsoft will be monitoring all the e-mails as well. That kid > > > doing this project for his science fair project to see how far > > > e-mails travel will also be involved, so please reply to him. The > > > 100 dollars will come from that African tribe leader with that > > > money he is just dying to give away if you just contact him. Some > > > of the money might come from the stolen tourist kidney sales in > > > Mexico, but I'm not positive of that). > > > > > > -- > > > Rick > > > > -- > > Kris Schneider <mailto:[EMAIL PROTECTED]> > > D.O.Tech <http://www.dotech.com/> > -- Rick --------------------------------------------------------------------- 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]