这几天在学习三层,有了自己的一点收获与理解,来分享给大家
三层的简单介绍以及和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();
}
}
}
}
}