如果你不能簡單說清楚,就是你還沒有完全明白。——愛因斯坦 need things: 1.操作xml文檔 dom4j 等開源類庫 2. dtd的驗證 等知識儲備 * n到n次 ? 0到1次 + 1到n次 3. java 反射的相關知識反射過程:導入 java.lang.reflect.*1.獲得需要操
如果你不能簡單說清楚,就是你還沒有完全明白。——愛因斯坦
need things:
1.操作xml文檔 dom4j 等開源類庫
2. dtd的驗證 等知識儲備
* n到n次 ? 0到1次 + 1到n次
3. java 反射的相關知識
反射過程:
導入 java.lang.reflect.*
1.獲得需要操作的類的 Java.lang.Class對象
2.調用Class的方法獲取Field, Method等對象
使用 反射api 進行操作
反射的常用類
Class 類 : 反射的核心類,反射的所有操作都是圍繞該類來生成的,通過它,可以獲取類的屬性,方法等信息
Field 類 : 類的屬性, 可以獲取和設置類中屬性信息
Method 類: 類的方法,可以獲取類中方法的信息,或者執行方法
Constructor類: 類的構造方法
1.
通過Class類的forName()靜態方法也可以獲取該類對應的Class對象,它會要求虛擬機查找並載入指定的類
Class cla = Class.forName("java.lang.String"); 如果字元串有問題,會拋出ClassNotFoundException異常
2.從Class 對象獲取信息
創建對象
使用Class對象的newInstance()方法創建對象
notice:實際上利用了它的無參構造方法來創建了該類的實例, 所以要求該Class對象的對應類有相應的無參構造方法
正文:構建開始
構建基於mvc模式的框架
實現方案1
所有請求發到一個統一的controller (用filter api 實現攔截請求) 這樣控制器負責接收請求 ,(根據請求的路徑指定由哪個action 來執行處理
然後定義Action介面,用來進行請求的處理, 比如登錄action, 註冊action 等
action 調用model,進行model的操作並返回相應的view
//controller類的定義 public class ActionFilter implements Filter{ private FilterConfig config; public voic destroy(){ } public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException,ServletException { //類型轉換 HttpServletRequest hsr = (HttpServletRequest) request; HttpServeltResponse hsp = (HttpServletResponse) response; //獲得action Action action = this.getAction(hsr); //調用action的excute 方法 String resultView = null; try{ resultView = action.execute(hsr,hsp); } catch(Exception e){ e.printStackTrace(); } //頁面跳轉 if(null != resultView) { request.getRequestDispatcher(resultView).forward(request, response); } } public void init(FilterConfig conf) throws ServletException { this.config = config; } public Action getAction(HttpServletRequest request) { String uri = request.getRequestURI(); //獲取請求的url String contextPath = request.getContextPath(); //獲取上下文路徑 String actionPath = uri.substring(contextPath.length()); //截取上下文路徑以後的部分 String actionName = actionPath.substring(1,actionPath.lastIndexOf('.')).trim(); Action action = null; // 以後每個定義的Action在這裡添加一項用於實例化一個需要的action 類的對象 if("login".equals(actionName)) { action = new LoginAction(); } return action; } }View Code
action介面的定義
主要 import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
....
基於Filter 的ActionFilter類的調用執行需要在web.xml中配置
<filter> <filter-name>requestFilter</filter-name> <filter-class>com.xx.xx.mystruts.framework.ActionFilter</filter-class> </filter> <filter-mapping> <filter-name>requestFilter</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping>
以上就是一個mvc框架大致思路的主體實現,很明顯還有很多遺漏的細節需要完善,但主體是這樣.
很明顯有改進的地方,比如
用前面xml的知識 讀取配置文件 把一個一個的action的註入通過xml註入
這樣就不用每新增一個action 就得重新加一行if 判斷處理需要的action類了
改為讓控制器初始化的時候讀xml
xml里抽出來定義的這些信息包括 action的name,匹配的url,調用的class文件,作為結果的視圖的路徑
這裡用一個java Bean來生成xml讀取後 對應的對象數據模型, 以在運行時讀取需要的信息
再寫一個manager用來管理這個action
與此同時controller也需要升級,讓web容器啟動的時候載入controller,並讀取我們寫的保存action信息的xml,
因此需要在filter的配置裡加上初始化參數,來實現這一功能本身
修改web.xml 之前的配置為類似下麵這種:
<filter> <filter-name>requestFilter</filter-name> <filter-class>com.xx.mystruts.ActionFilter</filter-class> <init-param> <param-name>config</param-name> <param-value>mystruts.xml</param-value> </init-param> </filter>
然後是actionFilter 類代碼實現的修改, 實現讀取配置文件
這時主要用到的幾個東西,和它們分別負責的內容為 (關於action mapping的映射可以方便的使用HashMap來進行相應的get,put)
mystruts.xml 配置文件,裡面定義每個Action的name result
ActionMapping 用來保存從xml中讀取的Action的信息
ActionFilter 作為controller 攔截請求,初始化應用,分配action
ActionMappingManager ActionMapping的管理器 它被調用初始化時,遍歷xml節點,
根據節點建立ActionMapping ,同時封裝一些對ActionMapping的操作,如根據ActionNameget到相應的ActionMapping對象等
ActionManager 使用反射技術生成具體的 Action實例
註意:
以上配置的時候關於請求訪問的時候觸發action,
1.可以通過直接訪問 localhost:xxx/xx.action
2.可以通過jsp的頁面轉發來調用,這時地址就可以不必是 xx.action結尾了,而是相應的jsp頁面地址
jsp頁面里寫
<body> <jsp:forward page="/index.action"></jsp:forward> </body>
此時web.xml中的filter-mapping做如下修改:
<filter-mapping> <filter-name>requestFilter</filter-name> <url-pattern>*.action</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>