三层与MVC

这几天在学习三层,有了自己的一点收获与理解,来分享给大家

三层的简单介绍以及和MVC的比较

1.三层的结构

[外链图片转存失败(img-GYhKLlne-1564026058819)(C:\Users\lenovo\Desktop\Image.png)]
1.1 表示层(UI):前台:用于和用户交互,界面的显示                         
后台:用于控制跳转,以及调用业务逻辑层 
1.2 业务逻辑层(BLL):接收表示层的请求,调用; 
组装数据访问层,逻辑性的操作     
1.2.1 BLL的职责机制:
UI ==> BLL ==> UI(UI提出请求,给BLL,BLL可以直接处理这件事,就自己处理了然后把结果传给UI)     
UI = => BLL = = > DAL = = > BLL= = >UI(UI提出请求,收集一定的数据,传给BLL,BLL把请求转给DAL,DAL经过数据源访问/加工有转给BLL,BLL得到指令后把结果转给UI)   
1.3 数据访问层(DAL):直接访问数据库的操作,原子性的操作(增删改查)

2.UI,BLL及DAL的关系

U层依赖B层,B层依赖D层,但是三者功能的实现又是界限分明,DAL只提供基本的数据访问,不包含任何业务相关的逻辑处理;UI只负责显示和采集用户操作,不包含任何的业务相关的逻辑处理; BLL负责处理业务逻辑,通过获取UI传来的操作指令,决定执行业务逻辑,在需要访问数据源的时候直接交给DAL处理,处理完成后,返回必要数据给UI。

3.与MVC的异同

3.1MVC的结构

[外链图片转存失败(img-a0UEhgir-1564026058842)(C:\Users\lenovo\Desktop\Image [2].png)]

view(视图):提供用户交互界面,直接面向用户,可以直接理解为界面,它是提供给用户操作的用户端,是程序的外壳,负责处理图形化操作界面,仅限于视图上的数据采集和处理用户请求。

Model(模型):是核心的“数据层”,表示为业务数据和业务逻辑,是程序需要操作的数据和信息,负责封装和事务逻辑相关资料,以及处理方法,属于业务流程处理。

Controller(控制):负责根据用户从视图层输入的指令,选取数据层中的数据,控制应用程式流程,然后对其进行相应的操作,产生最终的结果,回应资料模型变化,简单来说就是负责选择什么样的模型,选择什么样的视图,来完成什么样的用户请求。

最典型的MVC就是JSP+Servlet+javabean的模式

3.2三层是三层,MVC是MVC

[外链图片转存失败(img-zaRs0Na5-1564026058851)(C:\Users\lenovo\Desktop\Image [3].png)] MVC将三层架构中的UI分成了控制层和视图层。将三层架构中的数据访问层和业务逻辑层整合成了模型层。

3.3三层是从整个应用程序架构的角度来分的三层(如果程序需要,还可以分多层)。区分层次的目的是为了“高内聚,低耦合”的思想虽然三层架构将系统在逻辑上分成了三层,但是它并不是物理上的分层。也就是说,对不同层的代码而言,经历编译、打包、部署后,所有的代码最终还是运行在同一个进程中。

3.4 MVC是一种设计模式,一种思想,是存在于应用程序(B/S结构:又称之浏览器/服务器)的视图层划分出来的不同功能的几个模块。MVC主要是为了解决应用程序用户界面的样式替换问题,把展示数据的 HTML 页面尽可能的和业务代码分离。MVC把界面展示逻辑(用户界面)独立到一些文件中(Views),把一些和用户交互的程序逻辑(Controller)单独放在一些文件中,在 Views 和 Controller 中传递数据使用一些专门封装数据的实体对象,这些对象,统称为Models。

3.5 三层可以应用于任何语言、任何技术的应用程序;而MVC只是为了解决BS应用程序视图层各部分的耦合关系。它们互不冲突,可以同时存在,也可根据情况使用其中一种。

3.6 三层架构和MVC设计模式侧重点不一样,三层是一种笼统的架构思想,没有限制具体的设计;而MVC就比较具体的说明它的设计方法。我们从接手一个项目开始,首先,我们需要进行架构设计,一般我们采用的就是分层式的架构设计,即我们的三层架构。然后,在确定了架构以后,我们再根据项目的具体需求去考虑是否需要应用一些设计模式,比如是否应用我们的MVC模式,抽象工厂模式等等。

3.7 三层侧重的是整体的一个解耦,而MVC侧重的是web系统的解耦,即侧重jsp和Servlet的一个解耦。

