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]>