手写“迷你Tomcat”能让我们更好的理解Servlet的生命周期:
皮浪养的一只猪:Java学习之手写Tomcat“迷你汤姆猫”zhuanlan.zhihu.comServlet的执行流程:
我们拿一个自己创建的LifeServlet来举例说明
关键技术:XML解析 + 反射
*
* 入口:客户端浏览器url地址栏发起请求:http://127.0.0.1:8080/myservlet1/servlet/LifeServlet访问
*
* 1.类加载
0.通过解析xml文件得到对应的数据
* 1.截取url中的servlet路径:/servlet/LifeServlet
* 2.在web.xml中查找<url-pattern>的值是/servlet/LifeServlet
* 找不到,404 路径错误
* 3.找到了,根据<url-pattern>找对应的<servlet-name>,发现是LifeServlet
* 4.在 <servlet>寻找<servlet-name> 是LifeServlet
* 5.找到后,查找同级的<servlet-class>,并得到值“com.bjsxt.servlet.LifeServlet”
* 6.Class clazz = Class.forName(“com.bjsxt.servlet.LifeServlet”);
*
* 2. 创建Servlet对象(实例化)
* //new LifeServlet();
* Object obj = clazz.newInstance(); 使用反射来创建对象
* 3.调用init(),初始化方法
* Method m1 = clazz.getMethod("init"); 通过反射执行方法
* m1.invoke(obj);
* 4.调用service(),真正做事的方法
* Method m2 = clazz.getMethod("service",ServletRequest.class,ServletResponse.class)
* m2.invoke(obj,request,response); 通过反射执行方法
*
* 5.调用destroy(),servlet销毁的方法,当服务器关闭的时候销毁 servlet,触发 destroy 方法的执行
* Method m3 = clazz.getMethod("destory") 通过反射执行方法
* m3.invoke(obj);
问题1:xml是什么东东?
可扩展标签语言
和HTML的相同点:都是标签语言
不同点 : 1.html的标签含义都是固定的,xml中标签是自定义的
2.作用不同:html是网页内容,有浏览器解释展示的。xml主要用来存储数据的(开发中常用来存储配置信息)
3.html语法不严格,xml是严格语法的。
问题2:何时加载Servlet类?
情况1:客户端发起对该Servlet的请求 (懒加载),(第一次)
情况2:项目启动的时候自动加载 (非懒加载)
<load-on-startup>0</load-on-startup>
问题3:doGet()和doPost() 与service()关系?
* service() 根据用户请求的类型的不同,调用相应的方法
* get请求----doGet()
* post请求----doPost()
如下图,这是之前手写“迷你Tom猫”的时候的那个抽象servlet
总结:还得再复习手写“迷你Tom猫”的知识,让servlet学的更好,加油!!!