• 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

      

           

  • 相关阅读:
    SVN配置文件详解
    让Linux开机运行命令
    find命令用法介绍
    关于js优化和css优化
    弹性盒布局、头尾固定中间部分自适应布局
    css样式重置(初始化)收集
    动态嵌套form,使用Stimulus Js库(前后端不分离)
    给Mac的Dictionary添加其他原装词典
    使用rvm关联ruby版本和rails版本。
    Rails6.0 Beta版本1: ActionText的简单使用
  • 原文地址:https://www.cnblogs.com/helloqiufei/p/10885029.html
Copyright © 2020-2023  润新知