三层架构
- 为什么需要分层
- 软件设计中的分层模式
- 三层模式
- 分层的实现
- 创建用户实体类
- 编写用户实体类
- 编写数据访问层
- 编写数据访问接口
- 编写数据访问接口的实现
- 编写业务逻辑层
- 编写业务逻辑接口
- 编写业务逻辑接口的实现
- 编写表示层
- JSP页面调用业务逻辑层
为什么需要分层
JSP开发具有弊端,业务的代码与JSP代码混在一起,不易阅读,不易于代码的维护
在企业进行Web项目的开发时,主要会考虑到以下几点:
- 系统的耦合性(紧密度):企业比较注重
- 系统每个部分的联系程度
- 一般耦合性越低越好
- 系统的拓展性
- 代码的可读性:对程序员比较重要
- 业务的拓展性
为了降低耦合性(解耦),我们大多选择使用三层架构
软件设计中的分层模式
分层模式
- 分层模式是最常见的一种架构模式
- 分层模式是很多架构模式的基础
分层
- 将解决方案的组件分隔到不同的层中
- 在同一层中组件之间保持内聚性
- 层与层之间保持松耦合
三层模式
三层模式的划分
- 表示层
- 业务逻辑层
- 数据库访问层
除了这三层外,还有一层是:实体层
三层模式的关系
三层开发遵循的原则
- 上层依赖其下层,依赖关系不跨层
- 表示层不能直接访问数据访问层
- 上层调用下层的结果,取决于下层的实现
- 下层不能调用上一层
- 下一层不能依赖上一层
- 上层的改变不会影响下一层
- 下层的改变会影响上一层获得的结果
- 在上一层中不能出现下一层概念
- 分工明确,各司其职
分层开发的特点
- 下层不知道上层的存在
- 仅完成自身的功能
- 不关心结果如何使用
- 每一层仅知道其下层的存在,忽略其他层的存在
- 只关心结果的取得
- 不关心结果的实现过程
- JSTL通常会与EL表达式合作实现JSP页面的编码
分层开发的优势
- 职责划分清晰
- 无损替换
- 复用代码
- 降低了系统内部的依赖程度
分层的实现
创建用户实体类
编写用户实体类
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
//省略了后续的set/get方法
}
编写数据访问层
编写数据访问接口
public interface UserDao {
//根据用户进行查找,返回用户列表
public boolean findUser(User user);
}
编写数据访问接口的实现
public class UserDaoJdbcImpl implements UserDao{
public boolean findUser(User user){
Connection con = null;
PreparedStatement pStatement = null;
ResultSet res = null;
/** 调用创建数据库连接的方法 获得连接,实现用户名和密码查询*/
}
编写业务逻辑层
编写业务逻辑接口
//编写业务逻辑控制接口UserBiz
public interface UserBiz {
public boolean login(User user);
}
编写业务逻辑接口的实现
public class UserBizImpl implements UserBiz{
public List login(User user){
UserDao ud = new UserDaoJdbcImpl();
boolean flag = ud.findUser(user);
return flag;
}
}
编写表示层
JSP页面调用业务逻辑层
<%@page import="org.jbit.bean.*" %>
<%@page import="org.jbit.biz.*" %>
<%@page import="org.jbit.biz.impl.*" %>
<%
String uname=request.getParameter("user");
String upwd=request.getParameter("pwd");
User user = new User();
user.setUsername(uname);
user.setPassword(upwd);
UserBiz ub = new UserBizImpl();
boolean flag = ub.login(user);
if(flag)
response.sendRedirect("welcome.jsp");
else
response.sendRedirect("login.jsp");
%>