---
# System prepended metadata

title: mvc案例操作回顧複習
tags: [Java Web-mvc]

---

# mvc案例操作回顧複習
###### tags: `Java Web-mvc`

review：
(pro13)
1.最初的做法是：一個請求對應一個Servlet，這樣存在的問題是servlet太多了
2.把一系列的請求都對應一個Servlet，IndexServlet/AddServlet/EditServlet/UpdateServlet -> 合併成FruitServlet
  通過operate的值來決定調用FruitServlet中的哪一個方法
  使用的switch-case的語法

(pro14)
3.在上一個版本中，Servlet充斥著大量的switch-case，隨著項目的業務規模擴大，會有很多的Servlet，意味著有很多switch-case，是一種代碼冗餘
  因此我們在Servlet中，使用反射技術，我們規定operate的值和方法名一致，那麼接收到的operate的值是什麼，我們需要調用對應的方法進行響應，如果找不到對應的方法，則拋異常

(pro15)
4.在上一個版本中，我們使用了反射技術，但是其實還是存在一定的問題：每一個servlet中都有類似的反射技術代碼。
  因此繼續抽取，設計了中央控制器：DispatcherServlet
  DispatcherServlet這個類的工作分為兩大部分：
  1.根據url定位到能夠處理這個請求的controller組件：
    1)從url提取ServletPath：/fruit.do ->fruit
    2)根據fruit找到對應的組件：FruitController，這個對應的依據，我們存儲在application.xml中
    <bean id="fruit" class="com.atguigu.fruit.controllers.FruitController"/>
    通過DOM技術，我們去解析xml文件，在中央控制器形成一個beanMap容器，用來存放所有的Controller組件
    3)根據獲取到的operate的值，定位到我們FruitController中需要調用的方法

  2.調用Controller組件中的方法：
    1)獲取參數
        獲取即將要調用的方法的參數簽名信息：Parameter[] parameters = method.getParameter();
        通過parameter.getName()獲取參數名稱
        準備了Object[] parameterValues這個數組來存放對應參數的參數值
        另外，我們需要考慮參數的類型問題，需要做類型轉化的工作，通過parameter.getType()獲取參數類型
    2)執行方法
        Object returnObj = method.invoke(controllerBean,parameterValues);
    3)視圖處理
        String returnStr = (String)returnObj;
        if(returnStr.startWith("redirect:")){
        ...
        }else if{
        ...
        }