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包

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/457954.html
標籤:架構設計
上一篇:有人可以確認foreach回圈背后的原因,因為當前背景關系中不存在“無效令牌”和“splittedText”錯誤嗎?
下一篇:設計模式之責任鏈模式
