角色:
- MVC公司 —— springmvc
- 客户1 —— 小RB
- 客户2 —— 小明
- 前台小妹 —— 中央处理器(DispatchServlet)
- HR —— 处理器映射器(HandlerMapping)
- 研发部门 —— 处理器适配器(HandlerAdapter)
- 翻译官 —— 视图解析器(ViewResolver)
- 人工智能小卫 —— 过滤器(Filter)
- 钥匙 —— 处理器(Handler)
- 小c —— 控制层(Controller)
- 小s —— 业务层(Service)
- 大D —— 数据访问层(Dao)
- 阿宾 —— 数据模型(JavaBean)
故事1 —— 过滤器篇
在一个阳光明媚的下午,小RB来到MVC公司附近,他来这里的目的很明确,就是通过伪装,混入公司内部,夺走其公司的核心机密文件。他往手上唾了一口唾沫,抹了抹头发,整理了一下发型,迈着步子向着公司走去。刚到门口,头顶便传来:“小RB与狗不得入内!”小RB感觉自己伪装的很好,就打算直接进入,奈何躲不过小卫(Filter)的火眼金睛,直接紧闭大门,将其拒之门外。
故事2 —— 拦截器篇
又是一个阳光明媚的下午,小明来到MVC公司门口,他来这里的目的很明确,就是想查询自己这一个月在MCV公司的日总消费记录。小明来到门口,头顶传来小卫(Filter)具有磁性的声音”欢迎光临!“
小明来到前台,找到前台小妹(DispatchServlet),递上了自己的需求,前台小妹接过需求,看也不看就连忙答应了下来。
可小妹哪懂这些,所以她去向HR(HandlerMapping)寻求帮助,HR接过需求,一看发现这分明是查在MCV公司的消费记录,根本不是自己公司的业务,所以劈头盖脸的训了小妹一顿。小妹回到前台,委屈巴巴的送走了小明。
故事3 —— 完整篇
又是一个阳光明媚的下午,小明来到MVC公司门口,他来这里的目的很明确,就是想查询自己这个月在MVC公司的日总消费额。小明来到门口,头顶传来小卫(Filter)具有磁性的声音”欢迎光临!“
小明来到前台,找到前台小妹(DispatchServlet),递上了自己的需求,前台小妹接过需求,看也不看就连忙答应了下来。
可小妹哪懂这些,所以去向HR(HandlerMapping)寻求帮助,HR接过需求,大概看了看,对小妹说:“嗯,是本公司的业务,这事归研发部门(HandlerAdapter)管,你去研发部问问。”随后给了小妹研发部的坐标和钥匙(Handler)。
小妹皮跌皮跌的来到研发部,把钥匙给了研发部门,研发部长拿着钥匙打开了办公室的门,把需求给了小c(Controller),小c接到需求,立马找来自己的小弟小s(Service),说:“去,给我把这事办了,办漂亮点!”
小s接到需求,一脸迷茫,自己又没有数据库的钥匙,不能直接取数据,但管理数据库的大D(Dao)脾气是出了名的差,可为了完成上级指派的任务,只能硬着头皮去找大D。
大D不屑的看了一眼小s,一把抓起阿宾(javabean)就去数据库取数据了。漫长的等待中,小s越想越气,大D每次给自己的数据根本不满足要求,自己辛辛苦苦调整半天,上交后,奖金却都让小c和大D分了。自己真是脏活累活都干了,却总是被忽略的那个,甚至有人说自己没用,存不存在都一样(某些同学说不知道service层存在的意义)。
大D一脚把一箩筐装满着数据的阿宾踢到小s面前,就又回到床上躺着刷抖音了。小s看着那些乱糟糟的数据,叹了一口气,道了声谢后,回到了自己的办公室。
客户需要的是这个月的日总消费记录,也就是对每天的消费记录进行求总汇合,但大D给的数据是每次的消费记录。小s熟练的对指定日期范围内(如1月1日 00:00:00 到 1月1日 23:59:59 时间段内)的金额进行求和,然后全部汇总。完事后,小s脸上露出了满意的笑容,心想着“不愧是我啊!哼,交给他们,谁也办不了!”
小s将处理好的数据交给小c,小c接过数据后,内心乐开了花,心想又可以和上级邀功大赚一笔了!
小c把数据简单的封装(ModelAndView)了一下,交给部长,部长又把数据交给小妹。
小妹拿到数据,但是看不懂啊,就连忙去找翻译官(ViewResolver)帮忙,翻译官拿到数据,熟练的将数据进行解析,把解析后的数据(Model)和表格(View)交给小妹。
小妹拿着数据,开始在表格内进行填充,最后把表格交给了小明。
总结:
- 过滤器与拦截器的区别:
- 过滤器发生在servlet启动之前,可以拦截任意请求,包括直接访问静态页面的请求
- 拦截器发生在servlet启动之后,调用controller方法之前,所以只能拦截controller中的请求,对于直接访问jsp页面的请求无法拦截
- 所有进入springmvc的请求都要经过DispatchServlet进行统一分发处理
- 不要忽略service层!
- 觉得service层没用,只是因为我们目前接触到的业务比较少,所以会有错觉,感觉service层就只是持有了dao层的引用,然后把从dao层拿到的数据返回给controller层一样,其实并不是这样,service层才是咱们以后开发的主战地,不要让小s伤心!
- aop在service层就有很好的应用,把整个service层进行横切,然后在不改变原代码的情况下,通过切点进行注入日志等业务,完美的体现了高内聚低耦合的编程思想。
希望通过这篇文章,可以让大家对SpringMVC的执行流程有更加深刻的理解,有错误的地方也欢迎大家指出,积极讨论,共同进步!