为什么要分层
(JSP开发的弊端 ) 业务处理的代码与JSP代码混在一起,不易于阅读,不易于代码维护。
分层模式
- 是最常见的一种架构模式 。
- 是很多架构模式的基础。
分层
将解决方案的组件分隔到不同的层中 ,在同一个层中组件之间保持内聚性,层与层之间保持松耦合
三层模式的划分
- 表现层
- 业务逻辑层
- 数据库访问层
层与层之间的关系
- 表现层依赖于业务逻辑层
- 业务逻辑层依赖于数据访问层
三层开发遵循的原则
- 上层依赖其下层,依赖关系不跨层
- 下一层不能调用上一层
- 下一层不依赖上一层
- 在上一层中不能出现下一层的概念
分层开发的特点
- 下层不知道上层的存在(也就是仅仅只完成自己的功能功能,不会去关心结果的使用)
- 每一层仅知道其下层的存在,忽略其他层的存在(只关心结果不关心过程,JSTL通常会与EL表达式合作实现JSP页面的编码
)
分层开发的优势
- 职责划分清晰
- 无损替换
- 复用代码
- 降低了系统内部的依赖程度
栗子:分层实现用户登录
- 创建用户实体类
package com.zking.entity;
public class Users {
private String uuid;
private String uname;
private String upwd;
private String usex;
private int uage;
private String uhonney;
private String uaddress;
private String upower;
private String ucomment;
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
public String getUsex() {
return usex;
}
public void setUsex(String usex) {
this.usex = usex;
}
public int getUage() {
return uage;
}
public void setUage(int uage) {
this.uage = uage;
}
public String getUhonney() {
return uhonney;
}
public void setUhonney(String uhonney) {
this.uhonney = uhonney;
}
public String getUaddress() {
return uaddress;
}
public void setUaddress(String uaddress) {
this.uaddress = uaddress;
}
public String getUpower() {
return upower;
}
public void setUpower(String upower) {
this.upower = upower;
}
public String getUcomment() {
return ucomment;
}
public void setUcomment(String ucomment) {
this.ucomment = ucomment;
}
@Override
public String toString() {
return "Users [uuid=" + uuid + ", uname=" + uname + ", upwd=" + upwd + ", usex=" + usex + ", uage=" + uage
+ ", uhonney=" + uhonney + ", uaddress=" + uaddress + ", upower=" + upower + ", ucomment=" + ucomment
+ "]";
}
public Users() {
// TODO Auto-generated constructor stub
}
/**
* @param uuid
* @param uname
* @param upwd
* @param usex
* @param uage
* @param uhonney
* @param uaddress
* @param prower
* @param ucomment
*/
public Users(String uuid, String uname, String upwd, String usex, int uage, String uhonney, String uaddress,
String upower, String ucomment) {
super();
this.uuid = uuid;
this.uname = uname;
this.upwd = upwd;
this.usex = usex;
this.uage = uage;
this.uhonney = uhonney;
this.uaddress = uaddress;
this.upower = upower;
this.ucomment = ucomment;
}
public Users( String uname, String upwd, String usex, int uage, String uhonney, String uaddress,
String upower, String ucomment) {
super();
this.uname = uname;
this.upwd = upwd;
this.usex = usex;
this.uage = uage;
this.uhonney = uhonney;
this.uaddress = uaddress;
this.upower = upower;
this.ucomment = ucomment;
}
public Users( String uname, String upwd) {
super();
this.uname = uname;
this.upwd = upwd;
}
}
- 编写数据访问层
- 数据访问接口
//数据访问接口
package com.zking.dao;
import java.util.List;
import com.zking.entity.Users;
public interface IUsersDao {
/**
* 登录方法
* @param users
* @return
*/
int login(Users users);
int insert(Users users);
int update(Users users);
List<Users> query(Users users);
}
- 数据访问接口的实现
// 数据访问接口的实现
package com.zking.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
import com.zking.dao.IUsersDao;
import com.zking.entity.Users;
import com.zking.util.DBhelper;
public class UsersDao implements IUsersDao{
private PreparedStatement ps;
private List<Users> listusers;
private Connection con;
private ResultSet rs;
private boolean flag;
private String sql;
private Users users;
private int upower;
private int n;
@Override
public int login(Users users) {
try {
con = DBhelper.getCon();
sql = "select upower from tb_users where uname=? and upwd=?";
ps = con.prepareStatement(sql);
ps.setString(1, users.getUname());
ps.setString(2,users.getUpwd() );
rs = ps.executeQuery();
if(rs.next()) {
upower = rs.getInt(1);
}
DBhelper.closeObj(con, ps, rs);
} catch (Exception e) {
e.printStackTrace();
}
return upower;
}
@Override
public int insert(Users users) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int update(Users users) {
// TODO Auto-generated method stub
return 0;
}
@Override
public List<Users> query(Users users) {
// TODO Auto-generated method stub
return null;
}
}
- 编写业务逻辑层
- 编写业务逻辑控制接口IUserBiz
//编写业务逻辑控制接口IUserBiz
package com.zking.biz;
import java.util.List;
import com.zking.entity.Users;
public interface IUsersBiz {
int login(Users users);
int insert(Users users);
int update(Users users);
List<Users> query(Users users);
}
- 业务逻辑层接口实现
// 业务逻辑层接口实现
package com.zking.biz.impl;
import java.util.List;
import com.zking.biz.IUsersBiz;
import com.zking.dao.IUsersDao;
import com.zking.dao.impl.UsersDao;
import com.zking.entity.Users;
public class UsersBiz implements IUsersBiz{
// 在业务逻辑层biz里面调用数据访问层
IUsersDao iud = new UsersDao();// 里氏替换原则
@Override
public int login(Users users) {
return iud.login(users);
}
@Override
public int insert(Users users) {
return insert(users);
}
@Override
public int update(Users users) {
return update(users);
}
@Override
public List<Users> query(Users users) {
return query(users);
}
}
- 编写表示层
编写登录jps界面
// 编写登录jps界面
<%@ 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>
<form>
账号:<input type="text" name="uname" /><br/>
密码:<input type="password" name="upwd" /><br/>
<button>登录</button>
</form>
</body>
</html>
- jsp界面调用业务逻辑层
// jsp界面调用业务逻辑层
<%@page import="com.zking.entity.Users"%>
<%@page import="com.zking.biz.impl.UsersBiz"%>
<%@page import="com.zking.biz.IUsersBiz"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
String uname = request.getParameter("uname");
String upwd = request.getParameter("upwd");
Users users = new Users();
users.setUname(uname);
users.setUpwd(upwd);
// 调用业务逻辑层登录方法
IUsersBiz iub = new UsersBiz();
int n = iub.login(users);
%>