zoukankan      html  css  js  c++  java
  • Servlet的生命周期

    一、servlet生命周期

    1、  Web容器加载servlet类

    2、  初始化servlet对象(构造函数运行)

    3、  servlet调用init()方法(servlet一生只调用一次,在容器调用service()方法之前完成)

    4、  调用service方法(处理客户请求doGet(),doPost()方法,每个请求都在一个单独的线程中运行)

    5、  调用destroy(),容器调用这个方法,从而在servlet被垃圾回收之前有机会回收资源与init()方法一样,也只能调用一次。

    二、servlet的体系结构

    servlet接口,init(),service()和destory()方法是生命周期方法。

    GenericServlet 是一个抽象类,它实现了Servlet接口,实现了大部分基本的servlet方法

    public abstract class GenericServlet implements Servlet, ServletConfig,java.io.Serializable

    HttpServlet 也是一个抽象类继承GenericServlet,主要实现了一个service方法来处理http的请求与响应。

    public abstract class HttpServlet extends GenericServlet 

    最后写一个自己的servlet来继承HttpServlet.

    三、请求与响应

    public interface HttpServletRequest extends ServletRequest 

    public interface HttpServletResponse extends ServletResponse

    这些都由容器来实现 HttpServletRequest方法与http有关,如cookie,head和session会话,响应也一样。

    四、ServletConfig

    容器初始化一个servlet时,会为这个servlet建一个唯一的ServletConfig。容器从部署文件"web.xml"读取servlet初始化参数,并把这个参数交给ServletConfig,然后把ServletConfig传递给servlet的init(ServletConfig config)方法。servlet初始化参数只读一次,就是在容器初始化servlet的时候。

    @Override
    public void init(ServletConfig config) throws ServletException {
      this.config = config;
      this.init();
    }

    从GenericServlet的init()方法可以看出servlet中的getServletConfig是在初始化的时候创建的,在构造函数时还没有ServletConfig对象,所以在构造函数中不能调用关于ServletConfig对象的方法,如:getInitParameter(),getInitParameterNames()等。

    我们使用init()方法只需覆盖无参的方法,因为继承的init(ServletConfig config)方法会自动调用覆盖的无参的init()方法

    五、ServletContext

    ServletContext指的是servlet整个应用的上下文,是由ServletConfig对象得到的。每个Servlet可以得到ServletContext,并且获得上下文初始化参数。

    @Override
    public ServletContext getServletContext() {
    return getServletConfig().getServletContext();
    }

    <context-param>
      <param-name>email</param-name>
      <param-value>aa@163.com</param-value>
    </context-param>

    总结;每个servlet有一个ServletConfig,而整个web应用有一个ServletContext。如果应用是分布式应用,每个jvm有一个ServletContext。可以将初始化参数认为是部署时常量。

  • 相关阅读:
    Retrofit/Okhttp API接口加固技术实践(上)
    浅析C#中的结构体和类
    iOS中 支付宝钱包具体解释/第三方支付 韩俊强的博客
    Java并发之volatile二
    dynamic initializer和全局变量
    二叉树转换成森林&amp;森林变成二叉树
    这才是真正的裸眼3D!超级震撼!!
    每一个开发人员都应该有一款自己的App
    Hibernate HQL的使用
    我的Android进阶之旅------&gt;Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
  • 原文地址:https://www.cnblogs.com/chenxiaocai/p/5277589.html
Copyright © 2011-2022 走看看