跳转至

优化

最初的做法

  • 一个请求对应一个Servlet,
  • 问题:servlet太多了

把一些列的请求都对应一个Servlet, IndexServlet/AddServlet/EditServlet/DelServlet/UpdateServlet -> 合并成FruitServlet

  • 反射技术:我们规定operate的值和方法名一致,那么接收到operate的值是什么就表明我们需要调用对应的方法进行响应,如果找不到对应的方法,则抛异常

设置一个中央控制器

  • 在上一个版本中我们使用了反射技术,但是其实还是存在一定的问题:每一个servlet中都有类似的反射技术的代码。因此继续抽取,设计了中央控制器类:DispatcherServlet
  • DispatcherServlet这个类的工作分为两大部分:
  • 根据url定位到能够处理这个请求的controller组件:
    1. 从url中提取servletPath : /fruit.do -> fruit
    2. 根据fruit找到对应的组件:FruitController , 这个对应的依据我们存储在applicationContext.xml中 <bean id="fruit" class="com.atguigu.fruit.controllers.FruitController/>通过DOM技术我们去解析XML文件,在中央控制器中形成一个beanMap容器,用来存放所有的Controller组件
    3. 根据获取到的operate的值定位到我们FruitController中需要调用的方法
  • 调用Controller组件中的方法:
    1. 获取参数
      1. 获取即将要调用的方法的参数签名信息: Parameter[] parameters = method.getParameters();
      2. 通过parameter.getName()获取参数的名称;
      3. 准备了Object[] parameterValues 这个数组用来存放对应参数的参数值
        • 另外,我们需要考虑参数的类型问题,需要做类型转化的工作。通过parameter.getType()获取参数的类型
    2. 执行方法
      • Object returnObj = method.invoke(controllerBean , parameterValues);
    3. 视图处理
      String returnStr = (String)returnObj;
      if(returnStr.startWith("redirect:")){
       ....
      }else if.....