今天完成的任务
1、修改了任务审核的统计脚本
原来的统计脚本是把今天凌晨0:00之前所有已提交未审核的任务都给统计了,导致去年未审核的任务也统计了:
要改成只统计昨天(0:00 - 23:59:59)已提交未审核的任务。
找师兄拿到统计脚本的备份,看了一下脚本是通过直接进入数据库执行sql语句实现的统计,比通过java代码的方式相比,更显得简单粗暴,i like it。
修改也比较简单,给原来sql的where子句后再加上一条限定条件:
AND date_format(from_unixtime(utr.submit_at/1000),'%Y-%m-%d') > date_sub(curdate(), INTERVAL 2 DAY)
即任务的提交审核的时间要大于前一天的时间。
修改完之后在navicat测了一下sql有无语法问题,测试通过后再找的师兄去线上做测试,结果符合预期。
2、看了Spring MVC的部分源码,主要是DispatcherServlet的源码。
看源码要先看类的继承结构:
然后是这个类的成员变量,Spring MVC的九大组件就是定义成DispatcherServlet的成员变量,九大组件在Spring MVC处理请求的过程中起关键作用:
接着是关键的接口,DispatcherServlet.class实现的父类FrameworkServlet的doService()接口,入参为request、response
因为该方法的实现的代码比较长,我就不贴了。我就简单的把doService()的实现做的事情写出来:
1、把request的attribute进行备份;
2、给request设置几条新的attribute;
3、调用doDispatch(request, response)方法;
4、恢复requestion的attribute;
*因为步骤2、3都对request的attributes进行了修改,所以步骤4要把requestion的attributes进行回滚。回滚的方式为:移除所有值为null的attribute;对比步骤1的attributes和步骤3的attributes,若有不同,这把attribute的值设为步骤1的值
可以看到,比较关键的还是doDispatch(request, response)方法。同样的,代码我不贴,我只把doDispatch(request, response)方法做的事列出来:
1、调用组件一MultipartResolver判断request是不是上传文件类型的请求,若不是,则执行以下步骤;
2、调用组件二HandlerMapping,看看没有对应的Handler(也就是控制器或者控制器的接口)可以处理这个请求。
3、如果步骤2的结果为true,则返回组件三HandlerAdapter和一个处理器执行链(也就是拦截器链);
4、调用处理器执行链(拦截器链)的preHandler()方法;
5、通过组件三HandlerAdapter调用对应的Handler处理请求,返回一个ModelAndView;
6、如果步骤5得到的ModelAndView的view属性为null,则调用组件四RequestToViewNameTranslator把请求的路径作为view属性的值(String型);
7、调用处理器执行链(拦截器链)的postHandl()方法:
8、如果步骤1~7在执行过程中抛出异常,则由组件五HandlerExceptionResolver进行处理(这里的处理结果就是对ModelAndView进行初始化,也就是说,步骤1~7的目的就是返回一个ModelAndView。并且发生异常时,步骤8处理异常的结果也是返回一个ModelAndView);
9、调用dispatchServlet.render(mv, request, response)方法,对视图进行渲染(渲染就是把modelMap保存的数据填入view的模板中,这个过程会抵用组件六LocaleResolver和组件七ViewResolver),返回一个view;
10、调用处理器执行链(拦截器链)的afterComplete()方法;
可以看到上面的10个步骤调用了九大组件中的7个组件,另外还有组件八ThemeResolver在Spring MVC初始化时调用,组件九FlashMapManager的作用我还没发现。
上面总结的流程,可以用一张经典的图表示:
遇到的问题
收获
任务时期就看过Spring MVC处理请求的流程了,但是根本不理解为什么是这种流程,真的是很懵逼的一种状态,今天看了DispatcherServlet的源码后,对Spring MVC处理请求的流程有了更深的理解,最起码现在可以不看资料默就能把这个流程画出来。
明天的计划
1、还有个bug要改,是修真院前台服务器点击续费后,返回的续费时间为空,找接口文档也没发现这个续费接口;看代码,也没有发现哪个接口上面有“服务器续费”这类的注释;只能明天再问问古尘师姐。
进度
等着开新的项目
评论