Servet的基础学习

Servet的基础学习

servet的简单介绍

  • Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
  • 使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。servet是接口和实现类。
  • Servlet 创有三种方式,1.实现 Servlet 接口,2.继承 GenericServlet 类,3.继承 HttpServlet 方法,我们先简单介绍了解1,3两种方式。

实现 Servlet 接口

复制代码
  1-void init(ServletConfig config)初始化配置(初始化)
  2-ServletConfig getServletConfig()获得配置信息//用户自己设置
  3-String getServletInfo()获取Servlet文本化信息//用户自己设置
  4-void service(ServletRquest request,ServletResponse response) 负责处理请求,给出响应(核心方法)(服务)
  5-void destroy()回收资源(销毁)
  • servlet的生命周期 :从servlet创建到销毁的过程,一次创建,到处服务,一个servlet只会有一个对象,服务所有请求。我们可以看到以下代码,其中贯穿了servlet整个生命周期有哪一些方法。

复制代码
  public class ServletDemo1 implements Servlet {
   
      //public ServletDemo1(){}
   
       //生命周期方法:当Servlet第一次被创建对象时执行该方法,该方法在整个生命周期中只执行一次
      public void init(ServletConfig arg0) throws ServletException {
                  System.out.println("=======init=========");
          }
   
      //生命周期方法:对客户端响应的方法,该方法会被执行多次,每次请求该servlet都会执行该方法
      public void service(ServletRequest arg0, ServletResponse arg1)
              throws ServletException, IOException {
          System.out.println("hehe");
   
      }
   
      //生命周期方法:当Servlet被销毁时执行该方法
      public void destroy() {
          System.out.println("******destroy**********");
      }
  //当停止tomcat时也就销毁的servlet。
   
      public ServletConfig getServletConfig() {
   
          return null;
      }
   
      public String getServletInfo() {
   
          return null;
      }
  }

这里我们着重介绍三个方法

  • init() 方法

  • init() 方法是在创建 Servlet 对象时被调用,而且只能被调用一次,用于 Servlet 对象在整个生命周期内的唯一一次初始化。只有在 init() 方法调用成功后,Servlet 才会处于服务状态,才能够去处理客户端的请求。

  • service() 方法

  • service() 方法是 Servlet 工作的核心方法。当客户端请求访问 Servlet 时,Servlet 容器就会调用 service() 方法去处理来自客户端的请求,并把处理后的响应返回给客户端。

  • destroy() 方法

  • destory() 方法是 Servlet 容器回收 Servlet 对象之前调用的,且只会调用一次,而此时的服务器处于停止状态或者访问资源已经被移除。

  • Servlet 的生命周期,大概流程可以用下图来诠释

  • 图描述了 Servlet 的完整生命周期,按照功能的不同,大致可以将 Servlet 的生命周期分为三个阶段,分别是初始化阶段、运行阶段和销毁阶段。

  • 初始化阶段

  • 当用户第一次向 Servlet 容器发出 HTTP 请求要求访问某个 Servlet 时,Servlet 容器会在整个容器中搜索该 Servlet 对象,发现这个 Servlet 对象没有被实例化,于是创建这个 Servlet 对象,然后调用该对象的 init() 方法完成初始化。

  • 当用户第二次访问这个 Servlet 时,Servlet 容器仍然在容器中搜索该 Servlet 对象,结果找到了该对象的实例,则不去创建而直接使用该对象。

  • 找到了对应的 Servlet 对象,随后 Servlet 进入到运行阶段。

  • 需要注意的是,在 Servlet 的整个生命周期内,它的 init() 方法只被调用一次。

  • 运行阶段

  • 这是 Servlet 生命周期中最核心的阶段。在该阶段中,Servlet 容器会为当前的请求创建一个 ServletRequest 对象和一个 ServletResponse 对象(它们分别代表 HTTP 请求和 HTTP 响应),并将这两个对象作为参数传递给 Servlet 的 service() 方法。

  • service() 方法从 ServletRequest 对象中获得用户的详细请求信息并处理该请求,通过 ServletResponse 对象生成响应结果。

  • 需要强调的是,在 Servlet 的整个生命周期内,用户每次请求访问 Servlet 时,Servlet 容器都会调用一次 Servlet 的 service() 方法,并且创建新的 ServletRequest 和 ServletResponse 对象。

  • 销毁阶段

  • 当服务器停止时,Servlet 容器需要回收 Servlet 对象所占用的内存,在回收之前,会自动调用该对象的 destroy() 方法做好回收内存前的准备,辟如关闭后台线程。

  • 和 init() 方法类似,destroy() 方法也只会被调用一次。

  • 注意:Servlet 对象一旦创建就会驻留在内存中一直等待客户端的访问,直到服务器关闭或项目被移除出容器时,Servlet 对象才会被销毁。

继承 HttpServlet 方法

  • servlet通常通过HTTP接受和响应来自Web客户端的请求。要实现此接口编写一个扩展javax.servlet.GenericServlet的一般servlet,或者编写一个扩展javax.servlet.http.HttpServlet的HTTPservlet,来实现servlet程序。通过HttpServlet的两个核心方法,doGet(HttpServletRequest request, HttpServletResponse response)和doPost(HttpServletRequest request, HttpServletResponse response)来完成输出。

复制代码
  package com.sxh;
   
  import java.io.IOException;
  import java.io.PrintWriter;
   
  import javax.servlet.ServletException;
  import javax.servlet.http.HttpServlet;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
   
  public class ServletDemo03 extends HttpServlet {
   
  	@Override
  	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  		this.doPost(req, resp);
  	}
   
  	@Override
  	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  		
  response.setContentType("text/html;charset=UTF-8");//控制格式输出
  		PrintWriter out = resp.getWriter();
  		out.println("Hello,world--Browse");
  		System.out.println("Hello,world--console");
  	}
  }
相关推荐
杨杨杨大侠8 小时前
都能接模型、RAG 和 MCP,Java Agent 框架到底差在哪?
java
破茧蝴蝶9 小时前
Python分布式爬虫完整教程
开发语言·python
狗凯之家源码网9 小时前
全新 PHP 轻量客服聊天室源码深度评测
开发语言·php·聊天室系统
我是伪码农9 小时前
百蝶杯学习
学习
远离UE49 小时前
UE5 Substrate Thin Film 源码拆析
开发语言·javascript·ue5
keyipatience9 小时前
JavaScript学习(1)书写位置,变量、数据类型、运算符
开发语言·前端·javascript·css·学习
Thinker QAQ9 小时前
并发编程(九):BlockingQueue 与 Channel——语言层的原子性、可见性与有序性
java·python·go·并发编程·channel·blockingqueue·message passing
朱涛的自习室10 小时前
我给 Gemini 4 和 DeepSeek 搞了套「末位淘汰」,AI 干活会更猛吗?(Day 3)
android·前端·后端
栈帧之外10 小时前
【C++】STL之set
开发语言·c++
霸道流氓气质11 小时前
RAG 可观测性与生产监控实战:四层遥测模型、五大仪表盘与 OpenTelemetry 全链路追踪的 Java 生产级实现
java·人工智能·python