<Sorry if this gets posted twice. Not sure if it sent properly earlier.>
Thanks a million, Robert! I got it 99% working the way you described. The object in the list (PhoneNumber) has an org.apache.struts.upload.FormFile property. When I go to the AddNewPhoneNumber.jsp I get: java.lang.NoClassDefFoundError: org/apache/struts/upload/FormFile I tried adding a <@page import%> to include org.apache.struts.upload.FormFile in the jsp, but that didn't help. If I remove the FormFile property from the bean/jsp everything works great. I don't understand how it can't find this class. It seems to find the Struts taglib classes fine, but not FormFile. The taglib classes and org.apache.struts.upload.FormFile are in the same jar. I really hate Classloader related problems. Any ideas? Thanks again for all your help. Nate Here is the stack trace: java.lang.NoClassDefFoundError: org/apache/struts/upload/FormFile at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:1647) at java.lang.Class.getDeclaredMethods(Class.java:1131) at java.beans.Introspector$1.run(Introspector.java:1126) at java.security.AccessController.doPrivileged(Native Method) at java.beans.Introspector.getPublicDeclaredMethods(Introspector.java:1124) at java.beans.Introspector.getTargetMethodInfo(Introspector.java:989) at java.beans.Introspector.getBeanInfo(Introspector.java:370) at java.beans.Introspector.getBeanInfo(Introspector.java:144) at org.apache.commons.beanutils.PropertyUtils.getPropertyDescriptors(PropertyUtils.java:949) at org.apache.commons.beanutils.PropertyUtils.getPropertyDescriptors(PropertyUtils.java:979) at org.apache.commons.beanutils.PropertyUtils.getPropertyDescriptor(PropertyUtils.java:887) at org.apache.commons.beanutils.PropertyUtils.getSimpleProperty(PropertyUtils.java:1172) at org.apache.commons.beanutils.PropertyUtils.getNestedProperty(PropertyUtils.java:772) at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:801) at org.apache.struts.util.RequestUtils.lookup(RequestUtils.java:952) at org.apache.struts.taglib.html.BaseFieldTag.doStartTag(BaseFieldTag.java:176) at org.apache.jsp.addimporteddlist_jsp._jspx_meth_html_text_0(addimporteddlist_jsp.java:690) at org.apache.jsp.addimporteddlist_jsp._jspService(addimporteddlist_jsp.java:279) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:137) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:210) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:360) at org.mortbay.jetty.servlet.WebApplicationHandler.dispatch(WebApplicationHandler.java:294) at org.mortbay.jetty.servlet.Dispatcher.dispatch(Dispatcher.java:192) at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:129) at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069) at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:455) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507) at javax.servlet.http.HttpServlet.service(HttpServlet.java:740) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:360) at org.mortbay.jetty.servlet.WebApplicationHandler.dispatch(WebApplicationHandler.java:294) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:558) at org.mortbay.http.HttpContext.handle(HttpContext.java:1714) at org.mortbay.jetty.servlet.WebApplicationContext.handle(WebApplicationContext.java:507) at org.mortbay.http.HttpContext.handle(HttpContext.java:1664) at org.mortbay.http.HttpServer.service(HttpServer.java:863) at org.jboss.jetty.Jetty.service(Jetty.java:460) at org.mortbay.http.HttpConnection.service(HttpConnection.java:775) at org.mortbay.http.HttpConnection.handleNext(HttpConnection.java:939) On Mon, 2003-09-08 at 15:09, Robert Taylor wrote: > Sorry Nate, I can't help you with updating your structures using the > nested taglib. I haven't done it before. Maybe someone else can provide > you some guidance there so that you don't have to jump through the > indexed properties "hoops". > > On the other hand, using indexed properties: > > Your form must have getPhoneNumbers(int index) and setPhoneNumbers(int > index) > methods. > > Ultimately you want the HTML syntax to be something like: > > <input type="text" name="phoneNumbers[2].countryCode" ..../> > <input type="text" name="phoneNumbers[2].areaCode" ..../> > <input type="text" name="phoneNumbers[2].number" ..../> > <input type="text" name="phoneNumbers[2].description" ..../> > > Where the index of 2 is the nth location for your new phone number. > You could pass 'n' as a request parameter when the user clicks on > the "Add New Phone Number" link. > > Since the nth location doesn't exist, the lazy list will create an empty > PhoneNumberBean object and add it to the list in the nth location anytime > when a get() or set() is invoked on a location that does not exist. > This is all in the documentation which I'm sure you've read by now. > > So one way to achieve the HTML syntax listed above, is something like > the following where 'n' is a request parameter named 'topLevelIndex': > > <%String prefix = "phoneNumbers[" + request.getParameter("topLevelIndex") + > "]";%> > <html:text property="<%=prefix + ".countryCode"%>"/> > <html:text property="<%=prefix + ".areaCode"%>"/> > <html:text property="<%=prefix + ".number"%>"/> > <html:text property="<%=prefix + ".description"%>"/> > > There are more slick ways to do this using JTSL or Struts-el but if you just > want to > get it working first, you can try the above. > > What should happen when your form is displayed is that the <html:text .../> > tag will > look up (finally delegating to PropertyUtils) the indexed properties and > attempt to get any existing value by invoking > the getPhoneNumbers{index). The List implementation provided by the lazy > list > will determine that no object exists at the specified location and it will > create an empty PhoneNumberBean object and populate the list and then > delegate to the > get(index) which will retrieve the empty bean property. This prevents the > dreaded > ArrayIndexOutOfBoundsException. > > When your form is submitted, Struts sets the appropriate PhoneNumberBean and > then you can > procede with your business logic. > > > Nate, I hope this makes sense. Sorry I couldn' help you with using nested > taglib to accomplish > this. I assume you have already looked here: > > http://www.keyboardmonkey.com/next/index.jsp > > robert > > > > -----Original Message----- > > From: Nate Drake [mailto:[EMAIL PROTECTED] > > Sent: Monday, September 08, 2003 1:14 PM > > To: [EMAIL PROTECTED] > > Subject: RE: Create new nested bean instance > > > > > > Ok, the thing I don't understand now is how to setup the > > AddNewPhoneNumber jsp so that is uses the lazy list to create a new > > PhoneNumber instance bean. > > > > I'm trying to use the nested taglib, but I don't really understand how > > to set the top level object to be a new instance out of the list. > > > > I've tried something like this: > > > > <nested:nest property="phoneNumbers"> > > <nested:text property="countryCode" /> > > <nested:text property="areadCode" /> > > <nested:text property="number" /> > > <nested:text property="description" /> > > </nested:nest> > > > > The thing I can't figure out is how you set the top-level object to be a > > new instance of the PhoneNumber bean (which should be created from the > > lazy list). I tried using <nested:nest property="phoneNumbers">, but > > that gives me an error stating "No getter for property > > phoneNumbers.countryCode of bean customerForm". I figure that is > > because the <nested:nest> sets the top-level object to be the List, and > > doesn't actually attempt to get an item out of the list (which would > > cause the lazy list factory to create a new PhoneNumber instance). > > > > How is this supposed to work? Am I on the right track at all? Anyone > > have a link to an example like what I'm trying to do? > > > > Thanks. > > > > Nate > > > > > > On Mon, 2003-09-08 at 11:41, Robert Taylor wrote: > > > Yep. You could create the new lazy list in the form reset(). > > > > > > robert > > > > > > > -----Original Message----- > > > > From: Nate Drake [mailto:[EMAIL PROTECTED] > > > > Sent: Monday, September 08, 2003 9:29 AM > > > > To: Struts Users Mailing List > > > > Subject: RE: Create new nested bean instance > > > > > > > > > > > > Robert, > > > > > > > > Thanks for the links. I already read the Indexed Property FAQ (and I > > > > just re-read it again), but I didn't really see anything in it that > > > > relates to my problem. > > > > > > > > The lazyList stuff looks more promising. I have a question about it, > > > > though. Where do I create the new LazyList? In the > > ActionForms reset() > > > > method? > > > > > > > > Thanks again. > > > > > > > > Nate > > > > > > > > On Mon, 2003-09-08 at 06:18, Robert Taylor wrote: > > > > > Nate, you may want to look into indexed properties: > > > > > http://jakarta.apache.org/struts/faqs/indexedprops.html > > > > > > > > > > and ListUtils.lazyList(): > > > > > > > > > http://jakarta.apache.org/commons/collections/api/org/apache/commo > > > > ns/collect > > > > > ions/ListUtils.html > > > > > > > > > > robert > > > > > > > > > > > -----Original Message----- > > > > > > From: Nate Drake [mailto:[EMAIL PROTECTED] > > > > > > Sent: Sunday, September 07, 2003 9:32 PM > > > > > > To: [EMAIL PROTECTED] > > > > > > Subject: Create new nested bean instance > > > > > > > > > > > > > > > > > > Hi, > > > > > > > > > > > > What is the "proper" Struts way to implement create/update > > > > pages in the > > > > > > following scenario. > > > > > > > > > > > > You've got a Customer Form bean with the following properties: > > > > > > > > > > > > - First Name > > > > > > - Last Name > > > > > > - List of PhoneNumber Beans > > > > > > > > > > > > A PhoneNumber bean with these properties: > > > > > > > > > > > > - Country Code > > > > > > - Area Code > > > > > > - Number > > > > > > - Description > > > > > > > > > > > > > > > > > > I'd like it to be set up like this: > > > > > > > > > > > > CreateCustomer.jsp has text fields for first and last name, and it > > > > > > displays the list of added phone numbers. It also has an > > > > "Add New Phone > > > > > > Number" link. This link takes you to AddPhoneNumber.jsp. > > > > This page has > > > > > > fields for all the phone number properties, and an "Add" > > button. When > > > > > > you press the "Add" button it returns you to the > > CreateCustomer.jsp. > > > > > > The list of phone numbers on this page will reflect the > > newly added > > > > > > phone number. > > > > > > > > > > > > The part of this I'm having trouble figuring out is how > > the List of > > > > > > phone number beans gets updated. Is there a way to tell > > > > Struts to add a > > > > > > new PhoneNumberBean to CustomerBean's list of phone > > numbers? Or do I > > > > > > have to do it myself in an Action? > > > > > > > > > > > > I haven't been able to find any examples like this with > > nested beans. > > > > > > All the nested examples I find just show you how to display nested > > > > > > data. I need to create new nested data and add it to the parent. > > > > > > > > > > > > Any help would be greatly appreciated. > > > > > > > > > > > > Thanks, > > > > > > > > > > > > Nate > > > > > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > > > > 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] > > > > > > > > > > > > > --------------------------------------------------------------------- > > 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]