App下載

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

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

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

閱前須知

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

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

MVC進(jìn)階介紹

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

實戰(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://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)行請求參數(shù)的判定的,這一部分的代碼雖然不多(因為沒有完整寫完),但我們?nèi)匀挥斜匾獙膕ervlet中剝離。接下來我們新建一個專門的java類(順便擴(kuò)寫將完整邏輯寫完,以顯示差異性)來處理這部分邏輯:

public class model {
    String url = "";
    String element = "";
    public void select(String classname) {
        if (classname.equals("qd")) {//目前只做前端判定,后期再增加
            url = "http://hgci.cn/courses?direction=2120&tag=0&type=&condition=&order=";
            element = "前端微課";
        }else if (classname.equals("hd")){
            url ="http://hgci.cn/courses?direction=2126&tag=0&type=&condition=&order=";
            element="后端微課";
        }else if (classname.equals("db")){
            url ="http://hgci.cn/courses?direction=2126&tag=0&type=&condition=&order=";
            element="后端微課";
        }else if (classname.equals("cp")){
            url ="http://hgci.cn/courses?direction=2126&tag=0&type=&condition=&order=";
            element="后端微課";
        }
        else if (classname.equals("Android")){
            url ="http://hgci.cn/courses?direction=2126&tag=0&type=&condition=&order=";
            element="后端微課";
        }else if (classname.equals("other")){
            url ="http://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ù)邏輯代碼拆分到一個專門的model類中,然后通過調(diào)用model類的方法來實現(xiàn)業(yè)務(wù)邏輯,這樣業(yè)務(wù)邏輯就被拆分到model類中了,servlet只需要在請求到來的時候,明白要調(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é)

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

相關(guān)閱讀

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

JSP教程 

servlet教程


0 人點贊