Have you tried using ListUtils.lazyList() for this? I just tried it on a sample app and it works in cases like this.
- Hubert On Thu, 02 Sep 2004 14:27:32 -0400, 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] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]