Servlet工作流程

Servlet

配置servlet

重写的快捷建
ctrl + o

可以查看其他写法
ctrl+右键
![[Pasted image 20250301001606.png]]

package com.demo;  
  
import jakarta.servlet.ServletException;  
import jakarta.servlet.annotation.WebServlet;  
import jakarta.servlet.http.HttpServlet;  
import jakarta.servlet.http.HttpServletRequest;  
import jakarta.servlet.http.HttpServletResponse;  
  
import java.io.IOException;  
/*  
*实现Servlet  
* 1.创建普通java类  
* 2.实现Servlet的规范,继承HttpServelet类  
* 3.重写servlet方法,用来处理请求  
* 4.设置注解,指定访问的路径  
 */  

//用来定位

//@WebServlet("/ser01")  
@WebServlet(name="Servlet01",value={"/ser01","/ser02"})  
/*  
@WebServlet(name="Servlet01",value="/ser01")  
@WebServlet(name="Servlet01",urlPatterns="/ser01")  
@WebServlet(name="Servlet01",urlPatterns={"/ser01","/ser02"})  
  
 */public class Servlet01 extends HttpServlet {  
    @Override  
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        System.out.println("<html>");  
        System.out.println("<head>");  
        System.out.println("</head>");  
        System.out.println("<body>");  
        System.out.println("<h3>Hello World!</h3>");  
        System.out.println("</body>");  
        System.out.println("</html>");  
  
        resp.getWriter().write("Hello World!");  
        resp.getWriter().write("Hello World!");  
  
    }  
}

修改文件默认地址
![[Pasted image 20250301001734.png]]

Servlet工作流程

Servlet 的工作流程可以分为以下几个关键步骤,涵盖了从客户端发起请求到服务器返回响应的完整过程:

![[Pasted image 20250301231604.png]]


1. 客户端发起 HTTP 请求

  • 用户通过浏览器(或其他客户端)访问一个 URL(如 http://example.com/login)。
  • 请求可以是 GET、POST 或其他 HTTP 方法。

2. Web 服务器接收请求

  • 请求首先被 Web 服务器(如 Tomcat、Jetty 等 Servlet 容器)接收。
  • 服务器解析请求的 URL,确定对应的 Servlet 负责处理该请求(通过 web.xml 配置或 @WebServlet 注解)

当有请求进来时,首先会找请求行中的主机,找到本机,再找到请求行的地址,获取你当前访问的是哪个资源,然后再通过这个资源的这个路径,去找到我们的配置中与之相对应的这个路径,找到这个路径服务器会去创建一个servlet


3. Servlet 实例化与初始化

  • 首次请求时:如果 Servlet 尚未实例化,容器会调用其无参构造函数创建实例。
  • 初始化:调用 init(ServletConfig config) 方法,该方法仅在整个生命周期中执行一次(用于加载资源或配置)。
    如果不是第一次就会直接去调用service方法

4. 处理请求

  • 创建请求/响应对象:容器为当前请求创建 HttpServletRequestHttpServletResponse 对象,封装请求数据和响应操作。
    ==service()方法中含有 doGet() / doPost() ==
    ![[image 2025.3.1.png]]
  • 调用 service() 方法
    • service() 方法根据请求类型(GET/POST 等)自动调用对应的 doGet()doPost() 方法
    • 开发者通常在 doGet()/doPost() 中编写业务逻辑(如读取参数、访问数据库、处理数据)。
      那么也可以这样写 ,不太方便
package com.demo;  
  
  
import jakarta.servlet.ServletException;  
import jakarta.servlet.annotation.WebServlet;  
import jakarta.servlet.http.HttpServlet;  
import jakarta.servlet.http.HttpServletRequest;  
import jakarta.servlet.http.HttpServletResponse;  
  
import java.io.IOException;  
  
  
@WebServlet("/ser04")  
public class Servlet02  extends HttpServlet {  
  
    /*  
     @Override     protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {     super.service(req, resp);     }    */  
    /**  
     * Post请求调用方法  
     * @param req  
     * @param resp  
     * @throws ServletException  
     * @throws IOException  
     */    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        super.doPost(req, resp);  
    }  
  
    /**  
     * Get请求调用方法  
     * @param req  
     * @param resp  
     * @throws ServletException  
     * @throws IOException  
     */    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
      //  super.doGet(req, resp);  
        System.out.println("doGet");  
         
  
    }  
  
}

