App下載

MVC三層架構(gòu)分離——模型層分離

猿友 2021-06-22 15:22:28 瀏覽數(shù) (3487)
反饋

在小伙伴學(xué)習(xí)了如何將web項(xiàng)目的視圖層分離后,servlet里面還是有很多無(wú)關(guān)代碼,這是因?yàn)椴涣嫉拈_發(fā)習(xí)慣導(dǎo)致的。很多小伙伴對(duì)MVC模式的理解并不夠透徹,并沒有將servlet中的業(yè)務(wù)邏輯進(jìn)行分離,在小項(xiàng)目中可能影響不大,一旦業(yè)務(wù)邏輯繁雜起來(lái),整個(gè)servlet就會(huì)變得不易閱讀。而且這樣也沒有遵循MVC三層架構(gòu)的思想。接下來(lái)這篇文章,我們將針對(duì)之前的項(xiàng)目,進(jìn)行業(yè)務(wù)邏輯的拆解。

閱前須知

本篇文章分為上下兩篇,這是下篇,主要介紹如何把應(yīng)用邏輯從servlet中分離出來(lái)。上篇為:MVC三層架構(gòu)分離——視圖層分離。

對(duì)本文的web項(xiàng)目結(jié)構(gòu)要是有疑惑,可以參讀小編的這篇文章:java web項(xiàng)目結(jié)構(gòu)是怎么樣的?詳解java web項(xiàng)目文件!。

MVC進(jìn)階介紹

在上一篇文章中我們提到,我們應(yīng)該將web代碼按照功能的不同拆分成三個(gè)層次,其中模型層可能會(huì)給各位小伙伴帶來(lái)疑惑:什么是模型層,它是用來(lái)干什么的?模型層其實(shí)可以理解為一種邏輯。就像解題模型一樣,servlet將數(shù)據(jù)傳給模型層,然后模型給出一個(gè)結(jié)果返回給servlet。沒錯(cuò),模型層也可以被稱為業(yè)務(wù)邏輯層(在學(xué)習(xí)數(shù)據(jù)庫(kù)操作后,會(huì)將模型層進(jìn)行拆分,比如拆分成service層和dao層)。

實(shí)戰(zhàn)

還記得上一篇文章的代碼嗎?這邊進(jìn)行回顧:

 public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String classname = "";
        String url = "";
        String element = "";
        classname = request.getParameter("class");
        if (classname.equals("qd")) {//目前只做前端判定,后期再增加
            url = "http://m.hgci.cn/courses?direction=2120&tag=0&type=&condition=&order=";
            element = "前端微課";
        }

        request.setAttribute("url",url);
        request.setAttribute("element",element);
        RequestDispatcher view = request.getRequestDispatcher("result.jsp");
        try {
            view.forward(request,response);
        } catch (ServletException e) {
            e.printStackTrace();
        }
    }

這里的代碼中有一部分是進(jìn)行請(qǐng)求參數(shù)的判定的,這一部分的代碼雖然不多(因?yàn)闆]有完整寫完),但我們?nèi)匀挥斜匾獙膕ervlet中剝離。接下來(lái)我們新建一個(gè)專門的java類(順便擴(kuò)寫將完整邏輯寫完,以顯示差異性)來(lái)處理這部分邏輯:

public class model {
    String url = "";
    String element = "";
    public void select(String classname) {
        if (classname.equals("qd")) {//目前只做前端判定,后期再增加
            url = "http://m.hgci.cn/courses?direction=2120&tag=0&type=&condition=&order=";
            element = "前端微課";
        }else if (classname.equals("hd")){
            url ="http://m.hgci.cn/courses?direction=2126&tag=0&type=&condition=&order=";
            element="后端微課";
        }else if (classname.equals("db")){
            url ="http://m.hgci.cn/courses?direction=2126&tag=0&type=&condition=&order=";
            element="后端微課";
        }else if (classname.equals("cp")){
            url ="http://m.hgci.cn/courses?direction=2126&tag=0&type=&condition=&order=";
            element="后端微課";
        }
        else if (classname.equals("Android")){
            url ="http://m.hgci.cn/courses?direction=2126&tag=0&type=&condition=&order=";
            element="后端微課";
        }else if (classname.equals("other")){
            url ="http://m.hgci.cn/courses?direction=2126&tag=0&type=&condition=&order=";
            element="后端微課";
        }
    }
    public String getUrl() {
        return url;
    }
    public String getElement() {
        return element;
    }
}

然后修改servlet的代碼(只展示?doGet()?方法):

 public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String classname = "";
        classname = request.getParameter("class");
        model select = new model();
        select.select(classname);
        request.setAttribute("url",select.url);
        request.setAttribute("element",select.element);
        RequestDispatcher view = request.getRequestDispatcher("result.jsp");
        try {
            view.forward(request,response);
        } catch (ServletException e) {
            e.printStackTrace();
        }
    }

如上代碼所示,我們將業(yè)務(wù)邏輯代碼拆分到一個(gè)專門的model類中,然后通過(guò)調(diào)用model類的方法來(lái)實(shí)現(xiàn)業(yè)務(wù)邏輯,這樣業(yè)務(wù)邏輯就被拆分到model類中了,servlet只需要在請(qǐng)求到來(lái)的時(shí)候,明白要調(diào)用什么model的方法,然后將model返回的處理完畢的數(shù)據(jù)轉(zhuǎn)發(fā)給JSP進(jìn)行視圖的輸出即可。剝離了業(yè)務(wù)邏輯代碼和視圖表現(xiàn)代碼的servlet剩下的功能就是作為視圖和模型的連接,所以他又被稱為控制器(十分形象,servlet控制了業(yè)務(wù)邏輯的調(diào)用和表現(xiàn)代碼的調(diào)用)。

小結(jié)

通過(guò)兩篇文章的學(xué)習(xí),讀者們應(yīng)該可以學(xué)到如何將一個(gè)web項(xiàng)目進(jìn)行MVC三層架構(gòu)的拆分,然后加深對(duì)MVC模式的理解。作為web開發(fā)最重要的一個(gè)設(shè)計(jì)模式(沒有之一),學(xué)習(xí)MVC模式是相當(dāng)重要的。小編文章只能將MVC模式講個(gè)大概,更多精彩的web項(xiàng)目學(xué)習(xí),還得是編程獅的JSP/servlet微課。

相關(guān)閱讀

MVC三層架構(gòu)分離——視圖層分離

JSP教程 

servlet教程


0 人點(diǎn)贊