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]