[
https://issues.apache.org/struts/browse/STR-2375?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Paul Benedict closed STR-2375.
------------------------------
Resolution: Won't Fix
Fix Version/s: 1.2.9
Assignee: (was: Struts Developers)
Use EventActionDispatcher and EventDispatchAction.
> New action forward dispatch action
> ----------------------------------
>
> Key: STR-2375
> URL: https://issues.apache.org/struts/browse/STR-2375
> Project: Struts 1
> Issue Type: Improvement
> Components: Extras
> Affects Versions: 1.2.4
> Environment: Operating System: All
> Platform: All
> Reporter: Denis Pasek
> Priority: Minor
> Fix For: 1.2.9
>
> Attachments: ForwardDispatchAction.java
>
>
> In one of my last projects I occured the problem of having multiple submit
> buttons on a single page and the need to have a dispatch mechanism not using
> JavaScript on the client side.
> After reading Struts documentation I found the solution of using the
> LookupDispatchAction for this kind of problem but I was not quite satisfied
> with
> it. The following things I do not like about the LookupDispatchAction:
> - using multiple execute methods (add, delete) in one Action class. I like the
> more fine grained approach (one processing step = one Action)
> - the reusability of the dispatch class is poor. I had many forms for data
> input
> with always the same buttons (create, update, delete). The dispatch action is
> not reusable.
> So I thought of a different solution using the ActionForward for dispatch. The
> base idea is to have a reusable dispatcher Action that forwards to specific
> Action implementations for each processing step.
> My implementation which could be useful for all Struts users has the following
> advantages:
> - DispatcherAction class is reusable for multiple forms (with the same
> buttons).
> - the Action classes can be fine grained (see above)
> - better integration into Struts' conceptas using ActionForwards instead of
> method calls using reflection.
> Maybe you find this abstract class also useful and include it as common action
> in future Struts releases.
> The following documented source code fully reusing the LookupDispatchAction is
> the result of my considerations:
> package org.apache.struts.actions;
> import java.util.Map;
> import javax.servlet.ServletException;
> import javax.servlet.http.HttpServletRequest;
> import javax.servlet.http.HttpServletResponse;
> import org.apache.struts.action.ActionForm;
> import org.apache.struts.action.ActionForward;
> import org.apache.struts.action.ActionMapping;
> /**
> * <p>
> * An abstract <strong>Action</strong> that dispatches to a
> * <strong>ActionForward</strong> defined in <code>struts-config.xml</code>.
> * This is useful in cases where an HTML form has multiple submit buttons
> with
> * the same name and you want to keep your Action classes fine grained.
> * The button name is specified by the <code>parameter</code>
> * property of the corresponding ActionMapping. To configure the use of this
> * action in your <code>struts-config.xml</code> file, create an entry like
> * this:</p> <pre>
> * <action path="/test"
> * type="org.example.MyAction"
> * name="MyForm"
> * scope="request"
> * input="/test.jsp"
> * parameter="method">
> * <forward name="add" path="/save.do" />
> * <forward name="delete" path="/delete.do" />
> * <action/>
> * </pre> <p>
> *
> * which will use the value of the request parameter named "method" to locate
> * the corresponding key in ApplicationResources. For example, you might have
> * the following ApplicationResources.properties:</p> <pre>
> * button.add=Add Record
> * button.delete=Delete Record
> * </pre><p>
> *
> * And your JSP would have the following format for submit buttons:</p> <pre>
> * <html:form action="/test">
> * <html:submit property="method">
> * <bean:message key="button.add"/>
> * </html:submit>
> * <html:submit property="method">
> * <bean:message key="button.delete"/>
> * </html:submit>
> * </html:form>
> * </pre> <p>
> *
> * Your subclass must implement both getKeyMethodMap and the forward
> configurations
> * should be defined in the struts-config.xml.
> * . An example of such implementations are:</p>
> * <pre>
> * protected Map getKeyMethodMap() {
> * Map map = new HashMap();
> * map.put("button.add", "add");
> * map.put("button.delete", "delete");
> * return map;
> * }
> * </pre>
> * <p>
> *
> * <strong>Notes</strong> - If duplicate values exist for the keys returned
> by
> * getKeys, only the first one found will be returned. If no corresponding
> key
> * is found then an exception will be thrown. You can override the
> * method <code>unspecified</code> to provide a custom handler. If the submit
> * was cancelled (a <code>html:cancel</code> button was pressed), the custom
> * handler <code>cancelled</code> will be used instead.
> *
> */
> public abstract class ForwardDispatchAction extends LookupDispatchAction {
> /**
> * Provides the mapping from resource key to ActionForward name.
> *
> * @return Resource key / ActionForward name map.
> */
> protected abstract Map getKeyForwardMap();
> /**
> * Implementation of abstract method for maximum reuse of
> * <strong>LookupDispatchAction</strong>.
> * @return Resource key / method name map.
> */
> protected Map getKeyMethodMap() {
> return getKeyForwardMap();
> }
>
> /**
> * Process the specified HTTP request, and create the corresponding HTTP
> * response (or forward to another web component that will create it).
> * Return an <code>ActionForward</code> instance describing where and how
> * control should be forwarded, or <code>null</code> if the response has
> * already been completed.
> *
> * @param mapping The ActionMapping used to select this instance
> * @param request The HTTP request we are processing
> * @param response The HTTP response we are creating
> * @param form The optional ActionForm bean for this request (if any)
> * @return Describes where and how control should be forwarded.
> * @exception Exception if an error occurs
> */
> public ActionForward execute(
> ActionMapping mapping,
> ActionForm form,
> HttpServletRequest request,
> HttpServletResponse response)
> throws Exception {
> if (isCancelled(request)) {
> ActionForward af = cancelled(mapping, form, request, response);
> if (af != null) {
> return af;
> }
> }
> // Identify the request parameter containing the method name
> String parameter = mapping.getParameter();
> if (parameter == null) {
> String message = messages.getMessage("dispatch.handler",
> mapping.getPath());
> throw new ServletException(message);
> }
> // Identify the string to lookup
> String forwardName = getMethodName(mapping, form, request, response,
> parameter);
> return mapping.findForward(forwardName);
> }
>
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.