请求进入DispatcherServlet类,执行doService方法,doService方法中执行doDispatch方法:
1. 通过request对象获得对应的handler对象(网址和方法的映射存在在HandlerMapping中,通过request对象获得请求的网址,然后循环所有的handlerMapping对象(在一个List集合中),找到可以处理当前request的handler。如果网址啥也没传,也就是"/",循环结束后就会到下一个控制器:WelcomePageHandlerMapping,他会将请求转发到index.html中)
2. 通过handler找到适合当前handler的HandlerAdapter(handler适配器,也是通过循环查找一个List列表),找到后执行适配器的handle方法(这个方法执行request对应的handler对象的方法)
3. 获取方法的参数列表(存储在Object[]),然后依次调用对应的参数解析器(通过循环参数解析器列表找到可以处理改参数解析器)为其赋值 (参数解析器大部分对应的是标注了何种注解的参数,小部分对应的是何种“类型”(servlet API和复杂类型等等))。。
3.1 普通类型
3.2 复杂类型(例如Model、Map...):Map和Model找到对应的参数解析器,返回 BindingAwareModelMap对象(是Model也是Map),方法中操作的Map和Model都是在操作这个对象。
3.3 自定义类型:ServletModelAttributeMethodProcessor参数解析器可以处理,先创建一个空的自定义类型对象,创建WebDataBinder(web数据绑定器)对象,给自定义类型对象的每个属性赋值(从request中获取,获取的都是字符串,调用不同的类型转换器(循环查找)把字符串转变为适合的类型)
4. 方法结束后数据会被放在ModelAndView(包含了要去往的页面和数据等等)中,并把所有的数据放入一个Map,再从Map放入request请求域中(通过循环),之后去渲染对应的页面。