三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。
顾名思义,三层架构分为三层,分别是“数据访问层”、“业务逻辑层”、“表示层”。
数据访问层
:数据访问层在作业过程中访问数据系统中的文件,实现对数据库中数据的读取保存操作。
表示层
:主要功能是显示数据和接受传输用户的数据,可以在为网站的系统运行提供交互式操作界面,表示层的应用方式比较常见,例如Windows窗体和Web页面。
业务逻辑层
:将用户的输入信息进行甄别处理,分别保存。建立新的数据存储方式,在存储过程中对数据进行读取,将“商业逻辑”描述代码进行包含。
三层架构软件系统为用户的数据传输、提取、储存创造了便利条件。在应用数据时,信息划分架构开发项目,对各层次之间的工作职责进行清晰规划,这样就降低了网站系统的维护风险。 [1]
与MVC设计模式的目标一致:都是为了解耦和,提高代码复用
区别:二者对项目理解的角度不同
三层组成:
表示层(USL,UserShowLayer;视图层)
–前台:对应于MVC中的View,用于和用户交互,界面的显示
jsp js html css jQuery等web等前端技术
代码位置:WebContent
–后台:对用于MVC中Controller,用于控制跳转,调用业务逻辑层
servlet (SpringMVC Struts2)
代码位置:xxx.servlet包中
业务逻辑层(BLL, BusinessLogicLayer; Service层)
–接受表示层的请求 调用
–组装数据访问层,逻辑性的操作(增删该查,删:查+删)
代码位置:xxx.service包中
数据访问层(DAL,DataAccessLayer;Dao层)
–直接访问数据库的操作,原子性的操作(不可拆分)(增删改查)
代码位置:xxx.Dao包中<
用三层解决登陆问题:
表示层前台:(login.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
if(request.getAttribute("error")!=null){
out.print("<script type='text/javascript'>alert('密码或用户名错误!');</script>");
}
%>
<form action="loginServlet" method="post">
用户名:<input type="text" name = "uname">
密码:<input type= "text" name = "upassword">
<input type = "submit" value = "登陆">
</form><br/>
<a href = "netRom.jsp">网盘</a>
<a href = "signup.jsp">注册新用户</a>
</body>
</html>
表示层后台:(loginServlet.java)
package servlet;
import java.io.IOException;
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 ServiceImpl.loginService;
import entity.admin;
@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public loginServlet() {}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String name = request.getParameter("uname");
String password = request.getParameter("upassword");
admin admin = new admin(name,password);
int result = loginService.login(admin);
if(result != -1){
request.getRequestDispatcher("getUserByPage").forward(request, response);
}else{
request.setAttribute("error", "error");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
业务逻辑层:(loginService.java)
package ServiceImpl;
import java.sql.*;
import DaoImpl.DbDaoimpl;
import entity.admin;
//使用DbDao中的函数实现登陆验证
public class loginService {
public static int login(admin admin){
try{
String sql = "SELECT id FROM admin WHERE username = ? and password = ?";
ResultSet resultSet = new DbDaoimpl().Select(sql, admin.getName(),admin.getPassword());
if(resultSet.next()){
return resultSet.getInt(1);
}
return -1;
}catch(Exception e){
e.printStackTrace();
return -1;
}
}
}
数据访问层:(DbDaoImpl.java)
public ResultSet Select(String sql,Object... args){
try{
PreparedStatement pre = prepared(sql,args);
return pre.executeQuery();
}catch(Exception e){
System.out.println("DbDao中Selete错误!");
e.printStackTrace();
return null;
}
}