前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring技术知识点总结之五——Servlet 生命周期

Spring技术知识点总结之五——Servlet 生命周期

作者头像
剑影啸清寒
发布2020-07-10 11:20:46
5050
发布2020-07-10 11:20:46
举报
文章被收录于专栏:琦小虾的Binary琦小虾的Binary

接上篇《Spring技术知识点总结之四——Spring Bean 的生命周期》

五. Servlet 生命周期

参考地址:《什么是Servlet(原理,从访问到方法)》

Servlet 是 SUN 公司提供的一种用于开发动态 WEB 资源的技术,SUN 公司在其 API 中提供了一个 Servlet 接口。如果用户想要开发一个 Java Web 服务,需要完成两个步骤:

  1. 编写一个实现了 Servlet 接口的 Java 类;
  2. 将该 Java 类放到 Servlet 容器中(通常是 Tomcat);

通常我们写好的实现了 Servlet 接口的 Java 程序就称为 Servlet,它的路径在 %{TOMCAT_HOME}$/webapp/应用名/WEB_INF/classes/ 下。

5.1 Servlet 生命周期

Servlet 主要有三个接口:init(), service(), destroy();Servlet 生命周期可以分为 5 个步骤:

  1. 加载 Servlet;当 Tomcat 第一次访问 Servlet 的时候,Tomcat 负责创建 Servlet 的实例;
    • 只有第一次访问 Servlet 时会创建 Servlet 实例,第一次之后就会检查已经装载了的该 Servlet 实例对象;
  2. 初始化:当 Servlet 实例化时,Tomcat 调用 init() 方法初始化对象;
  3. 执行服务:接收浏览器传来的请求,调用 service() 方法处理请求并返回响应;
    • service() 方法通常是开发者需要重新实现的方法;
  4. 销毁 Servlet:当 Tomcat 关闭,或者检测到 Servlet 要从 Tomcat 中删除时,调用 Servlet 的 destroy() 接口,释放该 Servlet 实例占的资源;
  5. 卸载:Servlet 调用 destroy() 方法后等待垃圾回收。

在三个主要接口中,只要访问 Servlet,service() 方法就会被调用;init() 方法只有第一次访问 Servlet 的时候才会被调用;destroy() 方法只有在 Tomcat 关闭销毁时才会被调用。

5.2 Servlet 的配置

配置 Servlet 时,我们需要将 Servlet 所用 Jar 包加载到 classpath 路径下,然后在 WEB-INF 目录中新建一个 web.xml 文件,配置 Servlet 对外访问路径。web.xml 文件中配置 Servlet 主要需要两个标签:servlet, servlet-mapping

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1">
  
  <!-- Servlet 名称与实现类信息 -->
  <servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispathcerServlet</servlet-class>
  </servlet>
  
  <!-- Servlet 名称与 URL 映射 -->
  <servlet-mapping>
    <!-- 与前文的 servlet 名称匹配 -->
    <servlet-name>DispatcherServlet</servlet-name>
    <!-- URL 映射路径 -->
    <url-pattern>/home</url-pattern>
  </servlet-mapping>
</web-app>

由于浏览器客户端是通过 URL 地址访问 Web 服务器的资源,所以 Servlet 程序如果想被外界访问,必须将 Servlet 程序映射到 URL 地址上。

servlet 元素用于注册 Servlet,它包含有两个主要的子元素:servlet-name 和 servlet-class,分别用于设置 Servlet 的注册名称和 Servlet 的完整类名。一个 servlet-mapping 元素用于映射一个已注册的 Servlet 的一个对外访问路径,它包含有两个子元素:servlet-name 和 url-pattern,分别用于指定 Servlet 的注册名称和 Servlet 的对外访问路径。

5.3 Servlet 的实现

通常开发人员不会实现 Servlet 接口内容,因为 SUN 公司已经提供了两个默认实现类:GenericServlet, HttpServlet。开发人员在开发时通常只需要继承这两个 Servlet 实现类中的某一个,然后重新实现其中的主要方法即可。例如对于继承 HttpServlet,开发人员只需要重写 doGet(), doPost() 方法即可,不需要复写 service() 方法。

5.4 缺省 Servlet

如果某个 Servlet 的映射路径仅仅为一个正斜杠 (/),那么这个 Servlet 就成为当前 Web 应用程序的缺省 Servlet。凡是在 web.xml 文件中找不到匹配的 servlet-mapping 元素的 URL,它们的访问请求都将交给缺省 Servlet 处理。也就是说,缺省 Servlet 用于处理所有其他 Servlet 都不处理的访问请求。

通常在 Tomcat 安装目录\conf\web.xml 中注册了一个名为 org.apache.catalina.servlets.DefaultServlet 的 Servlet,在该配置文件中被设置成了缺省 Servlet。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1">
    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- JSP Servlet 略 -->

    <!-- 海量 mime-mapping 标签略 -->

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

5.5 Servlet 线程安全问题

当多个客户端并发访问同一个 Servlet 时,Web 服务器会为每个访问创建一个连接。所以如果不涉及 Servlet 实例中的共享资源,就不会涉及线程安全问题;但如果涉及共享资源,就需要考虑通过同步等手段解决线程安全问题。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 五. Servlet 生命周期
    • 5.1 Servlet 生命周期
      • 5.2 Servlet 的配置
        • 5.3 Servlet 的实现
          • 5.4 缺省 Servlet
            • 5.5 Servlet 线程安全问题
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档