簡略版本MVC框架JWork的實現

1.Servlet結合JSP做MVC三層開發遇到的問題?

接着上一篇博客裏面講的實現一個簡略版本的MVC框架,這個框架是基於Servlet技術的,爲什麼要寫這個Mini版本的MVC框架呢,相信做過Servlet和JSP開發的哥們都有一個感受,貼上代碼:

public class UserServlet extends HttpServlet {

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //設置編碼
        request.setCharacterEncoding("UTF-8");

        //獲取請求參數
        String method = request.getParameter("method");

        //根據不同的method執行相應的方法
        if("add".equals(method)){
            add(request,response);
        } else if("update".equals(method)){
            update(request,response);
        } else if("delete".equals(method)){
            delete(request,response);
        }
    }

    /* 刪除邏輯代碼 */
    private void delete(HttpServletRequest request, HttpServletResponse response) {
        //code
    }

    /* 更新邏輯代碼 */
    private void update(HttpServletRequest request, HttpServletResponse response) {
        //code
    }

    /* 添加邏輯代碼 */
    private void add(HttpServletRequest request, HttpServletResponse response) {
        //code
    }

    /* 方便Post請求和Get請求一起處理的方式 */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

2.框架的誕生解決實際開發遇到的問題

1.爲什麼要有框架?
框架是用來解決實際的開發問題而出現的。
2.爲什麼會有MVC?
MVC可以這樣理解M是Model的意思 V是View視圖而C是控制層,當時Java剛開始做web系統的時候只有JSP,如果將數據庫連接和數據顯示都放到一個JSP頁面中完成,這樣頁面非常混亂爲了解決這個問題誕生了一種解決方案,JSP+Servlet結合開發JSP負責顯示數據,連接數據庫的邏輯放在Servlet中實現,可以說出現了兩層了V+C,可是這樣發現數據直接顯示中間沒有得到數據的複用,如果數據多了不好辦了,這個時候JavaBean就加入了進來充當了Model負責數據的封裝,封裝從數據庫讀取的數據。到這裏MVC就完全出現了。小型網站最適合這種三層架構方案JavaBean+JSP+Servlet
下圖可以幫助理解MVC:
這裏寫圖片描述

3.簡略版MVC框架JWork實現方案

以上知道了爲什麼會出現框架,其實都是爲了簡化開發。

1.JWork的優點:

a.使用註釋進行映射訪問URI
b.使用Servlet的方式進行設計
c.約定Action結尾爲.go後綴
d.訪問傳遞參數爲method方式,不傳遞則默認執行work方法
e.只需要在web.xml中配置一次servlet

2.JWork實現原理
a.在Web服務器啓動的時候,掃描項目中所有編譯後的class字節碼文件,將有註解部分的字節碼文件加載到JVM中虛擬機中,同時將實例化的Action對象和註解路徑進行映射。獲取所有web請求,根據請求路徑到實例化Action對象的JVM容器中查找相對應的Action字節碼文件,通過反射調用方法。

b.在實現的過程中自定義類加載器是實現的關鍵

/*
 * 自定義類的加載器,JDK中沒有提供根據路徑進行加載類的方法,只能
 * 自定義類加載器根據路徑進行加載字節碼文件,從而將字節碼文件轉換
 * 成對象的形式,在JVM啓動的時候進行加載
 */
class KylinLoader extends ClassLoader {

    /*
     * 委託父級類加載器進行加載
     */
    public KylinLoader(ClassLoader parent) {
        super(parent);
    }

    public Class load(String path) {
        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            FileInputStream fis = new FileInputStream(new File(path));
            int len = 0;
            byte buffer[] = new byte[1024];
            //循環讀取
            while ((len = fis.read(buffer)) > 0) {
                bos.write(buffer, 0, len);
            }
            //清除數據流緩存
            bos.flush();
            //轉換成字節數組
            byte b[] = bos.toByteArray();

            //調用父類的方法完成操作
            return super.defineClass(null, b, 0, b.length);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

爲什麼要自定義類加載器呢?JDK中沒有提供根據路徑加載字節碼文件的功能所以只有自己實現這個功能,思路是根據路徑讀取字節碼文件,將其轉換成字節數組,然後通過JDK提供的defineClass方法將字節碼文件真正裝載到JVM中以Class對象的形式存在。

c.註解中一定要標明在運行時環境@Retention(RetentionPolicy.RUNTIME)

package org.kylin.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Mapper {
    //映射路徑
    String value();
}

以上就把MVC的實現要點說完了,同時這個JWork我在一些小系統中還是經常使用的比Struts2、Spring MVC好用多了,前提是小網站系統。並且JWork已經開源可以到我的GitHub上查看使用和源碼。


非常高興和大家交流學習
自由轉載,創意許可,請註明文章來源,來自這裏
(http://blog.csdn.net/unikylin)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章