1. 程式人生 > >關於對三層架構的學習

關於對三層架構的學習

關於對三層架構的學習

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.總結:

       三層的根本目的就是解耦,降低耦合性,增加內聚性。三層的視訊看起來雖然很簡單,程式碼照著視訊寫,很快就可以弄出來了。可是當讓自己用敲的時候,感覺到無從下手。還是通過網上查資料,查案例理解著去完成的,雖然這個過程花費時間不少,可是收穫很大!接下來就要靠實踐去熟練掌握了。