Javaweb - 10.2 Servlet
目录
servlet-api.jar 导入问题
Content-Type 响应头的问题
Servlet 映射细节
@WebServlet 注解使用
完!
servlet-api.jar 导入问题
在上篇文章中,我们的 service 方法直接 extends 了 HttpServlet
追根溯源,可以发现,HttpServlet 也是实现了 Servlet 接口
这个 Servlet 接口,并非是我们下载的基础类库 jdk 中的配置
是在 一个 servlet.jar 的 jar 包中的
此时进行思考,jar 包的导入,我们前面不是提到过吗?
应该在 WEB-INF 中创建一个 lib 文件夹,然后将需要的 jar 包导入进去即可~ 但我们上篇在这个项目中,并没有导入 jar 包呀~ 为什么还可以正常找到 Servlet 这个接口呢?
但我们是在开始的时候,project setting 中的 Dependency 中 导入了 Tomcat 依赖~
其实是:servlet-api,仅是在编码的时候需要,当运行的时候,在服务器的环境中,由服务软件(Tomcta)提供。因此,我们的 Javaweb 项目中,在打包 / 构建的过程中,无需携带 servlet-api 的 jar 包
Content-Type 响应头的问题
我们的上个 Javaweb 工程中,在点击“校验”按钮后,会运行 userServlet 的代码,然后做出响应给浏览器。我们在浏览器中打开 F12 的开发者模式
在响应报文中,我们并没有找到 Content-Type 这一属性~
==》
即,如果我们没有手动设置 Content-Type,其默认属性是 html
流程如下图:
下面是在 tomcat 文件夹 conf/web.xml 中,对 html png 进行的查找~
可见,tomcat 的 con/web.xml 中包含着绝大部分我们文件类型对应的 Content-Type
我们希望浏览器以什么形式来解析我们的响应,应该在响应中头,手动设置 Content-Type 的值
因为 Content-Type 的重要性,也专门为其设置了一个 API
Servlet 映射细节
为了方便介绍,我们再创建一个 Servlet 类
因不需要其实现什么功能,则仅输出一句话即可~
package com.zzz.servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;/** @author zzr* @date: 2025/07/04 16:33* @description: 测试 servlet 注解*/
public class servlet1 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("servlet1 执行了");}
}
然后为这个 servlet1 配置环境,在 web.xml 中进行配置 servlet 和 servlet-mapping
在打印的地方打一个断点,然后运行项目
在 url 后面配置上我们刚刚的路径 s1
发现代码卡在断点处,继续向下运行,打印出了“servlet1 执行了”
过程如下图所示:
通过反射获取字节码,反射执行 servlet 代码~
一个 servlet-name 可以同时对应多个 url-pattern
一个 servlet 标签,也可以同时对应多个 servlet-mapping
url-pattern
1. 精确匹配
/servlet1
2. 模糊匹配
* 作为通配符,* 在哪里,哪里就是模糊的
/ :匹配全部,不包括 jsp 文件
/* :匹配全部,包括 jsp 文件
/a/*:匹配前缀,后缀模糊
*.action:匹配后缀,前缀模糊
@WebServlet 注解使用
我们可以在 servlet 类的前面,使用 @WebServlet 注解,来替换掉 Servlet 配置:
注意:使用了 @WebServlet 注解的话,就不要在 web.xml 中再进行配置了~
我们可以看一下 WebServlet 中的接口,其实际的代码是需要下载 jar 包才可查看的,这里是一些反字节码文件~
也可以配置多个映射路径: