struts 2 source code of workflow

 

           

1)      Login.execute() line: 28

2)      DefaultActionInvocation.invokeAction(Object, ActionConfig) line: 452 

3)      DefaultActionInvocation.invokeActionOnly() line: 291  

4)      DefaultActionInvocation.invoke() line: 254       

5)      liasInterceptor.intercept(ActionInvocation) line: 190      

6)      DefaultActionInvocation.invoke() line: 248       

7)      ExceptionMappingInterceptor.intercept(ActionInvocation) line: 187      

8)      DefaultActionInvocation.invoke() line: 248       

9)      StrutsActionProxy.execute() line: 52     

10)  Dispatcher.serviceAction(HttpServletRequest, HttpServletResponse, ServletContext, ActionMapping) line: 485

11)  ExecuteOperations.executeAction(HttpServletRequest, HttpServletResponse, ActionMapping) line: 77 

12)  StrutsPrepareAndExecuteFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 91 

 

 

 

 

 

 

 

1) StrutsPrepareAndExecuteFilter

 

 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

 

        HttpServletRequest request = (HttpServletRequest) req;

        HttpServletResponse response = (HttpServletResponse) res;

 

        try {

            prepare.setEncodingAndLocale(request, response);

            prepare.createActionContext(request, response);

            prepare.assignDispatcherToThread();

                  if ( excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) {

                        chain.doFilter(request, response);

                  } else {

                        request = prepare.wrapRequest(request);

                        ActionMapping mapping = prepare.findActionMapping(request, response, true);

                        if (mapping == null) {

                              boolean handled = execute.executeStaticResourceRequest(request, response);

                              if (!handled) {

                                    chain.doFilter(request, response);

                              }

                        } else {

                              execute.executeAction(request, response, mapping);

                        }

                  }

        } finally {

            prepare.cleanupRequest(request);

        }

}

 

 

2) ExecuteOperations

 

public void executeAction(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) throws ServletException {

        dispatcher.serviceAction(request, response, servletContext, mapping);

    }

 

 

 

 

 

3) dispatcher

 

 

 

 

public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context,

                              ActionMapping mapping) throws ServletException {

 

        Map<String, Object> extraContext = createContextMap(request, response, mapping, context);

 

        // If there was a previous value stack, then create a new copy and pass it in to be used by the new Action

        ValueStack stack = (ValueStack) request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);

        boolean nullStack = stack == null;

        if (nullStack) {

            ActionContext ctx = ActionContext.getContext();

            if (ctx != null) {

                stack = ctx.getValueStack();

            }

        }

        if (stack != null) {

            extraContext.put(ActionContext.VALUE_STACK, valueStackFactory.createValueStack(stack));

        }

 

        String timerKey = "Handling request from Dispatcher";

        try {

            UtilTimerStack.push(timerKey);

            String namespace = mapping.getNamespace();

            String name = mapping.getName();

            String method = mapping.getMethod();

 

            Configuration config = configurationManager.getConfiguration();

            ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(

                    namespace, name, method, extraContext, true, false);

 

            request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack());

 

            // if the ActionMapping says to go straight to a result, do it!

            if (mapping.getResult() != null) {

                Result result = mapping.getResult();

                result.execute(proxy.getInvocation());

            } else {

                proxy.execute();

            }

 

            // If there was a previous value stack then set it back onto the request

            if (!nullStack) {

                request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, stack);

            }

        } catch (ConfigurationException e) {

            // WW-2874 Only log error if in devMode

            if(devMode) {

                String reqStr = request.getRequestURI();

                if (request.getQueryString() != null) {

                    reqStr = reqStr + "?" + request.getQueryString();

                }

                LOG.error("Could not find action or result/n" + reqStr, e);

            }

            else {

                  LOG.warn("Could not find action or result", e);

            }

            sendError(request, response, context, HttpServletResponse.SC_NOT_FOUND, e);

        } catch (Exception e) {

            sendError(request, response, context, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e);

        } finally {

            UtilTimerStack.pop(timerKey);

        }

    }

 

 

 

 

 

4) StrutsActionProxy

 

public String execute() throws Exception {

        ActionContext previous = ActionContext.getContext();

        ActionContext.setContext(invocation.getInvocationContext());

        try {

// This is for the new API:

//            return RequestContextImpl.callInContext(invocation, new Callable<String>() {

//                public String call() throws Exception {

//                    return invocation.invoke();

//                }

//            });

           

            return invocation.invoke();

        } finally {

            if (cleanupContext)

                ActionContext.setContext(previous);

        }

}

 

 

5) DefaultActionInvocation

 

 

 

 

 

 

 

 

 

public String invoke() throws Exception {

        String profileKey = "invoke: ";

        try {

            UtilTimerStack.push(profileKey);

 

            if (executed) {

                throw new IllegalStateException("Action has already executed");

            }

 

            if (interceptors.hasNext()) {

                final InterceptorMapping interceptor = (InterceptorMapping) interceptors.next();

                String interceptorMsg = "interceptor: " + interceptor.getName();

                UtilTimerStack.push(interceptorMsg);

                try {

                                resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);

                            }

                finally {

                    UtilTimerStack.pop(interceptorMsg);

                }

            } else {

                resultCode = invokeActionOnly();

            }

 

            // this is needed because the result will be executed, then control will return to the Interceptor, which will

            // return above and flow through again

            if (!executed) {

                if (preResultListeners != null) {

                    for (Object preResultListener : preResultListeners) {

                        PreResultListener listener = (PreResultListener) preResultListener;

 

                        String _profileKey = "preResultListener: ";

                        try {

                            UtilTimerStack.push(_profileKey);

                            listener.beforeResult(this, resultCode);

                        }

                        finally {

                            UtilTimerStack.pop(_profileKey);

                        }

                    }

                }

 

                // now execute the result, if we're supposed to

                if (proxy.getExecuteResult()) {

                    executeResult();

                }

 

                executed = true;

            }

 

            return resultCode;

        }

        finally {

            UtilTimerStack.pop(profileKey);

        }

}

 

 

 

    public String invokeActionOnly() throws Exception {

        return invokeAction(getAction(), proxy.getConfig());

    }

 

 

 

 

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);

 

            boolean methodCalled = false;

            Object methodResult = null;

            Method method = null;

            try {

                method = getAction().getClass().getMethod(methodName, EMPTY_CLASS_ARRAY);

            } 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, EMPTY_CLASS_ARRAY);

                } catch (NoSuchMethodException e1) {

                    // well, give the unknown handler a shot

                    if (unknownHandlerManager.hasUnknownHandlers()) {

                        try {

                            methodResult = unknownHandlerManager.handleUnknownMethod(action, methodName);

                            methodCalled = true;

                        } catch (NoSuchMethodException e2) {

                            // throw the original one

                            throw e;

                        }

                    } else {

                        throw e;

                    }

                }

            }

 

            if (!methodCalled) {

                methodResult = method.invoke(action, new Object[0]);

            }

 

            if (methodResult instanceof Result) {

                this.explicitResult = (Result) methodResult;

 

                // Wire the result automatically

                container.inject(explicitResult);

                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);

        }

    }

 

6) Login

 

    public String execute() throws Exception {

 

        if (isInvalid(getUsername())) return INPUT;

 

        if (isInvalid(getPassword())) return INPUT;

 

        return SUCCESS;

 

 

 

    }

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值