和大彪一起来学习-SpringMvc之第二回(控制器,适配器说明)

简述:

在上一篇文章中,我们学会了如何搭建一个简单SpringMvc HelloWorld程序,这篇文章主要是介绍一些常用的控制器,适配器学习和作用。

一、HandlerMapping处理器映射器

HandlerMapping 给前端控制器返回一个HandlerExecutionChain 对象(包含一个Handler (后端控制器)对象、多个HandlerInterceptor 拦截器)对象。

1).BeanNameUrlHandlerMapping Bean别名路径映射器

BeanNameUrl,通过类的命名名称我们是否发现了些什么?对,没错,就是通过配置bean的时候,bean的name作为访问其对应Controller的路径。一般可以和SimpleControllerHandlerAdapter配合使用,你如果把上一篇文章里面的例子自己写了遍的话,就会发现我们是用他们两个实现的。(源码中,就是实现了其父类AbstractDetectingUrlHandlerMapping
的determineUrlsForHandler方法,在方法中根据Bean Name注册处理器)

springmvc-servlet.xml 一般可以这么配置使用它:

<span style="white-space:pre">		</span><!-- 通过 /helloworld.action  可以访问到具体处理方法 -->
		<bean name="/helloworld.action" class="com.billstudy.springmvc.controller.HelloWorldController"/>

2).SimpleUrlHandlerMapping 简单路径处理映射器

SimpleUrl,这个是比较有意思的映射器,就是将访问路径直接映射到具体Controller类的id,通过查看源码我们会发现其实类中有个Map,用来存放注入进去的路径和Bean的相关信息,然后通过其父类注册处理器处理相关请求,看看源码就能更好的理解了:

public class SimpleUrlHandlerMapping extends AbstractUrlHandlerMapping {
	// 内部用了个map作为存放访问路径和beand的映射
	private final Map urlMap = new HashMap();
	// 由于这里有这个方法,那么我们在配置文件中就可以通过mappings,注入我们的数据
	public void setMappings(Properties mappings) {
		this.urlMap.putAll(mappings);
	}
	// 省略部分不相关方法....
</pre><pre name="code" class="java">	public void initApplicationContext() throws BeansException {
		super.initApplicationContext();
		registerHandlers(this.urlMap);
	}

	protected void registerHandlers(Map urlMap) throws BeansException {
		if (urlMap.isEmpty()) {
			logger.warn("Neither 'urlMap' nor 'mappings' set on SimpleUrlHandlerMapping");
		}
		else {
			Iterator it = urlMap.keySet().iterator();
			while (it.hasNext()) {
				String url = (String) it.next();
				Object handler = urlMap.get(url);
				// 如果不是斜杠起始,那么带上斜杠
				if (!url.startsWith("/")) {
					url = "/" + url;
				}
				// 如果是字符串,那么处理掉空格,这个不错,小细节也值得我们学习,
				if (handler instanceof String) {
					handler = ((String) handler).trim();
				}
				// 调用父类 AbstractUrlHandlerMapping方法,进行URL路径注册处理器
				registerHandler(url, handler);
			}
		}
	}

}

springmvc-servlet.xml一般可以这么配置使用:

<!—简单url映射,可以将项目的路径统一放到这里配置,比较方便,多个范围路径可以映射到通过一个Controller上,类似Map(key-value) -->
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props><!-- key:访问路径   value:bean的id -->
				<prop key="/hello1.action">hello_controller</prop>
				<prop key="/hello2.action">hello_controller</prop>
			</props>
		</property>
	</bean>

二、HandlerAdapter处理器适配器

HandlerAdapter会把后端控制器包装为一个适配器,支持多种类型的控制器开发,这里使用了适配器设计模式。

1).SimpleControllerHandlerAdapter简单控制器处理器适配器

简单控制器处理器适配器所有实现了org.springframework.web.servlet.mvc.Controller 接口的Bean作为Springmvc的后端控制器,分析源码我们可以更好地发现这一点。

public class SimpleControllerHandlerAdapter implements HandlerAdapter {
	// 判断目标类是否实现了Controller接口,为进一步执行handle方法做预判断
	public boolean supports(Object handler) {
		return (handler instanceof Controller);
	}

	// 处理方法
	public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// 使用简单,粗暴的方式 直接向上转型后执行 我们实现类bean里面的handleRequest方法,也就是Controller里面唯一的待实现方法。
		return ((Controller) handler).handleRequest(request, response);
	}
}

一般在配置文件中,直接配置该类即可支持实现了Controller接口的类正常使用

2).HttpRequestHandlerAdapter
Http请求处理器适配器

HTTP请求处理器适配器将http请求封装成HttpServletResquest 和HttpServletResponse对象,和servlet接口类似。通过源码会发现这个和上面的SimpleController处理有点类似,上面是强转Controller,这里是强转HttpRequestHandler对象,所以我们想要使用这个适配器时,应该怎么做呢?你可能通过对比学习发现了,对,就是写个bean实现HttpRequestHandler这个接口就好了。
比较简单,有兴趣的同学自己先试着写一下,然后想进一步看看内部如何实现的话可以去读读该源码哦。

好了,今天这些就是内容了,主要就是以上映射器和适配器的介绍了。大彪在这里只是简单地列出了几个,其实springmvc给咱们提供了很多映射器和适配器,如果小伙伴有更多的时间想对这些更深入地学习,可以继续看看别的类实现,如下图:

