Just a silly question. Where did ListUtils come from?? I can't find this in my JDK1.4.2.
Thanks ----- Original Message ----- From: "Hubert Rabago" <[EMAIL PROTECTED]> To: "Struts Users Mailing List" <[EMAIL PROTECTED]> Sent: Friday, September 03, 2004 7:40 AM Subject: Re: Not happy with approaches.. looking for better/other suggestions > 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] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]