Servlet 包

Servlet 包中文讲解

Servlet 是 Java EE(现 Jakarta EE)技术的一部分,用于开发动态 Web 应用。Servlet 的核心功能通过特定的 Java 包(package)来实现。这些包定义了 Servlet 的接口、类和注解,帮助开发者处理 HTTP 请求和响应。下面用中文详细讲解 Servlet 的主要包,包括包结构、常用类/接口、代码示例和注意事项。


1. Servlet API 的包概述

Servlet API 主要由两个核心包组成:

  • javax.servlet:这是 Servlet 的基础包,提供通用接口和类,适用于非 HTTP 协议的 Servlet(但实际中多用于 HTTP)。
  • javax.servlet.http:这是 HTTP 特定的包,扩展了 javax.servlet 包,提供处理 HTTP 请求/响应的类和接口。这是开发 Web 应用最常用的包。

注意

  • 在 Java EE 8 之前,使用 javax.servlet;从 Jakarta EE 9 开始,迁移到 jakarta.servlet(包名变更,但功能类似)。本讲解以 javax.servlet 为例,适用于大多数遗留项目。
  • 需要在项目中引入 Servlet API 依赖(如 Maven:<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency>)。
  • Servlet 包不包含实现(如 Tomcat 提供实现),仅定义 API。

这些包的类和接口用于:

  • 处理请求/响应。
  • 管理会话、过滤器、监听器等。
  • 支持注解配置(如 @WebServlet)。

2. javax.servlet 包详解

这个包是 Servlet 的基础,提供核心接口和类,不依赖特定协议。

(1) 常用接口和类

使用表格列出主要成员:

类/接口描述常用方法/属性
Servlet (接口)Servlet 的核心接口,所有 Servlet 必须实现。定义了生命周期方法。init(ServletConfig):初始化。
service(ServletRequest, ServletResponse):处理请求。
destroy():销毁。
GenericServlet (抽象类)Servlet 接口的抽象实现,提供默认方法,简化开发。getServletConfig():获取配置。
log(String):日志记录。
ServletRequest (接口)表示客户端请求,提供参数、属性等。getParameter(String):获取请求参数。
getAttribute(String):获取属性。
ServletResponse (接口)表示服务器响应,提供输出流等。getWriter():获取 PrintWriter 输出。
setContentType(String):设置响应类型。
ServletConfig (接口)Servlet 配置信息,从 web.xml 或注解获取。getInitParameter(String):获取初始化参数。
getServletContext():获取上下文。
ServletContext (接口)表示 Web 应用上下文,共享资源。getResourceAsStream(String):获取资源。
setAttribute(String, Object):设置应用属性。
RequestDispatcher (接口)用于转发请求或包含其他资源。forward(ServletRequest, ServletResponse):转发。
include(ServletRequest, ServletResponse):包含。
Filter (接口)过滤器接口,用于拦截请求/响应。doFilter(ServletRequest, ServletResponse, FilterChain):过滤逻辑。
ServletContextListener (接口)监听应用上下文事件。contextInitialized(ServletContextEvent):应用启动。
contextDestroyed(ServletContextEvent):应用销毁。

(2) 代码示例:使用 GenericServlet

import javax.servlet.*;
import java.io.IOException;

public class MyGenericServlet extends GenericServlet {
    @Override
    public void service(ServletRequest request, ServletResponse response) 
            throws ServletException, IOException {
        // 设置响应类型
        response.setContentType("text/html;charset=UTF-8");

        // 输出内容
        response.getWriter().write("<h1>这是 GenericServlet 的响应!</h1>");
    }
}

说明

  • 继承 GenericServlet,只需重写 service() 方法。
  • 在 web.xml 中配置:<servlet><servlet-name>myServlet</servlet-name><servlet-class>MyGenericServlet</servlet-class></servlet><servlet-mapping><servlet-name>myServlet</servlet-name><url-pattern>/generic</url-pattern></servlet-mapping>

3. javax.servlet.http 包详解

这个包扩展了 javax.servlet,专注于 HTTP 协议,提供 HTTP 特定的类。

(1) 常用接口和类

使用表格列出主要成员:

