Servlet生命周期与调用

Servlet

Servlet主要功能在于交互式的浏览和修改数据,生成动态Web内容。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

1. Servlet处理流程简述:

1.1 工作原理:

  1. Web Client发起一个请求 http request
  2. Web容器接收 http request
  3. HttpServletRequest create a new Instance & HttpServletResponse create a new Instance
  4. invoke HttpServlet's service method and dispatches HTTP Requests to doPost/doGet...methods defined in HttpServlet
  5. get request information and set response infomation
  6. 发送http response给Web Client

1.2 Simple Servlet Demo(IntelliJ IDEA)

  • 创建一个空的maven项目,然后右键项目选择添加框架支持,选择JavaEE

    image-20210904234041296

  • pom.xml引入servlet-api

    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    </dependency>
  • 创建MyServlet.java extends HttpServlet,随便写点东西

  • 修改web.xml

    <servlet>
    <servlet-name>FirstServlet</servlet-name>
    <servlet-class>com.ttc.elian.FirstServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>FirstServlet</servlet-name>
    <url-pattern>/firstServlet</url-pattern>
    </servlet-mapping>

2. Servlet生命周期

image-20210905010637572

  • Servlet接口源码:

    public interface Servlet {
    public void init(ServletConfig config) throws ServletException;
    public ServletConfig getServletConfig();
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
    public String getServletInfo();
    public void destroy();
    }
    1. 创建Servlet实例:

      当容器(包括但不限于tomcat)接受请求后,先判断是否已经装载并实例化该Servlet,如果没有则执行init(ServletConfig),直到关闭容器、长时间没有调用。这时属于懒加载,同时也可通过load-on-startup设置加载时机:

      <servlet>
      <servlet-name>firstServlet</servlet-name>
      <servlet-class>com.ttc.elian.FirstServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
      </servlet>
    2. init()初始化

      上面提到:当容器初始化Servlet时,会先执行init(ServletConfig)方法,GenericServlet类中设置属性:

      private transient ServletConfig config;
      public void init(ServletConfig config) throws ServletException {
      this.config = config;
      this.init();
      }
      1. 只需要重写init()方法即可(该方法在Servlet实例化以后只会被调用一次,不用担心线程不安全)。

      2. 通过web.xml配置

        1. 设置一些初始化参数:
        <servlet>
        <servlet-name>MyFirstServlet</servlet-name>
        <servlet-class>com.ttc.elian.MyFirstServlet</servlet-class>
        <init-param>
        <param-name>param</param-name>
        <param-value>Elian</param-value>
        </init-param>
        </servlet>
        2. 读取参数:
        // 通过GenericServlet继承的ServletConfig下的方法读取参数
        // GenericServlet已实现,我们直接调用即可
        public interface ServletConfig {
        public String getServletName();
        public ServletContext getServletContext();
        public String getInitParameter(String name); // 返回配置文件中配置的param-value
        public Enumeration getInitParamterNames();
        }
    3. service()

      • 由servlet容器调用以允许servlet响应请求。

      • 这个方法只有在servlet的init()方法成功完成后才会被调用。

      • 应该始终为抛出或发送错误的servlet设置响应的状态代码。

      • servlet是单例的,通常运行在多线程servlet容器中,这些容器可以同时处理多个请求。开发人员必须注意同步访问任何共享资源,如文件、网络连接,以及servlet的类和实例变量。

    4. destroy()

      • 一如上面所述,该方法并不意味着已经彻底销毁servlet,而是在销毁servlet前,进行的最后处理,由开发者自己决定还有哪些资源等未被安全处理
  • Servlet的生命周期非常的长,会一直到Tomcat关闭,或者长时间无连接才会进行销毁,所以开发中应尽量少的创建Servlet,在SpringMVC中,只有一个负责调度的DispatcherServlet。

  • 3.x版本后的Servlet注解写法

@WebServlet(urlPatterns = "/firstServlet",
name = "FirstServlet",
loadOnStartup = 0, initParams = {
@WebInitParam(name = "param", value = "Elian")
})
posted @   coderElian  阅读(78)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示