servlet 深入了解

servlet  作用

在Java web b/s架构中,servlet扮演了重要的角色,作为一个中转处理的容器,他连接了客户端和服务器端的信息交互和处理。简单来说,客户端发送请求,传递到servlet容器,而servlet将数据转换成服务器端可以处理的数据再发送给服务器端,再数据处理之后,再传递到servlet容器,servlet再转译到客户端,完成了一次客户端和服务器端的信息交互。

首先我们要理清一个逻辑:浏览器http请求------》tomcat服务器-------》到达servlet-----》执行doget,dopost方法----》返回数据

        从这个逻辑可以看出tomcat才是和客户端打交道的:

               他监听了端口,请求过来后,根据url信息和web.xml配置文件匹配,确定要将请求交给哪个servlet去处理,servlet处理请求然后返回给tomcat,tomcat在把数据返回给用户。

servlet  的实例化

如果没有设置loadOnStartup,则第一次请求的时候实例化

分三种情况:
loadOnStartup < 0 
即负数的情况下,web容器启动的时候不做实例化处理,servlet首次被调用时做实例化
这种情况和没有设置loadOnStartup是一样的。
loadOnStartup > 0
web容器启动的时候做实例化处理,顺序是由小到大,正整数小的先被实例化
loadOnStartup = 0
web容器启动的时候做实例化处理,相当于是最大整数,因此web容器启动时,最后被实例化

servlet实例化 解惑

本来一直以为 servlet是在容器启动的时候就实例化的,可是后来仔细想过,如果有1千个servlet,那服务器启动的时候就要实例化一千个类,那就是要在内存(堆中)中创建一千个对象,一次创建这么多对象,对于内存(堆中)而言负载量相当的大,有可能就会出现《内存溢出》的异常,所以后来想想,应该是在请求的时候才去实例化的吧,这样的话,对于容器而言不用启动的时候就加载那么多东西,感觉这就是请求时才加载的根本原因吧,纯属个人见解,希望各位有不同见解的提出来,大家一起讨论。

servlet 销毁 解惑

jdk api 的定义

destroy方法在容器移除servlet 时执行,同样只执行一次。这个方法会在所有的线程的service()方法执行完成或者超时后执行,调用这个方法后,容器不会再调用这个servlet的方法,也就是说容器不再把请求发送给这个servlet。这个方法给servlet释放占用的资源的机会,通常用来执行一些清理任务

Servlet容器停止或者重新启动:Servlet容器调用Servlet对象的destroy方法来释放资源

引用1            以下是jt   198952 在csdn上的原帖

 http://blog.csdn.net/jt198952/article/details/5656130

大多数程序员都知道Servlet的生命周期,简单的概括这就分为四步:servlet类加载--->实例化--->服务--->销毁。对这个过程只是肤浅了解下,对于servlet何时被销毁,还是不太情楚。下面我们描述一下Tomcat与Servlet是如何工作的,首先看下面的时序图.

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

2、Servlet容器接收Web Client的请求

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

4、Servlet容器创建一个HttpResponse对象

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

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

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

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

对于Servlet容器(Tomcat)与HttpServlet是怎样进行交互的呢,看下类图

Servlet的框架是由两个Java包组成的:javax.servlet与javax.servlet.http。在javax.servlet包中定义了所有的Servlet类都必须实现或者扩展的通用接口和类。在javax.servlet.http包中定义了采用Http协议通信的HttpServlet类。Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这个接口。

在Servlet接口中定义了5个方法,

其中3个方法代表了Servlet的生命周期:

1、init方法:负责初始化Servlet对象。

2、service方法:负责响应客户的请求。

3、destroy方法:当Servlet对象退出生命周期时,负责释放占用的资源。

一、创建Servlet对象的时机

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

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

3、Servlet的类文件被更新后,重新创建ServletServlet容器在启动时自动创建Servlet,这是由在web.xml文件中为Servlet设置的<load-on-startup>属性决定

的。从中我们也能看到同一个类型的Servlet对象在Servlet容器中以单例的形式存在。

二、销毁Servlet对象的时机

1、Servlet容器停止或者重新启动:Servlet容器调用Servlet对象的destroy方法来释放资源。以上所讲的就是Servlet对象的生命周期。那么Servlet容器如何知道创建哪一个Servlet对象?

Servlet对象如何配置?实际上这些信息是通过读取web.xml配置文件来实现的。

我们来看一下web.xml文件中的Servlet对象的配置节信息

-------------------------------------------

<servlet>

<servlet-name>action<servlet-name>

<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

<init-param>

<param-name>config</param-name>

<param-value>/WEB-INF/struts-config.xml</param-value>

</init-param>

<init-param>

<param-name>detail</param-name>

<param-value>2</param-value>

</init-param>

<init-param>

<param-name>debug</param-name>

<param-value>2</param-value>

</init-param>

<load-on-startup>2</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>action</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

--------------------------------------------

下面对上面的配置节信息进行解析

servlet-name:Servlet对象的名称

servlet-class:创建Servlet对象所要调用的类

param-name:参数名称

param-value:参数值

load-on-startup:Servlet容器启动时加载Servlet对象的顺序

servlet-mapping/servlet-name:要与servlet中的servlet-name配置节内容对应

url-pattern:客户访问的Servlet的相对URL路径

个人理解:

前提:我们之前创建的servlet 实例狭义的来说就是一个接口的实现类,广义的来说就是。。。。。

     servlet 容器有很多,之前我们接触tomcat 里面的context 容器实质上就是一个servlet 容器

servlet 容器是工作流程:

            1.  读取配置文件web.xml 文件(这个文件里面还有其他部分的配置信息)中的servlet的配置信息 

------》 2.  根据 servlet 的配置信息添加到 servlet 容器中配置文件中  (具体放在哪个文件中,不清楚),即将servlet的类和url请求关系存入, 以备后面http请求来之后的对应查找

-------》3. 当http请求来, servlet 容器会创建httprequest 对象, 将webclient 的请求信息封装在对象中

-------》4. servlet 容器创建httpresponse 对象,用于将服务器处理后的结果封装在这个对象之中,然后返回到客户端

-------》5. servlet 容器判断处理当前请求的servlet 实例是否被创建,如果没有创建则创建对应实例

-------》6. servlet 容器调用 servlet实体类的service()方法,并将httprequest, httpresponse 对象作为传递参数

--------》7. servlet对象 根据httprequest 对象获取http请求信息

--------》 8. servlet对象 根据httpresponse 对象,生成响应信息

--------》 9. servlet 容器将servlet 对象生成的响应信息返回到web client

  

       

原文地址:https://www.cnblogs.com/helloqiufei/p/10885029.html