Servlet 是 Java EE 规范中的一个技术,专门用于处理客户端(通常是浏览器)发送到服务器的请求,并生成动态的网页内容。Servlet 是服务器端的一段 Java 代码,它运行在支持 Servlet 技术的 Web 服务器(如 Tomcat)上,主要用于生成动态网页,响应客户端请求。Servlet 的核心概念包括:
核心功能:
-
处理请求:
- Servlet 可以处理来自浏览器(或其他客户端)发送的 HTTP 请求(GET、POST 等),并根据请求执行不同的逻辑操作,比如从数据库获取数据,调用其他服务,或进行计算。
-
生成响应:
- Servlet 负责将处理结果返回给客户端。通常,响应包括生成的动态 HTML 页面、JSON 数据等内容。
-
生命周期管理:
- Servlet 的生命周期由容器(如 Tomcat)管理,Servlet 会经历初始化、请求处理和销毁三个阶段。
Servlet 主要方法:
init():初始化方法,在 Servlet 第一次被创建时调用,通常用于执行一次性的初始化任务。service():核心方法,用于处理每次请求。不同的请求类型(如 GET、POST)会调用doGet()或doPost()方法。destroy():在 Servlet 被销毁前调用,用于执行清理任务。
Servlet 工作流程:

-
浏览器请求:
- 当客户端(例如浏览器)发送请求到服务器时,请求包含以下内容:
- 请求行:例如
/aaa路径。 - 请求头:包含请求的相关元数据,如浏览器信息、请求类型等。
- 请求体:如果是 POST 请求等可能包含请求数据。
- 请求行:例如
- 当客户端(例如浏览器)发送请求到服务器时,请求包含以下内容:
-
Tomcat 请求处理:
- Tomcat 收到这个请求后,会将请求的内容转换为一个
HttpServletRequest对象。该对象包含客户端请求的所有信息,比如请求头、参数、请求体等。 - 同时,Tomcat 会创建一个
HttpServletResponse对象,这个对象用于存储将返回给客户端的响应数据。
- Tomcat 收到这个请求后,会将请求的内容转换为一个
-
Servlet 处理:
- Tomcat 根据请求路径(例如
/aaa)找到对应的Servlet,并调用该Servlet的service()方法。 - 在
service()方法中,Tomcat 会将HttpServletRequest和HttpServletResponse对象作为参数传入。 Servlet从request对象中提取请求的所有信息(例如参数)。- 根据提取的参数,生成响应数据,并将这些数据放入
response对象。 - 最后,
response对象中的数据将被发送回客户端。
- Tomcat 根据请求路径(例如
如何使用Servlet?:
-
创建一个 Servlet 类
- 在
HttpServlet中,除了可以重写doGet()和doPost()方法来处理 HTTP 请求外,还可以重写service()方法。service()方法是 Servlet 处理请求的核心方法,它负责分发请求给具体的doGet()、doPost()、doPut()等方法。
- 在
-
配置 Servlet
- 你需要通过配置 Servlet 来定义它的 URL 映射,使得客户端能够通过指定的 URL 访问该 Servlet。在现代的 Java Web 应用中,通常通过
web.xml或使用注解来配置 Servlet。<!-- Servlet 配置 --><servlet><!-- Servlet 名称,可以任意指定 --><servlet-name>myServlet</servlet-name><!-- Servlet 类的完全限定名/路径 --><servlet-class>com.example.MyServlet</servlet-class></servlet><!-- Servlet URL 映射 --><servlet-mapping><!-- 与上面的servlet-name相匹配 --><servlet-name>myServlet</servlet-name><!-- 访问该Servlet的URL模式 --><url-pattern>/myServlet</url-pattern></servlet-mapping>解释:
<servlet>标签:<servlet-name>:为 Servlet 定义一个名称(可以是任意字符串)。它在<servlet-mapping>中使用。<servlet-class>:指定 Servlet 类的完全限定名(包括包名)。
<servlet-mapping>标签:<servlet-name>:与前面定义的<servlet-name>相匹配,用于将 Servlet 类和 URL 模式关联起来。<url-pattern>:指定 URL 路径。当用户访问与此路径匹配的 URL 时,Servlet 会被调用。例如,上面的配置意味着当用户访问/myServlet时,MyServlet将处理该请求。
- 你需要通过配置 Servlet 来定义它的 URL 映射,使得客户端能够通过指定的 URL 访问该 Servlet。在现代的 Java Web 应用中,通常通过
-
运行 Servlet
- Servlet 通常运行在支持 Servlet 容器的 Web 服务器上,如 Apache Tomcat。
package servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.io.PrintWriter;
/*
servlet开发流程:
1.创建javaWEB项目,同时将tomcat添加为当前项目的依赖
2.重写service方法 protected void service(HttpServletRequest req, HttpServletResponse resp)
3.在service方法中,定义业务处理代码
*/public class UserServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1 .从request 对象中获取请求中的任何信息String username = request.getParameter("username");// 2.处理业务代码String info = "YES";if("atguigu".equals(username)){info = "NO";}// 3.将要响应的数据放入responsePrintWriter writer = response.getWriter(); // 该方法返回的是一个向响应体中打印字符串的打印流writer.write(info);}
}