推荐个学习框架小技巧,可以通过查看框架的api文档找到几个主要的类或者接口,然后弄懂大概整个的框架模型和基本架构(springmvc 组件架构去看看第一回),然后再通过这些主要的类,和接口去学习。其实像这种比较成熟的开源框架,类的命名和注释都是相当规范的,以及具体用的一些设计模式、代码哲学都是非常值得我们学习的。写几个小例子,跑跑,打个断点跟着框架走上几次,忒爽了。
这些有时候比啃书来的实际多了,当然作为IT人,技术图书也是必不可缺的,好拉。 下一篇打算写写,springmvc里面重点:注解的使用。

简单说明什么是映射器,适配器:

映射器:就是根据DispatcherServlet 拿过来的用户请求某部分路径去寻找处理器(就是我们写的具体的某个方法)和一些拦截器

适配器:具体执行处理器的对象,将ModelAndView返回给DispatcherServlet渲染视图用的

这里是 热爱生活,热爱技术,喜欢交友的大彪 .

时间: 2024-10-01 11:17:26

和大彪一起来学习-SpringMvc之第二回(控制器,适配器说明)的相关文章

和大彪一起来学习-SpringMvc之第四回(拦截器使用)

一.拦截器介绍 springmvc中的拦截器,简单来说就是对用户的请求进行拦截,我们可以在拦截用请求后进行预处理和后处理,可以在这里做日志记录.权限控制.请求用时计算等操作.和Servlet api中的Filter有点类似. 二.拦截器使用 1.编写拦截器 我们要自己编写拦截器,比较常用的方法是实现org.springframework.web.servlet.HandlerInterceptor类,我把这个类的源码贴出来吧,内部就三个方法,我们的业务可以在方法中实现. package org.

和大彪一起来学习-SpringMvc之第三回(注解使用详解)

简述: 在上一篇文章中,介绍了适配器和映射器的一些概念,这篇文章主要是介绍SpringMvc注解的使用,下面先从一个最简单注解程序开始,慢慢引入一些常用的注解(@Controller,@Component,@Service,@Repository,@RequestMapping,@InitBinder,@RequestParam,@PathVariable,@RequestBody ,@ResponseBody). 一.第一个注解项目 1.创建项目,加入Jar包,编写web.xml 可以加入第一

大神的算法学习之路

http://zh.lucida.me/ 大神的算法学习之路,布布扣,bubuko.com

springmvc学习笔记(15)-数据回显

springmvc学习笔记(15)-数据回显 springmvc学习笔记15-数据回显 pojo数据回显方法 简单类型数据回显 本文介绍springmvc中数据回显的几种实现方法 数据回显:提交后,如果出现错误,将刚才提交的数据回显到刚才的提交页面. pojo数据回显方法 1.springmvc默认对pojo数据进行回显. pojo数据传入controller方法后,springmvc自动将pojo数据放到request域,key等于pojo类型(首字母小写) 使用@ModelAttribute

Lucas定理--大组合数取模 学习笔记

维基百科:https://en.wikipedia.org/wiki/Lucas%27_theorem?setlang=zh 参考:http://blog.csdn.net/pi9nc/article/details/9615359 http://hi.baidu.com/lq731371663/item/d7261b0b26e974faa010340f http://hi.baidu.com/j_mat/item/8e3a891c258c4fe9dceecaba 综合以上参考,我做的一下总结:

SpringBoot学习-SpringMVC自动配置

SpringBoot学习-SpringMVC自动配置 前言 在SpringBoot官网对于SpringMVCde 自动配置介绍 1-原文介绍如下: Spring MVC Auto-configuration Spring Boot provides auto-configuration for Spring MVC that works well with most applications. The auto-configuration adds the following features

需要同时掌握AVA和Linux,才可以继续大数据课程的学习

大数据包含的技术知识很多,如果是从头学起,一般是从两个方面入手,一是基础:二是专业技能.下面我们不妨从这两个方面给出一个简单的学习过程.希望对你有所帮助. 一.基础 学习大数据的两大基础就是JAVA和Linux,学习顺序不分前后.需要同时掌握,才可以继续大数据课程的学习. 在这里小编建了一个大数据学习交流扣扣群:529867072,我自己整理的最新的大数据进阶资料和高级开发教程,如果有想需要的,可以加群一起学习交流 Java:大家都知道Java的方向有JavaSE.JavaEE.JavaME,学

零基础如何转行大数据?系统学习路线在此

都知道大数据薪资高,前景好.而大数据又需要Java基础.对于稍微懂些Java的童鞋来说,到底如何转行大数据呢?今天小编给你一个大数据工程师具体的学习路线图.[ps:无java基础也可以学习大数据] 分享转行经验路线 对于Java程序员,大数据的主流平台hadoop是基于Java开发的,所以Java程序员往大数据开发方向转行从语言环境上更为顺畅,另外很多基于大数据的应用框架也是Java的,所以在很多大数据项目里掌握Java语言是有一定优势的. 在这里还是要推荐下我自己建的大数据学习交流群:5298

零基础学习大数据人工智能,学习路线篇!

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后. 大数据学习群:870097548 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经成为了语言排行第一名. 分享之前推荐一个大数据学习交流群:870097548未来将是大数据时代,需要学习大数据的抓紧时间学习,群内不定期分享视频资料,欢迎加入 从学习难易度来看,作为一个为“优雅”而生的语言,Python语法简捷而清晰,对底层做了很好的封装,是一