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/>

-- 
Kris Schneider <mailto:[EMAIL PROTECTED]>
D.O.Tech       <http://www.dotech.com/>

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

Reply via email to