自定义MVC原理与框架
生活随笔
收集整理的這篇文章主要介紹了
自定义MVC原理与框架
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
一、自定義MVC
二、如何優化增刪改查
三、自定義MVC框架
一、自定義MVC
1.自定義MVC的概念:
MVC全稱名是Model(模型層) View(視圖層) control(控制層),這三個層級分工明確,各司其職,使MVC具有高內聚、低耦合的特點
2.自定義MVC的作用:
我們采用MVC模式可以將這些重復的代碼變為一個通用的代碼,可以被多個實體使用。在一定程度上MVC的三層架構模式節省了很多開發的時間,以及減少了許多重復的代碼
二、如何優化增刪改查
1、我們先來看看最初版的增刪改查
寫四個Servlet分別對應增刪改查,再從JSP界面調用這四個方法
Servlet
?
JSP
?
從這我們可以發現了問題1:對于單個實體類BOOK我們就要建立四個Servlet了,同時面對不同的需求我們的操作也就越多需要建的類也就越多,造成了一個類膨脹的問題
2、優化類膨脹問題
這里做一個假設,我們在一個Servlet里寫增刪改查再進行判斷前臺傳過來的請求,從而調用相應的方法。
如圖所示:
Servlet
?JSP:
?
問題2:這個方法解決了類過多的問題但是如果我們新增方法,又要不斷在紅圈的地方增加判斷方法,這些判斷方法也是一個重復的代碼,所以我們還要進一步優化
3、反射版增刪改查
我們使用之前所分享過的反射方法,解決判斷方法的重復代碼
//為了區分當前請求的目的 ,增刪改查的目的 就從前臺將調用的方法傳達到后臺String methodNmae = request.getParameter("methodName");//methodName可以是add也可以是del或者其他//前臺傳遞什么方法 就調用當前類的對應方法try {Method m = this.getClass()//BookServlet.class.getDeclaredMethod(methodNmae, HttpServletRequest.class,HttpServletResponse.class);m.setAccessible(true);//調用當前類實例的methodName方法m.invoke(this, request,response);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}問題3:但是如果我們需要再建一個實體或多個實體時,同樣會發現反射方法以及doget和dopost方法也是重復的
三、自定義MVC框架
為了更好地解決第三個問題來給大家看看MVC工作原理圖
?如上圖所示:自定義MVC工作原理圖,圖中actionservlet是中央控制器,action是子控制器,excute為子控制器中的方法。
1、我們先來定義一個中央控制器
我們將瀏覽器比喻為點單的顧客,那么中央控制器就是服務員,幫助瀏覽器找到對應的處理人
package com.zjy.framework;import java.io.IOException; import java.util.HashMap; import java.util.Map;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import com.zjy.web.BookAction;/*** 中央控制器* 主要職能:幫助瀏覽器請求,找到對應的處理人* @author 朱佳音**/ @WebServlet("/*.action") public class DispatcherServlet extends HttpServlet {private Map<String, Action> actions = new HashMap<String, Action>();//程序啟動時只會啟動一次@Overridepublic void init() throws ServletException {actions.put("/book", new BookAction());}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//http://localhost:8080/mvc/book.action?methodName=listString url = request.getRequestURI();//要拿到/book,就是最后一個/到最后一個.的位置url.substring(url.lastIndexOf("/"),url.lastIndexOf("."));Action action = actions.get(url);action.execute(request, response);}}2、子控制器是對應處理人:
Action是子控制器的代表類(是一個接口,里面只有一個方法,就是excute方法,這個方法是一個抽象方法)
package com.zjy.framework;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;/*** 子控制器:* 對應請求的處理人* @author 朱佳音**/ public interface Action {void execute(HttpServletRequest request, HttpServletResponse response); }ActionSupport類:是Action類的實現類,里面只要反射出要用的哪一個對象,同時反射出要用到什么方法(methodname)
package com.zjy.framework;import java.lang.reflect.Method;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class ActionSupport implements Action{@Overridepublic void execute(HttpServletRequest request, HttpServletResponse response) {//為了區分當前請求的目的 ,增刪改查的目的 就從前臺將調用的方法傳達到后臺String methodNmae = request.getParameter("methodName");//methodName可以是add也可以是del或者其他//前臺傳遞什么方法 就調用當前類的對應方法try {Method m = this.getClass()//BookServlet.class.getDeclaredMethod(methodNmae, HttpServletRequest.class,HttpServletResponse.class);m.setAccessible(true);//調用當前類實例的methodName方法m.invoke(this, request,response);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}? 3、BookAction類:是子控制器下的最底層,這個類只專注做一件事,就是處理瀏覽器發送過來的請求,可以節約大量的時間。
package com.zjy.web;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import com.zjy.framework.Action; import com.zjy.framework.ActionSupport;public class BookAction extends ActionSupport{private void load(HttpServletRequest request, HttpServletResponse response) {System.out.println("在同一個Servlet中調用load方法");}private void list(HttpServletRequest request, HttpServletResponse response) {System.out.println("在同一個Servlet中調用list方法");}private void edit(HttpServletRequest request, HttpServletResponse response) {System.out.println("在同一個Servlet中調用edit方法");}private void del(HttpServletRequest request, HttpServletResponse response) {System.out.println("在同一個Servlet中調用del方法");}private void add(HttpServletRequest request, HttpServletResponse response) {System.out.println("在同一個Servlet中調用add方法");} }好啦今天就先分享到這里啦,明天再完善哦
總結
以上是生活随笔為你收集整理的自定义MVC原理与框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据智能下数据脱敏的思考
- 下一篇: RF-测试目录以及库引用、变量使用