Date: 2004-10-25T19:08:38
Editor: JoeGermuska <[EMAIL PROTECTED]>
Wiki: Apache Struts Wiki
Page: ActionChaining
URL: http://wiki.apache.org/struts/ActionChaining
Remove long and old emai; attempt to summarize some recent list discussion.
Change Log:
------------------------------------------------------------------------------
@@ -1,6 +1,10 @@
-Navigation Trail: HomePage / StrutsProjectPages / StrutsDeveloperPages /
JamesMitchell / MailDocumentation
+In a nutshell, '''Action Chaining''' is the practice of returning a non-redirect
ActionForward which points to a Struts action path. This is chaining (where a
redirect isn't) because it results in the ActionServlet triggering a second "run"
through the RequestProcessor's processing flow.
-Background:
+Many developers find this an effective way to organize their web applications.
However, it is important to note that this is not a supported way to use Struts. The
RequestProcessor is designed with the assumption that it is executed once per HTTP
request. Sometimes Action Chaining is used as a work around for an application which
is not cleanly designed.
+
+An earlier author wrote on this page:
+
+{{{
One might argue that the normal flow of a Struts-based application would be similar
to this:
jsp -> /action -> jsp
@@ -8,129 +12,9 @@
Some people (including myself) prefer this approach
jsp -> /processaction -> /prepareviewaction -> jsp
-----
-{{{
-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
-
- }}}
-
+}}}
+so again, this is evidence that people use this method successfully. This topic has
been discussed exhaustively on the StrutsUserMailingList.
----
@@ -157,4 +41,3 @@
directly to the business facade.
-Ted.
-
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]