Servlet

Posted by 余腾 on 2019-03-10
Estimated Reading Time 6 Minutes
Words 1.6k In Total
Viewed Times

Servlet —— Web 开发的基石

Servlet 容器 可以创建Servlet。并且负责Servlet和客户的通信,以及调用Servlet生命周期的方法。

  • 运行 Servlet、JSP、Filter的软件环境。


Servlet容器响应客户请求的过程

  • ①、Servlet引擎检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
  • ②、装载并创建该Servlet的一个实例对象:调用该Servlet的构造器。
  • ③、调用Servlet实 例对象的init()方法。
  • ④、创建一个用于封装请求的ServletRequest对象和一个代表响应消息的ServletResponse对象
    • 然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
  • ⑤、WEB应 用程序被停止或重新启动之前, Servlet引擎将卸载Servlet ,并在卸载之前调用Servlet的destroy()方法。


Servlet的生命周期

  • Servlet 是一个接口,一个类如果实现了该接口,要实现 Servlet接口的方法。容器是通过Java的反射API来创建Servlet实例。

    • 一般继承 HttpServlet 类 ,覆盖 doGet、doPost类 针对 HTTP 协议 定制
    • GenericServlet(一个抽象类) service为抽象方法
  • Servlet 运行在Servlet容器中,其生命周期由容器来管理,容器调用生命周期方法。

    • (Tomcat服务器就是Servlet容器)

  • Servlet的生命周期通过javax.servlet.Servlet接口中
    • Servlet 构造器
    • init(ServletConfig config)
    • service(ServletRequest req, ServletResponse res)
      • doGet()、doPost方法() (实际的业务处理流程,service根据客户端的请求类型来自动匹配需要执行那个方法)
    • destroy()


  • Web服务器在与客户端交互时Servlet的工作过程是:
    • 1、在客户端对web服务器发出请求
    • 2、web服务器接收到请求后将其发送给Servlet
    • 3、Servlet容器为此产生一个实例对象并调用ServletAPI中相应的方法来对客户端HTTP请求进行处理,然后将处理的响应结果返回给WEB服务器。
    • 4、 web服务器将从Servlet实例对象中收到的响应结构发送回客户端。

Servlet 构造器

  • 在Servlet的生命周期中,只被调用一次。只有第一次请求Servlet时,创建 Servlet 实例,调用构造器。(Servlet 是单实例)
  • 每个Servlet类必须有一个公共的无参数的构造器。

init()方法

  • 在Servlet的生命周期中,仅执行一次init()方法。在创建好 Servlet 实例立即被调用、用于初始化Servlet。Servlet 处于“已初始化”状态。
  • 它是在服务器装入 Servlet 时执行的,也可以配置服务器,以在启动服务器 当前 WEB应用被 Servlet 容器加载时创建实例。
    • < load-on-statup>1< /load-on-statup> 可以指定 Servlet 被创建的时机。(值越小 先启动)
  • 无论有多少客户机访问Servlet,都不会重复执行init();
  • 在初始化期间,如果发生错误,Servlet实例可以抛出以下异常:
    • ServletException 异常 一般初始化失败(没有找到参数) Servlet 对象将会被垃圾回收器回收。
    • UnavailableException 异常用于通知容器该Servlet实例不可用。(数据库服务器没有启动,数据库连接无法建立)。

service() 方法

  • 被多次调用。
  • Servlet的核心,每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用。
  • 而且服务器传递给这个方法一个”请求”(ServletRequest)对象和一个”响应”(ServletResponse)对象作为参数。

ServletRequest 封装了请求信息,可以从中获取任何的请求信息。

  • String getParameter(String name);:根据请求参数的名字,返回参数值。
  • String[] getParameterValues (String name);:根据请求参数的名字,返回请求参数对应的字符串数组。
  • Map getParameterMap();:返回请求参数的键值对。key:参数名,value:参数值。Sting 数组类型。
  • Enumeration getParameterNames();

ServletResponse: 封装了响应信息。

  • PrintWriter out = response.getWriter();

destroy()方法

  • 该方法在整个生命周期中,只会被调用一次,在服务器端停止且卸载Servlet 所在WEB应用 之前执行该方法。
    • 在servlet中,我们可以做一些资源的释放等操作,执行destory方法之后的servlet对象,会等待jvm虚拟机的垃圾回收机制择时回收。

Servlet 注册进web.xml

  • ServletConfig 从Web应用程序的配置信息(在web.xml中配置)中获取初始化的参数信息。
    • ServletConfig 对象封装了Servlet的配置信息 并且可以获取 ServletContext 对象。
    • ServletConfig.getInitParameter(String name):获取指定参数名的初始化参数。
    • ServletConfig.getInitParameterNames():获取参数名组成的 Enumeration 对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>

(当前Servlet 局部参数)
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>

<load-on-startup></load-on-startup>
</servlet>

//可以有多个 <servlet-mapping> 与之匹配
<servlet-mapping>
<servlet-name></servlet-name>
//两种方式 通配符 *.do 或者 /* 。 不合法 ——>/*.action
<url-pattern></url-pattern>
</servlet-mapping>

ServletContext

  • ServletContext context = ServletConfig.getServletContext();
  • 一个WEB应用程序中的所有Service共享同一个 ServletContext 对象。可以获取到当前WEB应用的各个方面的信息。所以被称为Application对象。
    • 获取当前 WEB 应用的初始化参数 context.getInitParameter(String name);
    • 获取当前 WEB 应用的某一个文件在服务器上的绝对路径 context.getRealPath(String path);
    • 获取当前 WEB 应用的某一个文件对应的输入流 context.getResourceAsStream(String path); path 的 / 为当前WEB的根目录。
    • 获取当前 WEB 应用的名称 context.getContextPath();
      1
      2
      3
      4
      5
      (全局参数)
      <context-param>
      <param-name></param-name>
      <param-value></param-value>
      </context-param>

HTTP

  • WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议。
  • HTTP是hypertext transfer protocol (超文本传输协议)的简写,它是TCP/IP协议集中的一个应用层协议。
    • 用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数据本身的格式。
    • HTTP协议的版本 HTTP/1.0、HTTP/1.1、 HTTP-NG

HTTP 会话方式

Servlet 3.0

感谢阅读


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !