看了源码跟踪之后,得出如下结论,希望老师帮忙看下是否描述及处理位置正确,谢谢.
一、类的继承关系:
public class DispatcherServlet extends FrameworkServlet
|
public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware
|
public abstract class HttpServletBean extends HttpServlet implements EnvironmentCapable, EnvironmentAware
|
public abstract class javax.servlet.http.HttpServlet extends GenericServlet
|
public abstract class javax.servlet.GenericServlet implements Servlet, ServletConfig,
java.io.Serializable
|
public interface javax.servlet.Servlet
二、代码处理流程:
1. DispatcherServlet.java: doService()开始处理请求;
2. DispatcherServlet.java: getHandler() 遍历几种handler
3. AbstractHandlerMapping.java: getHandler() 获取处理类的实例
4. AbstractHandlerMapping.java: getHandler() 检查是否为跨域请求(检查代码: request.getHeader("Origin") != null;)
5. AbstractHandlerMethodMapping.java: lookupHandlerMethod()->实际是在addMatchingMappings()方法里获取请求url对应的Controller全限定类路径及返回参数及全限定方法名.
(例如(因代码过长,所以折行.):
public
java.util.List<xyz.suancaiyu.complexcontrollerdemo.model.Coffee>
xyz.suancaiyu.complexcontrollerdemo.controller.CoffeeController.getAll()
)
6. DispatcherServlet.java: doService()实际调用处理程序:mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
7. DispatcherServlet.java: doService()处理完成,并返回.
展开
作者回复: 额,你描述的太复杂了,我们还是抓大步骤。其实只需要顺着DispatcherServlet的doService方法看下去就OK了。如果有地方实在不知道是怎么走的,就在方法上打个断点,DEBUG到那里。