您的位置:首页 > 编程语言 > Java开发

JAVA反射在STRUTS中的应用

2007-07-11 11:58 323 查看
struts中ACTION调用正常情况:

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

doXX();//某个动作的处理

return mapping.findForward("success");

}

 反射机制:

1:STRUTS 动作处理ACTION类

public class RegAction extends  BaseAction {

 // --------------------------------------------------------- Instance Variables

 // --------------------------------------------------------- Methods

 /**
  * Method execute
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return ActionForward
  */
 public ActionForward execute(
  ActionMapping mapping,
  ActionForm form,
  HttpServletRequest request,
  HttpServletResponse response) throws Exception{
  RegForm regForm = (RegForm) form;
  
  // TODO Auto-generated method stub
  String action = null;
  if (request.getParameter("type") == "query") {/////动态传递的参数
            action = "query";
        } else if (request.getParameter("type").equalsIgnoreCase("excelExport")) {{/////动态传递的参数

            action = "excelExport";
        }
        else
  {
         action="action3";{/////动态传递的参数

         request.setAttribute("type",request.getParameter("type"));
  }
     //Object[] params1 = {request};
     Object[] params = {regForm, request};
     String forword = this.dispatchSubAction(action, params);///这里通过反射方法dispatchSubAction动态调用子ACTION动作,在BASEACTION中定义

//        return mapping.findForward("success");
        return loggedFindForward(mapping, forword);
 }
  public String query(ActionForm form,HttpServletRequest request)
  {

  doXX1();
   return "success";
  }

  public String excelExport(ActionForm form,HttpServletRequest request)
  {

  doXX2();
   return "failure";
  }
  public String action3(ActionForm form,HttpServletRequest request)
  {

  doXX3();
   return "action3";
  }

}

 

 2:BASEACTION

public class BaseAction extends ActionSupport {
    protected transient final Log logger = LogFactory.getLog(getClass());

    protected final Map methods = getMethodMap();
   
    public BaseAction() {
        super();
    }

    /** 初始化时反射子类自身的结构, 形成一个映射, 用来日后dispatchSubaction.
     * @return 存放了methods对象的Map
     */
    protected Map getMethodMap() {
        Method[] methods = this.getClass().getDeclaredMethods();
        Map map = new HashMap();
        for (int i = 0; i < methods.length; i++) {
            map.put(methods[i].getName(), methods[i]);
        }
        return map;
    }

        /** 将Action转移给子动作.
     * 在子类中调用时,只需要新建一个Object[] {参数1, 参数2, ...} 一般为 {form, request, dao}
     * 然后调用dispatchSubAction(String, objects) 即可
     */
    protected String dispatchSubAction(String action, Object[] objs) throws Exception {

        if (logger.isDebugEnabled()) logger.debug(">> 调用子动作 [" + action + "]");
        if(action==null||action.equals("")||action.length()==0)
            return "success";

        try {
            String forward = (String) ((Method) methods.get(action)).invoke(this, objs);
            if(logger.isDebugEnabled()) logger.debug("<< 调用子动作结束 [" + action + "], 返回 [" + forward + "]");
            return forward;
        } catch (NullPointerException ne) {
            throw new java.lang.IllegalArgumentException("没有找到子动作[" + action + "]对应的方法");
        } catch (Exception e) {
            logger.error("<<<<< 调用子动作失败 [" + action + "], 详细情况如下:");
            if(e.getCause()!=null) {
                e.getCause().printStackTrace();
                throw (Exception) e.getCause();
            } else {
                e.printStackTrace();
                throw e;
            }
        }
    }

    protected ActionForward loggedFindForward(ActionMapping mapping, String forward) {
        return mapping.findForward(forward);
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息