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。XML<!-- 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
- Servlet 通常运行在支持 Servlet 容器的 Web 服务器上,如 Apache Tomcat。
java
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 {
@Override
protected 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.将要响应的数据放入response
PrintWriter 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
头部的格式为:
bash
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
并不会自动设置,因此如果你没有指定它,浏览器或者客户端可能无法正确处理返回的内容。
java
response.setHeader("Content-Type","text/css");
Servlet url-pattern的一些特殊写法:
1. 精确匹配 (Exact Match)
这种方式是最常见的,Servlet 只处理与指定路径完全匹配的请求。
XML
<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 的初始化参数。
java
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 {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet1执行了");
}
}