类/接口描述常用方法/属性
HttpServlet (抽象类)HTTP Servlet 的基类,扩展 GenericServletdoGet(HttpServletRequest, HttpServletResponse):处理 GET。
doPost(HttpServletRequest, HttpServletResponse):处理 POST。
其他:doPut、doDelete 等。
HttpServletRequest (接口)扩展 ServletRequest,提供 HTTP 请求细节。getMethod():获取请求方法(如 GET)。
getSession():获取 HttpSession。
getCookies():获取 Cookie 数组。
getHeader(String):获取请求头。
HttpServletResponse (接口)扩展 ServletResponse,提供 HTTP 响应控制。sendRedirect(String):重定向。
addCookie(Cookie):添加 Cookie。
setStatus(int):设置状态码(如 404)。
HttpSession (接口)表示用户会话,存储用户数据。getAttribute(String):获取会话属性。
setAttribute(String, Object):设置属性。
invalidate():销毁会话。
Cookie (类)表示 HTTP Cookie。getName()getValue():键值。
setMaxAge(int):设置有效期。
HttpSessionListener (接口)监听会话事件。sessionCreated(HttpSessionEvent):会话创建。
sessionDestroyed(HttpSessionEvent):会话销毁。

(2) 代码示例:使用 HttpServlet

import javax.servlet.http.*;
import java.io.IOException;

public class MyHttpServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws IOException {
        // 设置响应类型
        response.setContentType("text/html;charset=UTF-8");

        // 获取请求参数
        String name = request.getParameter("name");

        // 输出响应
        response.getWriter().write("<h1>欢迎," + (name != null ? name : "访客") + "!</h1>");
    }
}

说明

  • 继承 HttpServlet,重写 doGet()doPost()
  • 使用注解配置(Servlet 3.0+):@WebServlet("/http") 代替 web.xml。

4. Servlet 包的注解支持(Servlet 3.0+)

Servlet 包引入注解简化配置,无需 web.xml:

  • @WebServlet(name = "myServlet", urlPatterns = "/path"):定义 Servlet。
  • @WebFilter(urlPatterns = "/*"):定义过滤器。
  • @WebListener:定义监听器。
  • @MultipartConfig:处理文件上传。

代码示例:注解式 Servlet

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/anno")
public class AnnoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws IOException {
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().write("<h1>注解配置的 Servlet!</h1>");
    }
}

5. 注意事项

  1. 包迁移(Jakarta EE)
  • 如果使用 Jakarta EE,包名变为 jakarta.servletjakarta.servlet.http。代码需替换 javaxjakarta
  1. 中文编码处理
  • 始终设置 response.setContentType("text/html;charset=UTF-8");request.setCharacterEncoding("UTF-8");,避免中文乱码。
  • 参数处理:使用 getParameter() 时,确保请求编码正确。
  1. 生命周期管理
  • Servlet 生命周期:init → service(多次) → destroy。
  • 使用监听器监控应用/会话事件。
  1. 安全性
  • 避免在 Servlet 中存储敏感数据,使用 Session 或外部存储。
  • 处理异常:重写 service() 时捕获异常。
  1. 性能优化
  • Servlet 是单例的,多线程访问需同步共享资源。
  • 对于复杂应用,结合 JSP/EL 或框架(如 Spring MVC)使用。
  1. 常见问题解决
  • ClassNotFoundException:检查 Servlet API JAR 是否在 classpath。
  • NoSuchMethodError:版本不匹配,确保容器(如 Tomcat)和 API 版本一致。
  • 注解无效:确保 Servlet 版本 ≥3.0,并启用注解扫描。

6. 总结

  • javax.servlet 提供基础 Servlet 功能,javax.servlet.http 专注于 HTTP。
  • 通过继承 HttpServlet 和使用接口如 HttpServletRequest,可以轻松处理 Web 请求。
  • 注解简化配置,适合现代开发。
  • Servlet 包是 Web 开发的基础,理解这些包有助于构建 robust 的应用。

如果这是指“Servlet 的打包部署”(如 WAR 文件),或特定包的深入讲解,请提供更多细节!我可以扩展示例或对比其他技术。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注