几句话分析org.springframework.web.servlet.HandlerMapping体系机构

简介

   

目录

简介

   

基于对象级别映射关系的HandlerMapping

AbstractUrlHandlerMapping

AbstractDetectingUrlHandlerMapping

AbstractControllerUrlHandlerMapping

基于方法级别的HandlerMapping

 AbstractHandlerMethodMapping

                                       重要说明


映射器的作用就是解析出来url和handler的关系,并且保存这样的关系,在每次请求到来时,查找这个handler。handler并未有明确的要求,但是从spring原本实现上看,handler主要有对象级别和方法级别两种.

     {@link HandlerMapping}为高级接口定义,所有的HandlerMapping都是基于它实现的。但是它仅仅只是定义了,如何通过Request查找对应的HandlerExecutionChain对象,并未定义如何注册url和handler的关系,它的默认实现是 AbstractHandlerMapping,而它只提供了org.springframework.web.servlet.handler.AbstractHandlerMapping#getHandlerInternal方法,用于查找url与handler的关系。并且将找到的handler封装成HandlerExecutionChain对象,这个对象作用后面再讲。

        {@link  AbstractHandlerMapping}有两个实现类,分别是从对象级别以及方法级别上查找url和handler的映射关系,这两个实现类分别是:

  1.  AbstractUrlHandlerMapping:从对象级别定义url和handler的映射关系,它的内部是通过一个map来维护这个关系的,但是它只定义了url和handler的查找关系,以及提供了注册url与handler关系的接口,并未实现查找url与handler的映射关系的功能(这个功能是由子类实现的)
  2. AbstractHandlerMethodMapping:从方法级别定义url和handler的映射关系,它的内部是通过一个注册中心来维护这个关系的,即{@link AbstractHandlerMethodMapping.MappingRegistry},并且它支持的是{@link org.springframework.web.bind.annotation.RequestMapping}的注解。

基于对象级别映射关系的HandlerMapping

AbstractUrlHandlerMapping

它处理的handler是一个bean,但这个bean又分为实现了特定接口的bean和不指定特定实现的bean。注意该bean提供了查找关系的模式,也提供了注册url和handler关系的方法,但是就是没有实现查找url与handler关系的方法,所以它的子类必须得实现这个关系。

springmvc提供了如下两种实现:

  1. 自己指定url和handler关系映射的,即通过prop指定,其为{@link SimpleUrlHandlerMapping}
  2.  通过bean工厂的所有的bean,并根据bean本身去解析bean的url和handler关系的,即{@link AbstractDetectingUrlHandlerMapping}

AbstractDetectingUrlHandlerMapping

它实现了initApplicationContext的方法,该方法可以获取ApplicationContext,接着会从ApplicationContext获取所有的bean,并且进行解析。

对于通过bean本身去解析bean的url和handler关系的类,该类有分为两种:

  1. 第一种是通过bean的名称去解析,而bean的名称就是我们定义bean的时候制定的。即
    {@link BeanNameUrlHandlerMapping}
  2. 第二种则是通过实现了特定接口或者注解的bean去解析的bean,即
    {@link AbstractControllerUrlHandlerMapping}
AbstractControllerUrlHandlerMapping
该类通过,查找固定实现了{@link Controller}接口或者 {@link org.springframework.stereotype.Controller} 的bean来实现bena的关系映射,他又进一步分为三种查找关系
  1. bean的name是一个url结构的。对应的实现类为{@link ControllerBeanNameHandlerMapping},它与BeanNameUrlHandlerMapping的区别是,他必须实现实现了{@link Controller}接口或者 {@link org.springframework.stereotype.Controller},并且他还支持前缀、后缀适配、过滤适配等。
  2. bean的包路径形成url结构的,对应的实现类为{@link ControllerClassNameHandlerMapping},它的作用,就是讲bean所在的包当做url的一部分,进行url匹配。
  3. bean上注解了{@link org.springframework.web.bind.annotation.RequestMapping}的,目前该方法即将淘汰,使用AbstractHandlerMethodMapping的进行替换和支持。这个方法与AbstractHandlerMethodMapping的区别之处在于,他解析结果是对象级别的,比如你一个bean中注解了多个requestmapping,它的内部存的是一个requestmapping的url与这个bean的映射关系,而AbstractHandlerMethodMapping则是存了一个requestmapping与这个方法级别的映射关系

基于方法级别的HandlerMapping

 AbstractHandlerMethodMapping

这个方法是处理方法级别的映射,这个方法实现的原理就是遍历ApplicationContext的所有的bean,在afterPropertiesSet中实现,然后找到这个bean的所有方法进行处理。

