Nicholas,

I use DynaActionValidatorForm almost exclusively in my application.
I have successfully used IndexedProperties for structures that are dynamic
using LazyLists.

For me, when ever I have to do this, I always have to think about how Struts
handles the sequence of events in a request and submission.

What I do is subclass DynaActionValidatorForm and override the reset().
The reset() gets called before the action is executed.

For example:

/**
 * Reset all bean properties to their default state.  This method is
 * called before the properties are repopulated by the controller servlet.
 * <p>
 * The default implementation uses the initial value specified in the
 * FormPropertyConfig element for each property.
 *
 * @param mapping The mapping used to select this instance
 * @param request The servlet request we are processing
 */
 public void reset(ActionMapping mapping, HttpServletRequest request) {

    super.reset(mapping, request);


    /*
     * We have to create lazy lists for selected items
     * because we don't know which items will index
     * into the collection. A lazy list will create
     * the appropriate item at a specified index if it
     * doesn't exist there.
     */
     List selectedItems = ListUtils
                .lazyList(new ArrayList(), new SelectedItemFactory());

    this.set("selectedItems", selectedItems);

    // other stuff here if necessary
}


My XXXXFactory classes are usually inner classes to the subclassed
Dyna*Form.

For example:

/**
 * <code>SelectedItemFactory</code> is used in the form
 * to create a lazy list that will lazily create selected items.
 *
 * @author Robert Taylor
 * @author last modified  $Author: rtaylor $
 * @version $Revision: 1.8 $ $Date: 2003/11/17 13:58:51 $
 * @see org.apache.commons.ListUtils
 */
class SelectedItemFactory implements Factory {

    /**
     * Create a new instance of the specified object
     */
    public Object create() {

        return new SelectedItemVO();
    }

}


As long as the input fields which are added to the client have the correct
syntax
for indexing into your form (formName.selectedItems[0].fieldName) then
Struts should
handle the rest.

Does that help at all?

robert



> -----Original Message-----
> From: Nicholas L Mohler [mailto:[EMAIL PROTECTED]
> Sent: Thursday, December 11, 2003 7:46 AM
> To: Struts Users Mailing List
> Subject: Re: dynamically sized form (mostly solved)
>
>
>
>
>
>
>
> Ted,
>
> The origin of this thread had to do with using Indexed Properties and a
> Dyna* form.  As when using the ActionForm, getting the values to the
> browser is not an issue.  The area where the difficulty arises is when the
> values are returned from the browser.
>
> When using the ActionForm  (or subclass), this is neatly handled by
> implementing the LazyList (or similar functionality) or by making the form
> have session scope.  Note that the session scope solution fails if the
> end-user can add new entries to the list without a call to the server.  In
> the app I work on, we use javascript to add and remove list
> elements, so we
> use LazyList functionality.
>
> The problem is when the Dyna* type forms are used.  How do the indexed
> properties get back into the form when the page is submitted.  Similar to
> ActionForm based implementations, the form can have session
> scope, but this
> also fails if the user can add new entries to the list without a server
> call.  It isn't obvoius how one would implement LazyList type
> functionality
> in a dyna form.
>
> I have seen the suggestions for map-backed forms, but I don't see how this
> would help for the indexed properties...how it would be different
> from just
> grabbing the indexed properties out of the request.
>
> Any thoughts on this?
> Nick
>
>
>
>
>
>
>                       Ted Husted
>
>                       <[EMAIL PROTECTED]        To:       Struts
> Users Mailing List <[EMAIL PROTECTED]>
>                       g>                       cc:
>
>                                                Subject:  Re:
> dynamically sized form (mostly solved)
                      12/11/2003 07:03
>                       AM
>
>                       Please respond to
>
>                       "Struts Users
>
>                       Mailing List"
>
>
>
>
>
>
>
>
>
> I've lost track of the underlying use case for this thread, but if it's
> about populating input options on a form, you might consider using a
> second object for storing these types of options. For a time, some of us
> were starting to use the ActionForm to represent the input options along
> with the input values. This notion had more to do with code maintenance
> than architecture. At this point, I would suggest using finely-grained
> DynaActionForms to represent only the input required by an action. All
> other constructs, like arraylists for select boxes and so forth, can be
> put on a second "chrome" bean. A distinct advantage here is that you can
> scope the chrome bean as appropriate. A global default can live in
> applidcation scope, and other can live in session or request scope, as
> appropriate to a request.
>
> HTH, Ted.
>
> Andy Schmidgall wrote:
> > Does this mean it's impossible to do through request scope? I am
> > attempting to do this, and it would be nice to know if my work is in
> > vain :)
> >
> > -Andy
> >
> > -----Original Message-----
> > From: Yee, Richard K,,DMDCWEST [mailto:[EMAIL PROTECTED]
> > Sent: Wednesday, December 10, 2003 3:20 PM
> > To: 'Struts Users Mailing List'
> > Subject: RE: dynamically sized form (mostly solved)
> >
> >
> > I thought it worked, but it didn't.
> >
> > -Richard
> >
> > -----Original Message-----
> > From: Nifty Music [mailto:[EMAIL PROTECTED]
> > Sent: Wednesday, December 10, 2003 1:02 PM
> > To: [EMAIL PROTECTED]
> > Subject: RE: dynamically sized form (mostly solved)
> >
> >
> > Nicholas,
> >
> > What you said definitely makes sense to me.  Richard graciously replied
> > off-list with a similar response.  I remember reading documentation
> > which stated that when using dynamic arrays with DynaForms, it is
> > necessary to place the DynaForm in session scope.  However, I 'm almost
> > positive that someone (Matt? Mark?) mentioned on this list that they
> > were able to pass an ArrayList through a DynaForm in request scope.  For
> > a variety of reasons, I'm not too eager to put the entire formbean in
> > the session for the sake of propogating one ArrayList attribute.  If
> > Matt or Mark or anyone else has some insights to share regarding how
> > they were able to get this to work in request scope, I'd be very
> > grateful to hear.
> >
> > Thanks again,
> >
> > Brent
> >
> >
> > ---------------------------------------------------------------------
> > 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]
>
>
>
>
>
>
> ---------------------------------------------------------------------
> 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]

Reply via email to