You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Ted Husted <hu...@apache.org> on 2002/02/04 03:52:07 UTC

Re: Form fields submitted multiple times...

If you are forwarding from Action to Actoin, the ActionServlet will
handle each request the same as the first. 

If you do not want your ActionForm to be repopulated from the request as
you forward it around, the workaround is to put an readonly property on
the form. The public setters for your properties can then check this to
see if they should allow changes or not. The first action can then set
the ActionForm to readonly before forwarding it along.

    public void setProperty(String property) {
        if (isMutable()) { 
		this.property = property; 
	}
    }

There's a "SuperForm" class in the Scaffold package in the contrib
folder that demonstrates this and some other techniques
[org.apache.scaffold.http.SuperForm].

-- Ted Husted, Husted dot Com, Fairport NY USA.
-- Java Web Development with Struts.
-- Tel +1 585 737-3463.
-- Web http://www.husted.com/struts/


"Kearfott, David (DST-CLT)" wrote:
> 
> Has anyone ever noticed the "Set" methods in the ActionForm invoked multiple
> times (always using the values submitted from the html:form) from Action to
> Action?
> 
> In our JSP, we have several buttons pertaining to the same form
> ("thisActionForm").  Depending on which button was pressed, a different
> action mapping is invoked from Struts:
> 
> <action path="/handleButtons" type="HandleButtonsAction"
> name="thisActionForm" validate="false" scope="session" input="/home.jsp">
>                         <forward name="updateDetailsButton"
> path="/updateDetails.do"/>
>                         <forward name="resetDetailsButton"
> path="/resetDetails.do"/>
>                         <forward name="calculateButton"
> path="/calculateAmounts.do"/>
>                         <forward name="deleteButton"
> path="/deleteDetails.do"/>
> </action>
> 
> <action path="/resetDetails" type="ResetDetailsAction" name="thisActionForm
> " validate="false" scope="session" input="/home.jsp">
>                         <forward name="success"
> path="/calculateAmounts.do"/>
> </action>
> <action path="/calculateAmounts" type="CalculateAmountsAction"
> name="thisActionForm " validate="false" scope="session" input="/home.jsp">
>                         <forward name="success" path="/details.jsp"/>
> </action>
> 
> We see the fields entered/changed in "thisActionForm" set before entering
> the "HandleButtonsAction" class.
> We also see the same field values set again before entering the
> "ResetDetailsAction" class, as if the HTML form has been submitted a second
> time.
> The "ResetDetailsAction" resets some date fields on "thisActionForm", by
> invoking various Set methods.
> We then see the original field values set a third time before entering the
> "CalculateAmountsAction" class, clearing out the values reset in the
> "ResetDetailsAction"
> 
> As anyone seen anything similar?
> Is there an attribute we could use in the action element that would disallow
> the form from submitting again and again and again?
> 
> Our current work around is to not use "thisActionForm" on any other actions,
> except the "HandleButtonsAction", and just grab "thisActionForm" off of the
> session in "ResetDetailsAction" and "CalculateAmountsAction", but we feel
> that there's an easier way.
> 
> Sorry for the novel...
> -dave kearfott

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: Form fields submitted multiple times...

Posted by Ted Husted <hu...@apache.org>.
If you are using the ValidatorForm, another good trick is to key off the
page property it provides. 

In the reset function, put in a wrapper like this:

        if (getPage()==0) {

            setForward(null);
            setName(null);
            setTelephone(null);
            setNumber(null);
        };

This will keep the fields from being reset when you are in "Wizard" mode
and using multiple pages. You can also use it to provide a quick and
easy readonly mode. Just call 

setPage(1);

in your Action before forwarding it. 

Also works great in the Config if you are relaying actions. Just pass
?page=1 as part of the URI.

-T.


Ted Husted wrote:
> 
> If you are forwarding from Action to Actoin, the ActionServlet will
> handle each request the same as the first.
> 
> If you do not want your ActionForm to be repopulated from the request as
> you forward it around, the workaround is to put an readonly property on
> the form. The public setters for your properties can then check this to
> see if they should allow changes or not. The first action can then set
> the ActionForm to readonly before forwarding it along.
> 
>     public void setProperty(String property) {
>         if (isMutable()) {
>                 this.property = property;
>         }
>     }
> 
> There's a "SuperForm" class in the Scaffold package in the contrib
> folder that demonstrates this and some other techniques
> [org.apache.scaffold.http.SuperForm].
> 
> -- Ted Husted, Husted dot Com, Fairport NY USA.
> -- Java Web Development with Struts.
> -- Tel +1 585 737-3463.
> -- Web http://www.husted.com/struts/
> 
> "Kearfott, David (DST-CLT)" wrote:
> >
> > Has anyone ever noticed the "Set" methods in the ActionForm invoked multiple
> > times (always using the values submitted from the html:form) from Action to
> > Action?
> >
> > In our JSP, we have several buttons pertaining to the same form
> > ("thisActionForm").  Depending on which button was pressed, a different
> > action mapping is invoked from Struts:
> >
> > <action path="/handleButtons" type="HandleButtonsAction"
> > name="thisActionForm" validate="false" scope="session" input="/home.jsp">
> >                         <forward name="updateDetailsButton"
> > path="/updateDetails.do"/>
> >                         <forward name="resetDetailsButton"
> > path="/resetDetails.do"/>
> >                         <forward name="calculateButton"
> > path="/calculateAmounts.do"/>
> >                         <forward name="deleteButton"
> > path="/deleteDetails.do"/>
> > </action>
> >
> > <action path="/resetDetails" type="ResetDetailsAction" name="thisActionForm
> > " validate="false" scope="session" input="/home.jsp">
> >                         <forward name="success"
> > path="/calculateAmounts.do"/>
> > </action>
> > <action path="/calculateAmounts" type="CalculateAmountsAction"
> > name="thisActionForm " validate="false" scope="session" input="/home.jsp">
> >                         <forward name="success" path="/details.jsp"/>
> > </action>
> >
> > We see the fields entered/changed in "thisActionForm" set before entering
> > the "HandleButtonsAction" class.
> > We also see the same field values set again before entering the
> > "ResetDetailsAction" class, as if the HTML form has been submitted a second
> > time.
> > The "ResetDetailsAction" resets some date fields on "thisActionForm", by
> > invoking various Set methods.
> > We then see the original field values set a third time before entering the
> > "CalculateAmountsAction" class, clearing out the values reset in the
> > "ResetDetailsAction"
> >
> > As anyone seen anything similar?
> > Is there an attribute we could use in the action element that would disallow
> > the form from submitting again and again and again?
> >
> > Our current work around is to not use "thisActionForm" on any other actions,
> > except the "HandleButtonsAction", and just grab "thisActionForm" off of the
> > session in "ResetDetailsAction" and "CalculateAmountsAction", but we feel
> > that there's an easier way.
> >
> > Sorry for the novel...
> > -dave kearfott
> 
> --
> To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
> For additional commands, e-mail: <ma...@jakarta.apache.org>

-- Ted Husted, Husted dot Com, Fairport NY USA.
-- Java Web Development with Struts.
-- Tel +1 585 737-3463.
-- Web http://www.husted.com/struts/

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>