I can't see anything that would cause your problem.
I guess if it were me, I'd fire up my debugger and start stepping
through some code.
Sorry.
All I can say at this point is that I know what you're doing is
possible cause that's how FormDef does nested beans.

Hubert

On 9/22/06, Frank W. Zammetti <[EMAIL PROTECTED]> wrote:
Hehe, way ahead of you :)  I put logging in every method... constructors,
getters setter, all three forms.  Here's the output:

MasterForm constructor
Tab1Form constructor
Tab2Form constructor
--NOW IN JSP--
MasterForm getTab1Form() = [EMAIL PROTECTED]
MasterForm getTab2Form() = [EMAIL PROTECTED]
getting field1 = null
getting field2 = null

Notice the fields don't get set, nor do the subbeans get set on the
containing bean.  The MasterForm constructor instantiates Tab1Form and
Tab2Form, as the output indicates.

Frank


--
Frank W. Zammetti
Founder and Chief Software Architect
Omnytex Technologies
http://www.omnytex.com
AIM/Yahoo: fzammetti
MSN: [EMAIL PROTECTED]
Author of "Practical Ajax Projects With Java Technology"
 (2006, Apress, ISBN 1-59059-695-1)
Java Web Parts - http://javawebparts.sourceforge.net
 Supplying the wheel, so you don't have to reinvent it!

