關於對三層架構的學習
關於對三層架構的學習
1.什麼是三層架構
三層架構(3-tier architecture) 通常意義上的三層架構就是將整個業務應用劃分為:介面層(User Interface layer)、業務邏輯層(Business Logic Layer)、資料訪問層(Data access layer)。區分層次的目的即為了“高內聚低耦合”的思想。在軟體體系架構設計中,分層式結構是最常見,也是最重要的一種結構。微軟推薦的分層式結構一般分為三層,從下至上分別為:資料訪問層、業務邏輯層(又或稱為領域層)、表示層。
2.三層的作用分為
1>資料訪問層:主要是對非原始資料(資料庫或者文字檔案等存放資料的形式)的操作層,而不是指原始資料,也就是說,是對資料庫的操作,而不是資料,具體為業務邏輯層或表示層提供資料服務。
2>業務邏輯層:主要是針對具體的問題的操作,也可以理解成對資料層的操作,對資料業務邏輯處理,如果說資料層是積木,那邏輯層就是對這些積木的搭建。
3>介面層:主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表現成:aspx,如果邏輯層相當強大和完善,無論表現層如何定義和更改,邏輯層都能完善地提供服務。
3.三層架構的優點:
1>開發人員可以只關注整個結構中的其中某一層。
2>可以很容易的用新的實現來替換原有層次的實現。
3>可以降低層與層之間的依賴。
4>有利於標準化。
5>利於各層邏輯的複用。
6>結構更加的明確。
7>在後期維護的時候,極大地降低了維護成本和維護時間。
通過一個案例分析三層的作用和三層架構的工作流程
案例要求:在資料庫表product中查詢所有的商品資料在jsp中展示(要求:使用三層架構架構設計)
分析:
1.首先需要客戶端發出查詢的命令並將這個命令傳送到servlet
2.servlet要接受客戶端的request並接受可能存在的parameter
3.在servlet中將執行這個命令的方法分為三層(即:三層架構web層、service層、dao層);
web層:
1.接受客戶端傳送的資料和引數
2.對資料進行Java Bean的封裝。
3.傳遞資料:一般用介面和方法呼叫將資料傳遞到service層。
4.將service層返回的資料放在request域中轉發到jsp進行展示
service層:
1.對業務的邏輯處理
2.接受web層的資料並將資料傳遞到dao層
3.資料的回寫返回dao層傳回的資料
dao層:
1.操作資料庫對所需要的資料進行篩選或更改
2. 資料的回寫返回查詢到的資料返回web層
圖解分析:
程式碼分析:
1.當用戶單機商品管理的選單時傳送資料到AdminProductListServlet
AdminProductListServlet:
2.web層:
1>不需要接受資料只需要建立集合接受dao查詢到的資料的集合
2>建立List集合泛型為product
List<product> productList = null;
3>將資料傳遞到service層
AdminProductDao service = new AdminProductDao();
productList = service.findAllProduct();
3.service層:
1>product案例沒有業務邏輯直接傳遞給到dao層處理
AdminProductDao dao=new AdminProductDao();
2>將dao層查詢到的資料回寫
3.dao層:
1>使用c3p0建立快速連結
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
2>查詢所有的商品資料
String sql = "select * from product";
3>使用建立的List<product>收集查詢到的資料:
List<product> productList = runner.query(sql, new BeanListHandler<product>(product.class));
4>將查詢到的資料回寫
4.Web層
1>接受到dao層查詢到的商品資料並傳遞到request域中
request.setAttribute("productList", productList);
2>轉發到寫好的 jsp中進行展示
request.getRequestDispatcher("/admin/product/list.jsp").forward(request, response);
5.在jsp中展示是需要對集合進行遍歷輸出就涉及到關於資料的封裝和遍歷
1>List<String>,List<User> Map<String, String> Map<String, User>的賦值和遍歷
//1>遍歷strList<String>
List<String> strList = new ArrayList<String>();
strList.add("一");
strList.add("二");
strList.add("三");
strList.add("四");
request.setAttribute("strList", strList);
//2>遍歷List<User>的值
List<User> userList = new ArrayList<User>();
User user1 = new User();
user1.setId(1);
user1.setName("lisi");
user1.setPassword("1234");
userList.add(user1);
User user2 = new User();
user2.setId(2);
user2.setName("wangwu");
user2.setPassword("123456");
userList.add(user2);
request.setAttribute("userList", userList);
//3>遍歷Map<String,String>的值
Map<String, String> strMap = new HashMap<String, String>();
strMap.put("key1", "一");
strMap.put("key2", "二");
strMap.put("key3", "三");
strMap.put("key4", "四");
request.setAttribute("strMap", strMap);
//4>遍歷Map<String,User>的值
Map<String, User> userMap = new HashMap<String, User>();
userMap.put("key1", user1);
userMap.put("key2",user2);
request.setAttribute("userMap", userMap);
6.在jsp中通過jstl對各種集合進行遍歷
<h1>取出strList資料</h1> <c:forEach items="${strList}" var="str"> ${str}<br>
</c:forEach> <h1>取出userList資料</h1> <c:forEach items="${userList}" var="user"> ${user.id}<br> ${user.name}<br> ${user.password}<br> </c:forEach>
<h1>取出strMap資料</h1> <c:forEach items="${strMap}" var="strMap"> ${strMap.key}=${strMap.value}<br> </c:forEach>
<h1>取出userMap資料</h1> <c:forEach items="${userMap}" var="userMap"> ${userMap.key }=${userMap.value.name}=${userMap.value.password}<br>
</c:forEach> |
7.在web層常用的接收資料的方法:
1.List集合
2>建立List集合泛型為product
List<product> productList = null;
3>將資料傳遞到service層
AdminProductDao service = new AdminProductDao();
productList = service.findAllProduct();
2. Map<String,String>封裝資料
//獲取request域中的所有資料
Map<String, String[]> properties = request.getParameterMap();
product product = new product();
try {
//將properties中的資料封裝到product物件中
BeanUtils.populate(product, properties);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
1>手動的封裝product中自己想要的資料
product.setPimage("products/1/c_0033.jpg");
8.總結:
三層的根本目的就是解耦,降低耦合性,增加內聚性。三層的視訊看起來雖然很簡單,程式碼照著視訊寫,很快就可以弄出來了。可是當讓自己用敲的時候,感覺到無從下手。還是通過網上查資料,查案例理解著去完成的,雖然這個過程花費時間不少,可是收穫很大!接下來就要靠實踐去熟練掌握了。