Servlet 1.x 是 Java Web 开发的早期规范,为后续版本奠定了基础。以下是其核心特性、使用方式及与现代版本的对比分析:
一、Servlet 1.x 的核心特性
-
基础接口与实现
-
Servlet 1.x 的核心是
javax.servlet.Servlet
接口,开发者必须直接实现其五个抽象方法:init()
、service()
、destroy()
、getServletConfig()
和getServletInfo()
。 -
特点:没有
GenericServlet
或HttpServlet
抽象类的支持,需手动处理 HTTP 请求解析与响应生成。
-
-
生命周期管理
-
加载与初始化:容器首次收到请求时加载 Servlet 类并调用
init()
方法(仅一次)。 -
服务处理:所有请求由
service()
方法统一处理,需自行判断请求类型(如 GET/POST)。 -
销毁:容器关闭时调用
destroy()
释放资源。
-
-
配置方式
-
完全依赖
web.xml
:需在配置文件中定义<servlet>
和<servlet-mapping>
,例如:<servlet><servlet-name>MyServlet</servlet-name><servlet-class>com.example.MyServlet</servlet-class> </servlet> <servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/myPath</url-pattern> </servlet-mapping>
-
-
请求与响应处理
-
请求对象:通过
ServletRequest
获取参数,需手动处理字符编码(如setCharacterEncoding()
)。 -
响应生成:使用
ServletResponse
输出 HTML 或数据,需自行设置内容类型(如text/html
)。
-
二、Servlet 1.x 的局限性
-
缺少高层抽象
-
未提供
HttpServlet
,开发者需在service()
中自行实现 HTTP 方法分发(如区分 GET/POST)。 -
示例代码片段:
public void service(ServletRequest req, ServletResponse res) {HttpServletRequest httpReq = (HttpServletRequest) req;if ("GET".equals(httpReq.getMethod())) {// 处理GET逻辑} }
-
-
线程安全性问题
- Servlet 1.x 默认采用单实例多线程模型,若使用实例变量需开发者自行处理线程同步。
-
功能缺失
-
无会话管理:需通过 Cookie 或 URL 重写手动实现会话跟踪。
-
无注解支持:所有配置依赖
web.xml
,开发效率较低。
-
三、与现代 Servlet 规范的对比
特性 | Servlet 1.x | 现代版本(≥3.0) |
---|---|---|
抽象类支持 | 无,直接实现 Servlet 接口 | 提供 HttpServlet 和注解配置 |
配置方式 | 仅 web.xml | 支持注解(如 @WebServlet ) |
HTTP 方法处理 | 需在 service() 中手动分发 | 自动分派到 doGet() /doPost() |
会话管理 | 手动实现 | 内置 HttpSession 对象 |
线程模型 | 单实例多线程,需自行同步 | 推荐无状态设计,减少线程冲突风险 |
四、典型应用场景(历史背景)
- 早期 Java Web 应用:如 JSP 配合 Servlet 1.x 实现动态页面。
- 遗留系统维护:部分企业级系统仍基于 Servlet 1.x 规范开发。
java中的Servlet概述