这一篇不要过多的纠结代码质量,只要是思想。这一块不看对工作没有影响,但是为了往更高的方向发展,还是需要掌握的。
1. Servlet 优化
1.1 需求
假设我们有一个简易的水果店铺管理系统,对应的有首页展示、新增、删除等功能。最初每一个功能请求我们在后台都有一个对应的Servlet,随着功能的增多,可以看出需要的Servlet也就越多,因为都是Fruit相关的操作,所以可以优化到一个Servlet中。
![图片[1]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/e57610c07d30ce6c5bc0682b624a54e-1024x523.jpg)
优化思路是写一个FruitServlet类,然后不同的请求对应其中不同的方法。
![图片[2]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/7dbb232940c942bbe822cf03415ce7d.jpg)
1.2 代码
新建fruit.html,根据operate属性区分请求类型。
![图片[3]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/image-57.png)
Servlet3.0里引入了注解,使用@WebServlet注解我们便不用再web.xml中进行配置了
![图片[4]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/image-58.png)
![图片[5]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/c41ef330c3a4e0c433b539cedaf0f9b-1024x358.png)
在service中获取operate的值,再根据该值匹配对应的方法。
![图片[6]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/image-59-1024x605.png)
2. DispatcherServlet 引入
2.1 需求
随着发展,我们又陆续增添别的功能,例如:用户、订单等。这时,便会发现每个新增Servlet中都要写一次FruitServlet中service方法里的请求判断逻辑,而且随着功能的增多,同一个Servlet中switch条件判断也越来越长。所以可以将service方法提取到一个的Servlet中,并对请求判断进行优化。
![图片[7]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/6b5af351886a1140af27d8e1394ae47.png)
新增一个DispatcherServlet,并将各个业务Servlet命名为Controller,DispatcherServlet将请求转发到对应的Controller。
![图片[8]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/7bede567d0d545824cbf4d0e908e47a.jpg)
2.2 代码
在DispatcherServlet中获取所有“.do”结尾的请求,并对servletPath截取得到fruit。
![图片[9]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/image-60-1024x500.png)
获得fruit后,在根据fruit获取到FruitController,执行对应的业务方法即可。该如何通过fruit获取到Controller呢?
创建applicationContext.xml,配置请求与controller的映射关系。
![图片[10]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/image-61.png)
DispatcherServlet构造函数中解析applicationContext.xml,获取到fruit与FruitController的对应关系。之后根据获取到的全类名通过反射获取到FruitController对象,保存到beanMap中。
![图片[11]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/image-62-1024x660.png)
在service中,再根据servletPath截取的请求从beanMap中获取到controller对象,再通过反射调用operate值对应的业务方法。
![图片[12]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/image-63-1024x570.png)
3. Controller 通用代码优化
可以看到在FruitController中,每个业务方法中都有获取参数与跳转功能,这些通用操作可以提取到DispatcherServlet中。
![图片[13]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/image-64-1024x729.png)
3.1 跳转优化
FruitController中返回字符串
![图片[14]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/image-65.png)
DispatcherServlet获取Controller方法返回的结果,并跳转到响应的页面。
![图片[15]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/image-66-1024x656.png)
3.2 同一获取参数
FruitController代码:
![图片[16]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/1665936360165.png)
DispatcherServlet代码:
![图片[17]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/628fd3dabfb98e6fe220a4b9fd32046-1024x592.png)
注意:需要在idea中设置-parameters参数,否则无法获取参数名。
![图片[18]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/image-67-1024x736.png)
设置前:
![图片[19]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/d8b7ff7a11d074287e30a6ab54c784d-1024x447.png)
设置后:
![图片[20]-手写简易MVC-DispatcherServlet-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/4a4047ba6269cd75444d75bb18d67ef.png)
暂无评论内容