在小伙伴學(xué)習(xí)了如何將web項目的視圖層分離后,servlet里面還是有很多無關(guān)代碼,這是因為不良的開發(fā)習(xí)慣導(dǎo)致的。很多小伙伴對MVC模式的理解并不夠透徹,并沒有將servlet中的業(yè)務(wù)邏輯進行分離,在小項目中可能影響不大,一旦業(yè)務(wù)邏輯繁雜起來,整個servlet就會變得不易閱讀。而且這樣也沒有遵循MVC三層架構(gòu)的思想。接下來這篇文章,我們將針對之前的項目,進行業(yè)務(wù)邏輯的拆解。
閱前須知
本篇文章分為上下兩篇,這是下篇,主要介紹如何把應(yīng)用邏輯從servlet中分離出來。上篇為:MVC三層架構(gòu)分離——視圖層分離。
對本文的web項目結(jié)構(gòu)要是有疑惑,可以參讀小編的這篇文章:java web項目結(jié)構(gòu)是怎么樣的?詳解java web項目文件!。
MVC進階介紹
在上一篇文章中我們提到,我們應(yīng)該將web代碼按照功能的不同拆分成三個層次,其中模型層可能會給各位小伙伴帶來疑惑:什么是模型層,它是用來干什么的?模型層其實可以理解為一種邏輯。就像解題模型一樣,servlet將數(shù)據(jù)傳給模型層,然后模型給出一個結(jié)果返回給servlet。沒錯,模型層也可以被稱為業(yè)務(wù)邏輯層(在學(xué)習(xí)數(shù)據(jù)庫操作后,會將模型層進行拆分,比如拆分成service層和dao層)。
實戰(zhà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();
}
}
這里的代碼中有一部分是進行請求參數(shù)的判定的,這一部分的代碼雖然不多(因為沒有完整寫完),但我們?nèi)匀挥斜匾獙膕ervlet中剝離。接下來我們新建一個專門的java類(順便擴寫將完整邏輯寫完,以顯示差異性)來處理這部分邏輯:
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ù)邏輯代碼拆分到一個專門的model類中,然后通過調(diào)用model類的方法來實現(xiàn)業(yè)務(wù)邏輯,這樣業(yè)務(wù)邏輯就被拆分到model類中了,servlet只需要在請求到來的時候,明白要調(diào)用什么model的方法,然后將model返回的處理完畢的數(shù)據(jù)轉(zhuǎn)發(fā)給JSP進行視圖的輸出即可。剝離了業(yè)務(wù)邏輯代碼和視圖表現(xiàn)代碼的servlet剩下的功能就是作為視圖和模型的連接,所以他又被稱為控制器(十分形象,servlet控制了業(yè)務(wù)邏輯的調(diào)用和表現(xiàn)代碼的調(diào)用)。
小結(jié)
通過兩篇文章的學(xué)習(xí),讀者們應(yīng)該可以學(xué)到如何將一個web項目進行MVC三層架構(gòu)的拆分,然后加深對MVC模式的理解。作為web開發(fā)最重要的一個設(shè)計模式(沒有之一),學(xué)習(xí)MVC模式是相當重要的。小編文章只能將MVC模式講個大概,更多精彩的web項目學(xué)習(xí),還得是編程獅的JSP/servlet微課。