Servlet
项目结构
--web(项目名称)
--WEB-INF
--classes(编译后的java类)
--lib(存放运行时所需的jar包)
--web.xml(填写servlet相关信息)
--html
--css
--image
第一个servlet
-
在tomcat的webapp目录下创建一个文件,文件名就是项目名
-
创建以上目录结构,web.xml文件最好从其他地方复制,不要自己写
-
继承Jakarta.servlet.Servlet中的Servlet类
-
重写五个方法
import Jakarta.servlet.Servlet; public class HelloServlet implemts Servlet( ){ }
-
在service方法里面实现功能
IDEA 中创建javaweb项目
- 创建一个空项目
- 添加一个javase模块
- 添加web框架支持
- 项目结构----模块中添加依赖
- 创建一个类,继承servlet,然后在service方法中实现功能
- 添加tomcat
- 然后运行
Servlet对象的生命周期
- 什么是servlet对象生命周期?
servlet对象的生命周期表示:一个servlet对象从出生到最后的死亡,整个过程是怎样的。- servlet对象什么时候被创建
- servlet对象什么时候被销毁
- servlet对象创建了几个?
servlet对象是谁来维护的?
- servlet对象的创建、对象中方法的调用、对象的销毁,程序员是无法干预的。
- servlet对象的生命周期是由Tomcat服务器(web Server)全权负责的
- Tomcat服务器又称为:web容器(web container)。
- web容器来管理servlet对象的死活
思考:我们自己new的servlet对象受web容器的管理么?
- 不受
- web容器创建的servlet对象,这些servlet对象都会被放到一个集合当中(hash map),只有放到这个hash map集合中的servlet才能被web容器管理,自己new的servlet对象不会被web容器管理(自己new的servlet对象不在web容器内)
- web容器底层应该有一个hash map这样的集合,这个集合当中存储了servlet对象和请求路径之间的关系
服务器在启动的时候servlet对象有没有被创建出来(默认情况下)?
-
在servlet中提供一个无参数的构造方法,启动服务器时看构造方法是否执行
-
得出结论,默认情况下,服务器在启动的时候servlet对象并没有被创建
-
怎么让服务器启动的时候就启动servlet对象?
- 在servlet标签中加一个
标签,在标签中加一个整数,数字越小优先级越高。
- 在servlet标签中加一个
-
servlet对象生命周期
-
默认情况下,服务器启动的时候,servlet对象并没有被实例化
-
用户发送第一次请求的时候,控制台输出了以下内容
servlet无参数构造方法执行了 servlet init 方法执行了 servlet service 方法执行了
-
由此得出结论
- 用户在发送第一次请求的时候servlet对象被实例化(构造方法被执行了,并且执行的时无参数构造方法。
- servlet对象被创建出来之后,Tomcat服务器马上调用了servlet对象的init方法。(init方法在执行的时候,servlet对象已经存在了,已经被创建出来了)
- init方法执行之后,Tomcat服务器马上调用servlet对象的service方法。
-
用户继续发送请求,控制台输出以下内容
servlet service 方法执行了
-
由此得出结论,用户继续发送请求时,servlet对象并没有创建,还是使用之前创建好的servlet对象,直接调用该servlet对象的service方法,这说明:
- servlet对象是单例的(单实例。但是要注意:servlet对象是单实例的,但是servlet类并不符合单例模式,称为假单例)
- 无参数构造方法,init方法只在第一次用户发送请求的时候执行。
- 只要用户发送一次请求,service方法也必然会被toncat服务器调用一次。
-
关闭服务器时,控制台输出了以下内容
servlet destory 方法执行了
-
通过以上内容,可以得出以下结论
- servlet的destory方法只被tomcat调用一次
- 什么时候被调用?
- 在服务器关闭的时候
- 因为服务器关闭的时候要销毁servlet对象的内存
- 服务器在销毁servlet对象内存之前,tomcat服务器会自动调用servlet对象的destory方法
-
destory方法调用的时候,对象销毁了么?
- destory方法执行的时候,servlet对象还在,没有被销毁。destory方法执行结束之后,servlet对象的内存才会被tomcat释放。
-
-
tomcat创建实例时不会传入参数,所以使用的是无参数构造方法
- 如果编写一个有参数的构造方法,且没有手动编写无参数构造方法,那么服务器就会报错,所以不建议编写构造方法。
- 所以init方法有了存在的必要,将需要在创建时执行的程序写在init方法里面。
-
init,service,destory三种方法
- 使用最多的是service方法,service一定要实现,它是处理用户请求的核心
- init方法很少用,通常是初始化,并且这个初始化操作只需要执行一次,如:初始化数据库连接池、初始化线程池。
- destory方法也很少使用,通常是资源的关闭。对象马上被销毁了,有什么没保存的保存一下,没关闭的资源,关闭一下。
适配器设计模式
我们编写一个servlet类实现servlet接口时的缺点:我们只需要写一个service方法,其他方法大部分时间都不需要使用。
适配器设计模式Adapter
可以编写一个抽象通用标准的GenericServlet类,在其中重新其他不常用方法,然后抽象service方法,这样以后所有的servlet类都不再去实现Servlet接口了,只需要继承这个通用的GenericServlet类
GenericServlet就是一个适配器。
标签:web,生命周期,service,对象,Servlet,方法,改进,服务器,servlet From: https://www.cnblogs.com/winterqq/p/17041559.html