You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@struts.apache.org by "Michael Jouravlev (JIRA)" <ji...@apache.org> on 2006/08/28 21:28:31 UTC
[jira] Closed: (STR-1464) Server side solution for DispatchAction
and
[ http://issues.apache.org/struts/browse/STR-1464?page=all ]
Michael Jouravlev closed STR-1464.
----------------------------------
Resolution: Won't Fix
Assignee: (was: Struts Developers)
Struts 1.2.9+ provides ways to solve the issues related to this bug. Use EventDispatchAction. Closing with "Won't Fix".
> Server side solution for DispatchAction and <input type="image" .../>
> ---------------------------------------------------------------------
>
> Key: STR-1464
> URL: http://issues.apache.org/struts/browse/STR-1464
> Project: Struts 1
> Issue Type: Improvement
> Components: Extras
> Affects Versions: Future
> Environment: Operating System: other
> Platform: Other
> Reporter: Robert Taylor
> Priority: Minor
>
> I posted to the list a while back to see if Struts/anyone had a server side
> solution for using DispatchAction and forms with images as submit buttons.
> http://www.mail-archive.com/struts-user@jakarta.apache.org/msg33005.html
> From what I have read a common solution is to use Javascript to set a hidden
> parameter whose name is defined in the action elements parameter attribute.
> I haven't found that Struts or any extension supports a server side
> solution.
> In any case, I went ahead and extend the functionality of DispathAction to
> solve this problem and called it ImageButtonDispatchAction. It allows you
> to defined a comma delimited list of method names in the action element
> parameter attribute. When invoked, it will iterate over that list and
> return the first match found in the request parameter map.
> I've posted the code below and would be interested in any feedback.
> If there is already a known server side solution for this, I would still
> be interested.
> robert
> <code>
> package org.apache.struts.actions;
> import java.util.StringTokenizer;
> import java.util.Map;
> import java.util.logging.Logger;
> import javax.servlet.ServletException;
> import javax.servlet.http.HttpServletRequest;
> import javax.servlet.http.HttpServletResponse;
> import org.apache.struts.action.Action;
> import org.apache.struts.action.ActionForm;
> import org.apache.struts.action.ActionForward;
> import org.apache.struts.action.ActionMapping;
> import org.apache.struts.actions.DispatchAction;
> /**
> * <code>ImageButtonDispatchAction</code>
> *
> * When a form is submitted using one or many
> * <input name="buttonName" type="submit" .../>
> * then the button name/value that was clicked is sent to
> * the server. Using the normal DispatchAction, an Action
> * parameter identifies the parameter name under which this
> * operation will be identified.
> *
> * When a form is submitted using one or many
> * <input name="buttonName" type="image" src="" .../> then
> * the button names/values that was clicked is sent to the
> * server. The difference is that there are two names and two
> * values sent to the server for the single button that
> * was clicked; buttonName.x and buttonName.y both exist in
> * the request along with their corresponding x-y coordinate
> * values. It becomes evident that the x-y coordinates provide
> * no value in helping to determine which operation to invoke
> * but it is the actual buttonName.x or buttonName.y that hints
> * to the operation to invoke.
> *
> * One solution to this problem is to use Javascript on the client
> * and set a hidden parameter value with the appropriate operation
> * to be invoked based on which input button was selected. This
> * presents an obvious problem if the client has Javascript disabled.
> *
> * <code>ImageButtonDispatchAction</code> solves this problem on the
> * server side. It gets the mutually exclusive list (comma delimited)
> * of operations to be invoked from the action elements parameter
> * attribute and sequentially looks for each operation name in the
> * request parameter map. If found, it stops searching and returns
> * the operation name to be invoked.
> *
> *
> * @author Robert Taylor <rt...@mulework.com>
> * @version $Revision: 1.4 $ $Date: 2003/02/28 18:44:07 $
> */
> public class ImageButtonDispatchAction
> extends DispatchAction {
> private static Logger logger = Logger.getLogger(
> ImageButtonDispatchAction.class.getName());
> private static final String DELIM = ",";
> private static final String IMAGE_ID = ".x";
> /**
> * 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 form The optional ActionForm bean for this request (if any)
> * @param request The HTTP request we are processing
> * @param response The HTTP response we are creating
> *
> * @exception Exception if an exception occurs
> */
> public ActionForward execute(ActionMapping mapping,
> ActionForm form,
> HttpServletRequest request,
> HttpServletResponse response)
> throws Exception {
> // Identify the request parameter containing the method name
> String parameter = mapping.getParameter();
> if (parameter == null) {
> String message =
> messages.getMessage("dispatch.handler", mapping.getPath());
> log.error(message);
> response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
> message);
> return (null);
> }
> // Identify the method name to be dispatched to.
> // dispatchMethod() will call unspecified() if name is null
> //String name = request.getParameter(parameter);
> String name = getOperation(parameter, request);
> // Invoke the named method, and return the result
> return dispatchMethod(mapping, form, request, response, name);
> }
> /**
> * Return the operation name to be invoked if found
> * in the request
> *
> * @param parameter the mapping.getParameter() value
> * @param request contains the parameter map
> * @return the operation name to be invoked or null
> * if none is found.
> * @exception throws NullPointerException if parameter
> * or request is null.
> */
> public static String getOperation(String parameter, HttpServletRequest
> request) {
> String operation = null;
> StringTokenizer st = new StringTokenizer(parameter, DELIM);
> Map parameterMap = request.getParameterMap();
> boolean found = false;
> StringBuffer buf = new StringBuffer(100);
> /*
> * Iterate through parameters and
> * look for a match in the request
> */
> while (!found && st.hasMoreTokens()) {
> String temp = st.nextToken().trim();
> buf.setLength(0);
> buf.append(temp).append(IMAGE_ID);
> found = parameterMap.containsKey(buf.toString());
> if (found) {
> operation = temp;
> }
> }
> return operation;
> }
> }
> </code>
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/struts/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira