We are having trouble solving the same problem of updating the fields for a
DynaActionForm's indexed properties.  We are running on Struts 1.1 beta2.
Should we be using the latest beta3 to get this to work? 
Our configuration basically follows that of James' below.
We defined a Bean named EditFormIndexPropertyBean, which will be the
elements of the DynaActionForm's array property
The form-bean is configured as:
<form-bean  name="categoryIndicesEditForm"
type="org.apache.struts.action.DynaActionForm">
        <form-property name="categoryIndex"
type="com.cgc.approve.struts.beans.EditFormIndexPropertyBean[]"
         size="10"/> 
</form-bean>

The form's iteration in the JSP look like:
<logic:iterate id="categoryIndex" name="categoryIndicesEditForm"
property="categoryIndex"
type="com.cgc.approve.struts.beans.EditFormIndexPropertyBean"
indexId="index">
   <logic:notEmpty name="categoryIndex" property="name">

    <td>                         
     <html:text name="categoryIndex" property="name" indexed="true"/>
    </td>
   </logic:notEmpty>
</logic:iterate>

Unlike James' example, we had to name the <form-property> 'name' attribute
the same as the <logic:iterate> 'property' attribute, in this case
"categoryIndex".  Otherwise the PropertyUtils could not find the DynaForm's
property by that name.

Here's what appears to be the problem:  The DynaForm's array property
'categoryIndex' is not being populated with the elements of our
EditFormIndexPropertyBean. The array property is instantiated with the
correct name, however it is empty. The DynaActionForm then attempts to set
the property with name=categoryIndex at index 0 with some value:

DynaActionForm.set(String name, int index, Object value) {

        DynaProperty descriptor = getDynaProperty(name);
        Object prop = dynaValues.get(name);
....}

This causes a null pointer exception as there are no dynaValues to retrieve
(no EditFormIndexPropertyBeans in the array property) .

We have used successfully indexed properties for DynaActionForms such as
String[] and Integer[] and other primitive type wrapper classes.  How can we
get our DynaActionForm to work use a property that consists of an array of
user defined classes?

A side question for any who might know.  When using a String[] property it
is not necessary to set the size attribute.  Is this needed for user defined
classes?

Thanks for any help,

Neil Carusetta
CGC 
 
       
*       From: James Turner 
*       Subject: RE: multi row / multi col input forms 
*       Date: Thu, 02 Jan 2003 15:44:18 -0800 

Here's one way to do it:

Let's say you want to be able to record the grades of some students
across a number of classes.

First define a Bean called StudentGrades:

Package example;

public StudentGrades {
   private String name, biology, chemistry, physics, english, math;

   public String getName () { return this.name; }
   public String getBiology () { return this.biology; }
   public String getChemisty () { return this.chemistry; }
   public String getPhysics () { return this.physics; }
   public String getEnglish () { return this.english; }
   public String getMath () { return this.math; }

   public void setName (String name) { this.name = name; }
   public void setBiology (String grade) { this.biology = grade; }
   public void setChemisty (String grade) { this.chemistry = grade; }
   public void setPhysics (String grade) { this.physics = grade; }
   public void setEnglish (String grade) { this.english = grade; }
   public void setMath (String grade) { this.math = grade; }
}

In your struts-config.xml, define:

<form-bean  name="studentGradeForm"
type="org.apache.struts.validator.DynaValidatorForm">
   <form-property name="grades" type="example.StudentGrades[]"
size="50">
</form-bean>

Then, presuming that your Action populates the StudentGrades array with
the student names, in your JSP, you'd say:

<html:form action="/some/action">
<TABLE><TR><TD>Name</TD><TD>Biology</TD><TD>Chemistry</TD><TD>Physics</T
D><TD>English</TD><TD>Math</TD></TR>
<logic:iterate id="student" name="studentGradeForm" property="grades"
type="example.StudentGrades">
<logic:notEmpty name="student" property="name">
<TR><TD><bean:write name="student" property="name" indexed="true"/></TD>
<TD><html:text name="student" property="biology" indexed="true"/></TD>
<TD><html:text name="student" property="chimstry" indexed="true"/></TD>
<TD><html:text name="student" property="physics" indexed="true"/></TD>
<TD><html:text name="student" property="english" indexed="true"/></TD>
<TD><html:text name="student" property="math" indexed="true"/></TD></TR>
</logic:notEmpty>
</logic:iterate>
</TABLE>

> -----Original Message-----
> From: Mike Ash [<mailto:[EMAIL PROTECTED]>] 
> Sent: Thursday, January 02, 2003 5:04 PM
> To: 'Struts Users Mailing List'
> Subject: RE: multi row / multi col input forms
> 
> 
> I understand what he is saying about setter methods perhaps I 
> am not explaining the problem correctly
> 
> The exact example is I am trying to display a listing of a 
> dynamic number of projects with hours assigned to them by day 
> for a given week, the user can then update any of those 
> fields to make changes, some of those fields may be blank 
> which means the browser will not send them to the server 
> which puts the rows / cols out of balance.
> 
> I am using the logic iterate tag to build a row which looks like
> 
> someText  someMoreText inputBox1 inputBox2 inputBox3 inputBox4
> 
> So for two rows I get
> 
> someText  someMoreText inputBox1 inputBox2 inputBox3 
> inputBox4 someText  someMoreText inputBox1 inputBox2 
> inputBox3 inputBox4
> 
> This means that from a vertical perspective the boxes have 
> the same name ( is there a better way to do the names?) If a 
> inputBox doesn't contain anything I can't tell which one it 
> really was except which column it "didn't" come from.
> 
> Clear as mud?
> 
> 


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

Reply via email to