`
keepaneye
  • 浏览: 40145 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Spirng 源代码学习笔记 Web 篇(二)HandlerMapping

 
阅读更多

Spirng 源代码学习笔记 Web 篇(二)HandlerMapping

HandlerMapping 负责将请求映射到实际处理对象。

 

当应用上下文中未配置 HandlerMapping 的实现类时,DispatcherServlet 在初始化时会根据DispatcherServlet.properties 的配置设置 Spring 自己的实现类。 

 

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
	org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

 

继承结构:


 

HandlerMapping

接口声明如下,入参为 request 对象,返回为 HandlerExecutionChain。 

 

HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;

  

HandlerExecutionChain 包含实际处理请求的对象和拦截器。实际处理请求的对象例子是普通的 Controller 对象;拦截器的例子:如对 http 返回设置统一的防止浏览器缓存头信息。

 

AbstractHandlerMapping

继承自 WebApplicationObjectSupport,支持 ordering, a default handler, and handler interceptors.

使用 template method:

 

	public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
		Object handler = getHandlerInternal(request);
		if (handler == null) {
			handler = getDefaultHandler();
		}
		if (handler == null) {
			return null;
		}
		// Bean name or resolved handler?
		if (handler instanceof String) {
			String handlerName = (String) handler;
			handler = getApplicationContext().getBean(handlerName);
		}
		return getHandlerExecutionChain(handler, request);
	}
	
	protected abstract Object getHandlerInternal(HttpServletRequest request) throws Exception;
	
protected HandlerExecutionChain getHandlerExecutionChain(Object handler, HttpServletRequest request) {
		if (handler instanceof HandlerExecutionChain) {
			HandlerExecutionChain chain = (HandlerExecutionChain) handler;
			chain.addInterceptors(getAdaptedInterceptors());
			return chain;
		}
		else {
			return new HandlerExecutionChain(handler, getAdaptedInterceptors());
		}
	}
 

 

AbstractUrlHandlerMapping

for URL-mapped。Provides infrastructure for mapping handlers to URLs;

Supports direct matches and various Ant-style pattern matches。

 

// 注册映射关系

protected void registerHandler(String urlPath, Object handler)

 

// 根据已注册的映射集合找到所有匹配项,并确定一个 best match

protected Object lookupHandler(String urlPath, HttpServletRequest request)

 

// 调用 lookupHandler,设置拦截器,返回 HandlerExecutionChain

protected Object getHandlerInternal(HttpServletRequest request)

 

SimpleUrlHandlerMapping

根据用户配置的 Map<String, Object> 集合,注册映射集合。

 

AbstractDetectingUrlHandlerMapping

扫描所有 spring 上下文中的 bean 实例,存在映射的自动进行注册。

再次 template method:

 

	protected void detectHandlers() throws BeansException {
		if (logger.isDebugEnabled()) {
			logger.debug("Looking for URL mappings in application context: " + getApplicationContext());
		}
		String[] beanNames = (this.detectHandlersInAncestorContexts ?
				BeanFactoryUtils.beanNamesForTypeIncludingAncestors(getApplicationContext(), Object.class) :
				getApplicationContext().getBeanNamesForType(Object.class));

		// Take any bean name that we can determine URLs for.
		for (String beanName : beanNames) {
			String[] urls = determineUrlsForHandler(beanName);
			if (!ObjectUtils.isEmpty(urls)) {
				// URL paths found: Let's consider it a handler.
				registerHandler(urls, beanName);
			}
			else {
				if (logger.isDebugEnabled()) {
					logger.debug("Rejected bean name '" + beanName + "': no URL paths identified");
				}
			}
		}
	}
	protected abstract String[] determineUrlsForHandler(String beanName);
 

 

BeanNameUrlHandlerMapping

beanName 映射,只处理以 “/” 开始的 beanName。

	protected String[] determineUrlsForHandler(String beanName) {
		List<String> urls = new ArrayList<String>();
		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);
	}
 

 

DefaultAnnotationHandlerMapping

类和方法上 RequestMapping 注解中的 value 值作为 url 的构成部分。

 

AbstractControllerUrlHandlerMapping

基于约定,面向 Controller 类型的映射。可配置不希望包含的类或者包。

Controller 类型是指实现了 org.springframework.web.servlet.mvc.Controller 接口或者类上使用了 @Controller 注解。

 

ControllerBeanNameHandlerMapping

根据 beanName 和配置的前缀、后缀作为映射的 url。

 

ControllerClassNameHandlerMapping

根据类的名称生成 url,可配置大小写敏感、路径前缀、basePackage。

org.springframework.web.servlet.mvc.Controller

  • WelcomeController -> /welcome*
  • HomeController -> /home*

For MultiActionControllers and @Controller beans

  • WelcomeController -> /welcome, /welcome/*
  • CatalogController -> /catalog, /catalog/*
  • 大小: 10.5 KB
分享到:
评论

相关推荐

    org.apache.cxf.spring.remoting.Jsr181HandlerMapping.jar

    org.apache.cxf.spring.remoting.Jsr181HandlerMapping.jar

    看透springMvc源代码分析与实践

    8.3 关联spring源代码87 8.4 小结89 第9章 创建Spring MVC之器90 9.1 整体结构介绍90 9.2 HttpServletBean93 9.3 FrameworkServlet95 9.4 DispatcherServlet100 9.5 小结107 第10章 Spring MVC之用108 10.1...

    Spring MVC 学习笔记

    2、 DispatcherServlet把请求转交给HandlerMapping, HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象、多个HandlerInterceptor拦截器)对象.(后面会学习到拦截器) 3、 ...

    Spring in Action(第二版 中文高清版).part2

    第二部分 企业Spring 第5章 使用数据库 5.1 Spring的数据访问哲学 5.1.1 了解Spring数据访问的异常体系 5.1.2 数据访问的模板化 5.1.3 使用DAO支持类 5.2 配置数据源 5.2.1 使用JNDI数据源 5.2.2 使用数据源...

    Spring in Action(第二版 中文高清版).part1

    第二部分 企业Spring 第5章 使用数据库 5.1 Spring的数据访问哲学 5.1.1 了解Spring数据访问的异常体系 5.1.2 数据访问的模板化 5.1.3 使用DAO支持类 5.2 配置数据源 5.2.1 使用JNDI数据源 5.2.2 使用数据源...

    spring的web框架

    spring的web框架,详细的介绍有关框架的概述,DispatcherServlet、HandlerMapping、Controller、ModelAndView、ViewResolver、HandlerInterceptor的相关介绍

    SpringMVC源码总结(一)HandlerMapping和HandlerAdapter入门

    NULL 博文链接:https://yihuawuye1.iteye.com/blog/2104547

    全面掌握Spring MVC:从基础到高级的实践指南

    Spring MVC是Spring框架的一个模块,专注于构建Web应用程序。作为架构师和Java开发者,深入理解Spring MVC的原理和实践应用是非常重要的。本文通过分析Spring MVC的核心组件和执行流程,提供了一个全面的学习指南。 ...

    Struts2+Spring3+MyBatis3完整实例

    网上的东西好大多都不能直接用,自己结合网上资料做了一个Struts2+Spring3+MyBatis3的测试工程,JUnit测试用例和WEB服务。 内涵完整jar包,解压直接可用,包括一个表文件。 Eclipse3.2+Tomcat/5.5+jdk1.5.0_17 - ...

    spring:spring源码级别的学习

    1、web.xml DispatcherServlet 由Spring提供的 2、init-param classpath:application.xml contextConfigLoation 3、url-pattern /* 二、初始化、启动阶段 1、init 加载spring的配置文件 2、IOC初始化 声明一个IOC...

    民宿网站管理系统java+spring.7z,架构是SSM

    Spring MVC 内置了 Requestmapping、HandlerMapping 和 ViewResolver 等组件,可以简化开发流程。MyBatis 作为持久层框架,负责处理数据库操作。 在安全性方面,该网站采用了 SSL 证书进行加密传输,并实现了用户...

    Spring SpringMVC 简单整合

    Spring SpringMVC 简单整合(初学者参考) demo项目对应地址说明 :https://blog.csdn.net/tianyu00/article/details/89186404 SpringMVC流程 1、 用户发送请求至前端控制器DispatcherServlet。 2、 ...

    java spring mvc

    5)Spring MVC处理流程 a.首先客户端发出spring mvc请求,请求到达DispatcherServlet主控制器处理(前端控制器) b.主控制器调用HandlerMapping组件,根据请求不同调用Controller处理器 c.主控制器调用Controller方法...

    Spring MVC 员工管理系统

    Spring为展现层提供了一个优秀的Web框架——Spring MVC。和众多其它Web框架一样,它基于MVC设计理念,此外,由于它采用了松散耦合可插拔组件结构,具有比其它MVC框架更多的扩展性和灵活性。 Spring MVC框架围绕...

    入门案例-SpringMVC技术架构图

    Spring MVC以DispatcherServlet为核心,众多组件如HandlerMapping为辅助,为用户封装了请求映射等底层逻辑,让用户可以更专注与业务逻辑的处理。本文会对Spring MVC整体结构做简单介绍。 Spring MVC结构图 Spring ...

    Spring面试题

    2.源代码无关性 Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭...

    spring1.0.zip

    闲来无事,手写Spring的mini版本 1.0, 目前只有几个核心功能, @Controller,@RequestMapping,@RequestParam,HandlerMapping,DispatchServlet等.但是从前端发起URL请求到后台可以处理结果并且返回, 实现了...

    java-advance:java进阶,包含 常用设计模式、线程和并发、spring核心代码、mybatis核心代码、springboot2.0、springcloud G版本、docker的使用、各类面试题

    java进阶源码分析专题常用设计模式线程与并发锁的使用深度理解synchronized...Spring5新特性SpringMvcSpringMvc从Servlet到DispatcherServlet(一)SpringMvc初始化handlerMapping(二)SpringMvc中RequestCondition的...

    Spring MVC运行流程

    Spring MVC运行流程,分七个步骤,1.DispatcherServlet 2.HandlerMapping

Global site tag (gtag.js) - Google Analytics