Can you just use simple objects in the form? public class MyActionForm extends ActionForm { AnotherActionForm1 af1; AnotherActionForm2 af2;
MyActionForm() { af1 = new SimpleObject1AsAnotherActionForm1(); af2 = new SimpleObject2AsAnotherActionForm2(); } } Access: <%= masterForm.af1.field1 %> Peiyun -----Original Message----- From: Frank W. Zammetti [mailto:[EMAIL PROTECTED] Sent: September 22, 2006 4:23 PM To: Struts Users Mailing List Cc: Struts Users Mailing List Subject: Re: Nested form beans On Fri, September 22, 2006 3:59 pm, Hubert Rabago wrote: > 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. Yeah, that's the next step. Was hoping to avoid it with an easy answer, but that's the way it goes sometimes :) > 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. Actually, that's a pretty big help in and of itself... I wasn't frankly aware the subbeans would get populated, so knowing it *should* work at least means I'm not on a wild goose chase. Thanks for the effort, I definitely appreciate it! > Hubert Frank > 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] > > --------------------------------------------------------------------- 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]