优化
最初的做法
- 一个请求对应一个Servlet,
- 问题:servlet太多了
把一些列的请求都对应一个Servlet, IndexServlet/AddServlet/EditServlet/DelServlet/UpdateServlet -> 合并成FruitServlet
- 反射技术:我们规定operate的值和方法名一致,那么接收到operate的值是什么就表明我们需要调用对应的方法进行响应,如果找不到对应的方法,则抛异常
设置一个中央控制器
- 在上一个版本中我们使用了反射技术,但是其实还是存在一定的问题:每一个servlet中都有类似的反射技术的代码。因此继续抽取,设计了中央控制器类:DispatcherServlet
- DispatcherServlet这个类的工作分为两大部分:
- 根据url定位到能够处理这个请求的controller组件:
- 从url中提取servletPath : /fruit.do -> fruit
- 根据fruit找到对应的组件:FruitController , 这个对应的依据我们存储在applicationContext.xml中
<bean id="fruit" class="com.atguigu.fruit.controllers.FruitController/>
通过DOM技术我们去解析XML文件,在中央控制器中形成一个beanMap容器,用来存放所有的Controller组件 - 根据获取到的operate的值定位到我们FruitController中需要调用的方法
- 调用Controller组件中的方法:
- 获取参数
- 获取即将要调用的方法的参数签名信息:
Parameter[] parameters = method.getParameters();
- 通过
parameter.getName()
获取参数的名称; - 准备了
Object[] parameterValues
这个数组用来存放对应参数的参数值- 另外,我们需要考虑参数的类型问题,需要做类型转化的工作。通过
parameter.getType()
获取参数的类型
- 另外,我们需要考虑参数的类型问题,需要做类型转化的工作。通过
- 获取即将要调用的方法的参数签名信息:
- 执行方法
- Object returnObj = method.invoke(controllerBean , parameterValues);
- 视图处理
- 获取参数