[Servlet] 笔记
Servlet 创建步骤
- 创建web项目导入依赖
<dependency>
<groupld>javax.servlet</groupld>
<artifactld>javax.servlet-api</artifactld>
<version>3.1.0</version>
<!-- 排除运行环境,防止与tomcat中的servlet冲突 -->
<scope>provided</scope>
</dependency>
-
定义一个类,实现 Servlet 接口,并重写接口中所有方法,并在 service 方法中编写业务逻辑(比如在控制台输出一句话)
-
在类上使用 @WebServlet 注解,配置该 Servlet 的访问路径
@WebServlet("/servlet1")
public class Servlet1 implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException {
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet!!");
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
- 启动 Tomcat,浏览器输入 URL 访问该 Servlet
Servlet执行流程
浏览器请求 Servlet Url ===> Tomcat
Tomcat 自动创建 Servlet 对象,并调用其中的 Service 方法
浏览器 <=== Tomcat 将 Service 中的响应数据
- Servlet 类是对 Servlet 接口的实现。接口中有 Service 方法的声明。
Servlet 生命周期
Servlet运行在servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段
- 加载和实例化: 默认情况下,当Servlet第一次被访问时,由容器创建servlet对象
@WebServlet(value = "/servlet1", loadOnStartup = -1)
- loadOnStartup 负整数:在第一次访问时创建
- loadOnStartup 0 或正整数:服务器启动时创建 servlet 对象
- 初始化: 在 Servlet 实例化之后,容器将调用 servlet 的 init() 方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次
- 请求处理: 每次请求 servlet 时,Servlet 容器都会调用 servlet 的 service() 方法对请求进行处理。
- 服务终止: 当需要释放内存或者容器关闭时,容器就会调用 servlet 实例的 destroy() 方法完成资源的释放。在 destroy() 方法调用之后,容器会释放这个 Servlet 实例,该实例随后会被 Java 的垃圾收集器所回收
Servlet 体系结构
@WebServlet(urlPatterns = "/custom")
public class CustomServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post...");
}
}
HttpServlet 使用不同的请求方法为什么要用不同的方法?
不同请求的请求体,请求参数位置不同,要分别处理
HttpServlet 原理
获取发起请求的方式,对应方式调用不同的方法
HttpServlet 的部分源码
public abstract class HttpServlet extends GenericServlet {
private static final String METHOD_DELETE = "DELETE";
private static final String METHOD_HEAD = "HEAD";
private static final String METHOD_GET = "GET";
private static final String METHOD_OPTIONS = "OPTIONS";
private static final String METHOD_POST = "POST";
private static final String METHOD_PUT = "PUT";
private static final String METHOD_TRACE = "TRACE";
private static final String HEADER_IFMODSINCE = "If-Modified-Since";
private static final String HEADER_LASTMOD = "Last-Modified";
private static final String LSTRING_FILE = "javax.servlet.http.LocalStrings";
private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.http.LocalStrings");
public HttpServlet() {
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_get_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(405, msg);
} else {
resp.sendError(400, msg);
}
}
urlPattern 配置
配置方式
@WebServlet(urlPatterns = {"/demo1", "/demo2"})
匹配规则
- 精确匹配 (优先级最高)
- 配置
@WebServlet(urlPatterns = "/servlet1")
- 访问
/localhost/webapp/servlet1
- 配置
- 目录匹配
- 配置
@WebServlet(urlPatterns = "/user/*")
- 访问
/localhost/webapp/user/aa
- 访问
/localhost/webapp/user/zhangsan
等等
- 配置
- 扩展名匹配
- 配置
@WebServlet(urlPatterns = "*.jpg")
- 访问
/localhost/webapp/user/aa.jpg
- 访问
/localhost/webapp/user/girl.jpg
等等
- 配置
- 任意匹配
/** * 任意匹配url * * 方式1: /* * * 方式2: / * 方式1 的优先级高于 方式2 */ @WebServlet(urlPatterns = "/*") @WebServlet(urlPatterns = "/")
- 在 tomcat 中有一个默认 Servlet 它的访问路径是 "/"
/tomcat/conf/web.xml中定义了默认 Servlet <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
- 问题 :覆盖掉默认路径为 / 的 Servlet 会导致静态资源无法被访问
- 结论 :别配,危!
优先级:
精确匹配 > 目录匹配 > 扩展名匹配 > /* > /
遇到的问题
Maven [ERROR] 不再支持源选项 5,请使用 7 或更高版本的解决办法
解决:
pom.xml 中添加
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本