5. 生成响应

  • 通过 HttpServletResponse 对象设置响应内容:
    • 设置状态码(如 200 OK)、响应头(Content-Type 等)。
    • 通过 PrintWriterOutputStream 写入响应体(HTML、JSON 等数据)。

6. 返回响应给客户端

  • 容器将 HttpServletResponse 转换为 HTTP 响应报文,发送回客户端。
  • 客户端(浏览器)解析响应内容并渲染页面或处理数据。

7. 请求结束与资源释放

  • 容器销毁 HttpServletRequestHttpServletResponse 对象,释放资源。
  • 注意:Servlet 实例本身不会被销毁,后续请求会复用已创建的实例(单例模式)。

8. Servlet 销毁(可选)​

  • 当服务器关闭或 Servlet 被移除时,容器调用 destroy() 方法,释放长期占用的资源(如数据库连接)。

Srevlet的生命周期

Servlet没有main()方法,不能独立运行,他的运行完全由Servlet引擎来控制和调度

所谓生命周期 是指servlet容器何时创建servlet实例,何时调用其方法进行请求的处理,何时并销毁其实例的整个过程

  • 实例和初始化时机

    当请求到达容器时,容器查找servlet对象是否存在,如果不存在,则会创建实例并进行初始化

  • 就绪/调用/服务阶段

    当有请求到达容器时,容器调用servlet对象的service()方法,
    故 处理请求的方法在整个生命周期中可以被多次调用
    HTTPServlet的service()方法,会根据请求类型(GET、POST等)调用对应的doGet、doPost等方法

  • 销毁阶段
    触发时机
    容器关闭或 Servlet 被移除时(如应用重新部署)。

流程图解

容器启动
│
├── 若配置 load-on-startup → 实例化 → init() 
│
请求到达
│
├── 首次请求且未实例化 → 实例化 → init()
│
├── service() → doGet()/doPost() (每次请求)
│
容器关闭或应用卸载 → destroy()

![[Pasted image 20250304211044.png]]

init方法,在Servlet实例创建后执行 ()

public void init(ServletConfig config) throws ServletException {
}

service 方法,每次有请求到达某个Servlet方法时执行 ,用来处理请求

public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
}

destory方法

public void destory(){
}
package com.demo;  
  
import jakarta.servlet.ServletException;  
import jakarta.servlet.annotation.WebServlet;  
import jakarta.servlet.http.HttpServletRequest;  
import jakarta.servlet.http.HttpServletResponse;  
  
import java.io.IOException;  
@WebServlet("/ser05")  
public class Servlet03 extends HelloServlet{  

    /**  
     * 就绪/服务方法  
     * 当请求到达Servlet时,调用该方法  
     * 方法可以被多次调用  
     * @param req  
     * @param resp  
     * @throws ServletException  
     * @throws IOException  
     */    @Override  
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        super.service(req, resp);  
    }  
  
    /**  
     * 初始化方法  
     * 系统方法,服务器自动调用  
     * 当请求到达容器时,容器查找servlet对象是否存在,如果不存在,则会创建实例并进行初始化  
     * 只会调用一次  
     * @throws ServletException  
     */    @Override  
    public void init() throws ServletException {  
        super.init();  
    }  
  
    /**  
     * 销毁方法  
     * 系统方法,服务器自动调用  
     * 当服务器关闭或应用程序停止时,调用  
     * 方法只会执行一次  
     */  
    @Override  
    public void destroy() {  
        super.destroy();  
    }  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值