Spring MVC自定义请求处理器

前言

Spring MVC 的核心是 DispatcherServlet,这个类本质上是一个 HttpServlet,它接管了所有的 HTTP 请求,让开发者专注于 Controller 编写 API 接口。

DispatcherServlet 处理 HTTP 请求的过程可以精简为四步:

  1. 通过 HandlerMapping 查找可以处理 HTTP 请求的处理器:Handler
  2. 查找可以协调处理器工作的处理器适配器:HandlerAdapter
  3. HandlerAdapter 协调 Handler 处理 HTTP 请求,得到 ModelAndView
  4. 处理返回结果,渲染视图

通过这四个步骤,引出了 Spring MVC 中三个核心组件:Handler、HandlerMapping、HandlerAdapter。

关于每个类的详细介绍,之后会专门记录,这里大家只需要大概了解即可:

  • Handler:请求处理器,可以是任何形式,在 Spring MVC 中用 Object 表示
  • HandlerMapping:处理器映射器,说白了就是查找 Handler 用的
  • HandlerAdapter:处理器适配器,光有 Handler 还不够,它是个 Object,Spring MVC 不知道怎么让它处理请求,所以还需要有一个协调者来让 Handler 干活

自定义请求处理器

为了让大家更好的理解 Spring MVC 处理 HTTP 请求的大致流程、以及这些组件的作用,我们自定义一个处理器来处理 HTTP 请求。

自定义Handler

前面说过了,在 Spring MVC 中 Handler 可以以任何形式存在,它可以是一个类,也可以是一个方法。这里我们用一个类来表示吧:

java 复制代码
public class MyHandler {

	public ModelAndView handle(HttpServletRequest request, HttpServletResponse response) throws IOException {
		response.addHeader(HttpHeaders.CONTENT_TYPE, "text/html");
		response.setCharacterEncoding("utf-8");
		response.getWriter().println("<h1>My Handler Page</h1>");
		response.getWriter().close();
		return null;
	}
}

逻辑很简单,输出一个超级简单的 HTML。

自定义HandlerAdapter

光有 MyHandler 还不够,Spring MVC 又不认识它,没法指挥它干活啊。

所以,我们还需要自定义处理器适配器,协调我们自定义的 MyHandler 干活:

java 复制代码
@Component
public class MyHandlerAdapter implements HandlerAdapter {

	// 是否支持给定的handler
	@Override
	public boolean supports(Object handler) {
		// 只要是 MyHandler 就支持
		return handler instanceof MyHandler;
	}

	@Override
	public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		// 协调MyHandler干活,透传request&response即可
		return ((MyHandler) handler).handle(request, response);
	}

	@Override
	public long getLastModified(HttpServletRequest request, Object handler) {
		return 0;// ignore
	}
}

Tips:自定义的 HandlerAdapter 记得注册到 Spring 容器!

自定义HandlerMapping

最后一步,就是让 Spring MVC 能找到我们自定义的 MyHandler。

所以我们还要自定义一个处理器映射器:MyHandlerMapping,规则很简单,只要请求的 URI 以 "/my-handler" 前缀,我们就把请求交给 MyHandler 处理。

java 复制代码
@Component
@Order(-1)
public class MyHandlerMapping implements HandlerMapping {

	@Override
	public HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
		// 只要URI前缀是"/my-handler"就交给MyHandler处理
		if (request.getRequestURI().startsWith("/my-handler")) {
			return new HandlerExecutionChain(new MyHandler());
		}
		return null;
	}
}

试一试

一切就绪,接下来启动 Spring 程序,访问网址:

basic 复制代码
http://127.0.0.1:8080/my-handler

就可以看到由我们自定义的处理器 MyHandler 输出的页面了:

尾巴

通过分析 DispatcherServlet 处理 HTTP 请求的流程,我们引出了 Spring MVC 至关重要的三个核心组件。现在你应该对这些组件的职责有了更深的认知,同时也清楚它们是如何协作的了。

相关推荐
别动我齐刘海5 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
code2cat6 小时前
Java进阶篇之AtomicLongFieldUpdater:把累计额度留在对象字段中
java·cas·并发编程
WeiXin_DZbishe6 小时前
基于springboot城市公交实时运营与调度系统-计算机毕设 附源码【课程设计】66173
java·vue.js·spring boot·后端·python·php·课程设计
泡茶喝茶写代码7 小时前
A股量化数据工程:从 REST 接口到策略信号(第 18 篇):放量缩量异动扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
wewowilling7 小时前
认识微服务
java·运维·微服务·springcloud
代码什么用7 小时前
Java Web 7-10
java·servlet
蜗牛互联网9 小时前
GPT-6 与 Intelligent UI:从回答到可审计操作的产品迁移
java·人工智能·后端
SL_staff9 小时前
运维救火实录:钉钉考勤API变更引发工资计算异常,我们用JVS-Logic可视化逻辑引擎实现分钟级热修复
java·mysql·全栈
SunnyDays101110 小时前
Java 查找并高亮 Word 文字:精确查找及正则表达式模糊查找
java·查找文字·word 文档·高亮文字·正则匹配查找·模糊查找