Springboot定义Controller接口的这些方式你肯定不知道

2023-10-26

环境:Springboot2.4.11


概述

当一个请求过来后Spring是如何进行处理的?下面简单的罗列下请个的过程中核心组件

SpringMVC处理的流程:

  1. DispatcherServlet 所有请求的入口
  2. HandlerMapping 将请求地址与处理程序关联
  3. HandlerAdapter 真正处理程序,如执行上一步中对应的处理程序
  4. HandlerMethodArgumentResolver 对参数进行解析,这里面还涉及到很多其它东西
  5. HanlderMethodReturnValueHandler 对返回值进行输出处理
  6. ViewResolver 当上一步返回结果为ModelAndView时会应用视图解析器

常规Controller定义

@RestController
@RequestMapping("/users")
public class UsersController {
  @GetMapping("/save")
  public Object save(Users users) {
    return users ;
  }
}

上面这个Controller接口是我们最常的定义方法,对于绝大多数人来说或许也就知道这样去定义Controller接口,而这种定义Controller方式基本上已经可以满足我们日常的所有操作了。接下来看看其它的定义Controller方法

HttpRequestHandler

@Component("/others/chrh")
public class ControllerHttpRequestHandler implements HttpRequestHandler {
  @Override
  public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=utf8");
    PrintWriter out = response.getWriter() ;
    out.print("<h1>你好,HttpRequestHandler</h1>") ;
    out.close() ;
  }
}

定义一个类实现HttpRequestHandler接口即可,注意这里注解@Component("/others/chrh")使用的以‘/’ 开头,为什么这么定义?在概述中说到HandlerMapping是用来将请求地址与处理程序关联起来,在常规中都是使用@RequestMapping定义接口请求地址,那在这里我们是不能用该注解的,但是又要让容器知道我们这个接口就必须使用'/'开头,这样就会有一个 BeanNameUrlHandlerMapping的HandlerMapping将我们这个Bean进行收集保存起来,以 /others/chrh为key,Bean对象为value保存到Map中。

测试

Springboot定义Controller接口的这些方式你肯定不知道

Controller接口

定义一个Bean实现该即可

@Component("/others/custom")
public class CustomController implements Controller {

  @Override
  public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
    response.setContentType("text/html;charset=utf8");
    PrintWriter out = response.getWriter() ;
    out.print("<h1>Controller接口</h1>") ;
    out.close() ;
    return null ;
  }

}

Bean的名称还是以'/' 开头,那么还是由BeanNameUrlHandlerMapping与之关联

测试

Springboot定义Controller接口的这些方式你肯定不知道

继承HttpServlet

这里的判断依据就是你的这个Bean是否是Servlet接口类型(有没有实现Servlet接口)。

@Component("/others/servlet")
public class ControllerServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

  @Override
  protected void service(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=utf8");
    PrintWriter out = response.getWriter() ;
    out.print("<h1>你好 HttpServlet</h1>") ;
    out.close() ;
  }

}

这样看起来就是个标准的Servlet程序。

如果你只是这样,那这可运行不起来,你还需要注册一个
SimpleServletHandlerAdapter。

@Configuration
public class WebConfig implements WebMvcConfigurer {
  @Bean
  public SimpleServletHandlerAdapter simpleServletHandlerAdapter() {
    return new SimpleServletHandlerAdapter() ;
  }
}

测试

Springboot定义Controller接口的这些方式你肯定不知道

在这个程序中我们还可以让这个程序成为一个受应用服务管理的Servlet程序。可以将注解改成@WebServlet("/others/servlet")。只是换成这个注解还并不能生效,还需要在启动类(任何配置类上)添加@ServletComponentScan注解。

以上就是在SpringMVC中支持的几种接口定义处理方式。

下一篇文章会对上面几种实现的方式进行源码分析,一个请求是如何知道使用哪个HandlerMapping的,找到了HandlerMapping又是怎么确定由哪个HandlerAdapter处理的(在上面的例子中,每一种实现他们的实现方法都不一样,所以一定的需要不同的HandlerAdapter进行处理);通过源码的分析,让你知其然,知其所以然。关注我让你对Spring源码不再畏惧。

完毕!!!

求个关注+转发

公众:Springboot实战案例锦集

给个关注+转发谢谢

 图片

图片

图片

图片

图片

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot定义Controller接口的这些方式你肯定不知道 的相关文章