经过上面的分析,我们很清楚的理解了三层与MVC的不同之处

下面我们来举一个简单的三层,我们以学生信息管理系统为例:

表示层:

前台:增加学生

学生信息管理 学号:
姓名:
年龄:
地址:


'

后台:Servlet

`

package org.Servlet;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.Service.StudentService;

import org.Student.Student;

@WebServlet("/AddServlet")

public class AddServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;    
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	int sno = Integer.parseInt(request.getParameter("sno"));
	String name = request.getParameter("name");
	int age = Integer.parseInt(request.getParameter("age"));
	String address = request.getParameter("address");
	Student student = new Student(sno,name,age,address);
	
	StudentService studentService = new StudentService();    //调用逻辑业务层
	boolean result = studentService.addStudent(student);
	PrintWriter out = response.getWriter();
	if(result){
		out.println("添加成功");
	}else{
		out.println("添加失败");
	}
	
}

}`

实体类:Student

`

public class Student {
    private int sno;
    private String name;
    private int age ;
    private String address;
   
public Student(){} 
public Student(int sno, String name, int age, String address) {
	super();
	this.sno = sno;
	this.name = name;
	this.age = age;
	this.address = address;
}
public int getSno() {
	return sno;
}
public void setSno(int sno) {
	this.sno = sno;
}
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public int getAge() {
	return age;
}
public void setAge(int age) {
	this.age = age;
}
public String getAddress() {
	return address;
}
public void setAddress(String address) {
	this.address = address;
}

}`

业务逻辑层

`public class StudentService {

​ Student student = new Student();
public boolean addStudent(){
if(!StudentDao.isExist(student.getSno())){ //调用数据访问层
StudentDao.addStudent(student);
return true;
}else
return false;
}
}

`

数据访问层(DAO):

package org.Dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.resource.cci.ResultSet;

import org.Student.Student;

public class StudentDao {
	private final static String URL = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";
	private final static String USERNAME = "jiajiachong";
	private final static String PASSWORD = "lalala";
	
	public static boolean isExist(int sno){                        //查询是否存在
		if(search(sno)!=null){
			return true;
		}
		return false;
	}
    
	public static boolean addStudent(Student student){             //增加学生
		Connection connection = null;
		PreparedStatement pstmt = null;
		try{
			Class.forName("oracle.jdbc.OracleDriver");          //调用数据库
			connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
			String sql = "inesrt into student values(?,?,?,?)";
			pstmt = connection.prepareStatement(sql);
		    pstmt.setInt(1, student.getSno());
		    pstmt.setString(2, student.getName());
		    pstmt.setInt(3, student.getAge());
		    pstmt.setString(4, student.getAddress());
		    int count = pstmt.executeUpdate();
		    if(count>0){
		    	return true;
		    }else{
		    	return false;
		    }
		}catch (ClassNotFoundException e) {
			e.printStackTrace();
			return false;
		} catch(SQLException e){
			e.printStackTrace();
			return false;
		} catch(Exception e){
			e.printStackTrace();
			return false;
		}
	}
	
     public static Student search(int sno){                            //查询学生
    	    Student student = new Student();
    		Connection connection = null;
    		PreparedStatement pstmt = null;
    		ResultSet rs = null; 
    	 try {
			Class.forName("oracle.jdbc.OracleDriver");                 //调用数据库
			connection = DriverManager.getConnection(URL,USERNAME,PASSWORD);
			String sql = "search student where sno=?";
			pstmt = connection.prepareStatement(sql);
			pstmt.setInt(1, sno);
			rs = (ResultSet) pstmt.executeQuery();
			if(rs.next()){
				student.setSno(rs.getInt("sno"));
				student.setName(rs.getString("name"));
				student.setAge(rs.getInt("age"));
				student.setAddress(rs.getString("address"));
			}
			return student;
		} catch (ClassNotFoundException e) {                              //异常处理
			e.printStackTrace();
			return null;
		} catch(SQLException e){
			e.printStackTrace();
			return null;
		} catch(Exception e){
			e.printStackTrace();
			return null;
		}
    	 finally{
    		 try{
    			 if(rs!=null){
    				 rs.close();
    			 }
    			 if(pstmt!=null){
    				 pstmt.close();
    			 }
    			 if(connection!=null){
    				 connection.close();
    			 }
    		 }catch(SQLException e){
    			 e.printStackTrace();
    		 }
    	 }
     }
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值