1 .解決跳轉問題:添加一個login方法,跳轉返回一個字元串。 中央控制器DispacherServlet調用EmpController,所以字元串返回給中央控制器。如下圖所示:中央控制器幫我們統一的做 資源的轉發(forward/include) 或 重定向。 1.1 更新 EmpControl ...
1 .解決跳轉問題:添加一個login方法,跳轉返回一個字元串。
中央控制器DispacherServlet調用EmpController,所以字元串返回給中央控制器。如下圖所示:中央控制器幫我們統一的做 資源的轉發(forward/include) 或 重定向。
1.1 更新 EmpController代碼
1.2 更該 DispatcherServlet 代碼
1.3 演示效果:
現在XxxController已經算一個普通的POJO類了,但是還是和Servlet耦合,方法的參數中還有HttpServletRquest。
2 刪除XxxControler中各方法中的response
改動了跳轉後,就可以刪除XxxController中的各個方法的中的HttpServletResponse參數了。
2.1 EmpController代碼
3 下一步,我們改動傳參。
幾乎每個方法中,都有request.getParameter(“xxx”);方法,我們需要將該方法刪掉,變成參數,讓XxxController不要依賴Servlet 。
3.1 EmpController 代碼
3.2 變成參數後,誰給我們傳參?
將獲取參數的過程 — request.getParameter(“xxx”),統一抽取到中央調度器DispatcherServlet中,來統一獲取請求參數。
如果在EmpController中寫個delete方法參數名叫什麼?如果寫一個insert,update方法呢,每個方法的參數都不一樣。所以我到底要獲取哪些參數是,根據當前這個方法的方法簽名來決定的。
3.3 在DispatcherServlet添加統一獲取請求參數的代碼。
訪問測試:http://127.0.0.1:8080/mymvc3/emp.do?ac=login
報錯:
因為EmpController的方法中沒有,HttpServletRequest和HttpServletResponse了。那麼這句代碼就無法獲取到了。
3.4 修改DispatcherServlet代碼
修改代碼,通過反射機制獲取所有的方法。然後只根據方法名來做判斷。
3.5 測試:模擬登錄
這麼寫,獲取方法的參數的名字是arg0,arg1……,並不能獲取真實的方法名。
3.6 要想獲取真實的參數名稱需要加參數重新編譯代碼
從JDK8.0開始,有一個反射的新特性,可以獲取到參數的方法的名字。做一個小的設置。
java中獲取介面(方法)中的參數名字(eclipse設置編譯參數)(java8 javac –parameters)
這個就表示JVM虛擬機在編譯的時候,所得到的Class文件裡面就帶有形參的名稱了。
重新編譯項目,debug運行。
再次debug運行看到已經獲得了方法的參數的實際的名稱。
3.6.1 maven工程如何更方便的設置?
3.7 修改DispatcherServlet代碼
3.8 invoke進行調用的時候就不能傳遞request和response了。
3.9 修改EmpController代碼,並新增delete刪除方法
3.10 代碼測試:
http://127.0.0.1:8080/mymvc3/emp.do?ac=login&ename=fbb&pwd=123456
http://127.0.0.1:8080/mymvc3/emp.do?ac=login
3.11 訪問EmpController的delete方法,出現的錯誤:
訪問:http://127.0.0.1:8080/mymvc3/emp.do?ac=delete&eid=1 報錯:
EmpController中delete方法的參數需要的是一個Integer類型,
通過反射機制我們該方法需要的類型Parameter是Integer,
但是前臺傳遞到後臺的是字元串”1”,而不是數字1,所以需要進行類型轉換。
3.12 測試3.3.12問題,修改DispatcherServlet中的代碼
3.13 解決3.3.12問題,再次修改DispatcherServlet中的代碼
3.14 再次測試代碼,成功。
http://127.0.0.1:8080/mymvc3/emp.do?ac=delete&eid=1
DispatcherServlet中的完整代碼
3.15 小結:對應的版本mymvc3
寫到著,我們的Xxx只需要考慮,業務功能即可,不需要考慮如何獲取參數,資源的跳轉問題。那麼之前所寫的重覆的,請求參數的獲取和 請求轉發或是重定向都不要了。關註業務即可。
jackson jar包