Servlet接口

Servlet

Servlet是一套规范,按照这套规范写的代码就可以直接在java服务器上运行。
先看一下Servlet的继承结构:
Servlet接口
Servlet接口

init方法在容器启动时被容器调用(当load-on-startup设置为负数或者不设置时会在servlet第一次用到时才被调用),只会调用一次;
getServletConfig 获取配置;
service用于处理一个请求;
getServletInfo获取Servlet的相关信息(作者,版权等),这个方法需要自己实现,默认返回空字符串;
destroy用于在Servlet销毁(一般指关闭服务器)时释放一些资源,只会调用一次;

init方法调用时的参数ServletConfig是容器传进去的,使用DI的方式在web.xml中配置,例如:
Servlet接口

看下ServletConfig接口:
Servlet接口
其中getServletContext方法很重要,它的返回值ServletContext代表的是应用本身。
既然ServletContext代表应用本身,那么ServletContext里面设置的参数就可以被当前应用的所有Servlet共享了。通常项目中的参数可以保存在session中也可以保存在Application之中,而后者很多时候就是保存在ServletContext之中。
可以参考这篇文章ServletContext

GenericServlet

GenericServlet是Servlet的默认实现,主要做了三件事:

  1. 实现了ServletConfig接口,可以直接调用ServletConfig之中的方法
    Servlet接口
    Servlet接口
  2. 提供了无参的init方法
    Servlet接口
    看下init(ServletConfig config)方法,在里面将config设置给了内部变量config,
    这样做就提供了第一点的好处,其次在我们写servlet的时候就可以只处理自己的初始化逻辑而不需要关心config了,还有就是重新了init方法就不需要调用super.init(),但是如果重写了带参数的init方法,那么一定要调用super.init(config)
  3. 提供了log方法
    Servlet接口
    最后说句废话GenericServlet是和协议无关的

HttpServlet

HttpServlet是用HTTP协议实现的Servlet的基类,写Servlet时直接继承它就可以了,Spring MVC之中的DispatchServlet就是继承的HttpServlet。
既然是协议相关的Servlet,主要关心的是如何处理请求,所以HttpServlet主要重写了service方法。在service方法之中首先将ServletRequest和ServletResponse转换为HttpServletRequest和HttpServletResponse,然后根据Http请求的类型不同将请求路由到不同的处理方法,代码如下:
Servlet接口
Servlet接口
Servlet接口