欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于对三层架构的学习

程序员文章站 2023-11-06 14:51:16
关于对三层架构的学习 1.什么是三层架构 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区 ......

关于对三层架构的学习

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

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