Servlet
配置servlet
重写的快捷建
ctrl + o
可以查看其他写法
ctrl+右键
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!");
}
}
修改文件默认地址
Servlet工作流程
Servlet 的工作流程可以分为以下几个关键步骤,涵盖了从客户端发起请求到服务器返回响应的完整过程:
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. 处理请求
- 创建请求/响应对象:容器为当前请求创建
HttpServletRequest
和HttpServletResponse
对象,封装请求数据和响应操作。
==service()方法中含有 doGet() / doPost() ==
- 调用
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 等)。 - 通过
PrintWriter
或OutputStream
写入响应体(HTML、JSON 等数据)。
- 设置状态码(如
6. 返回响应给客户端
- 容器将
HttpServletResponse
转换为 HTTP 响应报文,发送回客户端。 - 客户端(浏览器)解析响应内容并渲染页面或处理数据。
7. 请求结束与资源释放
- 容器销毁
HttpServletRequest
和HttpServletResponse
对象,释放资源。 - 注意: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()
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();
}
}