随机推荐

  • I/O多路复用(select、poll、epoll)

    基本思想 1 先构造一张有关文件描述符的表 然后使用我们的select poll epoll函数 2 我们的应用程序会将这张表复制给内核 3 内核层初始化表中的需要检测的描述符 4 当检测到有文件操作时 则立即将文件描述符作为标志并返回给应
  • Pytorch profiler with tensorboard.

    文章目录 前言 你将学到什么 一 准备数据集和模型 二 使用profiler来记录执行的事件 三 执行profiler 四 使用TensorBoard来观察结果并对模型性能做出分析 最后 总结 前言 你将学到什么 注意 以下所有的内容均来自
  • innerHTML的作用及用法。

    对innerHTML的用法有些模糊 今天来总结一下 1 innerHTML有两个作用 1 获取对象的内容 2 向对象插入内容 例 这是内容 由于id是唯一的 我们可以不获取id 通过 a innerHTML 来获取id为a的对象的内嵌内容
  • 数据结构学习笔记----排序

    排序 就是要整理表中的元素 使之按关键字递增 或递减 有序排列 如果待排序的表中 存在有多个关键字相同的元素 经过排序后这些具有相同关键字的元素之间的相对 次序保持不变 则称这种 排序算法是稳定的 在排序过程中 若整个表都是放在内存中处理
  • Java8 Stream 之groupingBy 分组讲解

    本文主要讲解 Java 8 Stream之Collectors groupingBy 分组示例 Collectors groupingBy 分组之常见用法 功能代码 使用java8 stream groupingBy操作 按城市分组list
  • day5 qt

    include widget h include ui widget h Widget Widget QWidget parent QWidget parent ui new Ui Widget ui gt setupUi this tim
  • 计算机无法识别荣耀9,华为荣耀9连接不上电脑端华为手机助手怎么处理?

    如果手机无法连接华为手机助手 可通过以下步骤来尝试解决 步骤一 请确认USB线连接是否正常 若手机通知栏中没有显示USB已连接的提示 则可能是USB线连接不正常 手机能充电不能说明USB线是完全连接正常 比如部分USB线仅支持充电不支持数据
  • 独家

    随机森林 概述 当变量的数量非常庞大时 你将采取什么方法来处理数据 通常情况下 当问题非常庞杂时 我们需要一群专家而不是一个专家来解决问题 例如Linux 它是一个非常复杂的系统 因此需要成百上千的专家来搭建 以此类推 我们能否将许多专家的
  • 将线程pid转成16进制_如何使用jstack分析线程状态

    背景 记得前段时间 同事说他们测试环境的服务器cpu使用率一直处于100 本地又没有什么接口调用 为什么会这样 cpu使用率居高不下 自然是有某些线程一直占用着cpu资源 那又如何查看占用cpu较高的线程 当然一个正常的程序员不会写出上述代
  • Spring Cloud中的Ribbon的实现和使用

    Spring Cloud Ribbon 是 Spring Cloud 生态系统中的一个负载均衡客户端 它可以轻松地与其他 Spring Cloud 组件集成 提供负载均衡的方式来访问后端服务 下面介绍 Spring Cloud Ribbon
  • 如何进行远程调试(remote debug)。

    场景 scenario 本地机器 A 重现不了问题 其他机器或其他系统 B 可以重现问题 而重现问题的机器没有装VS调试工具 在开发本地机器中拷贝远程调试工具 以VS 2015 为例 将C Program Files x86 Microso
  • yum错误:Invalid configuration value: failovermethod=priority in /etc/yum.repos.d/CentOS-Epel.repo;

    错误描述 yum install y yum utils device mapper persistent data lvm2 Invalid configuration value failovermethod priority in e
  • 解析优化机器人课程体系与教学策略

    依据 基础教育信息技术课程标准 制定机器人教育课程标准 将机器人教育课程纳入新的课程体系 对现有机器人教育教材进行重新规划和修订 提高机器人教育在中小学阶段课时的比例 同时保证实践课的课时比例 加强学生的动手能力 保证教学质量 除此 还要保
  • 请尽快报名参加Imagine Cup 微软“创新杯”全球学生大赛

    微软Imagine Cup 2013大赛报名即将截止 截止报名时间是2013年1月31日 请各大高校抓紧时间报名参加 CSDN高校俱乐部校区将选出1个校区一等奖 10个校区二等奖 校区一等奖可直接参加中国区半决赛 团队成员还可获得CSDN高
  • VS构建项目报错信息及解决办法04

    报错信息及解决7 报错信息详情 error LNK2001 无法解析的外部符号 symbol 原因 编译后的代码引用或调用符号 该符号未在链接器搜索的任何库或对象文件中定义 什么是未解析的外部符号 符号 是函数或全局变量的内部名称 它是在已
  • 【算法】最优服务次序问题(贪心算法)

    设有n 个顾客同时等待一项服务 顾客i需要的服务时间为 t i 1 lt i lt n 应如何安排n个顾客的服务次序才能使平均等待时间达到最小 平均等待时间是n 个顾客等待服务时间的总和除以n 输入格式 第一行是正整数n 1
  • 归档的概念和用法

    归档的概念和用法 概念 对象归档是指将对象写入文件保存在硬盘的文件内 当在次打开程序时 可以还原这些对象 也可以称为对象序列化 对象持外化 数据持久化的方式 1 gt NSKeyedArchiver 对象归档 2 gt NSUserDefa
  • 回味2022

    回味2022 1 前言 2 过去的十二个月 3 我期望的2023 1 前言 2021年写给自己的总结 回味2021 一年又一年飞逝的光阴 我想唯有时间留给人的印象最为深刻吧 春去秋来 四季轮回间都是时光的印记 2022年12月30日 25岁
  • pycocotools报错 if type(resFile) == str or type(resFile) == unicode: NameError: name ‘unicode‘ is

    Q pycocotools报错 if type resFile str or type resFile unicode NameError name unicode is not defined A pycocotools与python版本
  • Springboot定义Controller接口的这些方式你肯定不知道

    环境 Springboot2 4 11 概述 当一个请求过来后Spring是如何进行处理的 下面简单的罗列下请个的过程中核心组件 SpringMVC处理的流程 DispatcherServlet 所有请求的入口 HandlerMapping