Craig,

Thanks for the idea.

Only problem I see with this that I usually make my "real" actions some
flavor of a DispatchAction, usually a MappingDispatchAction.

So to keep that type of functionality, it appears that I'd have to
replicate a lot of the Struts dispatch/reflection logic inside of my
abstract Action subclass. Calling super.execute() gets me that, but that
is precisely what this concept seems to try to avoid. :-/



> -----Original Message-----

:snip:

> A useful design pattern for something like this is to create 
> a common subclass for your actions that does the 
> setup/teardown work in the
> execute() method, and then delegates to the action-specific 
> work in some other method.  For your scenario, it might look 
> like this:
> 
>     public abstract class BaseAction extends Action {
> 
>         public ActionForward execute(...) throws Exception {
>             Persistence persistence = 
> ActionHelper.getPersistenceObject(request);
>             try {
>                 ActionForward forward = delegate(mapping, 
> form, request, response, persistence);
>             } finally {
>                 persistence.release)(;
>             }
>         }
> 
>         protected abstract ActionForward 
> delegate(ActionMapping mapping, ActionForm form,
>           HttpServletRequest request, HttpServletResponse 
> response, Persistence persistence)
>           throws Exception;
> 
>     }
> 
> Then, your real business logic is implemented in a delegate() 
> method that is passed in for you, and you never have to 
> remember to allocate and release the persistence object.
> 
>     public class RealAction extends BaseAction {
> 
>         protected ActionForward delegate(...) {
>             ... use the persistence object as needed ...
>         }
> 
>     }
> 
> This is pretty close to what you've got now ... the key 
> difference is that it uses a local variable instead of an 
> instance variable to avoid sharing problems.  Also, because 
> of the finally clause, it also ensures that the persistence 
> object is cleaned up, even if the
> delegate() method throws an exception.
> 
> Craig
> 
> ---------------------------------------------------------------------
> 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]

Reply via email to