JavaWeb.11.三层架构

三层指的是哪几个?分层是个啥?


目录:

        了解分层与分层模式:

                为什么需要分层?

        三层架构(三层模式):

                什么是三层?what?

                为什么用它? why?

        面向接口编程:

        详细代码:


企业做开发会涉及到一下四个点:

        1.系统的耦合性(紧密度):藕断丝连,与系统的多个部分都有联系

        2.系统的拓展性

        3.代码的可读性

        4.业务的拓展性

        耦合性:

        比如:公司开发了一个系统,会有 用户系统,订单系统,物流系统,如果用户系统订单系统处于一个你中有我,我中有你的一个紧密状态,说明二者的耦合性很高,那么其中一个系统坏了,另一个系统就用不了了,还会影响系统的拓展性,这个就体现了耦合性。

因此,耦合性太高,对于系统来说是不好的

以上咱们可以了解到,耦合性太高会造成的影响,所以,为了降低这种耦合性(解耦),咱通常会在开发时采用分层的模式,这种模式中常见的有今天我们要重点讲解的三层架构


了解分层与分层模式:

为什么需要分层?

jsp开发的弊端:业务处理的代码与jsp代码混在一起,不易于阅读,不易于代码维护:

JavaWeb.11.三层架构_第1张图片

分层模式:

1. 分层模式是最常见的一种架构模式

2. 分层模式是很多架构模式的基础

分层:

1. 将解决方案的组件分隔到不同的层中

2. 在同一个层中组件之间保持内聚性

3. 层与层之间保持松耦合


 三层架构(三层模式):

 什么是三层?

 1. 表示层:只要是指与用户交互的界面,用于接收用户输入的数据和显示处理后用户需要的数据

 2. 业务逻辑层:表示层和数据访问层之间的桥梁,实现业务逻辑,具体包含:验证,计算,业务  规则等等

 3. 数据访问层:与数据库打交道,只要实现对数据的增,删,改,查

请看下面的流程图,有助李姐:

 JavaWeb.11.三层架构_第2张图片

 表示层 UI:相当于jsp(服务员:给别人做显示)

 业务逻辑层 BIZ:相当于biz(厨师:针对数据进行加工)

 数据访问层 DAL:对应dao(仓库管理员:从数据库拿数据)

 所以就相当于:

 JavaWeb.11.三层架构_第3张图片

  

补充:(实体层)

其实有一个层贯穿了所有的层,那就是 业务实体层(Entity )

JavaWeb.11.三层架构_第4张图片


为什么用它?  why?

三层架构的特征

各司其职:

        服务员就是专门和顾客直接交流的,为顾客点菜

        厨师只需要根据顾客点的菜来做

        采购员只需根据顾客德才准备食材,交给厨师即可

用三层架构的目的就是为了实现 高内聚,低耦合 的思想:

高内聚:尽可能类的每个成员方法只完成一件事

低耦合:减少类内部,一个成员方法调用另一个成员方法

减少耦合性就是(解耦),只做自己功能内的事

因此,

服务员(UI层):请假——>另找服务员

厨师(BLL层):辞职——>招聘另一个厨师

采购员(DAL层):辞职——>招聘另一个采购员

(任何一层发生变化都不会影响到另外一层!!!)


面向接口编程:

设计与实现分开:

在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。

实现方式:

在开发时建立以下几个包:

JavaWeb.11.三层架构_第5张图片

        含义:

        * biz:存放业务逻辑层接口

        * biz.impl:存放业务逻辑层的实现类

        * dao:存放数据访问层的接口

        * dao.impl:存放数据访问层的实体类

        * entity:存放实体类

        * util:存放帮助类,如DBHelper

        


详细代码:

  用户登录首页 index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


	//单体数据
	new NewsDao().queryAll();
	//多个表的数据
	//1.多表查询语句
	//2.从dao里面取出连多个表的数据
	
	//dao 拿数据 加工 
	//jsp 显示		
	
	//拿数据:仓库(数据库)管理员	dao
	//针对数据进行加工:厨师	biz
	//给别人做显示:服务员	jsp
	
	//用户在页面上发起了一个请求(jsp上点击了一个按钮)
	//	【西红柿炒蛋】
	//请求给到biz【没有西红柿,没有炒蛋】
	//	【告诉dao,我需要西红柿(数据),鸡蛋(数据)】
	//1.西红柿dao包-》西红柿
	//2.鸡蛋dao包-》鸡蛋
	//biz处理数据,将西红柿+鸡蛋-》西红柿炒鸡蛋
	//jsp页面:显示功能【上菜】
	
	



  处理用户登录 doLogin.jsp的页面:

<%@page import="com.zking.pojo.User"%>
<%@page import="com.zking.biz.IUserBiz"%>
<%@page import="com.zking.biz.impl.UserBizImpl"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//表示层-》业务逻辑层(biz)-》数据库操作层(dao)
	String username=request.getParameter("username");
	String password=request.getParameter("password");
	User user=new User(username,password);

	
	//登录
	IUserBiz userBiz=new UserBizImpl();
	//调用业务逻辑层的方法
	String message=userBiz.login(user);
	
	//输出结果
	out.print(message);
	
%>


  业务逻辑层接口代码 IUserBiz.java:(前面带 I 的,表示是接口)

package com.zking.biz;

import com.zking.pojo.User;

public interface IUserBiz {//用户业务逻辑层的接口
	
	String login(User user);//接口没有实现

}


  实体类代码 User.java:

package com.zking.pojo;

public class User {//用户实体类
	
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + "]";
	}
	
	public User() {
		// TODO Auto-generated constructor stub
	}
	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}
	
	

}


  业务逻辑层接口的实现类代码UserBizImpl.java:(后面是Impl的,表示是实现类)

package com.zking.biz.impl;

import com.zking.biz.IUserBiz;
import com.zking.dao.IUserDao;
import com.zking.dao.impl.UserDaoImpl;
import com.zking.pojo.User;

public class UserBizImpl implements IUserBiz{//用户逻辑接口实现类

	//使用接口来声明,用子类来实现
	//里氏替换原则
	private IUserDao userDao=new UserDaoImpl();
	
	//biz-》dao
	
	@Override
	public String login(User user) {
		//1.先拿到dao数据
		User u=userDao.queryByName(user);
		//2.处理数据
		if(u!=null) {
			return "登陆成功";
		}
		
		return "登录失败";
	}

}


  数据访问层接口代码 IUserDao.java:

package com.zking.dao;

import com.zking.pojo.User;

public interface IUserDao {//用户的数据库操作接口
	
	User queryByName(User user);

}


  数据访问层接口的实现类代码 UserDaoImpl.java:

package com.zking.dao.impl;

import com.zking.dao.IUserDao;
import com.zking.pojo.User;

public class UserDaoImpl implements IUserDao{//用户的数据库操作接口实现类

	@Override
	public User queryByName(User user) {
		// 根据用户名和密码去数据库查询数据
		if("root".equals(user.getUsername())&&"123".equals(user.getPassword())) {
			return new User("","");
		}
		return null;
	}

}


有疑问的小伙伴,欢迎一起来探讨~

感谢观看~

你可能感兴趣的:(javaWeb,后端,web,html5,java,tomcat)