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 规范开发。