标签:通过 不可移植 不同的 用户 重写 请求方法 参数 get 对象
一、servlet的生命周期:
Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。
(1)加载:容器通过类加载器使用servlet类对应的文件加载servlet
(2)创建:通过调用servlet构造函数创建一个servlet对象【第二步和第三步可以算是同时执行,所以也可以说:一旦加载某个servlet,服务器就会调用它的init()方法进行初始化】
(3)初始化:调用init方法初始化【servlet生命的起点。】
(4)处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求(service())
(5)卸载:调用destroy方法让servlet自己释放其占用的资源【servlet生命的终点。】
PS:Servlet是线程不安全的,在Servlet类中可能会定义共享的类变量,这样在并发的多线程访问的情况下,不同的线程对成员变量的修改会引发错误。
二、servlet service
1)service()是在servlet生命周期中的服务期,默认在HttpServlet类中实现,所有的请求均首先由service()进行处理,根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法实现。
2)service()是在javax.servlet.Servlet接口中定义的,在javax.servlet.GenericServlet中实现了这个接口(其实应该说是在HttpServlet进行了实现的)。GenericServlet抽象类给出了设计servlet的一些骨架,定义了servlet生命周期还有一些得到名字、配置、初始化参数的方法,但其设计的是和应用层协议无关的。而doGet/doPost与http协议有关,是在 javax.servlet.http.HttpServlet 中实现的。
三、servlet的体系结构
体系结构:
Servlet:接口
|(实现)
GenericServlet:抽象类,定义一个通用的,独立于底层协议的servlet
|(实现)
HttpServlet:抽象类
|(实现)
自定义servlet #多数Servlet通过从GenericServlet或HttpServlet类进行扩展来实现
servlet常用方法:
1)void init(ServletConfig config):初始化
2)void service(ServletRequest request,ServletResponse response):服务 处理业务逻辑
3)void destroy():销毁
4)ServletConfig:接口定义了在Servlet初始化的过程中由Servlet容器传递给Servlet得配置信息对象(又getServletConfig()完成)
GenericServlet常用方法:
1)除了service()没有,其他都实现了
2)空参的Init():若我们自己想对servlet进行初始化操作,重写这个init()方法即可
HttpServlet常用方法:
1)service()做了实现,把参数强转,调用了重载的service方法
2)重载的service方法获取请求的方式,根据请求方式的不同调用相应doGet和doPost方法
四、servlet和CGI(common gateway interface,通用网关接口)的比较:
1)当用户浏览器发出一个Http/CGI的请求,每个进程只为一个客户所服务,导致服务器内存和cpu开销大。而Servlet充分发挥了服务器端的资源并高效的利用。每次调用Servlet时并不是新启用一个进程,每个请求会产生新的线程,减少系统中进程数量,并发处理能力强。多个客户能在同一个进程中的同时得到服务。
2)CGI主要用Perl,shell script或C编写,而servlet用java语言编写。
3)CGI进程在服务完成后就被销毁,所以效率上低于servlet;servlet进程(实例)处于服务进程中,只有在服务器被卸载时才会被卸载。
4)CGI是不可移植的,是运行在特定平台上的,而servlet是可移植的,运行在JVM上的。
5)servlet有连接池的概念,可以利用多线程的优点,在系统缓存中事先建立好若干与数据库的连接,到时候若想和数据库打交道可以随时跟系统要连接就行,反应速度快。
标签:通过 不可移植 不同的 用户 重写 请求方法 参数 get 对象
原文地址:https://www.cnblogs.com/yangrongkuan/p/12024950.html