struts中自定义DispatchAction

       使用struts 框架中 DispatchAction 的时候 如果不小心将 execute 方法重写了就会发现 DispatchAction不起作用.了.我个人认为这应该算是struts框架的一个小小的bug .我们可以利用java的反射机制自定义 DispatchAction来解决这一问题.

代码:

struts-config.xml:

 <action
      attribute="calculateForm"
      input="/calculate.jsp"
      name="calculateForm"
      path="/calculate"
      parameter="op"
      scope="request"
      type="com.cao.struts.action.CalculateAction" >
      <forward name="success" path="/ok.jsp" />
    </action>

类代码:

package com.cao.struts;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

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;
import org.apache.struts.actions.DispatchAction;

public class MyDispatchAction extends DispatchAction {
 
 public final  ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request ,HttpServletResponse response){
  String op  =  request.getParameter("op");//获取方法名。
  Class cal = this.getClass();  //得到类对象
  Object forward = null;
  try {
   Method method =  this.getMethod(op);
   forward = method.invoke(this, new Object[]{mapping,form,request,response});//反射调用方法
   
  } catch (Exception e) {
   e.printStackTrace();
  }
 
  if(forward!=null){
   return (ActionForward)forward;
  }  
  return null;

 }

}

 

通过上面的类 使自己的Action从 MyDispatchAction 继承.就可以 由于该类中的 execute方法是final 的所以子类是不可能覆盖的.

posted @ 2008-04-01 09:29  shine_panda  阅读(136)  评论(0编辑  收藏  举报