Skip to content

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
              └── doPost

3. 手写第一个 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/会话/转发重定向,框架原理就通了。

练习建议

  1. 配置 IDEA + Tomcat,跑通第一个 HelloServlet。
  2. 写一个 /user?method=add 的多方法分发 Servlet。
  3. 用浏览器开发者工具(F12)观察请求报文、响应报文。
  4. 用 Postman 发 GET/POST 请求测试 Servlet。