关于对三层架构的学习

关于对三层架构的学习

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.总结:

       三层的根本目的就是解耦,降低耦合性,增加内聚性。三层的视频看起来虽然很简单,代码照着视频写,很快就可以弄出来了。可是当让自己用敲的时候,感觉到无从下手。还是通过网上查资料,查案例理解着去完成的,虽然这个过程花费时间不少,可是收获很大!接下来就要靠实践去熟练掌握了。

猜你喜欢

转载自www.cnblogs.com/asndxj/p/10007671.html