SpringMVC ,这个应该是国内面试必问题,网上有很多答案,其实背背就可以。但今天笔者带大家一起深入浅出源码,看看他的原理。以期让印象更加深刻,面试的时候游刃有余。

Spring MVC 过程

先来张图:

代码位置:com.interface21.web.servlet.DispatcherServlet#doService

(没错,就是 Spring 1.0 的代码,大道至简,现在的 Spring 经过 15 年的发展,已经太过臃肿,从学习角度来说,interface 21 是最好的代码,不接受反驳)

代码如下:

1. 设置属性

// 1. 设置属性
// Make web application context available
request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());// Make locale resolver available
request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);// Make theme resolver available
request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);

2. 根据 Request 请求的 URL 得到对应的 handler 执行链,其实就是拦截器和 Controller 代理对象。

// 2. 找 handler 返回执行链
HandlerExecutionChain mappedHandler = getHandler(request);

3. 得到 handler 的适配器

// This will throw an exception if no adapter is found
// 3. 返回 handler 的适配器
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

关于这个适配器,作用到底是啥呢?HandlerAdapter 注释写到:This interface is not intended for application developers. It is available to handlers who want to develop their own web workflow.
译:此接口不适用于应用程序开发人员。它适用于想要开发自己的Web工作流程的处理程序。

也就说说,如果你想要在处理 handler 之前做一些操作的话,可能需要这个,即适配一下这个 handler。例如 Spring 的测试程序做的那样:

public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object delegate)throws IOException, ServletException {// 你可能需要 doSomething.......((MyHandler) delegate).doSomething(request);return null;}

4. 循环执行 handler 的 pre 拦截器

// 4. 循环执行 handler 的 pre 拦截器
for (int i = 0; i < mappedHandler.getInterceptors().length; i++) {HandlerInterceptor interceptor = mappedHandler.getInterceptors()[i];// pre 拦截器if (!interceptor.preHandle(request, response, mappedHandler.getHandler())) {return;}
}

这个没什么好讲的吧?

5. 执行真正的 handler,并返回 ModelAndView(Handler 是个代理对象,可能会执行 AOP )

// 5. 执行真正的 handler,并返回  ModelAndView(Handler 是个代理对象,可能会执行 AOP )
ModelAndView mv = ha.handle(request, response, mappedHandler.getHandler());

6. 循环执行 handler 的 post 拦截器

// 6. 循环执行 handler 的 post 拦截器
for (int i = mappedHandler.getInterceptors().length - 1; i >=0 ; i--) {HandlerInterceptor interceptor = mappedHandler.getInterceptors()[i];// post 拦截器interceptor.postHandle(request, response, mappedHandler.getHandler());
}

7. 根据 ModelAndView 信息得到 View 实例

View view = null;
if (mv.isReference()) {// We need to resolve this view name// 7. 根据 ModelAndView 信息得到 View 实例view = this.viewResolver.resolveViewName(mv.getViewName(), locale);
}

8. 渲染 View 返回

// 8. 渲染 View 返回
view.render(mv.getModel(), request, response);

面试问烂的 Spring MVC 过程相关推荐

  1. modelandview使用过程_面试问烂的 Spring AOP 原理、Spring MVC 过程

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 作者:莫那一鲁道链接:www.jianshu.com/p/e18fd44964eb Spring AOP ,SpringMVC ,这两个应该 ...

  2. 面试问烂的 Spring AOP 原理、SpringMVC 过程(求求你别问了)

    Spring AOP ,SpringMVC ,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以.但今天笔者带大家一起深入浅出源码,看看他的原理.以期让印象更加深刻,面试的时候游刃有余. Sp ...

  3. 别看是面试问烂的题目,一面试你照样还是不会系列MySQL四种隔离级别,看完吊打面试官!

    别看是面试问烂的题目,一面试你照样还是不会系列MySQL四种隔离级别,看完吊打面试官! 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也 ...

  4. mysql 查看表v空间自增涨_面试问烂的 MySQL 查询优化,看完屌打面试官!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 作者:唐立勇 https://segmentfault.com/a/1190000013672421 什么影响了数据库查询速 ...

  5. 面试问烂的 MySQL 查询优化,看完屌打面试官!

    Java大数据修炼之道 优秀的Java技术公众号 作者:唐立勇 https://segmentfault.com/a/1190000013672421 相关阅读 面试问烂的 MySQL 四种隔离级别, ...

  6. 面试被问烂的 Spring IOC(求求你别再问了)

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 作者:莫那·鲁道 链接:http://thinkinjava.cn 广义的 IOC IoC(Inv ...

  7. 【2023最新】我把面试问烂了的Web安全集合总结了一下(带答案)建议收藏

    人人都有一个进大厂的梦想,而进大厂的门槛也可想而知,所以这里整理了一份安全大厂的面试大全,看完文章如果对你有帮助的话希望能够点赞+收藏+关注!感谢! 本篇文章对于学习Web安全的朋友来说应该是目前最全 ...

  8. 面试问烂的 MySQL 四种隔离级别,看完吊打面试官!

    作者:游泳的石头 https://www.jianshu.com/p/8d735db9c2c0 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被 ...

  9. 面试问烂了的测试用例: 登录界面的测试用例

    从功能测试.性能测试.界面测试.安全性测试.兼容性测试.可用性测试六个方面设计测试用例. 一.功能性测试 使用用户名和密码登录 正常登录情况: 输入正确的用户名和密码,验证是否登录成功 输入正确的手机 ...

最新文章

  1. bzoj1688[Usaco2005 Open]Disease Manangement 疾病管理*
  2. SAP MM 不常用事务代码之MBSL - Copy Material Document
  3. eclipse git插件配置
  4. 【Java基础】使用带有标签的break,跳出多层循环
  5. matlab trendsurface,MATLAB 添加新的预测性维护产品
  6. java中的装箱及拆箱
  7. [Xcode 实际操作]九、实用进阶-(23)多个Storyboard故事板中的页面跳转
  8. Mutable and Immutable Variables in Python
  9. jadc连接oracle,用jdbc连接oracle的第一次经历
  10. eplan好看的电缆图表_EPLAN电缆图表模板
  11. 【锂电】锂电工艺大全
  12. MSP430G2553开发板万年历加温湿度
  13. win10 clion msvc opencv4.10 报错Process finished with exit code -1073741515 (0xC0000135)
  14. 《此生未完成读书总结》
  15. 2021年隐私和安全性最佳的8款Linux手机
  16. 自适应设计和响应式设计
  17. 利好:加快发展统一的资本市场
  18. 封装微信小程序api请求地址
  19. 南柯服务器压力,有关性能测试结果的几点分析原则
  20. 迎风破局!Cocos 引擎荣获第六届金陀螺奖「年度优秀游戏服务商奖」

热门文章

  1. Android官方网站
  2. python入门基础教程02 Python简介
  3. JSP连接SQL数据库实现数据分页显示
  4. ubuntu更换阿里源
  5. 8种常用图像处理算法
  6. 模式识别机器学习术语
  7. 修改Ubuntu和XP双系统时的默认启动系统
  8. python处理u开头的字符串
  9. [Linux实用工具]munin-node插件配置和插件编写
  10. 如果通过当前元素知道父元素、同级元素