Craig,

Last week, there was a thread labelled: "Minimizing Action class proliferation". I 
think you were on your brief "no list access" hiatus. :)

Below is the long-and-short of a proposed enhancement to Struts that could optionally 
be used by developers if they are so inclined. The only piece missing from this is a 
proposed change to the "action" XML elemen to include a "handler" or "method" 
attribute. This would be used as the first parameter to the "class.getMethod" call in 
the code below.

I won't regurgitate the whole thread here. I was just wondering if you had any 
thoughts on this?

Thanks,

Donnie


>>> [EMAIL PROTECTED] 03/07/01 10:05PM >>>
Donnie,

How about this as an alternative. I have created a subclass of Action called
StandardAction which uses reflection to invoke a method with the same name
as the "actions" path (defined in the struts-config.xml file). So all you
have to do is extend the Standard action and implement methods that
correspond to the paths that use it.

For example if you define three actions in your struts-config.xml file of
/saveOrder, /editOrder and /deleteOrder that all use a class OrderAction
which extends StandardAction and then create a OrderAction class as shown
below:

I hope this is of use.

Niall


--------------Example of StandardAction implementation-----------

public class OrderAction extends StandardAction{

  public ActionForward saveOrder(ActionMapping mapping,
                               ActionForm form,
                               HttpServletRequest request,
                               HttpServletResponse response) {


  }
  public ActionForward editOrder(ActionMapping mapping,
                               ActionForm form,
                               HttpServletRequest request,
                               HttpServletResponse response) {


  }
  public ActionForward deleteOrder(ActionMapping mapping,
                               ActionForm form,
                               HttpServletRequest request,
                               HttpServletResponse response) {


  }
}

-------------------------------StandardAction Class-----------
package nkp;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

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 java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;

/**
 * @author Niall Pemberton
 * @version 1.0
 */

public abstract class StandardAction  extends Action {

  public ActionForward perform(ActionMapping mapping,
                               ActionForm form,
                               HttpServletRequest request,
                               HttpServletResponse response) {


    // Determine the method name to call (based on the path without the "/")
    String methodName = mapping.getPath().substring(1);

    // Get the method with the same name as the path
    Class cls = this.getClass();
    Method method = null;
    try {
      method = cls.getMethod(methodName, new Class[] {ActionMapping.class,
                                                      ActionForm.class,

HttpServletRequest.class,

HttpServletResponse.class});
    }
    catch (NoSuchMethodException ex) {
      servlet.log("Method "+methodName+" not found in class
"+this.toString());
    }

    // Invoke the Method
    Object obj = null;
    try {
      obj = method.invoke(this, new Object[] {mapping, form, request,
response});
    }
    catch (InvocationTargetException etargEx) {
      servlet.log("Error Involing Method
"+methodName+"(InvocationTargetException) "+this.toString());
    }
    catch (IllegalAccessException illEx) {
      servlet.log("Error Involing Method
"+methodName+"(IllegalAccessException) "+this.toString());
    }
    ActionForward actionForward = (ActionForward)obj;

    // Forward control to the specified success URI
    return actionForward;
  }
}

Reply via email to