smart-framework框架学习之DispatcherServlet分发机制
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类,进行处理。主要流程如下:
获取类加载器
Thread.currentThread().getContextClassLoader();
获取urls资源,根据基础包名获取urls资源
classloader.getResources(packageName.replace(".","/"))
遍历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); }
将获取到的action类和每个action中的方法以及注解中的requestPath封装成map对象,Requester是方法与注解的封装,Handler为类与方法的封装。
Map<Requester, Handler> Requester->actionMethod,requestPath; Handler-->actionclass,actionMethod.
遍历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);}
初始化数据(目的:使用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(); }
实例化Handler,获取action对象,创建action方法的参数列表。系统启动时,会将所有bean、service、action的类进行实例化,然后放到map集合中去。
Object beanInstance = cls.newInstance(); Map<Class<?>, Object> beanMap; beanMap.put(cls, beanInstance);
根据反射机制,调用Method的invoke方法
对返回的数据类型进行判断,默认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分发机制相关推荐
- 【安卓Framework学习】Wifi框架学习之热点评分机制
系列文章目录 [安卓Framework学习]Wifi框架学习之核心类 [安卓Framework学习]Wifi框架学习之wifi状态机 [安卓Framework学习]Wifi框架学习之连接与断开流程 [ ...
- Omi框架学习之旅 - 插件机制之omi-finger 及原理说明
以前那篇我写的alloyfinger源码解读那篇帖子,就说过这是一个很好用的手势库,hammer能做的,他都能做到, 而且源码只有350来行代码,很容易看懂. 那么怎么把这么好的库作为omi库的一个插 ...
- Omi框架学习之旅 - 插件机制之omi-touch 及原理说明
这个插件也能做好多好多的事,比如上拉下拉加载数据,轮播,等一切和运动有关的特效. 具体看我的allowTouch这篇博客,掌握了其用法,在来看它是怎么和omi结合的.就会很简单. 当然使用起来也比较方 ...
- AudioToolbox.framework框架学习
http://quding0308.iteye.com/blog/1596710 AudioFile AudioFileStream类 提供了一个接口,用来解析一个流音频文件. //创建一个new s ...
- 【安卓Framework学习】Wifi框架学习之wifi状态机
系列文章目录 [安卓Framework学习]Wifi框架学习之核心类. [安卓Framework学习]Wifi框架学习之开启与关闭流程. [安卓Framework学习]Wifi框架学习之连接与断开流程 ...
- 【安卓Framework学习】Wifi框架学习之核心类
系列文章目录 [安卓Framework学习]Wifi框架学习之开启与关闭流程 [安卓Framework学习]Wifi框架学习之wifi状态机 [安卓Framework学习]Wifi框架学习之连接与断开 ...
- quick框架事件分发机制
quick框架中的事件分发机制与cocos2dx的不同. quick框架的事件按照功能和用途分为: (1)节点事件 (2)帧事件 (3)键盘事件 (4)加速计事件 (5)触摸事件 1.节点事件 节点事 ...
- 【安卓Framework学习】Wifi框架学习之开启与关闭流程
系列文章目录 [安卓Framework学习]Wifi框架学习之核心类 [安卓Framework学习]Wifi框架学习之wifi状态机 [安卓Framework学习]Wifi框架学习之连接与断开流程 [ ...
- RabbitMQ学习总结(6)——消息的路由分发机制详解
2019独角兽企业重金招聘Python工程师标准>>> 一.Routing(路由) (using the Java client) 在前面的学习中,构建了一个简单的日志记录系统,能够 ...
最新文章
- 学python去哪做项目_有哪些适合 Python 刚入门者去做的项目?
- R语言描述性统计分析:相关性分析
- 印象笔记电脑版使用技巧_印象笔记使用攻略
- python 3.6.5编译安装_Linux系统安装Python3.6.5
- gprs模块http mqtt_在GPRS模块(SIM800C)和STM32芯片上实现MQTT协议 | TsonTec:测量解决方案提供者...
- 深度学习自学(八):人脸识别主要场景与算法实现
- SVN服务端与客户端安装(汉化包)以及简单使用
- 成功实施ERP的规范流程
- 重载和重写(覆盖)的区别
- 网页数据提取----网络投票软件开发(续1)
- vim编辑器跳转、复制、剪切(2)
- windows上使用wordpress搭建博客
- 老生常谈之Android里的dp和sp
- sbuf.st_size 为负数
- LNK1120: 一个无法解析的外部命令
- 如何正确安装朗文英文当代大词典(2CD版)
- Delphi下的MPS
- 使用pyhook3/pynput实现键盘连发
- Liferay环境搭建、简单说明与相关资料
- 图片处理:完成图片的颜色反转
热门文章
- 6个面的骰子 标上1 2 3 4 5 6 投掷8次 求出现和的概率最大的数 ,就是这8次的和最有可能是多少...
- perl脚本中的ENDOFINPUT
- 在线网页快捷方式创建工具
- android修改用户名和密码错误,Android应用开发Android Studio 修改用户名、密码、URL等操作教程...
- lnmp python _mysql web_Nginx+uWSGI+DJango+Python+ Mysql 搭建可靠的python web服务器
- 毛坯房验房留意事项及细节有哪些呢?
- python 复习计划
- bootstrap treetable 树形网格,动态扩展,连数据库
- 使用Spring Boot构建独立的OAuth服务器(三)
- 暗能量什么样?爱因斯坦只“蒙”对了一半