2019独角兽企业重金招聘Python工程师标准>>>

最近几天,工作之余在学习黄勇老师的Smart-Framework框架,希望自己可以借此机会,对于web开发能力可以更近一步。 本文对于DispatcherServlet分发机制进行细致化的分析解读,若有地方不妥,万望指出,谢谢。 # DispatcherServlet.java是Smart-Framework框架中的Controller,对应于web请求,DispatcherServlet.java将其分发到处理该请求的action去。

首先,DispatcherServlet.java在系统启动时,默认启动init(ServletConfig)方法,初始化相关配置。

@WebServlet(urlPatterns = "/*", loadOnStartup = 0)
public class DispatcherServlet extends HttpServlet {...@Overridepublic void init(ServletConfig config) throws ServletException {// 初始化相关配置ServletContext servletContext = config.getServletContext();UploadHelper.init(servletContext);}

在Action 分发机制实现原理一文中,曾经对init(ServletConfig)有所解释,将静态资源放到一个指定的目录下,就可以在初始化时,直接加载静态资源,之后只需要加载动态资源即可。

@WebServlet(urlPatterns = "/*", loadOnStartup = 0)
public class DispatcherServlet extends HttpServlet {@Overridepublic void init(ServletConfig config) throws ServletException {// 用 Default Servlet 来映射静态资源ServletContext context = config.getServletContext();ServletRegistration registration = context.getServletRegistration("default");registration.addMapping("/favicon.ico", "/www/*");}

其次,在DispatcherSerlvet.java中,service()主要获取web的url动态请求,将请求分发到处理请求的相应的action类,进行处理。主要流程如下:

  1. 获取类加载器

    Thread.currentThread().getContextClassLoader();
  2. 获取urls资源,根据基础包名获取urls资源

    classloader.getResources(packageName.replace(".","/"))
  3. 遍历urls资源,获取协议名分为file和jar两种,根据协议进行获取项目基础包及其子包下的action类,并check是否有action注解标识

    //jar类型的部分处理
    // 获取子包
    String subPackagePath = fileName;
    if (StringUtil.isNotEmpty(packagePath)) {subPackagePath = packagePath + "/" + subPackagePath;
    }
    // 子包名
    String subPackageName = fileName;
    if (StringUtil.isNotEmpty(packageName)) {subPackageName = packageName + "." + subPackageName;
    }
    //jar类型的部分处理
    String className = jarEntryName.substring(0, jarEntryName.lastIndexOf(".")).replaceAll("/", ".");
    // 判断是否可以添加类
    if (checkAddClass(cls)) {// 添加类classList.add(cls);
    }
  4. 将获取到的action类和每个action中的方法以及注解中的requestPath封装成map对象,Requester是方法与注解的封装,Handler为类与方法的封装。

    Map<Requester, Handler>
    Requester->actionMethod,requestPath;
    Handler-->actionclass,actionMethod.
  5. 遍历action的映射,查找处理请求url资源的action类的Handler对象

