博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从DispatcherServlet说自定义访问处理
阅读量:4144 次
发布时间:2019-05-25

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

从DispatcherServlet说自定义访问处理

DispatcherServlet是springMvc处理请求的核心逻辑,简单描述一下处理流程,

首先需要在web.xml中配置该Servlet的服务路径,默认是/*所有路径,这样web请求就从Servlet
容器把控制权流转到DispatcherServlet,看一下DispatcherServlet的核心方法:

protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {	//...省略部分代码,看到这里把请求委托给doDispatch	try {		doDispatch(request, response);	}	//...省略部分代码}

继续看一下doDispatch:

//省略部分代码,根据用户的请求,查找对应得handlermappedHandler = getHandler(processedRequest);//根据handler查找对应得适配器HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

再来看一下:

protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {	//遍历handlerMappings查找符合的类	if (this.handlerMappings != null) {		for (HandlerMapping mapping : this.handlerMappings) {			HandlerExecutionChain handler = mapping.getHandler(request);			if (handler != null) {				return handler;			}		}	}	return null;}

再看一下handler适配器种类:

HandlerAdapter (org.springframework.web.servlet)	HttpRequestHandlerAdapter (org.springframework.web.servlet.mvc)	SimpleServletHandlerAdapter (org.springframework.web.servlet.handler)	AbstractHandlerMethodAdapter (org.springframework.web.servlet.mvc.method)		RequestMappingHandlerAdapter (org.springframework.web.servlet.mvc.method.annotation)	SimpleControllerHandlerAdapter (org.springframework.web.servlet.mvc)

适配HttpRequestHandler,Servlet,Controller,@RequestMapping

接下来看一下如何把HandlerMapping和HandlerAdapter配置到spring中:

private void initHandlerMappings(ApplicationContext context) {	this.handlerMappings = null;	if (this.detectAllHandlerMappings) {		//查找子父容器中所有类型是HandlerMapping的类		Map
matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false); if (!matchingBeans.isEmpty()) { this.handlerMappings = new ArrayList<>(matchingBeans.values()); // We keep HandlerMappings in sorted order. AnnotationAwareOrderComparator.sort(this.handlerMappings); } } else { try { HandlerMapping hm = context.getBean(HANDLER_MAPPING_BEAN_NAME, HandlerMapping.class); //保存到字段中 this.handlerMappings = Collections.singletonList(hm); } catch (NoSuchBeanDefinitionException ex) { // Ignore, we'll add a default HandlerMapping later. } } //省略部分代码}

初始化HandlerAdapter和上面类似:

private void initHandlerAdapters(ApplicationContext context) {	this.handlerAdapters = null;	if (this.detectAllHandlerAdapters) {		// Find all HandlerAdapters in the ApplicationContext, including ancestor contexts.		Map
matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerAdapter.class, true, false); if (!matchingBeans.isEmpty()) { this.handlerAdapters = new ArrayList<>(matchingBeans.values()); // We keep HandlerAdapters in sorted order. AnnotationAwareOrderComparator.sort(this.handlerAdapters); } } else { try { HandlerAdapter ha = context.getBean(HANDLER_ADAPTER_BEAN_NAME, HandlerAdapter.class); this.handlerAdapters = Collections.singletonList(ha); } catch (NoSuchBeanDefinitionException ex) { // Ignore, we'll add a default HandlerAdapter later. } } //省略部分代码}

来实践一下:

自定义一个类:

public class MyController implements HttpRequestHandler {    @Override    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        response.setHeader(HttpHeaders.CONTENT_TYPE, MimeTypeUtils.TEXT_PLAIN_VALUE);        ServletOutputStream os = response.getOutputStream();        BufferedOutputStream bos = new BufferedOutputStream(os);        bos.write("my controller...".getBytes());        bos.flush();    }}

适配器配置:

@Configurationpublic class MyMappingConfig {    @Bean    public HandlerMapping handlerMapping(){        SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();        Map
map = new HashMap<>(); map.put("/test/test.html", new MyController()); mapping.setUrlMap(map); mapping.setOrder(Ordered.HIGHEST_PRECEDENCE + 100); return mapping; }}

结果展示:

my controller...

可以通过这种方式在jar包中,配合自动注入,把自己的服务暴露出去.

比如:spring的actuator(当然,其应用比这里复杂很多)

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

你可能感兴趣的文章
25个构建Web项目的HTML建议,你需要了解一下!
查看>>
【web素材】02-10款大气的购物商城网站模板
查看>>
6种方式实现JavaScript数组扁平化(flat)方法的总结
查看>>
49个在工作中常用且容易遗忘的CSS样式清单整理
查看>>
20种在学习编程的同时也可以在线赚钱的方法
查看>>
隐藏搜索框:CSS 动画正反向序列
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(上)
查看>>
【视频教程】Javascript ES6 教程27—ES6 构建一个Promise
查看>>
【5分钟代码练习】01—导航栏鼠标悬停效果的实现
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(中)
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(下)
查看>>
【web素材】03-24款后台管理系统网站模板
查看>>
Flex 布局教程:语法篇
查看>>
年薪50万+的90后程序员都经历了什么?
查看>>
2019年哪些外快收入可达到2万以上?
查看>>
【JavaScript 教程】标准库—Date 对象
查看>>
前阿里手淘前端负责人@winter:前端人如何保持竞争力?
查看>>
【JavaScript 教程】面向对象编程——实例对象与 new 命令
查看>>
我在网易做了6年前端,想给求职者4条建议
查看>>
SQL1015N The database is in an inconsistent state. SQLSTATE=55025
查看>>