Servlet是JavaWeb开发中最常使用的一个接口,尤其是这个接口中的doGet()和doPost()方法。我们在做web开发的时候,经常会自定义一个Servlet如HelloServlet,并且让这个类继承HttpServelt,接着重写doGet()方法就可以快速实现我们自己的请求服务。
那么doGet()方法的背后到底发生了什么?有些同学可能会说这个问题很简单啊,就是HttpServlet做了一次封装会判断HTTP请求的类型,如果是get请求就调用doGet()方法,如果是post请求就调用doPost()方法。
我们想要的并非这种简单的回答,而是探究这背后的背后究竟发生了什么?
HelloServlet ->HttpServlet->ApplicationFilterChain -> WsFilter -> StandardWrapperValve ->StandardContextValve -> StandardHostValve -> StandardEngineValve ->CoyoteAdapter -> Http11Processor -> NioEndpoint -> ThreadPoolExecutor-> Worker -> TaskThread -> Thread -> Catalina ->Bootstrap.main()
这才是最终我们想要得到的答案,从doGet方法开始,逐步的探究它开始的地方,最终这个开始的地方在什么地方结束呢?答案无疑是Tomcat程序启动的入口main函数。只有完成了这样的一个历程,我们才能说我们彻底明白了doGet()方法,彻底明白了这背后到底发送了什么。
通过本系列博客的阅读,您将彻底的了解doGet()方法背后发生了什么,从源码的角度深入的理解Tomcat的实现机制,Tomcat中各核心组件是如何协同工作的,同时也会学习到WEB服务器设计思路。
1目标
本系列博客源码分析的目标是深入了解Tomcat中doGet方法的实现机制。本次源码分析的目标是了解Servlet。
2分析方法
首先编写测试代码,然后利用Intellij Idea的堆栈窗口、线程窗口以及单步调试功能,逐步的分析其实现思路。
前期准备工作如下:1)编写HelloServlet类。public classHelloServletextendsHttpServlet {
@Overrideprotected voiddoGet(HttpServletRequestreq, HttpServletResponse resp)throwsServletException, IOException {
resp.getWriter().write("hello");//断点位置
}
}2) web.xml中添加servlet配置。
helloServletHelloServlethelloServlet/hello
3)测试运行
浏览器地址栏输入:http://localhost:8080/hello最终页面显示结果:hello