    // 获取请求路径匹配器(使用正则表达式匹配请求路径并从中获取相应的请求参数)
    Matcher requestPathMatcher = Pattern.compile(requestPath).matcher(currentRequestPath);
    // 判断请求方法与请求路径是否同时匹配
    if (requestMethod.equalsIgnoreCase(currentRequestMethod) && requestPathMatcher.matches()) {// 获取 Handler 及其相关属性handler = actionEntry.getValue();// 设置请求路径匹配器if (handler != null) {handler.setRequestPathMatcher(requestPathMatcher);}
  6. 初始化数据(目的:使用ThreadLocal,存放线程的局部变量让每个线程请求,访问的都是独立的数据),用于在action和service对象中获取request和response对象。

    DataContext.init(request, response);
    private static final ThreadLocal<DataContext> dataContextContainer = new ThreadLocal<DataContext>();
    public static DataContext getInstance() {return dataContextContainer.get();
    }
  7. 实例化Handler,获取action对象,创建action方法的参数列表。系统启动时,会将所有bean、service、action的类进行实例化,然后放到map集合中去。

    Object beanInstance = cls.newInstance();
    Map<Class<?>, Object> beanMap;
    beanMap.put(cls, beanInstance);
  8. 根据反射机制,调用Method的invoke方法

  9. 对返回的数据类型进行判断,默认view和result两种,view用于页面跳转,result用于文件上传或者json数据请求。此处应该使用了约定优于配置的原则,返回值类型只有view和result两种。

    public class View extends BaseBean {private String path;              // 视图路径private Map<String, Object> data; // 相关数据...
    }
    public class Result extends BaseBean {private boolean success; // 成功标志private int error;       // 错误代码private Object data;     // 相关数据
    }

转载于:https://my.oschina.net/fallow5/blog/468350

smart-framework框架学习之DispatcherServlet分发机制相关推荐

  1. 【安卓Framework学习】Wifi框架学习之热点评分机制

    系列文章目录 [安卓Framework学习]Wifi框架学习之核心类 [安卓Framework学习]Wifi框架学习之wifi状态机 [安卓Framework学习]Wifi框架学习之连接与断开流程 [ ...

  2. Omi框架学习之旅 - 插件机制之omi-finger 及原理说明

    以前那篇我写的alloyfinger源码解读那篇帖子,就说过这是一个很好用的手势库,hammer能做的,他都能做到, 而且源码只有350来行代码,很容易看懂. 那么怎么把这么好的库作为omi库的一个插 ...

  3. Omi框架学习之旅 - 插件机制之omi-touch 及原理说明

    这个插件也能做好多好多的事,比如上拉下拉加载数据,轮播,等一切和运动有关的特效. 具体看我的allowTouch这篇博客,掌握了其用法,在来看它是怎么和omi结合的.就会很简单. 当然使用起来也比较方 ...

  4. AudioToolbox.framework框架学习

    http://quding0308.iteye.com/blog/1596710 AudioFile AudioFileStream类 提供了一个接口,用来解析一个流音频文件. //创建一个new s ...

  5. 【安卓Framework学习】Wifi框架学习之wifi状态机

    系列文章目录 [安卓Framework学习]Wifi框架学习之核心类. [安卓Framework学习]Wifi框架学习之开启与关闭流程. [安卓Framework学习]Wifi框架学习之连接与断开流程 ...

  6. 【安卓Framework学习】Wifi框架学习之核心类

    系列文章目录 [安卓Framework学习]Wifi框架学习之开启与关闭流程 [安卓Framework学习]Wifi框架学习之wifi状态机 [安卓Framework学习]Wifi框架学习之连接与断开 ...

  7. quick框架事件分发机制

    quick框架中的事件分发机制与cocos2dx的不同. quick框架的事件按照功能和用途分为: (1)节点事件 (2)帧事件 (3)键盘事件 (4)加速计事件 (5)触摸事件 1.节点事件 节点事 ...

  8. 【安卓Framework学习】Wifi框架学习之开启与关闭流程

    系列文章目录 [安卓Framework学习]Wifi框架学习之核心类 [安卓Framework学习]Wifi框架学习之wifi状态机 [安卓Framework学习]Wifi框架学习之连接与断开流程 [ ...

  9. RabbitMQ学习总结(6)——消息的路由分发机制详解

    2019独角兽企业重金招聘Python工程师标准>>> 一.Routing(路由) (using the Java client) 在前面的学习中,构建了一个简单的日志记录系统,能够 ...

最新文章

  1. 学python去哪做项目_有哪些适合 Python 刚入门者去做的项目?
  2. R语言描述性统计分析:相关性分析
  3. 印象笔记电脑版使用技巧_印象笔记使用攻略
  4. python 3.6.5编译安装_Linux系统安装Python3.6.5
  5. gprs模块http mqtt_在GPRS模块(SIM800C)和STM32芯片上实现MQTT协议 | TsonTec:测量解决方案提供者...
  6. 深度学习自学(八):人脸识别主要场景与算法实现
  7. SVN服务端与客户端安装(汉化包)以及简单使用
  8. 成功实施ERP的规范流程
  9. 重载和重写(覆盖)的区别
  10. 网页数据提取----网络投票软件开发(续1)
  11. vim编辑器跳转、复制、剪切(2)
  12. windows上使用wordpress搭建博客
  13. 老生常谈之Android里的dp和sp
  14. sbuf.st_size 为负数
  15. LNK1120: 一个无法解析的外部命令
  16. 如何正确安装朗文英文当代大词典(2CD版)
  17. Delphi下的MPS
  18. 使用pyhook3/pynput实现键盘连发
  19. Liferay环境搭建、简单说明与相关资料
  20. 图片处理:完成图片的颜色反转

热门文章

  1. 6个面的骰子 标上1 2 3 4 5 6 投掷8次 求出现和的概率最大的数 ,就是这8次的和最有可能是多少...
  2. perl脚本中的ENDOFINPUT
  3. 在线网页快捷方式创建工具
  4. android修改用户名和密码错误,Android应用开发Android Studio 修改用户名、密码、URL等操作教程...
  5. lnmp python _mysql web_Nginx+uWSGI+DJango+Python+ Mysql 搭建可靠的python web服务器
  6. 毛坯房验房留意事项及细节有哪些呢?
  7. python 复习计划
  8. bootstrap treetable 树形网格,动态扩展,连数据库
  9. 使用Spring Boot构建独立的OAuth服务器(三)
  10. 暗能量什么样?爱因斯坦只“蒙”对了一半