You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Karin Schellner <ka...@researchstudio.at> on 2005/08/29 14:44:40 UTC

how to init forms?

Hi,
I just started implementing a webapplication using Struts and could not 
find a good solution for the following (- not so uncommon as I would 
guess -) problem:
Each authenticated user has a userprofile with personal data which 
he/she can edit via a "PersdataForm". The initial values for this form 
should be retrieved from the database, i.e. there is a BO somewhere 
containing these data. There is a "PersdataAction" writing the changed 
values back to the BO.

How would I best initiate the form? - the FormBeans "reset" method seems 
not to be the right place because it is called too often - should I use 
another Action? but how  would the configuration look like in such a 
scenario?

Thanks in advance for your ideas on this problem!
karin.



---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: how to init forms?

Posted by Hubert Rabago <hr...@gmail.com>.
Check out Rick's Struttin with Struts lessons.  Lesson 2 covers form
prepopulation.

http://www.reumann.net/struts/lesson2.do

Hubert

On 8/29/05, Karin Schellner <ka...@researchstudio.at> wrote:
> Hi,
> I just started implementing a webapplication using Struts and could not
> find a good solution for the following (- not so uncommon as I would
> guess -) problem:
> Each authenticated user has a userprofile with personal data which
> he/she can edit via a "PersdataForm". The initial values for this form
> should be retrieved from the database, i.e. there is a BO somewhere
> containing these data. There is a "PersdataAction" writing the changed
> values back to the BO.
> 
> How would I best initiate the form? - the FormBeans "reset" method seems
> not to be the right place because it is called too often - should I use
> another Action? but how  would the configuration look like in such a
> scenario?
> 
> Thanks in advance for your ideas on this problem!
> karin.
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
> 
>

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: how to init forms?

Posted by Joe Germuska <Jo...@Germuska.com>.
This is something which is kind of awkward in Struts 1.2.  I think 
we've got a pretty decent approach in Struts 1.3, but I guess we'll 
have to wait until more people start checking that out to find out.

Basically, the approach is to prepare a FormBean instance in an 
action and populate its values with those you want to see in the 
form.  If the FormBean is in the right place, then when the page 
draws, the form tag and its child elements will be populated based on 
the FormBean instance.

The "right place" is dependent on the "name" and "scope" of the 
action in the <html:form>'s action attribute.  Specifically, the bean 
should be in either request or session scope (accordingly) under an 
attribute name which matches the Form Bean's name.

First, how it should be done in Struts 1.3, because it's more 
straightforward; below that, the gist of how to do it in Struts 1.2. 
Before midway through the Struts 1.2 development line, there was even 
less API support, so I won't get into the details -- hopefully there 
aren't a lot of people still using Struts 1.1, but if you needed, you 
could probably work out the gist of it from what comes below.

So, in Struts 1.3, there is a generic command, "CopyFormToContext". 
If you configure this command simply with the submission destination 
(action path) of the form you want to prefill, Struts will create a 
form bean (or reuse an existing one if possible) and put it where it 
needs to be for the form to use it as a prefill source.  You then 
need to follow that command with another which would be customized to 
your needs and which would perform the prefilling logic.   You can 
configure CopyFormToContext so that besides putting the form where 
the <html:form> tag needs it, it can also put a reference under any 
arbitrary Context key, so that your population command can find it 
easily.

I won't get into the details of configuring chains and commands here, 
except to note that you can hook a command to any action or forward, 
so that this behavior is executed "en route" to your view.  I'll be 
happy to answer follow-on questions as necessary, but first, a bit 
more about how this works in Struts 1.2 (which is what the above does 
behind the scenes.)

The problem is that in Struts 1.2, you need to hard-code more than I 
really like about the config files into your actions, and the API is 
not entirely straightforward.  There are methods in ModuleUtils and 
RequestUtils to get a hold of the relevant objects and ultimately get 
a form instance, but the responsibility for putting that form bean 
back into the correct scope under the correct key is still not 
centralized.  (It's actually not universally centralized in Struts 
1.3 either, but still, there's a enough support for this specific 
task that it's not such a big deal.)

I recommend using the API for getting a form bean instance because 
it's pretty cumbersome to instantiate dynaforms yourself.  The steps 
are: get the ModuleConfig (static, only requires an instance of 
HttpServletRequest), then from the module config, get the 
ActionMapping (aka ActionConfig) (just takes the action path of the 
submit destination of the form you want to prepare), and then get the 
Form instance using the static RequestUtils.createActionForm(request, 
mapping, moduleConfig, servlet).  Now you have the bean you wish to 
populate,   After you populate it, there is no specific Struts API 
method, but you can use the ActionMapping (the one you looked up, not 
the one passed in to your preparation action) to find the correct 
scope and name.

ModuleUtils.getModuleConfig(request)
http://struts.apache.org/api/org/apache/struts/util/ModuleUtils.html#getModuleConfig(javax.servlet.http.HttpServletRequest)

ModuleConfig.findActionConfig
http://struts.apache.org/api/org/apache/struts/config/ModuleConfig.html#findActionConfig(java.lang.String)

RequestUtils.createActionForm(request, mapping, moduleConfig, servlet)
http://struts.apache.org/api/org/apache/struts/util/RequestUtils.html#createActionForm(javax.servlet.http.HttpServletRequest,%20org.apache.struts.action.ActionMapping,%20org.apache.struts.config.ModuleConfig,%20org.apache.struts.action.ActionServlet)


I hope this helps.  The relative difficulty of achieving this 
compared to the regularity with which it is needed has been bothering 
me for years, and I hope that people will agree that it is getting 
easier in newer versions of Struts.

Joe



At 2:44 PM +0200 8/29/05, Karin Schellner wrote:
>Hi,
>I just started implementing a webapplication using Struts and could 
>not find a good solution for the following (- not so uncommon as I 
>would guess -) problem:
>Each authenticated user has a userprofile with personal data which 
>he/she can edit via a "PersdataForm". The initial values for this 
>form should be retrieved from the database, i.e. there is a BO 
>somewhere containing these data. There is a "PersdataAction" writing 
>the changed values back to the BO.
>
>How would I best initiate the form? - the FormBeans "reset" method 
>seems not to be the right place because it is called too often - 
>should I use another Action? but how  would the configuration look 
>like in such a scenario?
>
>Thanks in advance for your ideas on this problem!
>karin.
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
>For additional commands, e-mail: user-help@struts.apache.org


-- 
Joe Germuska            
Joe@Germuska.com  
http://blog.germuska.com    
"Narrow minds are weapons made for mass destruction"  -The Ex

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org