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