Craig,

Many thanks for the quick and clear clarifications.

    -- Pierre

"Craig R. McClanahan" wrote:
> 
> Hi Pierre,
> 
> See intermixed below.
> 
> On Tue, 23 Jul 2002, Pierre Delisle wrote:
> 
> > Date: Tue, 23 Jul 2002 23:26:09 -0700
> > From: Pierre Delisle <[EMAIL PROTECTED]>
> > Reply-To: Struts Developers List <[EMAIL PROTECTED]>
> > To: [EMAIL PROTECTED]
> > Subject: action calling another action
> >
> > I have a 1.0 struts-based web application where a "higher-level" action
> > depends on the processing associated with another lower-level action.
> >
> 
> Welcome to the eternal debate over whether action chaining/nesting is a
> good design pattern or not :-).  I'm *not* a believer, but lets address
> your questions anyway.
> 
> > For example, action "foo" needs to invoke the processing
> > associated with action "bar".
> >
> > Using struts 1.0, I could do the following in the FooAction:
> >
> >   ActionServletMine actionServlet =
> >       (ActionServletMine)mapping.getMappings().getServlet();
> >   ActionMapping targetMapping = actionServlet.findMapping("/bar.do");
> >   ((BarAction)actionServlet.getActionInstance(
> >       targetMapping)).perform(targetMapping, form, request, response);
> >
> 
> You should have been able to pass "/bar" as the argument to the
> findMapping() method, even in Struts 1.0.
> 
> > ActionServletMine is my own subclass of ActionServlet. It simply provides
> > the extra method "getActionInstance()" to allow me to get access to the
> > action instance associated with "targetMapping". (it calls
> > processActionCreate()).
> >
> > Migrating to struts 1.1, I was hoping for backwards compatibility,
> > but ActionMapping.getMappings() seems to have been removed without
> > being first deprecated. Any reason, or am I missing something?
> > (btw, I know I could simply call getServlet() within the Action subclass,
> > but I'm still curious as to why getMappings() has been removed).
> >
> 
> There is no longer a single collection of ActionMappings -- there is one
> per application module.  So you'll need to do the following to get an
> ActionMapping:
> 
>   ApplicationConfig appConfig = (ApplicationConfig)
>     request.getParameter(Action.APPLICATION_KEY);
>   ActionMapping mapping = (ActionMapping)
>     appConfig.findActionConfig("/bar");
> 
> >
> > If I am to bite the bullet right now and rearchitect the
> > webapp with the new struts 1.1 api, I still run into a few
> > issues.
> >
> > What I've described above is how I thought would be the proper way
> > to handle "action calling other action" in the very early days of 1.0.
> > There might be a better approach now. If so, I'd appreciate if someone
> > could point me in the right direction.
> >
> 
> Best practice is to factor the common code out and call it from both
> actions, so you don't have to do any form of "chaining" or "nesting".
> 
> > If I am to simply migrate the above code to the new 1.1 apis,
> > it appears that I'd have to do the following:
> >
> >   ActionServlet actionServlet = getServlet();
> >   ApplicationConfig appConfig = mapping.getApplicationConfig();
> >   RequestProcessor rp = actionServlet.getRequestProcessor(appConfig);
> >
> > It appears that "findMapping()" has been deprecated. So the code
> >     ActionMapping targetMapping = actionServlet.findMapping("/bar.do");
> > should be replaced by
> >     ActionConfig targetAction = appConfig.findActionConfig()
> >
> 
> You have to look up the correct ActionConfig from the ApplicationConfig,
> and cast it to ActionMapping (for backwards compatibility).
> 
> > The problem though is that the execute() method of an Action expects
> > an ActionMapping object... which means that I'm back to want to use the old
> > 1.0 api to get an ActionMapping (or I'm once again missing something).
> > How come the new execute() method of Action does not take an ActionConfig
> > object as argument instead of the old ActionMapping?
> >
> 
> The ActionMapping class in 1.1 is a subclass of ActionConfig, and that is
> the class actually used in the configuration file parsing.  So the cast
> will always work.
> 
> > Finally, it would be preferable to migrate to the new RequestProcessor interface.
> > However, ActionServlet.getRequestProcessor() is protected,
> > preventing me from accessing it from my Action code.
> > Any reason why it is not public?
> 
> Because you shouldn't be messing around with this stuff in the first place
> :-).
> 
> Actually, the RequestProcessor instance that is processing the current
> request can be acquired directly, from the same place that ActionServlet
> gets it:
> 
>   String key = Action.REQUEST_PROCESSOR_KEY + appConfig.getPrefix();
>   RequestProcessor processor = (RequestProcessor)
>     servlet.getServletContext().getAttribute(key);
> 
> The only difference is that the ActionServlet.getRequestProcessor() method
> will lazilly instantiate the request processor the first time.  By the
> time you execute the above code in an Action, you will not have to worry
> about that.
> 
> >
> > Many thanks for any answer/advice...
> >
> >     -- Pierre
> >
> 
> Craig
> 
> --
> To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to