zoukankan      html  css  js  c++  java
  • springMVC源码学习之获取参数名

    1.入口到参数处理调用流程

    入口为spring-webmvc-4.3.18.RELEASE.jar中org.springframework.web.servlet.DispatcherServlet.doService(request,respose)

    --》doDispatch(request, response)

    --》ha.handle

    --》org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal()

    --》invokeHandlerMethod()

    --》invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);//将parameterNameDiscoverer对象值赋给org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod父类org.springframework.web.method.support.InvocableHandlerMethod.parameterNameDiscoverer对象invocableMethod.parameterNameDiscoverer。

    2.取request中参数流程

    当处理request时RequestMappingHandlerAdapter.invokeHandlerMethod()调用org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle()调用父类org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest()调用getMethodArgumentValues()取到request中的对应参数值

    3.初始化parameterNameDiscoverer流程及源码

    以下为初始化org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.parameterNameDiscoverer流程

    --》 private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();

    --》spring-core-4.3.18.jar org.springframework.core.DefaultParameterNameDiscoverer();

    -->spring-core-4.3.18.jar org.springframework.core.PrioritizedParameterNameDiscoverer.addDiscoverer(new org.springframework.core.StandardReflectionParameterNameDiscoverer() extends ParameterNameDiscoverer)

    {

      List<ParameterNameDiscoverer> parameterNameDiscoverers.add(ParameterNameDiscoverer pnd)

    }

    //-->spring-core-4.3.18.jar org.springframework.core.MethodParameters.initParameterNameDiscovery()

     

     

    在org.springframework.core.ParameterNameDiscoverer.getParameterNames(Method method)

    -->org.springframework.core.StandardReflectionParameterNameDiscoverer.getParameterNames(Method method)

    package org.springframework.core;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    import java.lang.reflect.Parameter;
    import org.springframework.lang.UsesJava8;
    
    @UsesJava8
    public class StandardReflectionParameterNameDiscoverer
      implements ParameterNameDiscoverer
    {
      public String[] getParameterNames(Method method)
      {
        Parameter[] parameters = method.getParameters();//利用java8的新特性来取参数名
        String[] parameterNames = new String[parameters.length];
        for (int i = 0; i < parameters.length; ++i) {
          Parameter param = parameters[i];
          if (!(param.isNamePresent()))
            return null;
    
          parameterNames[i] = param.getName();
        }
        return parameterNames;
      }
    
      public String[] getParameterNames(Constructor<?> ctor)
      {
        Parameter[] parameters = ctor.getParameters();
        String[] parameterNames = new String[parameters.length];
        for (int i = 0; i < parameters.length; ++i) {
          Parameter param = parameters[i];
          if (!(param.isNamePresent()))
            return null;
    
          parameterNames[i] = param.getName();
        }
        return parameterNames;
      }
    }
  • 相关阅读:
    2019安徽省程序设计竞赛 I.你的名字(序列自动机)
    poj3522Slim Span(暴力+Kruskal)
    Uva1349Optimal Bus Route Design(二分图最佳完美匹配)(最小值)
    基于Python的Web应用开发实战——3 Web表单
    [nRF51822]5.触摸按键
    [nRF51822]4.GPIO控制蜂鸣器
    [nRF51822]3. GPIO输入按键检测
    [nRF51822]2. 跑马灯
    [nRF51822]1. 点亮一个LED
    [nRF51822]0.nRF51822的开发环境
  • 原文地址:https://www.cnblogs.com/pu20065226/p/10178437.html
Copyright © 2011-2022 走看看