手写简易MVC-DispatcherServlet

这一篇不要过多的纠结代码质量,只要是思想。这一块不看对工作没有影响,但是为了往更高的方向发展,还是需要掌握的。

1. Servlet 优化

1.1 需求

假设我们有一个简易的水果店铺管理系统,对应的有首页展示、新增、删除等功能。最初每一个功能请求我们在后台都有一个对应的Servlet,随着功能的增多,可以看出需要的Servlet也就越多,因为都是Fruit相关的操作,所以可以优化到一个Servlet中。

图片[1]-手写简易MVC-DispatcherServlet-深吸氧

优化思路是写一个FruitServlet类,然后不同的请求对应其中不同的方法。

图片[2]-手写简易MVC-DispatcherServlet-深吸氧

1.2 代码

新建fruit.html,根据operate属性区分请求类型。

图片[3]-手写简易MVC-DispatcherServlet-深吸氧

Servlet3.0里引入了注解,使用@WebServlet注解我们便不用再web.xml中进行配置了

图片[4]-手写简易MVC-DispatcherServlet-深吸氧
图片[5]-手写简易MVC-DispatcherServlet-深吸氧

在service中获取operate的值,再根据该值匹配对应的方法。

图片[6]-手写简易MVC-DispatcherServlet-深吸氧

2. DispatcherServlet 引入

2.1 需求

随着发展,我们又陆续增添别的功能,例如:用户、订单等。这时,便会发现每个新增Servlet中都要写一次FruitServlet中service方法里的请求判断逻辑,而且随着功能的增多,同一个Servlet中switch条件判断也越来越长。所以可以将service方法提取到一个的Servlet中,并对请求判断进行优化。

图片[7]-手写简易MVC-DispatcherServlet-深吸氧

新增一个DispatcherServlet,并将各个业务Servlet命名为Controller,DispatcherServlet将请求转发到对应的Controller。

图片[8]-手写简易MVC-DispatcherServlet-深吸氧

2.2 代码

在DispatcherServlet中获取所有“.do”结尾的请求,并对servletPath截取得到fruit。

图片[9]-手写简易MVC-DispatcherServlet-深吸氧

获得fruit后,在根据fruit获取到FruitController,执行对应的业务方法即可。该如何通过fruit获取到Controller呢?

创建applicationContext.xml,配置请求与controller的映射关系。

图片[10]-手写简易MVC-DispatcherServlet-深吸氧

DispatcherServlet构造函数中解析applicationContext.xml,获取到fruit与FruitController的对应关系。之后根据获取到的全类名通过反射获取到FruitController对象,保存到beanMap中。

图片[11]-手写简易MVC-DispatcherServlet-深吸氧

在service中,再根据servletPath截取的请求从beanMap中获取到controller对象,再通过反射调用operate值对应的业务方法。

图片[12]-手写简易MVC-DispatcherServlet-深吸氧

3. Controller 通用代码优化

可以看到在FruitController中,每个业务方法中都有获取参数与跳转功能,这些通用操作可以提取到DispatcherServlet中。

图片[13]-手写简易MVC-DispatcherServlet-深吸氧

3.1 跳转优化

FruitController中返回字符串

图片[14]-手写简易MVC-DispatcherServlet-深吸氧

DispatcherServlet获取Controller方法返回的结果,并跳转到响应的页面。

图片[15]-手写简易MVC-DispatcherServlet-深吸氧

3.2 同一获取参数

FruitController代码:

图片[16]-手写简易MVC-DispatcherServlet-深吸氧

DispatcherServlet代码:

图片[17]-手写简易MVC-DispatcherServlet-深吸氧

注意:需要在idea中设置-parameters参数,否则无法获取参数名。

图片[18]-手写简易MVC-DispatcherServlet-深吸氧

设置前:

图片[19]-手写简易MVC-DispatcherServlet-深吸氧

设置后:

图片[20]-手写简易MVC-DispatcherServlet-深吸氧
© 版权声明
THE END
请撒泡尿证明你到此一游
点赞4 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容