servlet的定义:服务器上运行的小程序。servlet和jsp的关系呢?jsp经过编译后成为了servlet,jvm只能识别java的类,不能识别jsp,所以jsp的本质就是servlet。这里跟大家说说servlet的生命周期和工作原理

       servlet的生命周期:初始化--->服务--->销毁

  1.  初始化时Servlet容器装载Servlet:

  • Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的<Servlet></Servlet>之间添加如下代码从中我们也能看到同一个类型的Servlet对象在Servlet容器中以单例的形式存在。
    
    <servlet>
            <servlet-name>Init</servlet-name>
            <servlet-class>org.xl.servlet.InitServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
    </servlet>
    
    

  • 在Servlet容器启动后,客户首次向Servlet发送请求
  • Servlet类文件被更新后,重新装载Servlet

  Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。

  2.服务阶段调用service()方法,它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。

  3. 销毁阶段调用destory()方法,当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。


工作原理

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

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

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

public void service(ServletRequest req,ServletResponse res)
  throws ServletException,IOException
{
      HttpRequest request;
      HttpResponse response;
 
     try
     {
         req = (HttpRequest)request;
         res = (HttpResponse)response;
      }catch(ClassCastException e)
      {
         throw new ServletException("non-HTTP request response");
      }
      service(request,response);
}
    代码的最后调用了HTTPServlet自己的service(request,response)方法

下面是一个servlet工作的流程:

      

步骤:客户端向servlet容器发送请求,然后servlet容器创建httprequest对象和httpresponse对象,然后调用httpservice的service()方法,获取request和response参数的值,servlet容器最后把响应结果传给客户端。

        总结:在web.xml文件中,某些Servlet只有<serlvet>元素,没有<servlet-mapping>元素,这样我们无法通过url的方式访问这些Servlet,这种Servlet通常会在<servlet>元素中配置一个<load-on-startup>子元素,让容器在启动的时候自动加载这些Servlet并调用init()方法,完成一些全局性的初始化工作。然后调用service()方法处理业务流程,最后将结果返回客户端,释放资源。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