struts-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Kyle W. Cartmell" <KyleCartm...@FirstFinance.org>
Subject Re: validation breaks my form prepopulation
Date Wed, 03 May 2006 23:02:13 GMT
So in a Struts web application if I supply two mappings for a single 
action, one that has a form and one that does not, and I call the one 
with the form and then a few seconds later call the one without, the 
form parameter to the execute method is not null on the second call. I 
don't understand why this would be so...

Michael Jouravlev wrote:
> On 5/3/06, Kyle W. Cartmell <KyleCartmell@firstfinance.org> wrote:
>> I did some tinkering and found that even though my setup action is
>> indeed associated with a form bean, and my reset method is defined and
>> sets my values to null, when I return to an action from a validation
>> failure or forwarded from another action, the form that I originally
>> used to populate the data on that page is present and intact.
>>
>> 1. Is it reasonable to simply make use of this mechanic to allow this
>> data to persist?
>
> How many forms do you have: one or two? If two, do they have
> properties with the same names? If I remember correctly, this should
> work somewhat like this:
>
> * You submit an HTML form to a submit action, well, actually to an
> action mapping
> * If actionform is defined for the mapping, it is initialized. That
> means, that if it has request scope, it is created. If it has session
> scope it is usually reused (this is not guaranteed, but I've yet to
> encounter the situation when session-scoped form was not reused).
> * reset() is called on form
> * form is populated from request parameters
> * if "validate" attribute of the action mapping is set to true,
> validate() is called
> * if validate() returns non-empty object and you have "input"
> attribute set, then control is forwarded to the location defined in
> the "input". (Hmm, what happens if you have validate="true" but do not
> have "input" attribute?) By the way, it is possible to redirect to
> "input" location instead of forwarding, but this is done globally for
> all mappings in the config file.
> * If you do a regular forward using "input" attribute, the
> request/response sequence has not been finished yet, so all objects
> that were created when you submitted the request, are still there,
> including request-scoped actionform and request object itself. So, if
> you forward to a regular JSP page, you can pull data from the
> actionform or from request object.
> * Now, the fun part. If you forward to a setup action, then Struts
> will look for an actionform associated with this mapping, and will
> call reset() on it, then it will try to populate it from the request
> object, then it will call validate() if you have validate="true". So,
> if you forward to a setup action and you have changed content of the
> actionform, you should either NOT associate a form with an action.
> Because otherwise your changes to actionform fields will be
> overwritted from the request object. Does it make sense? ;-)
>
>> 2. I find that I am shocked by some astounding discovery regarding
>> Struts functionallity, and I have gone through all of the documentation
>> on the website, can anyone direct me toward comprehensive (or as close
>> as possible) documentation of Struts internals in hopes that I can stop
>> posting silly questions here and not have to resort to reading source?
>
> I think that it all clears when you understand how scoped objects are
> managed, and how the request/response cycle works. The key here is
> that Struts runs its portion of request/response code whenever you
> call an action mapping, even if you make a server-side forward.
>
> I wrote a small article on that topic [1]. It is not perfect and,
> frankly, needs a rewrite (I introduced my own names to some of the
> action/form combinations), I would do some things differently. But
> some sections of it are still valuable. Take a look at "Two actions,
> one form" and "Two actions, two forms" sections. Currently I prefer to
> use only one actionform and two action classes (input and render) for
> one web resource.
>
> Oh yeah, and as the article says, use the same scope if you use the
> same form name :-) Otherwise you'll get some funny results.
>
> Michael.
>
> [1] 
> http://www.theserverside.com/articles/article.tss?l=StrutsActionMapping
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
>
>

-- 
Kyle W. Cartmell
Sr. Software Developer
LAP Holdings, LLC dba First Finance
Phone: (480) 222-0050
Toll Free: (800) 355-3135
kylecartmell@firstfinance.org
www.efirstfinance.com


Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message