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类来表示。

@RestController
public class MyController {
   

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

3. Controller

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

@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。

@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来处理请求。

@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管理,内容如下:

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

相关推荐

  1. Spring MVCHandler类型

    2024-01-05 12:10:03       67 阅读
  2. 特殊类设计、C++类型转换

    2024-01-05 12:10:03       42 阅读
  3. 背包问题类型

    2024-01-05 12:10:03       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-05 12:10:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-05 12:10:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-05 12:10:03       82 阅读
  4. Python语言-面向对象

    2024-01-05 12:10:03       91 阅读

热门阅读

  1. pytorch中的wheel文件

    2024-01-05 12:10:03       44 阅读
  2. C语言——!(--x)和!(-x)以及while(!(--x)) 和 while(!(-x))

    2024-01-05 12:10:03       50 阅读
  3. 什么是软件测评?

    2024-01-05 12:10:03       54 阅读
  4. vue2和vue3 部署打包到线上子目录的区别

    2024-01-05 12:10:03       59 阅读
  5. 50、Flink的单元测试介绍及示例

    2024-01-05 12:10:03       46 阅读
  6. flutter 项目安卓开启混淆防止渗透

    2024-01-05 12:10:03       53 阅读
  7. LN和BN

    LN和BN

    2024-01-05 12:10:03      48 阅读
  8. cnn lstm结合网络

    2024-01-05 12:10:03       65 阅读
  9. uniapp vue 前端页面半小时选择器

    2024-01-05 12:10:03       53 阅读
  10. 项目管理的细节-平衡

    2024-01-05 12:10:03       56 阅读
  11. 哈希查找【数据结构】

    2024-01-05 12:10:03       50 阅读
  12. Spring中的依赖注入(DI)的几种方法的使用

    2024-01-05 12:10:03       45 阅读