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]