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]