<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]

Reply via email to