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 的基类,扩展 GenericServlet 。 | doGet(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. 注意事项
- 包迁移(Jakarta EE):
- 如果使用 Jakarta EE,包名变为
jakarta.servlet
和jakarta.servlet.http
。代码需替换javax
为jakarta
。
- 中文编码处理:
- 始终设置
response.setContentType("text/html;charset=UTF-8");
和request.setCharacterEncoding("UTF-8");
,避免中文乱码。 - 参数处理:使用
getParameter()
时,确保请求编码正确。
- 生命周期管理:
- Servlet 生命周期:init → service(多次) → destroy。
- 使用监听器监控应用/会话事件。
- 安全性:
- 避免在 Servlet 中存储敏感数据,使用 Session 或外部存储。
- 处理异常:重写
service()
时捕获异常。
- 性能优化:
- Servlet 是单例的,多线程访问需同步共享资源。
- 对于复杂应用,结合 JSP/EL 或框架(如 Spring MVC)使用。
- 常见问题解决:
- 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 文件),或特定包的深入讲解,请提供更多细节!我可以扩展示例或对比其他技术。