Joe, you could move your business logic to a service layer which
also leverages the Command pattern. You could have a base command
which did something similar as Craig has outlined.
public abstract class BaseCommand {
public void execute() throws Exception {
try {
// set up transaction
doExecute();
} catch (Exception e) {
// abort transaction
} finally {
// clean up transaction
}
}
// implement actual work here.
public abstract void doExecute() throws Exception;
}
then....
public class MyCommand extends BaseCommand {
public void doExecute() throws exception {
// put business logic here
}
}
in your action's execute method (be it DispatchAction, MappingDispatchAction, etc...)
public ActionForward execute(...) throws Exception {
ActionForward forward = // get appropriate forward
Command command = // get the appropriate command and initialize it
command.execute();
return forward;
}
You might also check out the Spring framework. It allows you to declaratively demarcate
transaction boundries (similar to EJB).
robert
> -----Original Message-----
> From: Joe Hertz [mailto:[EMAIL PROTECTED]
> Sent: Monday, August 09, 2004 4:11 AM
> To: 'Struts Users Mailing List'
> Subject: RE: I suspect this is a bad idea...so what's a better one?
>
>
> 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]
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]