Servlet、HttpServlet 和 DispatcherServlet 区别与关系

在 Java Web 开发中,ServletHttpServletDispatcherServlet 是非常常见的类。

一、Servlet 接口(javax.servlet.Servlet)

✅ 基本介绍:

  • 所属包javax.servlet.Servlet
  • 作用:是所有 Servlet 的根接口,定义了 Servlet 生命周期的基本方法。
  • 特点
    • 与协议无关(可以用于任何协议,如 HTTP、FTP 等)。
    • 是一个底层接口,通常我们不会直接实现它,而是继承其子类(如 HttpServlet)。

🧱 核心方法:

方法描述
init(ServletConfig config)初始化方法,在第一次请求时调用一次
service(ServletRequest req, ServletResponse res)处理客户端请求的核心方法
destroy()销毁方法,在服务器关闭或重新部署时调用
getServletInfo()返回有关该 Servlet 的信息
getServletConfig()返回配置对象

💡 示例代码:

public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig config) {
   
        System.out.println(" <init-param> " + servletConfig.getInitParameter("name")); 
   }

    @Override
    public void service(ServletRequest request, ServletResponse response) throws IOException {
        response.getWriter().write("Hello from Servlet!");
    }

    @Override
    public void destroy() { }

    @Override
    public String getServletInfo() {
        return "A simple servlet";
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
}

⚠️ 注意:一般不建议直接实现 Servlet 接口,而是继承 HttpServlet

配置普通 Servlet

假设我们有一个简单的Servlet类名为HelloServlet,其完整类路径为com.example.HelloServlet。在项目的部署描述符文件web.xml中进行配置。

<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.example.HelloServlet</servlet-class>
    <!-- 可选:初始化参数 -->
    <init-param>
        <param-name>name</param-name>
        <param-value>张三</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

这里定义了一个名为HelloServlet的Servlet,并将其映射到URL模式/hello上。当用户访问这个URL时,就会触发这个Servlet。

二、HttpServlet 抽象类(javax.servlet.http.HttpServlet)

✅ 基本介绍:

  • 所属包javax.servlet.http.HttpServlet
  • 作用:专门用于处理 HTTP 协议的抽象类,是 Servlet 的扩展。
  • 特点
    • 只处理 HTTP 请求(GET、POST、PUT、DELETE 等)。
    • 提供了 doGet()doPost() 等方法,开发者只需重写这些方法即可。
      在这里插入图片描述

🧱 核心方法:

方法描述
doGet(HttpServletRequest req, HttpServletResponse resp)处理 GET 请求
doPost(HttpServletRequest req, HttpServletResponse resp)处理 POST 请求
service(HttpServletRequest req, HttpServletResponse resp)根据 HTTP 方法自动调用 doGet/doPost 等

💡 示例代码:

public class HelloHttpServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        resp.setContentType("text/html");
        PrintWriter out = resp.getWriter();
        out.println("<h1>Hello from HttpServlet!</h1>");
    }
}

✅ 更推荐使用 HttpServlet 来开发基于 HTTP 的 Web 应用。

由于HttpServlet是处理HTTP请求的特殊类型,它的配置方式与普通的Servlet几乎相同。如果我们的HttpServlet实现类名为HelloHttpServlet,且位于com.example包下,我们可以这样配置:

<servlet>
    <servlet-name>HelloHttpServlet</servlet-name>
    <servlet-class>com.example.HelloHttpServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>HelloHttpServlet</servlet-name>
    <url-pattern>/httpHello</url-pattern>
</servlet-mapping>

三、DispatcherServlet(org.springframework.web.servlet.DispatcherServlet)

✅ 基本介绍:

  • 所属框架:Spring MVC
  • 作用:前端控制器(Front Controller),负责接收所有请求并协调 Spring MVC 各个组件进行处理。
  • 特点
    • 是 Spring MVC 的核心组件之一。
    • 负责请求分发、视图解析、异常处理等。
    • 不是标准的 Servlet,而是对 HttpServlet 的封装和增强。

🧱 工作流程简述:

  1. 用户发送 HTTP 请求。
  2. DispatcherServlet 拦截请求。
  3. 使用 HandlerMapping 找到对应的 Controller。
  4. 调用 Controller 并获取 Model 数据。
  5. 使用 ViewResolver 解析视图名。
  6. 渲染视图并返回响应。

💡 示例配置(web.xml + spring-servlet.xml):

web.xml 配置:
<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
spring-servlet.xml 配置:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>
示例 Controller:
@Controller
public class HelloController {
    @RequestMapping("/hello")
    public String sayHello(Model model) {
        model.addAttribute("message", "Hello from DispatcherServlet!");
        return "hello"; // 对应 /WEB-INF/views/hello.jsp
    }
}

四、三者的关系总结

类型层级用途是否协议相关是否 Spring 组件
Servlet最基础接口定义生命周期和基本操作
HttpServlet抽象类专用于处理 HTTP 请求是(HTTP)
DispatcherServletSpring MVC 核心类Spring MVC 的前端控制器,整合 MVC 流程是(HTTP)

五、类图结构示意(简化版)

  • DispatcherServlet 是 Spring MVC 中的一个特殊 Servlet,继承自 FrameworkServlet,而 FrameworkServlet 又继承自 HttpServlet
  • 在这里插入图片描述
    在这里插入图片描述

六、应用场景对比

场景推荐使用
编写简单的 HTTP 请求处理逻辑HttpServlet
构建模块化、可维护的 Web 应用DispatcherServlet(配合 Spring MVC)
实现非 HTTP 协议的服务自定义 Servlet 实现

七、结语

  • 如果你只是想快速构建一个处理 HTTP 请求的小型应用,可以选择 HttpServlet
  • 如果你需要构建大型、模块化的 Web 应用,强烈推荐使用 Spring MVC 和 DispatcherServlet
  • Servlet 是整个 Java Web 体系的基础,了解它是掌握现代框架的前提。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员乐逍遥

如果你觉得帮助了你,支持一下!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值