博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC三个HandlerMapping实现类解读
阅读量:2066 次
发布时间:2019-04-29

本文共 1848 字,大约阅读时间需要 6 分钟。

目录

1、前言

DispatchServlet需要通过url来找到对应的controller,而在SpringMVC中为我们完成这个工作的组件就是HandlerMapping。

而我们常见的No mapping found for HTTP request with URI……错误也是因为HandlerMapping没有找到对应handler,今天我们就来了解一下,SpringMVC中HandlerMapping的实现类。

2、HandlerMapping的实现类

在HandlerMapping的实现类中,除去抽象类、已弃用的实现类、子接口以及EmptyHandlerMapping空实现之外,我们可以得出三个实现类:

  1. BeanNameUrlHandlerMapping
  2. SimpleUrlHandlerMapping
  3. RequestMappingHandlerMapping

在这里插入图片描述

我们来逐一解读一下这几个类的作用。

2.1 BeanNameUrlHandlerMapping

该实现类可以把IOC容器中name以"/" 开头的Bean注册为handler

简单介绍一下这个类的使用方式:在xml文件中,我们只需要在配置bean的时候,加上name属性就可以将handler注册上去:

需要注意的是,name属性必须带上“/”前缀,否则BeanNameUrlHandlerMapping是不会将其注册进去的,关于这一点我们可以在源码中验证:

protected String[] determineUrlsForHandler(String beanName) {
List
urls = new ArrayList
(); if (beanName.startsWith("/")) {
urls.add(beanName); } String[] aliases = getApplicationContext().getAliases(beanName); for (String alias : aliases) {
if (alias.startsWith("/")) {
urls.add(alias); } } return StringUtils.toStringArray(urls); }

2.2 SimpleUrlHandlerMapping

该实现类需要我们在xml文件中手动配置url与handler的映射,使用方式有点类似struts2:

helloController

2.3 RequestMappingHandlerMapping

这是最常用的HandlerMapping实现,通过它,我们可以使用注解的形式来标识url与handler的映射:

@Controller("/mvc")public class HelloController {
@GetMapping("/hello") public String hello(){
return "hello"; } }

3、SpringMVC中的默认配置

当我们没有在xml文件中配置任何HandlerMapping实现类时,SpringMVC会使用默认的实现类,该配置可以在DispatcherServlet.properties中找到:

在这里插入图片描述
在此处SpringMVC为我们引入了两个默认实现类,一个是我们上面讲过的BeanNameUrlHandlerMapping。

而另一个DefaultAnnotationHandlerMapping是已经弃用的实现类,在Spring3.1使用新的HandlerMapping 和 HandlerAdapter来支持@Contoller和@RequestMapping注解处理器

需要注意的是,如果我们在xml中配置了HandlerMapping,那么默认的HandlerMapping就会失效。

转载地址:http://amfmf.baihongyu.com/

你可能感兴趣的文章
一次“不负责任”的 K8s 网络故障排查经验分享
查看>>
一次有趣的 Docker 网络问题排查经历
查看>>
KubeSphere Meetup 北京站火热报名中 | 搭载 CIC 2021 云计算峰会
查看>>
深入理解 Linux Cgroup 系列(一):基本概念
查看>>
深入理解 Linux Cgroup 系列(二):玩转 CPU
查看>>
云原生周报第 1 期 | 2019-06-24~2019-06-28
查看>>
Kubernetes Pod 驱逐详解
查看>>
kubectl 创建 Pod 背后到底发生了什么?
查看>>
[译] Kubernetes 儿童插图指南
查看>>
云原生周报第 2 期 | 2019-07-01~2019-07-05
查看>>
kubectl 创建 Pod 背后到底发生了什么?
查看>>
Kube-scheduler 源码分析(二):调度程序启动前逻辑
查看>>
kubernetes 1.15 有哪些让人眼前一亮的新特性?
查看>>
云原生周报:第 3 期
查看>>
深入理解 Linux Cgroup 系列(三):内存
查看>>
7月最新Java微服务资料
查看>>
Linux 指令
查看>>
wi10优化
查看>>
windows console 颜色设置
查看>>
VC unicode下Cstring转char*
查看>>