这个类还是 一个泛型类,这个泛型的作用就是如何包装method的信息。如我们所熟悉的@RequestMapping注解的方法,解析得到的就是一个RequestMappingInfo对象。

但无论是什么,最终都会转变成org.springframework.web.method.HandlerMethod对象,而org.springframework.web.method.HandlerMethod就可以理解成我们所谓的handler。

                                       重要说明

从上面来看,通过handlermapping,我们得到的handler有两种,一种方法级别的handler,一种是对象级别的handler。

但是spring并不会直接使用这个handler,而是使用HandlerExecutionChain进行了封装。HandlerExecutionChain封装了什么呢?

1.对handler的调用的拦截,即HandlerInterceptor。HandlerInterceptor就是一个接口,用于拦截handler的调用前后回调。

2.解决跨域问题。跨域问题另行了解

### 回答1: 在使用Spring框架的MVC模式进行Web开发时,我们需要导入org.springframework.web.servlet包。这个包中包含了一些用于处理HTTP请求和响应的类和接口。 首先,在项目中使用Spring框架需要在项目的构建工具中加入spring-webmvc依赖,例如在Maven项目中,在pom.xml文件中添加以下依赖项: ```xml <dependencies> <!-- Spring webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.1.RELEASE</version> </dependency> </dependencies> ``` 然后,在我们的Java类中使用import语句导入org.springframework.web.servlet包中的相应类和接口。例如,在一个Controller类中,我们可能需要导入以下类: ```java import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; ``` 其中,Controller是一个接口,我们可以通过实现该接口来处理HTTP请求。ModelAndView类表示一个包含模型数据和相应视图的对象。 当我们导入了org.springframework.web.servlet包后,就可以使用其中的类和接口来编写处理Web请求的逻辑了。比如,我们可以创建一个实现了Controller接口的类,重写handleRequest方法来处理具体的请求,并返回相应的视图。 总结来说,导入org.springframework.web.servlet包是为了能够使用Spring框架提供的处理HTTP请求和响应的类和接口。这些类和接口可以帮助我们简化Web开发过程,并提供了一些方便的方法和工具来处理请求、渲染视图等操作。 ### 回答2: 为了使用org.springframework.web.servlet包,您需要执行以下步骤: 1. 打开您的Java项目,并确保您的项目已经配置了Maven或Gradle依赖管理工具。 2. 在您的项目配置文件(例如pom.xml或build.gradle)中添加Spring MVC的相关依赖。 3. 在依赖配置文件中,添加以下依赖项: - Maven: ```xml <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>您需要的版本号</version> </dependency> </dependencies> ``` - Gradle: ```groovy dependencies { implementation 'org.springframework:spring-webmvc:您需要的版本号' } ``` 4. 保存并更新您的项目配置文件,以便Maven或Gradle可以自动下载所需的库和依赖项。 5. 在您的Java类中,导入org.springframework.web.servlet相关类: ```java import org.springframework.web.servlet.*; ``` 6. 现在,您可以在您的代码中使用Spring MVC提供的类和功能。 通过遵循上述步骤,您就可以成功导入org.springframework.web.servlet包,并开始使用Spring MVC框架提供的功能开发Web应用程序。 ### 回答3: 导入org.springframework.web.servlet包是为了使用Spring MVC框架提供的Servlet相关的类和接口。Spring MVC是一种基于ServletWeb应用程序框架,用于开发灵活、可扩展的Web应用程序。 在导入org.springframework.web.servlet包之前,需要首先在项目的构建管理工具中添加对Spring MVC框架的依赖,例如使用Maven的话,在项目的pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>版本号</version> </dependency> ``` 这将自动引入org.springframework.web.servlet包及其相关依赖。 在代码中导入org.springframework.web.servlet包,可以使用以下语句: ``` import org.springframework.web.servlet.*; ``` 导入该包后,可以使用Spring MVC提供的一系列类和接口,例如: - DispatcherServletServlet派发器,用于将请求派发给相应的处理器。 - HandlerMapping:处理器映射,用于将请求映射到相应的处理器。 - HandlerAdapter:处理器适配器,用于处理请求并调用相应的处理器方法。 - ModelAndView:模型和视图,用于封装处理器处理后的数据和视图信息。 - ViewResolver:视图解析器,用于根据逻辑视图名解析出具体的视图。 导入org.springframework.web.servlet包后,就可以利用Spring MVC的功能进行Web应用程序的开发,包括URL映射、请求处理、参数绑定、模型和视图的处理等,提供了快速、简单和灵活的Web开发方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值