以动态代理模式看Action的执行流程
//PrepareOperations是执行前准备的所有操作的包装类PrepareOperations prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);//ExecuteOperations是执行Action过程所有操作的包装类ExecuteOperations execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher);//包装request为StrutsRequestWrapper对象request = prepare.wrapRequest(request);//创建ActionMapping对象ActionMapping mapping = prepare.findActionMapping(request, response, true);*/*ActonMapping{name = "login",extension = "action",namespace = "/",result = "null",method = "null";}*///执行Actionexecute.executeAction(request, response, mapping);//在executeAction中调用Dispatcher的serviceAction方法public void executeAction(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) throws ServletException {dispatcher.serviceAction(request, response, servletContext, mapping);}//在Dispatcher的serviceAction方法创建ActionProxy对象public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context,ActionMapping mapping) throws ServletException {Map<String, Object> extraContext = createContextMap(request, response, mapping, context);String namespace = mapping.getNamespace(); // "/"String name = mapping.getName(); // "login"String method = mapping.getMethod(); // "null"//获取得配置文件的Configuration对象Configuration config = configurationManager.getConfiguration();//利用ActionProxy的工厂类ActionProxyFactory创建StrutsActionProxy对象 ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy( namespace, name, method, extraContext, true, false);/*ActionProxy{actionName = "login",method = "execute",//由configurationManager解析配置文件获取invocation = DefaultActionInvocation{Action:LoginAction,//由configurationManager解析配置文件获取interceptors:Iterator<InterceptorMapping> //defaultStack中Interceptor });}*/proxy.execute();}//在ActionProxy的execute方法调用invocation的invoke方法 public String execute() throws Exception {return invocation.invoke();}//ActionInvocation的invoke方法public String invoke() throws Exception {//循环应用defaultStack中的拦截器if (interceptors.hasNext()) {final InterceptorMapping interceptor = interceptors.next();resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);} else { //Invokes only the Action (not Interceptors or Results),result the resultCode.resultCode = invokeActionOnly(); }}//ActionInvocation的invokeActionOnly方法public String invokeActionOnly() throws Exception { return invokeAction(getAction(), proxy.getConfig()); }}//ActionInvocation的 invokeAction方法 protected String invokeAction(Object action, ActionConfig actionConfig) throws Exception { String methodName = proxy.getMethod(); //使用反射调用execute方法 Method method = getAction().getClass().getMethod(altMethodName, new class[]{}); String methodResult = method.invoke(action, new Object[]{}); return saveResult(actionConfig, methodResult); }
?
?
?