探索servlet机制(生命周期)

探索servlet实现机制

2.1 servlet继承家族以及家族成员做了什么事情?

要想拥有一个servlet,需要创建一个类继承HttPServlet,重写方法

2.2 导入源码【Tomcat文档】

在继承的类名【例:HttpServlet】上右击,点击Open Declaration;进入一个类,有一个按钮 attach source–点击弹出一个窗体,有两个选项:

  • workspace location–到工作区间下找
  • extrenal location–到其他目录下找

选择到其他目录下找,可以导入文件或者文件夹【压缩包即可】。

文档下载(https://tomcat.apache.org/download-80.cgi#8.5.73)【Tomcat V8.5.73】

2.3 HttpServlet

是一个抽象类。

做的事情:

  • 定义常量–存储HTTP请求方法
  • 定义方法:–方法不被允许的时候,显示的信息
    • doget()等每一个请求都定义了对应的处理方法
    • service() --根据提交请求的方式调用对应的doXX()方法
  • HttpServlet继承了GenericServlet
2.4 HttpServlet的父类——GenericServlet

也是一个抽象类。

做的事情:

  • 定义常量获取ServletConfig对象
  • 定义方法
    • destroy() --servlet销毁的时候
    • getInitParameter(String name) --获取初始化参数
    • getServletConfig() --获取ServletConfig对象
    • getServletContext() --获取上下文对象
    • init(getServletConfig config) --获取初始化参数
    • abstract void service(HttpServletRequest req, HttpServletResponse resp) --被子类使用
  • 实现了三个接口:Servlet、ServletConfig、Serializable
2.5 顶层接口:Servlet、ServletConfig、Serializable
  • Servlet
    • 定义了servlet相关方法的规范
      • init() --初始化
      • destory() --销毁
      • service() --业务实现过程
  • ServletConfig
    • getServletName() --获取servlet名字
    • getServletContext() --获取上下文对象
    • getInitParameter(String name) --获取初始化参数
  • Serializable:序列化 --存储Servlet对象
2.6 初始化参数和获取Servlet名字

①获取名字

​ getServletName();

②获取初始化参数:解决的问题固定化的数据

​ getInitParamrter(String name);

在web.xml中,当前servlet进行配置。

<servlet>
	<servlet-name>LoginServlet</servlet-name>
	<servlet-class>pers.wcs.login1215.servlet.LoginServlet</servlet-class>
	<init-param>
		<param-name>mytime</param-name>
		<param-value>7</param-value>
	</init-param>
</servlet>
<servlet-mapping>
	<servlet-name>LoginServlet</servlet-name>
	<url-pattern>/login</url-pattern>
</servlet-mapping>

注意:初始化参数配置给哪个servlet,name只有对应的servlet可以获取(排他性)。

3. servlet生命周期【探索servlet的执行过程】

创建一个新的servlet [CycleLifeServlet]。

准备方法:
  • 构造方法() --创建对象
  • init() --初始化
  • destory() --销毁
  • service() --业务处理
  • doXX() --实际处理业务
开始测试<多方位测试>:

运行过程:

  1. 首先调用构造方法 --创建对象

  2. 其次调用init方法–初始化一些新信息

  3. 再次调用service方法–处理业务

    ​ 如果没有重写service方法,调用的是和提交请求对应的doXX()方法。

  4. 最后服务器正常关闭,调用destory方法–销毁servlet

探索问题:
重写了service方法 --提交的所有请求–直接调用service方法 --不去调用doXX方法;
没有重写service方法的时候 --直接调用对应的doXX方法接收请求处理业务。

出现以上问题的原因分析:

重写service方法 --直接调用service方法;

没有重写service方法 --其实是调用了HttpServlet中的service方法,然后根据提交请求的方式调用对应的doXX方法。

在这里插入图片描述

4. Servlet总结

在我们第一次加载servlet的时候,创建一个servlet对象,整个业务过程中servlet对象只有一个,是一个单例。多线程访问:单实例多线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值