摘要:經過前面幾次反射機制的學習,這次用反射的知識寫一個類似于框架處理機制的小。和在引入反射知識前,先簡單介紹下框架和。再次使用反射獲取的最新值,組成返回,同時根據方法的返回值,去中獲取對應的。最后根據的返回值和的名稱組成最終展示的視圖。
經過前面幾次反射機制的學習,這次用反射的知識寫一個類似于Struts框架處理機制的小demo。
Servlet 和 Sturts在引入反射知識前,先簡單介紹下Sturts框架和Servlet。
在沒有一些Web框架之前,當我們要寫Java Web應用使用的就是Servlet。一個簡單的Servletdemo就是如下所示。
public class HelloWorld extends HttpServlet { private String message; public void init() throws ServletException { message = "Hello World"; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("" + message + "
"); } public void destroy() { } }
servlet會提供出來doGet和doPost,同時接收用戶傳入的參數,進行業務處理,再返回視圖。那么Servlet如何與URL對應起來呢,答案就是在web.xml,綁定servlet和url之間的映射關系。
HelloWorld HelloWorld HelloWorld /HelloWorld
映射、業務邏輯處理、視圖返回全部在servlet中完成,耦合度比較高,隨著url的增多,servlet會越來越多,需要在web.xml配置很多映射關系,不利于維護。同時servlet的入參以及返回的參數很依賴于當前運行的容器,本身也是線程不安全的,當入參非常多時,需要多次調用getParm方法,代碼很冗余。
之后Struts框架誕生,通過統一的ActionServlet處理具體的url請求和參數映射以及根據不同的返回結果跳轉不同的視圖,開發者只需要關心自己的業務邏輯,就可以實現web應用的開發。具體的Struts的配置文件,大致如下面XML所示。
/jsp/homepage.jsp /jsp/showLogin.jsp /jsp/welcome.jsp /jsp/error.jsp
我們只需要分別實現視圖和業務邏輯,再通過struts將他們綁定起來,就可以完成開發工作,也更便于理解,方便維護。有興趣的讀者可以自行深入學習下servlet和struts的思想。
小demo我想寫的小demo就是利用讀取xml,利用反射加載不同的action,進行業務邏輯處理,最后輸出返回的視圖,整個邏輯思路還是比較簡單,純當反射學習的練手。
首先是定義配置類,把xml中action對應的映射關系保存下來
private class ActionConfig { private String name; private String className; private MapviewResult = new HashMap<>();
當初始化讀取xml完畢后,得到如下結構,action的名字對應著具體的action配置
MapactionConfigMap = new HashMap<>();
模擬Struts ActionServlet的運作方式
public View runAction(String actionName, Mapparams) { String className = cfg.getClassName(actionName); if (className == null) { return null; } try { Class> clz = Class.forName(className); Object action = clz.newInstance(); ReflectionUtil.invokeSetMethods(action, params); String resultName = (String) clz.getDeclaredMethod("execute").invoke(action); Map result = ReflectionUtil.invokeGetMethods(action); String resultView = cfg.getViewResult(actionName, resultName); return new View(resultView, result);
通過actionName從配置類中拿到具體的執行類的全類名,其實Struts框架就是直接解析url,然后對應到xml配置的對應action名稱,將url和具體的執行類綁定在一起。
之后是使用Class.forName創建類類型,然后創建對應的實例。ReflectionUtil里面做的事情就是,先獲取action中對應的field的Name,然后從變量中,根據filed名稱找對應的值,然后使用set方法對action的field進行賦值操作,就是LoginAction中的相關信息。
public class LoginAction { private String name; private String password; private String message;
這一步就省去了使用servlet時,重復去get賦值的繁瑣操作,利用反射機制,直接對成員變量進行賦值,開發者只需要將前端會傳入的參數名稱和后端類中的名稱做好事先的確認即可。
然后就是通過反射調用execute方法,使用了Method.invoke方法。再次使用反射獲取field的最新值,組成map返回,同時根據方法的返回值,去actionConfigMap中獲取對應的view。
最后根據field的返回值map和view的名稱組成最終展示的視圖。
以上其實就是根據反射知識模仿的struts核心運行流程的小demo,整個web框架處理了非常多的其他的事情比如參數映射,安全,Json處理等,如果有興趣,可以進一步做學習。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70760.html
摘要:分類根類加載器也被稱為引導類加載器,負責核心類的加載比如等。要想解剖一個類必須先要獲取到該類的字節碼文件對象。 這是劉意老師的JAVA基礎教程的筆記講的賊好,附上傳送門 傳智風清揚-超全面的Java基礎 一、類的加載 1.類初始化的時機 創建類的實例訪問類的靜態變量,或者為靜態變量賦值調用類的靜態方法使用反射方式來強制創建某個類或接口對應的java.lang.Class對象初始化某個類...
摘要:反射機制一結合官方通過編寫的反射教程,復習一下反射的知識。反射的概念反射是一種在運行時獲取以及修改應用行為的一種工具。因為反射需要動態的解析類的信息,相比于非反射使用的方式要慢。反射需要獲取一定的運行時權限,在特定的安全環境下不一定存在。 Java反射機制(一) 結合Oracle官方通過JDK8編寫的反射教程,復習一下反射的知識。結尾篇補一個小例子。 主要內容 這次博客的主要內容就是簡...
摘要:再附一部分架構面試視頻講解本文已被開源項目學習筆記總結移動架構視頻大廠面試真題項目實戰源碼收錄 Java反射(一)Java反射(二)Java反射(三)Java注解Java IO(一)Java IO(二)RandomAccessFileJava NIOJava異常詳解Java抽象類和接口的區別Java深拷貝和淺拷...
摘要:本文是作者自己對中線程的狀態線程間協作相關使用的理解與總結,不對之處,望指出,共勉。當中的的數目而不是已占用的位置數大于集合番一文通版集合番一文通版垃圾回收機制講得很透徹,深入淺出。 一小時搞明白自定義注解 Annotation(注解)就是 Java 提供了一種元程序中的元素關聯任何信息和著任何元數據(metadata)的途徑和方法。Annotion(注解) 是一個接口,程序可以通過...
摘要:找到字節碼并創建一個對象。鏈接,檢驗字節碼,為字段分配存儲空間,解決其對他類的引用。初始化,如果有父類則初始化父類,執行靜態初始化器和靜態初始化區塊直到第一次訪問靜態成員時初始化才執行。如果成員不是編譯時常量由初始化器賦值,也會引起初始化。 有兩種形式在運行時獲取類型信息: 傳統的RTTI 反射 Class對象 運行時的類型信息是通過Class對象表現的,它包含了類的信息。所有...
閱讀 2066·2021-09-22 15:54
閱讀 1830·2021-09-04 16:40
閱讀 854·2019-08-30 15:56
閱讀 2623·2019-08-30 15:44
閱讀 2150·2019-08-30 13:52
閱讀 1120·2019-08-29 16:35
閱讀 3340·2019-08-29 16:31
閱讀 2562·2019-08-29 13:48