论述Servlet的生命周期

先来总结下上一篇的内容:浏览器和服务器进行数据的交互过程!

整体上看

1、用户通过浏览器输入请求地址(URL)后,服务器给出一个默认响应页在浏览器上展示。
2、用户再次进行输入数据(如注册、或者点击页面等)。服务器再根据用户请求做出对应的响应。

具体过程:①接收请求  ②返回响应
①、接收请求过程:

1、用户访问localhost:8080/project/login.html请求被发送到服务器Tomcat。

2、Connector监听到8080端口并处理 HTTP/1.1 协议,然后交给Engine处理。

3、Engine匹配所有名为localhost的虚拟主机Host,若没有匹配到,则匹配默认的虚拟主机defaultHost。

4、匹配到的虚拟主机Host会根据URL中的/project去找webapps目录下的文件名为project的目录。

5、在该目录中获取响应页等资源。如index.xml或则index.jsp.

6、
① 若用户输入(http://www.baidu.com),没有输入其他请求数据。
则服务器会把 响应页 返回给浏览器进行展示,等待用户进一步提交数据。
② 若输入(http://www.baidu.com/s?wd=天猫),则会在Servlet中进行对应逻辑处理。(如校验啊什么的。此处是直接跳到天猫关键字搜索页面)

②返回响应过程:

7、Context把执行完之后的结果通过HttpServletResponse对象返回给Host。
8、Host把HttpServletResponse返回给Engine。
9、Engine把HttpServletResponse对象返回Connector。
10、Connector把HttpServletResponse对象返回给客户Browser。

Servlet

Servlet是实现了Servlet接口的类。
我们每创建一个Servlet对象,就得在web.xml中配置一下。如何配置?如下图:

每创建一个新的Servlet对象,就得手动配置一次!!!
这是WEB—INF目录下的web.xml文件!
<servlet>
        <servlet-name>myservlet</servlet-name>
        <servlet-class>com.controller.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
        <servlet-name>myservlet</servlet-name>
        <url-pattern>/dologin</url-pattern>
</servlet-mapping>

Servlet的生命周期

关键技术:XML解析 + 反射

Servlet的生命周期是由容器进行管理的,分别经历五个阶段。

  • ① 类加载
  • ② new :实例化
  • ③ init():初始化
  • ④ service():执行服务
  • ⑤ destroy():回收销毁

① 当客户端浏览器第一次请求Servlet时,Servlet容器会实例化这个Servlet,然后调用一次init方法,并在新的线程中执行service方法处理请求。
② service方法执行完毕后,容器不会销毁这个Servlet,而是做缓存处理,当客户端浏览器再次请求这个Servlet时,容器会从缓存中直接找到这个Servlet对象,并再一次在新的线程中执行Service方法。
③ 当容器在销毁Servlet之前,会调用一次destory方法。

入口:客户端发起请求:http://127.0.0.1:8080/myservlet1/servlet/LifeServlet

1.类加载的过程

(1) 截取url中的servlet路径:/servlet/LifeServlet
(2) 在web.xml中查找的值是/servlet/LifeServlet,找不到,404 路径错误.
(3) 找到了,根据找对应的,发现是LifeServlet
(4) 在 寻找 是LifeServlet
(5) 找到后,查找同级,得到值“com.servlet.LifeServlet”。
(6) 获取类对象Class clazz = Class.forName(“com.servlet.LifeServlet”);

2. 创建Servlet对象(实例化)
	//new LifeServlet();
	Object obj = clazz.newInstance();  使用反射来创建对象
3. 调用init()
	Method m1 = clazz.getMethod("init",ServletConfig.class); 

通过反射执行方法
m1.invoke(obj,config);

4. 调用service()
Method m2 = 
clazz.getMethod("service",ServletRequest.class,ServletResponse.class);
m2.invoke(obj,request,response);  通过反射执行方法

(会去调用子类重写的service方法或者doGet/doPost方法)

5. 调用destroy()
	Method m3 = clazz.getMethod("destory")  通过反射执行方法
  	m3.invoke(obj);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值