I recently made use of model driven and preparable using some of the advice provided in Roughley's book, and got a clear picture of how these interceptors work from the forthcoming Manning book. Our situation required 2 different actions (one provides the form that posts to another that does the save). We're using annotated validation on our model with custom validators. This created the need for model driven in order for the field names to sync up across actions and for the text field tags to have the same field info in order to do the right decoration on field error.
The key to making it work was this interceptor stack: <default-interceptor-ref name="paramsPrepareParamsStack"/> which I didn't see anyone mention yet. Understanding what to do with preparable and getModel was a little tricky, and I think the important thing for me was to make sure my action was doing one thing. Action 1 - Provide the model to a form. Action 2 - Handle the form posted model. Action 1 only had getModel and the property declaration for the model, but no setter/getter. Prepare took care of setting it, and action 1 was nice and clean. Action 2 on the other hand did require the setter/getter plus getModel and a somewhat strange prepare() in order for info to be made available from the value stack back to the INPUT result when field errors occur. Here's the prepare() statement: public void prepare() throws Exception { if (site == null) { site = new Site(); } else { site = getSite(); } } Since this action handels a form post it makes sense that site is null and to create a new one that then gets populated with all the form data. The } else { site = getSite() } part is a kludge and is there strictly so I can run a test against this action. I could not figure out a way to get a mocked up site object into the action without doing this. Has anyone unit tested model driven/preparable actions in this format? Testing these with the BaseStrutsTestCase found at arsenalist.com was illuminating to make sure these actions worked. If you haven't used the test case provided there you need to check it out and start using it when writing these kinds of actions. I hope some of this makes sense. Thanks, Andrew -----Original Message----- From: Adam Hardy [mailto:[EMAIL PROTECTED] Sent: Thursday, January 31, 2008 5:03 PM To: Struts Users Mailing List Subject: Re: preparable vs modelDriven I don't think you are strictly conveying the intended usage, when you say that the getModel() method will 'later' return the model. It depends how your interceptor stack is ordered. In the docs, it explicitly says the ModelDrivenInterceptor should come before ParametersInterceptor, as often the PrepareInterceptor does. Both ModelDriven- and PrepareInterceptor can retrieve the model and place it in instance variables on the action. http://struts.apache.org/2.0.11/docs/prepare-interceptor.html http://struts.apache.org/2.0.11/docs/model-driven-interceptor.html What I originally wanted to ask (whether I conveyed my question correctly is another matter) was: what's the difference in intention and implementation between these two? Thanks Adam Roberto Nunnari on 31/01/08 18:12, wrote: > The prepare() method task is to retrive the model and store it as an > instance variable. > > The getModel() method will later return the model when asked by the > framework that will put it on the value stack. > > Please correct me if I'm wrong. > > Adam Hardy wrote: >> Dave Newton on 31/01/08 16:00, wrote: >>> Adam Hardy <[EMAIL PROTECTED]> wrote: >>>> Dave Newton on 31/01/08 15:29, wrote: >>>>> Adam Hardy <[EMAIL PROTECTED]> wrote: >>>>>> * ModelDriven: how do I get hold of my model during my action >>>>>> methods? I don't want to get getModel() again, because that will >>>>>> retrieve another instance of the entity and not the one that was >>>>>> populated by struts. >>>>> Lazy initialization (via null check or by setting an instance >>>>> var), or config through Spring, or... >>>> If your getModel() puts the model entity on an instance variable, >>>> won't that confuse the param interceptor? >>> >>> Depends on what instance variable you put it in, I suppose. One of >>> your questions was how to access the model object w/o running >>> through a >>> getModel() >>> method that would re-instantiate; lazily initializing an instance >>> variable in >>> getModel() then using that instance variable is one way of dealing >>> with that. >> >> OK, that makes sense now, thanks. What I thought would be the more >> obvious way of obtaining the model would be to fetch it from where >> struts puts it when it calls getModel(), i.e. the value stack, >> however I don't see any access methods for doing that, particulary on >> ActionSupport. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]