Servet工作原理和生命周期详解

   Servlet的工作原理和生命周期:
   Servlet是一个基于java技术的web组件,用来扩展以请求/响应为模型的服务器的能力。          Servlet与平台无关,可以被编译成字节码。Servlet被容器管理,能别编译成字节码被web服务器调用,容器也被称之为引擎,是支持Servlet功能的web服务的扩展,Servlet之间的通信是通过客户端请求被容器执行成request/response对象进行的。
    Servlet容器是web服务器或应用服务器的一部分,服务器能够支持网络的请求/响应,基于请求解析MIME,基于响应格式化MIME。Servlet容器是Servlet的运行环境,管理和维护Servlet的整个生命周期,Servlet容器必须支持HTTP协议,负责处理客户请求,把请求传递给适当的Servlet并把结果返回给客户;
    在介绍Servlet具体工作流程之前,我觉得很有必要理解以下几个概念,说真的,我自己之前就没有搞清楚,刚才的百度加上自己的理解,如下:
    (1)web定义:是运行在互联网上的一种服务,它以网页的形式让浏览者获取信息;
    (2)Apache的定义是Web server,即web服务器,web服务器是指能够为发出请求的浏览器提供文档的程序,只有浏览器发出请求的时候才会响应,应用层使用的是HTTP协议。而web容器是一种服务器程序,在服务器端口就有一个提供相应服务的程序。一个服务器可以有多个容器。
    (3)Tomcat是一个提供支持Servlet/JSP运行的web容器,产生动态网页内容,也能为静态网页提供支持。
    (4)对于web服务器而言,Apache仅仅支持静态网页,对于支持动态网页就会显得苍白无力;
     (5)如果要在Apache环境下运行JSP的话就需要一个解释器来执行JSP网页,而这个解释器就是Tomcat;而因为JSP连接数据库的话就需要JDK来提供连接数据库的驱程。所以要运行JSP的web服务器平台就需要Apache+Tomcat+JDK;
     (6)一般来说,大的站点都是Tomcat+Apache的结合,Apache接收所有来自客户端的HTTP请求,如果客户端请求的是静态页面,则只需要Apache服务器响应请求,如果客户端请求动态页面,则是Tomcat服务器响应请求;所以可以说Tomcat既是容器,也是web服务器,它可以独立于Apache运行;可以这么类比:Apache是一辆卡车,上面可以装一些东西如HTML等,但是不能装水,要是装水的话必须要桶(容器),而这个桶也可以不放在卡车上。
    具体工作流程如下:
    1,客户端(如客户机的web浏览器)向服务器发起一个Http请求;
    2,web服务器接收该请求,检测是否是html静态页面,则直接将静态页面返回给浏览器;如果不是Html静态页面,则会转交给Servlet容器来处理,Servlet容器查询所需要加载的JSP文件是否已经被解析成Servlet文件,如果没有,则根据该JSP文件新创建一个Servlet文件,当然如果直接是java类(例如是继承HttpServlet类的Java类)则就不需要解析这个过程了。。反之,如果容器里面有此Servlet文件,则比较两者的时间,如果JSP文件的时间要晚于servlet文件,说明此JSP文件已经被修改过,需要容器重新生成Servlet文件,反之容器将使用原先的Servlet文件。
    3,容器编译好的Servlet文件被加载到Servlet容器中,执行文件里面的各项操作;
    4,Servlet容器生成响应结果,并以HTML的形式返回给客户端;
    Servlet生命周期:
       (1),装载Servlet在下列情形下:Servlet容器加载servlet;Servlet容器启动时自动加载某些servlet;在Servlet容器启动时,客户端首次向Servlet发出请求;Servlet的类文件被更新后,重新加载servlet;
       (2),实例化一个Servlet实例对象(即为该对象分配一块内存空间);
       (3),调用init()方法进行初始化;
       (4),服务。容器收到该Servlet请求,调用该Servlet对象的service()方法处理请求;
       (5)卸载。当服务器不再需要该Servlet对象的时候,服务器调用destroy()方法卸载该Servlet,并释放Servlet运行时占用的资源;当多个客户请求一个Servlet时,引擎为每一个客户启动一个线程,Servlet的成员变量被所有的线程共享,而init()方法只有第一次被请求加载时被调用一次,当有客户再来请求服务时,web服务器将启动一个新的线程,在该线程中,调用service()方法响应客户的请求。

你可能感兴趣的:(apache,tomcat,jsp,Web,servlet)