03-Tomcat 与 Servlet
对应原始资料:
day05-Tomcat+HTTP+Servlet
一、Web 服务器 Tomcat
1. 是什么
Tomcat 是一款开源的 Java Web 服务器(Servlet 容器),负责接收浏览器的 HTTP 请求,并把请求交给 Servlet 处理,再把响应返回浏览器。
2. 安装与目录结构
bin/:启动脚本(startup.bat / startup.sh)。conf/:配置(server.xml 改端口)。lib/:Tomcat 自带 jar。webapps/:部署的应用目录。- 默认端口 8080,在
conf/server.xml修改。
3. IDEA 集成
IDEA 中 Edit Configurations → Tomcat Server → Local,关联 Tomcat 目录,部署 Module 即可一键启动。
二、HTTP 协议
1. 请求报文
POST /login HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Cookie: JSESSIONID=xxx
username=tom&password=123- 请求行:方法 + URL + 版本。
- 请求头:键值对。
- 请求空行。
- 请求体(GET 一般没有)。
2. 请求方法
GET:请求数据,参数在 URL 上,有长度限制,可缓存。POST:提交数据,参数在 body,无长度限制,不缓存。- PUT、DELETE、PATCH(RESTful 用到)。
3. 响应报文
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 12
hello, world- 状态码:
- 1xx 信息、2xx 成功(200)、3xx 重定向(302、304)、4xx 客户端错误(404、405)、5xx 服务端错误(500)。
三、Servlet(核心)
1. 概念
Servlet 是 JavaEE 规范中处理 HTTP 请求的小程序,运行在 Servlet 容器(Tomcat)中。
2. Servlet 体系
Servlet(接口)
└── GenericServlet
└── HttpServlet ← 我们一般继承它
├── doGet
└── doPost3. 手写第一个 Servlet
java
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("<h1>Hello Servlet!</h1>");
}
}@WebServlet("/hello")是 Servlet 3.0 注解,免去 web.xml 配置。- 浏览器访问
http://localhost:8080/demo/hello触发 doGet。
4. web.xml 配置(3.0 之前的写法)
xml
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.itheima.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>5. Servlet 生命周期
| 方法 | 调用时机 |
|---|---|
init() | 默认第一次被请求时(可配置 loadOnStartup 启动即创建) |
service() | 每次请求都调用,按方法分发到 doGet/doPost |
destroy() | 服务器关闭、应用卸载时 |
6. url-pattern 匹配规则
- 精确匹配:
/hello - 路径匹配:
/user/* - 扩展名匹配:
*.do - 缺省匹配:
/(兜底)
四、ServletContext(应用域对象)
每个 Web 应用一个,全局共享。
java
getServletContext().setAttribute("count", 1);
Object c = getServletContext().getAttribute("count");
// 获取真实路径
String path = getServletContext().getRealPath("/img/a.jpg");五、为什么学 Servlet
虽然实际开发用 SpringMVC/SpringBoot,但:
- SpringMVC 的核心
DispatcherServlet本身就是一个 Servlet。 - 理解了 Servlet 的
request/response/会话/转发重定向,框架原理就通了。
练习建议
- 配置 IDEA + Tomcat,跑通第一个 HelloServlet。
- 写一个
/user?method=add的多方法分发 Servlet。 - 用浏览器开发者工具(F12)观察请求报文、响应报文。
- 用 Postman 发 GET/POST 请求测试 Servlet。