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]