【JavaWeb 核心】Servlet 从入门到精通(超详细版)
·
一、Servlet 概述
1.1 JavaWeb 三大核心组件
Servlet 是 JavaWeb 三大核心组件之首,是学习 JavaWeb 的基础,必须 100% 掌握:
- Servlet:处理客户端请求(核心)
- Filter(过滤器):拦截请求 / 响应(后续讲解)
- Listener(监听器):监听 Web 容器事件(观察者模式,后续讲解)
1.2 Servlet 的核心作用
Servlet 翻译为「Server Let」(服务器小应用程序),核心作用是处理客户端 HTTP 请求:
- 客户端(浏览器)发送请求 → Tomcat 接收请求 → 匹配对应的 Servlet 处理请求 → Servlet 返回响应结果
- 举例:登录请求由「登录 Servlet」处理,注册请求由「注册 Servlet」处理。
二、Servlet 初识(必须熟练)
2.1 第一个 Servlet 实现
2.1.1 Servlet 核心规则
Servlet 是运行在 Web 服务器(Tomcat)中的 Java 程序,需遵守两个核心规则:
- 必须实现
javax.servlet.Servlet接口; - 必须在
web.xml中配置部署(Tomcat 才能找到自定义 Servlet)。
2.1.2 Servlet 接口核心方法
javax.servlet.Servlet 接口定义了 Servlet 的生命周期方法,核心方法如下:

2.1.3 手写第一个 Servlet(完整步骤)
package cn.tx.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* 第一个Servlet实现类
*/
public class Servlet1 implements Servlet {
// 初始化方法:仅调用1次
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("Servlet1 初始化完成!");
}
// 获取配置对象:需先保存init参数,此处简化返回null
@Override
public ServletConfig getServletConfig() {
return null;
}
// 核心处理方法:每次请求都会调用
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
// 设置响应编码,避免中文乱码
response.setContentType("text/html;charset=UTF-8");
// 向浏览器输出内容
response.getWriter().write("Hello Servlet! 这是我的第一个Servlet程序");
System.out.println("Servlet1 处理了一次请求!");
}
// 获取Servlet信息:基本不用
@Override
public String getServletInfo() {
return "这是我的第一个Servlet,版本1.0";
}
// 销毁方法:仅Tomcat关闭时调用1次
@Override
public void destroy() {
System.out.println("Servlet1 被销毁了!");
}
}
步骤 2:配置 web.xml(核心)
在 WEB-INF/web.xml 中注册 Servlet 并映射访问路径:
<?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名称:自定义,需与mapping中一致 -->
<servlet-name>hello</servlet-name>
<!-- Servlet全类名:包名+类名 -->
<servlet-class>cn.tx.servlet.Servlet1</servlet-class>
</servlet>
<!-- 映射访问路径 -->
<servlet-mapping>
<!-- 关联上面的Servlet名称 -->
<servlet-name>hello</servlet-name>
<!-- 访问路径:以/开头,自定义 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
2.1.4 JavaWeb 请求响应流程(核心)
以请求 http://localhost:8080/servlet_pro/hello 为例:
- Tomcat 解析请求:找到
servlet_pro项目 → 读取web.xml; - 路径匹配:通过
/hello找到对应的<servlet-name>hello</servlet-name>; - 类名匹配:通过
hello找到<servlet-class>cn.tx.servlet.Servlet1</servlet-class>; - 实例化 Servlet:
- 若内存中已有 Servlet 实例 → 直接调用
service()处理请求; - 若没有 → 通过反射创建实例(存入 Servlet 池)→ 调用
init()初始化 → 调用service()处理请求;
- 若内存中已有 Servlet 实例 → 直接调用
- 返回响应:Servlet 处理完成后,Tomcat 将结果返回给浏览器。
2.2 Servlet 生命周期(核心)
Servlet 的生命周期完全由 Tomcat 管理,核心阶段:
- 创建阶段:默认第一次访问 Servlet 时创建实例(可配置启动时创建),调用
init()初始化(仅 1 次); - 运行阶段:每次请求都调用
service()处理(多次); - 销毁阶段:Tomcat 关闭时调用
destroy()销毁实例(仅 1 次)。
注意:自定义方法不会被 Tomcat 主动调用,需在生命周期方法(如 service)中手动调用。
三、HttpServlet(必须精通)
3.1 HttpServlet 介绍
实际开发中,我们几乎不会直接实现 Servlet 接口,而是继承 HttpServlet(专门处理 HTTP 请求),继承关系:Servlet(接口) → GenericServlet(抽象类) → HttpServlet(抽象类)
GenericServlet:实现了 Servlet 接口,简化了 init、destroy 等方法;HttpServlet:继承 GenericServlet,封装了 HTTP 请求的处理逻辑(GET/POST 等)。
3.2 HTTP 请求方法
常用核心方法:
- GET:查询数据(参数拼在 URL 后,长度有限,不安全);
- POST:提交数据(参数在请求体中,长度无限制,更安全);其他方法(PUT/DELETE 等)几乎不用,了解即可。
3.3 实战:创建 HttpServlet
3.3.1 手动创建(推荐掌握)
步骤 1:编写 HttpServlet 子类
package cn.tx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 继承HttpServlet处理HTTP请求
*/
public class Servlet2 extends HttpServlet {
// 处理GET请求
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("这是GET请求的响应结果!");
}
// 处理POST请求
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// POST请求可复用GET逻辑,或单独编写
doGet(request, response);
}
}
步骤 2:配置 web.xml
<servlet>
<servlet-name>hello2</servlet-name>
<servlet-class>cn.tx.servlet.Servlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello2</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
3.3.2 IDEA 快捷创建(开发效率)
- 右键包名 → New → Servlet;
- 填写 Servlet 名称(如 Servlet2),自动生成类和基础方法;
- 补充
web.xml映射路径(或使用注解@WebServlet("/hello2")替代配置)。
3.3.4 配置 Servlet 启动时创建
默认 Servlet 在第一次访问时创建,若需 Tomcat 启动时就创建,添加 <load-on-startup> 标签:
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>cn.tx.servlet.Servlet1</servlet-class>
<!-- 启动时创建:值≥0即可,数字越小优先级越高 -->
<load-on-startup>1</load-on-startup>
</servlet>
- 取值规则:
≥0:Tomcat 启动时创建,数字越小越先创建;<0:默认值,第一次访问时创建。
四、核心总结
- Servlet 本质:运行在 Tomcat 中的 Java 程序,用于处理 HTTP 请求,生命周期完全由 Tomcat 管理;
- 核心流程:编写 Servlet 实现类 → 配置 web.xml(或注解)→ Tomcat 匹配路径 → 调用 service 方法处理请求;
- 开发规范:实际开发优先继承 HttpServlet,重写 doGet/doPost 方法,替代直接实现 Servlet 接口。
五、拓展提示
- Servlet3.0 + 支持注解配置(
@WebServlet("/hello")),可替代 web.xml,简化开发; - 处理请求时需注意中文乱码:GET 请求需配置 Tomcat 编码,POST 请求需设置
request.setCharacterEncoding("UTF-8"); - Servlet 是单例多线程,不要在 Servlet 中定义成员变量(线程不安全)。
更多推荐




所有评论(0)