hi Rick,

have you tried defining the following in your ActionForm? (assuming
your collection has MyFooBar objects):

public MyFooBar getAccessDefinitions(int i)
{
  if(null == accessDefinitions)
    accessDefinitions = new ArrayList();
  while(i >= accessDefinitions.size())
    ((ArrayList)accessDefinitions).add(new MyFooBar())

  return (MyFooBar) ((ArrayList)accessDefinitions).get(i);
}

can this help you to populate form data onto your ActionForm
collection?

woodchuck


--- Rick Reumann <[EMAIL PROTECTED]> wrote:

> One of the most frustrating things I run into when developing Struts 
> applications is the problem of when you want to use a request scoped 
> ActionForm but you need to populate a collection that is one of your 
> ActionForm properties. The problem is the classic index out of bounds
> 
> exception if you do not have your collection populated with enough
> objects.
> 
> For example imagine the case where you might want to edit a bunch of 
> Access definitions on one form.
> 
> So in an ActionForm property you have:
> 
> Collection accessDefinitions;
> 
> In your Action before you get to the form you populate your form:
> 
> ((AccessForm)form).setAccessDefinitions( aCollectionOfDefs );
> 
> Your JSP then displays the access definition properties for the user
> to 
> edit:
> 
> (condensed and table formatting removed:)
> 
> <c:forEach items="${accessForm.accessDefinitions}" var="access" 
> varStatus="status">
>    <html:text property="accessDefinitions[${status.index}].name"/>
>    <html:text
> property="accessDefinitions[${status.index}].description"/>
> </c:forEach>
> 
> Now the problem will be when you submit this form. If this form was 
> given request scope in the action mapping, you'll end up with errors 
> since BeanUtils can not populate the Collection. You need to have the
> 
> correct size in place for 'accessDefinitions' to allow for
> population.
> 
> There are several solutions that have been proposed by searching the 
> list archives.
> 
> The easiest alternative is of course to just put your form in Session
> 
> scope, but that is such a waste in my opinion.
> 
> Another approach would be something like:
> 
> In reset() of ActionForm:
> 
> public void reset(ActionMapping actionMapping, HttpServletRequest
> request) {
>      if ( request.getParameter("accessDefinitionsSize") != null ) {
>          int accessDefinitionsSize = new 
> Integer(request.getParameter("accessDefinitionsSize")).intValue();
>          accessDefinitions = new ArrayList(accessDefinitionsSize);
>          for (int i=0;i<accessDefinitionsSize;i++) {
>              accessDefinitions.add(new AccessDefinitionVO());
>          }
>      }
> }
> 
> Then in your JSP (code snipped just showing releveant portion):
> 
> <c:forEach items="${accessForm.accessDefinitions}" var="access" 
> varStatus="status">
>    ....
>    <c:set var="accessDefinitionsSize" value="${status.count}"/>
> </c:forEach>
> <input type="hidden" name="accessDefinitionsSize" 
> value="${accessDefinitionsSize}"/>
> 
> The above works 'ok' but it's so much extra code. I've thought of
> just 
> adding the accessDefinitionsSize attribute to the Session in the
> Action 
> that is called right be the form is set up. Then the reset method can
> 
> pull it right from there. An int in the session won't be too much 
> overhead. But I'm not sure if I like that approach that much either 
> (although I'm leaning towards just doing it that way).
> 
> Of course I don't like the approaches that call a business class from
> 
> the reset to get the size.
> 
> Any suggestions welcome.
> 
> -- 
> Rick
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 



                
_______________________________
Do you Yahoo!?
Win 1 of 4,000 free domain names from Yahoo! Enter now.
http://promotions.yahoo.com/goldrush

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

Reply via email to