【Java】Servlet

Servlet 是 Java 平台用于处理 Web 请求和生成动态内容的核心技术之一,主要应用于服务器端开发。

1、Servlet 是什么?

  • 定义:Servlet 是用 Java 编写的服务器端程序,遵循特定的接口(如 javax.servlet.Servlet),用于处理 HTTP 请求(GET、POST 等)并生成动态响应(HTML、JSON 等)。
  • 核心作用:在 Web 容器(如 Tomcat、Jetty)中运行,充当客户端(浏览器)与服务器端逻辑(如数据库、业务逻辑)之间的中间层。

2、Servlet 的工作流程

  • 客户端发起请求:浏览器发送 HTTP 请求到服务器。
  • Web 容器接收请求:容器(如 Tomcat)解析请求,确定对应的 Servlet。
  • Servlet 处理请求:
    • 调用 service() 方法,根据请求类型(GET/POST)分发到 doGet() 或 doPost()。
    • 执行业务逻辑(如查询数据库)。
  • 生成响应:Servlet 通过 response 对象返回 HTML、JSON 或其他格式的数据。
  • 容器发送响应:容器将响应返回给客户端。

在这里插入图片描述

3、Servlet 的生命周期

  • 初始化阶段:
    • 容器加载 Servlet 类,调用 init(ServletConfig config) 方法(仅一次)。
      • servlet 在内存中只存在一个,是单例的,存在线程安全问题
    • 用于初始化资源(如数据库连接)。
    • 使用<load-on-startup>来控制创建时机
      • 非负整数:容器启动时创建
      • 负数:第一次被访问时创建
  • 请求处理阶段:
    • 每次请求时,容器创建 ServletRequest 和 ServletResponse 对象。
    • 调用 service() 方法处理请求(多线程执行)。
  • 销毁阶段:
    • 容器卸载 Servlet 前调用 destroy() 方法(仅一次)。
    • 只有服务器正常关闭才会调用销毁方法。
    • 用于释放资源(如关闭连接)。

4、核心类与接口

  • HttpServlet:开发者通常继承此类,重写 doGet() 和 doPost() 方法。
  • HttpServletRequest:封装 HTTP 请求信息(参数、头信息、Session 等)。
  • HttpServletResponse:封装 HTTP 响应操作(设置状态码、写入输出流等)。
  • ServletConfig:提供 Servlet 初始化参数。
  • ServletContext:代表整个 Web 应用,用于共享全局数据。

5、配置 Servlet

  • 方式 1:XML 配置(web.xml)
    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.example.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/my-servlet</url-pattern>
    </servlet-mapping>
    
  • 方式 2:注解配置(Java 5+)
    @WebServlet(name = "MyServlet", urlPatterns = "/my-servlet")
    public class MyServlet extends HttpServlet {
          
          
        // ...
    }
    

6、Helleword

  • 创建Maven工程:
    src/
    ├── main/
    │   ├── java/
    │   │   └── com/example/
    │   │       └── HelloServlet.java  # Servlet 类
    │   └── webapp/
    │       └── WEB-INF/               # 可留空(Servlet 3.0+ 使用注解)
    pom.xml                            # Maven 依赖配置
    
  • 代码实现
    • Servlet 类 HelloServlet.java
package com.example;

import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hello") // 定义访问路径
public class HelloServlet extends HttpServlet {
    
    
    
    // 处理 GET 请求
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws IOException {
    
    
        
        // 设置响应内容类型
        response.setContentType("text/html");
        
        // 获取输出流
        PrintWriter out = response.getWriter();
        
        // 生成 HTML 内容
        out.println("<html>");
        out.println("<head><title>Hello World Servlet</title></head>");
        out.println("<body>");
        out.println("<h1>Hello World from Servlet!</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

7、Servlet 与 JSP 的关系

  • Servlet:适合处理业务逻辑和复杂计算,直接操作请求/响应。
  • JSP(Java Server Pages):本质是 Servlet 的变体,更擅长生成动态 HTML(通过嵌入 Java 代码和标签)。
  • 协作模式:通常使用 MVC 模式,Servlet 作为控制器(Controller),JSP 作为视图(View)。

8、应用场景

  • 处理表单提交(如用户登录)。
  • 构建 RESTful API(返回 JSON/XML)。
  • 实现会话管理(通过 HttpSession)。
  • 与数据库交互(如查询并展示数据)。

9、注意事项

  • 线程安全:Servlet 实例通常被多个线程共享,避免使用实例变量保存状态。
  • 性能优化:合理使用 init() 和 destroy() 管理资源。
  • 异步处理:Servlet 3.0+ 支持异步处理(AsyncContext),适合长时间任务。

10、优势与局限

优势:

  • 跨平台(Java 特性)。
  • 高性能(多线程处理请求)。
  • 与 Java 生态无缝集成(如 Spring MVC)。

局限:

  • 直接使用 Servlet API 较底层,通常需结合框架(如 Spring)简化开发。

11、总结

Servlet 是 Java Web 开发的基石,理解其原理是掌握高级框架(如 Spring MVC)的前提。尽管现代开发中更多使用框架,但 Servlet 的核心机制(如生命周期、请求/响应模型)仍然是关键基础。

猜你喜欢

转载自blog.csdn.net/weixin_42364929/article/details/146003768