Hilo Everybody wellcome to my channel!
今天Lion带大家来学习JAVAWeb的三层构架(JAVAWeb05)
前言:实在抱歉很多天没有更新了,是因为Lion最近在写一个新闻发布系统的小项目,没抽出空来,在明天Lion也会将这个项目发出来供大家参考学习!(求放过!!!)
一、为什么需要用到分层?
由于业务处理的代码与jsp代码混在一起,不易于阅读,不易代码维护,所以我们需要分层,以便我们进行编码工作,而且我们后续会讲jsp页面变成一个没有业务处理代码时我们就可以了!
二、分层的原理?
值得一提的是,分层模式是最常见的一种架构模式,同时是很多架构模式的基础所以我们很有必要掌握!!!
其实什么是分层呢?
通俗来讲就是我们所知的代码可能存在多个包eg:utli包、ui包、dao包,而我们在ui包直接调用一些方法是直接调用的fao包里面的方法,其实这样是不妥当的,我们需要在中间加一个包来实现隔离的效果。
假设ui包是A,dao包是C,我们以前是直接A调用C这样不妥当,我们需要分层,加一个Biz包假设为B,我们需要A调用B,B调用C来实现我们的各个功能!
那我们通常将ui包称为表示层、Biz包称为业务逻辑层、dao包称为数据库访问层。
他们的关系如下图:
层与层之间有严格的依赖关系不能跃层!
三、怎么分层?
eg:以一个登录界面为案例实现分层效果:
dao(数据库访问层):一个接口一个类
//接口类
public interface IUserDao {
/**
* 实现用户登录
* @param name 用户名
* @param upwd 密码
* @return 用户
*/
public User login(String name,String upwd);
}
/**
* 数据库访问层
* @author Administrator
*
*/
public class UserDao implements IUserDao{
private Connection con=null;
private PreparedStatement ps=null;
private ResultSet rs=null;
@Override
public User login(String name, String upwd) {
User u=null;
try {
con=DBHelper.getCon();//获得连接
String sql="select * from tb_0325 where sname=? and spwd=?";//定义sql语句
ps=con.prepareStatement(sql);//获得执行对象
//给占位符赋值
ps.setString(1, name);
ps.setString(2, upwd);
rs=ps.executeQuery();//获得结果集
//判断
if(rs.next()) {
u=new User();//实例化
u.setUuid(rs.getInt(1));
u.setUname(rs.getString(2));
u.setUpwd(rs.getString(3));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.myClose(con, ps, rs);
}
return u;
}
Biz(业务逻辑层):一个包一个类
在这里是按照个人习惯将类放在了biz包的下一级中的impl包中
//接口类
public interface IUserDao {
/**
* 实现用户登录
* @param name 用户名
* @param upwd 密码
* @return 用户
*/
public User login(String name,String upwd);
}
/**
* 业务逻辑层 B
* @author Administrator
*
*/
public class UserBiz implements IUserBiz {
//业务逻辑层 调用 数据库访问层c
IUserDao iud=new UserDao();//里氏替换原则
@Override
public User login(String name, String upwd) {
// TODO Auto-generated method stub
return iud.login(name, upwd);
}
}
ui(表示层):
这里就是调用Biz业务逻辑层的login方法,而不是直接调用Dao数据库访问层的login方法了:
//表示层a 调用 业务逻辑层b
IUserBiz iud=new UserBiz();
//调用登录方法
User u=iud.login(name, pwd);
//判断
if(u!=null){
//登录成功
out.print("登录成功");
}
else{
//说明登录失败
out.print("<script>alert('用户名或者密码错误');location.href='login.jsp';</script>");
}