On Fri, September 22, 2006 2:53 pm, Hubert Rabago wrote:
> It still sounds like Struts is getting nulls for the subbeans when it
> tries to populate subbean.fieldX.  Put some more logging, this time in
> the getters for the subbean in MasterForm, and log what it's
> returning.
>
> Hubert
>
> On 9/22/06, Frank W. Zammetti <[EMAIL PROTECTED]> wrote:
>> As a follow-up, I threw some logging in the field1 and field2 setters in
>> the subbeans... they don't appear to ever get called.  I don't have to
>> do
>> anything special to tell Struts I'm using nested beans, do I?  I didn't
>> think so...
>>
>> Frank
>>
>>
>> --
>> Frank W. Zammetti
>> Founder and Chief Software Architect
>> Omnytex Technologies
>> http://www.omnytex.com
>> AIM/Yahoo: fzammetti
>> MSN: [EMAIL PROTECTED]
>> Author of "Practical Ajax Projects With Java Technology"
>>  (2006, Apress, ISBN 1-59059-695-1)
>> Java Web Parts - http://javawebparts.sourceforge.net
>>  Supplying the wheel, so you don't have to reinvent it!
>>
>> On Fri, September 22, 2006 2:47 pm, Frank W. Zammetti wrote:
>> > Hi Chris.. thanks for the suggestion, I gave that a shot at one point
>> > actually... what I get is now the fields in the subforms (I guess
>> that's
>> > as good a term as any!) don't get set...
>> >
>> > masterForm = [EMAIL PROTECTED]
>> > tab1Form = [EMAIL PROTECTED]
>> > tab2Form = [EMAIL PROTECTED]
>> > field1 = null
>> > field2 = null
>> >
>> > That's what I see in my final JSP output.
>> >
>> > Frank
>> >
>> >
>> > --
>> > Frank W. Zammetti
>> > Founder and Chief Software Architect
>> > Omnytex Technologies
>> > http://www.omnytex.com
>> > AIM/Yahoo: fzammetti
>> > MSN: [EMAIL PROTECTED]
>> > Author of "Practical Ajax Projects With Java Technology"
>> >  (2006, Apress, ISBN 1-59059-695-1)
>> > Java Web Parts - http://javawebparts.sourceforge.net
>> >  Supplying the wheel, so you don't have to reinvent it!
>> >
>> > On Fri, September 22, 2006 2:40 pm, Chris Pratt wrote:
>> >> In your no-arg constructor of your outer ActionForm (the container),
>> >> make
>> >> sure it instantiates each of the nested ActionForms using their
>> no-arg
>> >> constructors.
>> >>   (*Chris*)
>> >>
>> >> On 9/22/06, Frank W. Zammetti <[EMAIL PROTECTED]> wrote:
>> >>>
>> >>> Sorry, by af1 and af2 I did mean actionForm1 and actionForm2... my
>> >>> mistake
>> >>> wasn't quite *THAT* obvious! ;) LOL
>> >>>
>> >>> Frank
>> >>>
>> >>>
>> >>> --
>> >>> Frank W. Zammetti
>> >>> Founder and Chief Software Architect
>> >>> Omnytex Technologies
>> >>> http://www.omnytex.com
>> >>> AIM/Yahoo: fzammetti
>> >>> MSN: [EMAIL PROTECTED]
>> >>> Author of "Practical Ajax Projects With Java Technology"
>> >>> (2006, Apress, ISBN 1-59059-695-1)
>> >>> Java Web Parts - http://javawebparts.sourceforge.net
>> >>> Supplying the wheel, so you don't have to reinvent it!
>> >>>
>> >>> On Fri, September 22, 2006 1:31 pm, Frank W. Zammetti wrote:
>> >>> > Hi Hubert,
>> >>> >
>> >>> > Yes, I get nulls for af1 and af2... I do have getters and setters
>> for
>> >>> > them.
>> >>> >
>> >>> > Lemme throw some data your way... I was hoping to avoid posting
>> all
>> >>> this,
>> >>> > but I suspect there to be something my eyes just aren't catching,
>> >>> so...
>> >>> >
>> >>> >
>> >>> > Here's ActionForm1:
>> >>> >
>> >>> >
>> >>> > package app.test.formbeans;
>> >>> > import org.apache.struts.action.ActionForm;
>> >>> > public class Action1Form extends ActionForm {
>> >>> >   private String field1;
>> >>> >   public void setField1(String inField1) {
>> >>> >     this.field1 = inField1;
>> >>> >   }
>> >>> >   public String getField1() {
>> >>> >     return this.field1;
>> >>> >   }
>> >>> > }
>> >>> >
>> >>> >
>> >>> > ActionForm2 is identical, just replacing the number 1 with 2
>> >>> everywhere.
>> >>> > Here's MasterForm:
>> >>> >
>> >>> >
>> >>> > package app.test.formbeans;
>> >>> > import org.apache.struts.action.ActionForm;
>> >>> > public class MasterForm extends ActionForm {
>> >>> >   public Action1Form action1Form;
>> >>> >   public Action2Form action2Form;
>> >>> >   public void setAction1Form(Action1Form inAction1Form) {
>> >>> >     this.action1Form = inAction1Form;
>> >>> >   }
>> >>> >   public Action1Form getAction1Form() {
>> >>> >     return this.action1Form;
>> >>> >   }
>> >>> >   public void setAction2Form(Action2Form inAction2Form) {
>> >>> >     this.action2Form = inAction2Form;
>> >>> >   }
>> >>> >   public Action2Form getAction2Form() {
>> >>> >     return this.action2Form;
>> >>> >   }
>> >>> > }
>> >>> >
>> >>> >
>> >>> > The Action everything gets submitted to is just a ForwardAction,
>> >>> which
>> >>> > forwards to:
>> >>> >
>> >>> >
>> >>> > <%@ page language="java" import="app.test.formbeans.*" %>
>> >>> > <%
>> >>> >   MasterForm masterForm =
>> >>> (MasterForm)request.getAttribute("masterForm");
>> >>> > %>
>> >>> > <%="masterForm = " + masterForm + "<br>"%>
>> >>> > <%
>> >>> >   Tab1Form tab1Form = null;
>> >>> >   Tab2Form tab2Form = null;
>> >>> >   if (masterForm != null) {
>> >>> >     tab1Form = masterForm.getTab1Form();
>> >>> >     tab2Form = masterForm.getTab2Form();
>> >>> >   }
>> >>> > %>
>> >>> > <%="tab1Form = " + tab1Form + "<br>"%>
>> >>> > <%="tab2Form = " + tab2Form + "<br>"%>
>> >>> > <% if (tab1Form != null) { %>
>> >>> >   <%="field1 = " + tab1Form.getField1() + "<br>"%>
>> >>> > <% } %>
>> >>> > <% if (tab2Form != null) { %>
>> >>> >   <%="field2 = " + tab2Form.getField2() + "<br>"%>
>> >>> > <% } %>
>> >>> >
>> >>> >
>> >>> > The result I see from this is:
>> >>> >
>> >>> >
>> >>> > masterForm = [EMAIL PROTECTED]
>> >>> > tab1Form = null
>> >>> > tab2Form = null
>> >>> >
>> >>> >
>> >>> > The page that does that submit, in its final rendered form on the
>> >>> client
>> >>> > is:
>> >>> >
>> >>> >
>> >>> > <html>
>> >>> > <head>
>> >>> >   <script>
>> >>> >     var finalSubmit = null;
>> >>> >     function getXHR() {
>> >>> >       if (window.XMLHttpRequest) {
>> >>> >         return new XMLHttpRequest();
>> >>> >       } else if (window.ActiveXObject) {
>> >>> >         return new ActiveXObject("Microsoft.XMLHTTP");
>> >>> >       }
>> >>> >     }
>> >>> >     function submitAll() {
>> >>> >       var tab1Form = dojo.io.encodeForm(
>> >>> >         document.getElementById("tab1Form"));
>> >>> >       var tab2Form = dojo.io.encodeForm(
>> >>> >         document.getElementById("tab2Form"));
>> >>> >       finalSubmit = getXHR();
>> >>> >       finalSubmit.onreadystatechange = finalSubmitCallback;
>> >>> >       finalSubmit.open("POST", "final.do", true);
>> >>> >       finalSubmit.send(tab1Form + tab2Form);
>> >>> >     }
>> >>> >     function finalSubmitCallback() {
>> >>> >       if (finalSubmit.readyState == 4) {
>> >>> >         document.getElementById("divResult").innerHTML =
>> >>> > finalSubmit.responseText;
>> >>> >       }
>> >>> >     }
>> >>> >   </script>
>> >>> > </head>
>> >>> > <body onload="init();">
>> >>> >   <form name="masterForm" id="tab1Form" method="post"
>> >>> > action="/test/tab1.do">
>> >>> >     Field1: <input name="tab1Form.field1" value="val1"
>> >>> type="text"><br>
>> >>> >   </form>
>> >>> >   <br>
>> >>> >   <form name="masterForm" id="tab2Form" method="post"
>> >>> > action="/test/tab2.do">
>> >>> >     Field2: <input name="tab2Form.field2" value="val2"
>> >>> type="text"><br>
>> >>> >   </form>
>> >>> >   <br>
>> >>> >   <input value="Submit All" onclick="submitAll();" type="button">
>> >>> >   <br><br>
>> >>> >   <div id="divResult"></div>
>> >>> > </body>
>> >>> > </html>
>> >>> >
>> >>> >
>> >>> > Note that I removed all the Dojo-related stuff, and some stuff
>> that
>> >>> isn't
>> >>> > related to this submissino, just to try and keep it small, but,
>> the
>> >>> > important thing to note is that when the submission is made, the
>> >>> request
>> >>> > that goes across is a POST to http://localhost:8080/test/final.do,
>> as
>> >>> > expected, and the POST body is:
>> >>> >
>> >>> > tab1Form.field1=val1&tab2Form.field2=val2&
>> >>> >
>> >>> > ...also as expected, verified in Firebug.  Lastly, here's
>> >>> struts-config:
>> >>> >
>> >>> >
>> >>> > <?xml version="1.0" encoding="ISO-8859-1" ?>
>> >>> > <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD
>> >>> Struts
>> >>> > Configuration 1.2//EN"
>> >>> > "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd";>
>> >>> > <struts-config>
>> >>> >   <form-beans>
>> >>> >     <form-bean name="masterForm"
>> type="app.test.formbeans.MasterForm"
>> >>> />
>> >>> >   </form-beans>
>> >>> >   <action-mappings>
>> >>> >     <action path="/final" type="app.test.actions.FinalAction"
>> >>> > name="masterForm" scope="request" validate="false">
>> >>> >       <forward name="defaultForward" path="/final.jsp" />
>> >>> >     </action>
>> >>> >   </action-mappings>
>> >>> > </struts-config>
>> >>> >
>> >>> >
>> >>> > Note here that I removed the stuff that generated the markup from
>> >>> above
>> >>> > too, since that seems to be working just fine, I'm pretty sure
>> this
>> >>> is
>> >>> all
>> >>> > that would be relevant.
>> >>> >
>> >>> > So, seeing any obvious blunders on my part?  Thanks Hubert!
>> >>> >
>> >>> > Frank
>> >>> >
>> >>> >
>> >>> > --
>> >>> > Frank W. Zammetti
>> >>> > Founder and Chief Software Architect
>> >>> > Omnytex Technologies
>> >>> > http://www.omnytex.com
>> >>> > AIM/Yahoo: fzammetti
>> >>> > MSN: [EMAIL PROTECTED]
>> >>> > Author of "Practical Ajax Projects With Java Technology"
>> >>> >  (2006, Apress, ISBN 1-59059-695-1)
>> >>> > Java Web Parts - http://javawebparts.sourceforge.net
>> >>> >  Supplying the wheel, so you don't have to reinvent it!
>> >>> >
>> >>> > On Fri, September 22, 2006 1:10 pm, Hubert Rabago wrote:
>> >>> >> So what does happen when you submit the form?  Are you getting
>> NPEs?
>> >>> >>
>> >>> >> By the time Struts attempts to populate the form bean, the nested
>> >>> >> forms should already be instantiated.  You should have getters
>> and
>> >>> >> setters for af1 and af2, and getAf1() and getAf2() should not
>> return
>> >>> a
>> >>> >> null.  This could be an issue if the form bean is new, either
>> >>> because
>> >>> >> it's in request scope, or in session scope but was not previously
>> >>> >> instantiated.
>> >>> >>
>> >>> >> Hubert
>> >>> >>
>> >>> >> On 9/22/06, Frank W. Zammetti <[EMAIL PROTECTED]> wrote:
>> >>> >>> I'm facing a situation where ideally I'd like to have a single
>> >>> >>> ActionForm
>> >>> >>> like so:
>> >>> >>>
>> >>> >>> public class MyActionForm extends ActionForm {
>> >>> >>>   AnotherActionForm1 af1;
>> >>> >>>   AnotherActionForm2 af2;
>> >>> >>> }
>> >>> >>>
>> >>> >>> When in my JSP I do:
>> >>> >>>
>> >>> >>> <html:text property="af1.field1" />
>> >>> >>>
>> >>> >>> ...I do indeed see the value as I expect.  The way I did this is
>> to
>> >>> >>> have
>> >>> >>> an Action mapping that references MyActionForm, then within the
>> >>> Action
>> >>> >>> I
>> >>> >>> instantiate AnotherActionForm1, set the value of field1 on it,
>> and
>> >>> then
>> >>> >>> set af1 to that new AnotherActionForm1 instance.  That all works
>> >>> >>> nicely.
>> >>> >>>
>> >>> >>> Here's where I run into a problem...
>> >>> >>>
>> >>> >>> On the page I basically have 2 separate HTML forms, one for
>> >>> >>> AnotherActionForm1 and another for AnotherActionForm2.  However,
>> I
>> >>> have
>> >>> >>> a
>> >>> >>> SINGLE submit button at the end (just plain button that makes an
>> >>> AJAX
>> >>> >>> request).  onClick of that button, I create a query string from
>> the
>> >>> >>> values
>> >>> >>> of both forms, and make a request to the server with the query
>> >>> string
>> >>> >>> attached.  The parameter names of the query string arguments are
>> >>> >>> af1.field1 and af2.field2, mimicing what's in MyActionForm.  The
>> >>> >>> mapping
>> >>> >>> that the request goes to again references MyActionForm.
>> >>> >>>
>> >>> >>> What I've been told should happen is that Struts should be able
>> to
>> >>> >>> instantiate those two nested beans and set the properties, since
>> >>> the
>> >>> >>> parameter names give it the information it needs.  This does not
>> >>> >>> however
>> >>> >>> seem to be happening.
>> >>> >>>
>> >>> >>> So, two questions... first, is that in fact the expected
>> >>> behavoir?  And
>> >>> >>> two, if so, any ideas what I'm doing wrong?  I can post all the
>> >>> >>> pertinent
>> >>> >>> config and code, but thought it might be something more generic
>> >>> that
>> >>> >>> wouldn't require all that.  This is the first time I've ever had
>> a
>> >>> need
>> >>> >>> to
>> >>> >>> nest forms like this, so it's a new question for me.
>> >>> >>>
>> >>> >>> Thanks all!
>> >>> >>>
>> >>> >>> Frank
>> >>> >>>
>> >>> >>>
>> >>> >>> --
>> >>> >>> Frank W. Zammetti
>> >>> >>> Founder and Chief Software Architect
>> >>> >>> Omnytex Technologies
>> >>> >>> http://www.omnytex.com
>> >>> >>> AIM/Yahoo: fzammetti
>> >>> >>> MSN: [EMAIL PROTECTED]
>> >>> >>> Author of "Practical Ajax Projects With Java Technology"
>> >>> >>>  (2006, Apress, ISBN 1-59059-695-1)
>> >>> >>> Java Web Parts - http://javawebparts.sourceforge.net
>> >>> >>>  Supplying the wheel, so you don't have to reinvent it!
>> >>> >>>
>> >>> >>> ---------------------------------------------------------------------
>> >>> >>> 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]
>>
>>
>
> ---------------------------------------------------------------------
> 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