当前位置: 代码迷 >> Java Web开发 >> struts2流程简单有关问题(小弟我是菜鸟)
  详细解决方案

struts2流程简单有关问题(小弟我是菜鸟)

热度:245   发布时间:2016-04-17 10:22:39.0
struts2流程简单问题(我是初学者)
1、ConfigurationManager 存有配置文件的一些基本信息,ActionMapper存有action的配置信息。
2、过滤器会通过询问ActionMapper类来查找请求中需要用到的Action。
3、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类。
我想问一下这三句话是不是正确的,如果正确那第一句话的意思就是ConfigurationManager是读取struts.properties,ActionMapper是读取struts.xml。那第三句ActionProxy怎么能是通过ConfigurationManager找到需要调用的Action类呢,干嘛不通过ActionMapper找到需要调用的Action类??

------解决方案--------------------
DefaultActionInvocation下invokeAction方法:
Java code
   protected String invokeAction(Object action, ActionConfig actionConfig) throws Exception {        String methodName = proxy.getMethod();        if (LOG.isDebugEnabled()) {            LOG.debug("Executing action method = " + actionConfig.getMethodName());        }        String timerKey = "invokeAction: "+proxy.getActionName();        try {            UtilTimerStack.push(timerKey);                        Method method;            try {                method = getAction().getClass().getMethod(methodName, new Class[0]);            } catch (NoSuchMethodException e) {                // hmm -- OK, try doXxx instead                try {                    String altMethodName = "do" + methodName.substring(0, 1).toUpperCase() + methodName.substring(1);                    method = getAction().getClass().getMethod(altMethodName, new Class[0]);                } catch (NoSuchMethodException e1) {                    // throw the original one                    throw e;                }            }            Object methodResult = null;            if (action instanceof Proxy) {                try {                    methodResult = Proxy.getInvocationHandler(action).invoke(action, method, new Object[0]);                } catch (Throwable throwable) {                    throwable.printStackTrace();                    throw new Exception("Error invoking on proxy: " + throwable.getMessage());                }            } else {                methodResult = method.invoke(action, new Object[0]);            }            if (methodResult instanceof Result) {                this.result = (Result) methodResult;                return null;            } else {                return (String) methodResult;            }        } catch (NoSuchMethodException e) {            throw new IllegalArgumentException("The " + methodName + "() is not defined in action " + getAction().getClass() + "");        } catch (InvocationTargetException e) {            // We try to return the source exception.            Throwable t = e.getTargetException();            if (actionEventListener != null) {                String result = actionEventListener.handleException(t, getStack());                if (result != null) {                    return result;                }            }            if (t instanceof Exception) {                throw(Exception) t;            } else {                throw e;            }        } finally {            UtilTimerStack.pop(timerKey);        }    }
  相关解决方案