參考鏈接:https://www.cnblogs.com/xdp-gacl/p/3902537.html
Servlet+JSP+JavaBean架構屬於Web MVC模型,控制器采用Servlet、模型采用JavaBean、視圖采用JSP,其中
servlet負責處理用戶請求,jsp負責數據顯示,javabean負責封裝數據,如圖
分層架構的代碼也是按照【域模型層(domain)】→【數據訪問層(dao、dao.impl)】→【業務處理層(service、service.impl)】→【表現層(web.controller、web.UI、web.filter、web.listener)】→【工具類(util)】→【測試類(junit.test)】的順序進行編寫的。
項目所需要的包 | |||
序號 | 包名 | 描述 | 所屬層次 |
1 | me.gacl.domain | 存放系統的JavaBean類(只包含簡單的屬性以及屬性對應的get和set方法,不包含具體的業務處理方法),提供給【數據訪問層】、【業務處理層】、【Web層】來使用 | domain(域模型)層 |
2 | me.gacl.dao | 存放訪問數據庫的操作接口類 | 數據訪問層 |
3 | me.gacl.dao.impl | 存放訪問數據庫的操作接口的實現類 | |
4 | me.gacl.service | 存放處理系統業務接口類 | 業務處理層 |
5 | me.gacl.service.impl | 存放處理系統業務接口的實現類 | |
6 | me.gacl.web.controller | 存放作為系統控制器的Servlet | Web層(表現層) |
7 | me.gacl.web.UI | 存放為用戶提供用戶界面的servlet(UI指的是user interface) | |
8 | me.gacl.web.filter | 存放系統的用到的過濾器(Filter) | |
9 | me.gacl.web.listener | 存放系統的用到的監聽器(Listener) | |
10 | me.gacl.util | 存放系統的通用工具類,提供給【數據訪問層】、【業務處理層】、【Web層】來使用 | |
11 | junit.test | 存放系統的測試類 |
開發總結
通過這個小例子,可以了解到mvc分層架構的項目搭建,在平時的項目開發中,也都是按照如下的順序來進行開發的:
1、搭建開發環境
1.1 創建web項目
1.2 導入項目所需的開發包
1.3 創建程序的包名,在java中是以包來體現項目的分層架構的
2、開發domain
把一張要操作的表當成一個VO類(VO類只定義屬性以及屬性對應的get和set方法,沒有涉及到具體業務的操作方法),VO表示的是值對象,通俗地說,就是把表中的每一條記錄當成一個對象,表中的每一個字段就作為這個對象的屬性。每往表中插入一條記錄,就相當於是把一個VO類的實例對象插入到數據表中,對數據表進行操作時,都是直接把一個VO類的對象寫入到表中,一個VO類對象就是一條記錄。每一個VO對象可以表示一張表中的一行記錄,VO類的名稱要和表的名稱一致或者對應。
3、開發dao
3.1 DAO操作接口:每一個DAO操作接口規定了,一張表在一個項目中的具體操作方法,此接口的名稱最好按照如下格式編寫:“I表名稱Dao”。
├DAO接口里面的所有方法按照以下的命名編寫:
├更新數據庫:doXxx()
├查詢數據庫:findXxx()或getXxx()
3.2 DAO操作接口的實現類:實現類中完成具體的增刪改查操作
├此實現類完成的只是數據庫中最核心的操作,並沒有專門處理數據庫的打開和關閉,因為這些操作與具體的業務操作無關。
4、開發service(service 對web層提供所有的業務服務)
5、開發web層
缺點
1、Servlet作為控制器的缺點
此處的控制器使用Servlet,使用Servlet作為控制器有以下幾個缺點:
1、控制邏輯可能比較復雜,其實我們可以按照規約,如請求參數submitFlag=toLogin,我們其實可以直接調用toLogin方法,來簡化控制邏輯;而且每個模塊基本需要一個控制器,造成控制邏輯可能很復雜。現在流行的Web MVC框架(如Struts2)都支持"請求參數submitFlag=toAdd,就可以直接調用toAdd方法"這樣的處理機制,在Struts2中類似這樣的處理機制就稱為"動態方法調用"
2、請求參數到模型的封裝比較麻煩,如果能交給框架來做這件事情,我們可以從中得到解放。
請求參數到模型的封裝代碼:
// 1收集參數
String username = req.getParameter("username");
String password = req.getParameter("password");
// 2封裝參數
UserBean user = new UserBean();
user.setUsername(username);
user.setPassword(password);
當有幾十個甚至上百個參數需要封裝到模型中時,這樣寫恐怕就痛苦萬分了,要寫幾十次甚至上百次這樣的代碼,估計寫到吐了,所以現在流行的Web MVC框架(如Struts2)都提供了非常方便的獲取參數,封裝參數到模型的機制,減少這些繁瑣的工作。
3、選擇下一個視圖,嚴重依賴Servlet API,這樣很難或基本不可能更換視圖。
例如:使用Servlet API提供的request對象的getRequestDispatcher方法選擇要展示給用戶看的視圖
private void toLogin(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//使用Servlet API提供的request對象的getRequestDispatcher方法選擇視圖
// 此處和JSP視圖技術緊密耦合,更換其他視圖技術幾乎不可能
request.getRequestDispatcher("/mvc/login.jsp").forward(request, response);
}
4、給視圖傳輸要展示的模型數據,也需要使用Servlet API,更換視圖技術也要一起更換,很麻煩。
例如:使用Servlet API提供的request對象給視圖傳輸要展示的模型數據
//使用Servlet API提供的request對象給視圖login.jsp傳輸要展示的模型數據(user) request.setAttribute("user", user); request.getRequestDispatcher("/mvc/login.jsp").forward(request, response)
3.2、JavaBean作為模型的缺點
此處模型使用JavaBean,JavaBean組件類既負責收集封裝數據,又要進行業務邏輯處理,這樣可能造成JavaBean組件類很龐大,所以一般現在項目都是采用三層架構,而不直接采用JavaBean。
3.3、視圖的缺點
現在被綁定在JSP,很難更換視圖,比如Velocity、FreeMarker;比如我要支持Excel、PDF視圖等等。
點擊此處下載項目源碼: