一.Why?为什么要分层?
1.jsp开发的弊端。
1)业务处理的代码与JSP代码混在一起,不易于阅读,不易于代码维护。
eg:在JSP页面中连接数据库
<form method="post" action="doLogin.jsp">
<table>
<tr>
<td>用户名称:<input type="text" name="user"/></td>
</tr>
…
<%
String uname=request.getParameter("user");
String upwd=request.getParameter("pwd");
String driverClassName ="oracle.jdbc.driver.OracleDriver";
String url ="jdbc:oracle:thin:@10.0.0.34:1521:PRD34";
…
二.软件设计中的分层模式
1.分层模式
1)分层模式是最常见的一种架构模式.
2)分层模式是很多架构模式的基础.
2.分层
1)将解决方案的组件分隔到不同的层中.
2)在同一个层中组件之间保存内聚性.
3)层于层子间保存松耦合.
三. 三层架构
1.What?什么是三层?
1)表示层(UI):只要是指与用户交互的界面,用于接收用户输入的数据和显示处理后用户需要的数据
2)业务逻辑层(BLL):表示层和数据访问层之间的桥梁,实现业务逻辑,具体包含:验证,计算,业务 规则等等
3)数据访问层(DAL):与数据库打交道,只要实现对数据的增,删,改,查
2.How?怎样理解三层?
1)通俗来讲,就是我们所知的代码可能存在多个包eg:utli包、ui包、dao包,而我们在ui包是直接调用dao包里面的方法,这样是不妥当的,我们需要在中间加一个包实现隔离的效果。
2)ui直接调用dao不妥当,我们需要分层,加一个Biz包,我们需要ui调用Biz,Biz调用dao来实现我们的各个功能!
3)那我们通常将ui包称为表示层、Biz包称为业务逻辑层、dao包称为数据库访问层。
3.补充: (实体层)
1)其实有一个层贯穿了所有的层,那就是业务实体层(Entity )
2)三层架构效果图如下:
四.分层实现用户登录
1. 实现方式:
1)在开发时建立以下几个包:
2)各种类型包的含义:
* biz:存放业务逻辑层接口
* biz.imp:存放业务逻辑层的实现类
* dao:存放数据访问层的接口
* dao.imp:存放数据访问层的实体类
* entity:存放实体类
* util:存放帮助类,如DBHelper
3)dao(数据库访问层用户接口&实现类代码):
package com.zking.dao;
import com.zking.entity.Users;
/**
* 用户的接口(声明方法)
* 用户的数据访问层接口
* @author zjjt
*/
public interface IUserDao {
/**
* 用户登录方法
* @param uname 用户名
* @param upwd 用户密码
* @return 登录成功返回用户对象,否返回null
*/
public Users login(String uname,String upwd);
/**
* 用户的实现类
* 用户的数据访问层实现类
* @author zjjt
*
*/
public class Imp_UserDao implements IUserDao{
public Users login(String uname,String upwd) {
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
Users users=null;
try {
con=DBHelper.getCon();
ps=con.prepareStatement("select*from T277 where uname=? and upwd=?");
ps.setString(1, uname);
ps.setString(2, upwd);
rs=ps.executeQuery();
if(rs.next()) {
users=new Users(rs.getInt(1),uname,upwd,rs.getString(4));
}
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
}finally {
DBHelper.closeDb(con, ps, rs);
}
return null;
}
public int register(Users users) {
return 0;
}
}
4) Biz(业务逻辑层用户接口&实现类代码):
package com.zking.biz;
import com.zking.entity.Users;
/**
* 用户的业务逻辑接口
* @author zjjt
*
*/
public interface IUserBiz {
/**
* 用户登录方法
* @param uname 用户名
* @param upwd 用户密码
* @return 登录成功返回用户对象,否返回null
*/
public Users login(String uname,String upwd);
}
/**
* 用户的业务逻辑层实现类
* @author zjjt
*
*/
public class Imp_UserBiz implements IUserBiz{
//多态
IUserDao iud=new Imp_UserDao();
public Users login(String uname, String upwd) {
// TODO Auto-generated method stub
return iud.login(uname, upwd);
}
5)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>");
}
厌倦一切盛大的开场,我总隐约觉得,故事的开头不应该如此隆重,导致所有的后来都在往下走。