servlet-api.jar 导入问题
servlet-api 编码的时候需要,运行的时候,在服务器的环境中,由服务软件(Tomcat)提供
因此,我们的IAVAWEB项目中,在打包/构建的时候,是无需携带servlet-api的iar包
UserServlet 中没有显式设置 Content-Type
介绍Content-Type:
Content-Type 是HTTP头字段之一,用于指示发送给接收方的实体的媒体类型。它定义了资源的类型以及服务器如何解释该资源。Content-Type 通常在HTTP请求和响应中使用,尤其是在上传文件和服务器返回文件时。
Content-Type头部的格式为:
Content-Type: type/subtype; charset=encoding
其中:
type表示媒体类型的主类型,如text、image、application等。subtype表示具体的媒体子类型,如html、plain、jpeg、json等。charset是可选的参数,表示文本的字符编码方式,如UTF-8。
显示处理:
在Java的HttpServlet中,如果你希望在响应中设置Content-Type,需要显式地调用response.setContentType()方法。默认情况下,Content-Type并不会自动设置,因此如果你没有指定它,浏览器或者客户端可能无法正确处理返回的内容。
response.setHeader("Content-Type","text/css");
Servlet url-pattern的一些特殊写法:
1. 精确匹配 (Exact Match)
这种方式是最常见的,Servlet 只处理与指定路径完全匹配的请求。
<url-pattern>/myServlet</url-pattern>
- 示例:访问
http://localhost:8080/app/myServlet会匹配这个 Servlet。 - 只能精确匹配
/myServlet,其他任何路径都不会被匹配。
模糊匹配
1. 根路径匹配 /
-
匹配规则:匹配所有请求的 URL,但不包括 JSP 文件。
-
说明:
- 当你在
url-pattern中配置为/时,这个 Servlet 将会处理所有的请求,除了一些静态资源(如 JSP 页面)和明确分配给其他 Servlet 的请求。 - 这种方式适合作为默认的请求处理器,特别是当你想为整个 Web 应用提供一个通用的处理逻辑时。
- 当你在
2. 通配符路径匹配 /*
-
匹配规则:匹配所有的 URL 请求,包括 JSP 文件。
-
说明:
- 当你在
url-pattern中使用/*时,它会捕获所有请求,包括 JSP 文件的请求。 - 这意味着请求的 URL 不论路径和文件扩展名是什么,都可以匹配该 Servlet。例如,静态资源、动态资源和 JSP 页面都会由该 Servlet 处理。
- 当你在
3. 路径匹配 /a/*
-
匹配规则:匹配以
/a/开头的所有请求,前缀为固定的路径,后缀可以是任意路径。 -
说明:
- 这是路径前缀匹配的一种形式,它会捕获所有以
/a/为开头的 URL。 - 例如:
/a/test、/a/user/profile、/a/settings都会匹配此url-pattern。- 但
/b/test、/c/d则不会匹配。
- 这是路径前缀匹配的一种形式,它会捕获所有以
4. 扩展名匹配 *.action
-
匹配规则:匹配所有以
.action为扩展名的请求,后缀固定,前缀可以是任意路径。 -
说明:
- 这种模式可以用来匹配具有特定扩展名的所有请求,不论前缀是什么。它非常适合处理特定类型的请求,比如使用
.action扩展名的请求。
- 这种模式可以用来匹配具有特定扩展名的所有请求,不论前缀是什么。它非常适合处理特定类型的请求,比如使用
Servlet 注解方式配置Servlet:
@WebServlet 注解的基本用法
@WebServlet 注解用于将一个类声明为 Servlet,并指定它的 URL 映射(url-pattern)。以下是 @WebServlet 注解的常见属性:
- name:指定 Servlet 的名称,通常可选,如果不指定,默认使用类名。
- urlPatterns 或 value:指定这个 Servlet 可以处理哪些 URL 请求。
- loadOnStartup:指定 Servlet 是否在服务器启动时加载。值为负数或不设置时,表示在首次访问时加载;如果值为 0 或正数,表示在启动时加载,值越小优先级越高。
- initParams:定义 Servlet 的初始化参数。
package servlet;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("/s1")
public class Servlet1 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Servlet1执行了");}
}
