Spring MVC之Handler的四种类型

1. 前言

在Spring MVC的架构里面,负责处理HTTP请求的组件叫Handler。DispatcherServlet会根据请求的URL查找对应的处理器Handler,再根据Handler查找对应的适配器HandlerAdapter,再通过HandlerAdapter协调Handler处理请求。

Spring MVC并没有限制Handler的类型,使用Object来表示,Handler可以以任何形式存在。正因为如此,所以需要适配器HandlerAdapter来协调Handler工作。

Spring MVC默认有四种类型的Handler,对应的也就有四种适配器HandlerAdapter

2. HandlerMethod

最常用的自然是通过@RequestMapping注解将方法定义为Handler了,这种Handler在Spring MVC里面通过org.springframework.web.method.HandlerMethod类来表示。

java 复制代码
@RestController
public class MyController {

    @GetMapping("MyController")
    public Object test() {
        return "OK";
    }
}

3. Controller

Spring MVC提供了org.springframework.web.servlet.mvc.Controller接口,实现该接口的Handler也可以处理请求,beanName对应匹配的URL。

java 复制代码
@Component(value = "/MyControllerImpl")
public class MyControllerImpl implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.err.println("MyControllerImpl");
        response.getWriter().println("OK");
        response.getWriter().close();
        return null;
    }
}

4. HttpRequestHandler

Spring MVC提供了org.springframework.web.HttpRequestHandler接口,实现该接口的Handler同样可以处理请求,beanName对应匹配的URL。

java 复制代码
@Component("/MyHttpRequestHandler")
public class MyHttpRequestHandler implements HttpRequestHandler {

    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.err.println("MyHttpRequestHandler");
        response.getWriter().println("OK");
        response.getWriter().close();
    }
}

5. Servlet

最后一种就是原生的javax.servlet.Servlet,把原生Servlet作为bean注册到容器,Spring MVC也可以把它当作Handler来处理请求。

java 复制代码
@Component("/MyHttpServlet")
public class MyHttpServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.err.println("MyHttpServlet");
        resp.getWriter().println("OK");
        resp.getWriter().close();
    }
}

默认情况下,Spring MVC不会处理原生Servlet,原因是对应的适配器SimpleServletHandlerAdapter默认不会注册,默认适配器Spring MVC通过配置文件DispatcherServlet.properties管理,内容如下:

properties 复制代码
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

要想Spring MVC处理原生Servlet,首先得注册适配器SimpleServletHandlerAdapter

相关推荐
要开心吖ZSH1 小时前
一文搞懂:JDK 21 虚拟线程 vs N种异步方案,到底该怎么选?
java·数据库·jdk·虚拟线程
guodingdingh6 小时前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯8 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育8 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵8 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔10 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影10 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao1213111 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔11 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
CRMEB系统商城12 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源