您的位置:首页 > 其它

Servlet生命周期,工作原理

2017-08-29 10:47 309 查看
Servlet 生命周期:Servlet 加载—>实例化—>服务—>销毁。

init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。

service():它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。

destroy():

仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。

Tomcat 与 Servlet 是如何工作的:



步骤:

Web Client 向Servlet容器(Tomcat)发出Http请求

Servlet容器接收Web Client的请求

Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中。

Servlet容器创建一个HttpResponse对象

Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数传给

HttpServlet 对象。

HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息。

HttpServlet调用HttpResponse对象的有关方法,生成响应数据。

Servlet容器把HttpServlet的响应结果传给Web Client。

Servlet工作原理:

首先简单解释一下
Servlet
接收和响应客户请求的过程,首先客户发送一个请求,
Servlet
是调用
service()
方法对请求进行响应的,通过源代码可见,
service()
方法中对请求的方式进行了匹配,选择调用
doGet,doPost
等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在
Servlet
接口和
GenericServlet
中是没有
doGet()、doPost()
等等这些方法的,
HttpServlet
中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个
Servlet
的时候,都必须实现
doGet
doPost
等这些方法。

每一个自定义的
Servlet
都必须实现
Servlet
的接口,
Servlet
接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的
init(),service(),destroy()
方法。
GenericServlet
是一个通用的,不特定于任何协议的Servlet,它实现了
Servlet
接口。而
HttpServlet
继承于
GenericServlet
,因此
HttpServlet
也实现了
Servlet
接口。所以我们定义
Servlet
的时候只需要继承
HttpServlet
即可。

Servlet
接口和
GenericServlet
是不特定于任何协议的,而
HttpServlet
是特定于
HTTP
协议的类,所以
HttpServlet
中实现了
service()
方法,并将请求
ServletRequest
ServletResponse
强转为
HttpRequest
HttpResponse


创建Servlet对象的时机:

Servlet容器启动时:读取web.xml配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,同时将ServletConfig对象作为参数来调用Servlet对象的init方法。

在Servlet容器启动后:客户首次向Servlet发出请求,Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有则创建它,然后根据客户的请求创建
HttpRequest
HttpResponse
对象,从而调用Servlet对象的service方法。

Servlet
容器在启动时自动创建Servlet,这是由在
web.xml
文件中为Servlet设置的
<load-on-startup>
属性决定的。从中我们也能看到同一个类型的Servlet对象在Servlet容器中以单例的形式存在。

<servlet>
<servlet-name>Init</servlet-name>
<servlet-class>org.xl.servlet.InitServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: