各位看官好,好久不见。今天我们来认识一下jsp的三层架构简称-分层
目录
一、为什么要使用三层架构
面向接口编程:为了将设计和实现完全分离
A、JSP开发弊端
业务处理的代码与JSP代码混在一起,不易于阅读,不易于代码维护
B、软件设计中的分层模式
ba、分层模式
① 分层模式是最常见的一种架构模式
② 分层模式是很多架构的基础
bb、分层
① 将解决方案的组件分隔到不同的层中
② 在同一个层中组件之间保存内聚性
③ 层于层子间保存松耦合
C、三层模式
ca、层与层之间的关系
① 表示层<---->业务逻辑层<---->数据访问层
② 表示层依赖于业务逻辑层
③ 业务逻辑层依赖 于数据访问层
二、使用分层实现用户登录
A、创建实体类
public class User implements Serializable{
private static final long serialVersionUID = -5035676571644687947L;
private int uuid;
private String uname;
private String upwd;
private int urole;
public int getUuid() {
return uuid;
}
public void setUuid(int uuid) {
this.uuid = uuid;
}
//后续一些get/set方法+构造方法
B、编写数据库访问层
ba、数据访问接口
import java.util.List;
import com.zking.entity.User;
public interface IUserDao {
/**
* 用户登录
* @param uname 用户名
* @param upwd 密码
* @return 用户
*/
public User login(String uname,String upwd);
}
bb、实现接口
public class UserDao implements IUserDao{
//三兄弟
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
/**
* 登陆
* @param uname用户名
* @param upwd 密码
* @return 用户
*
*
*/
public User login(String uname,String upwd) {
User u=null;
try {
con= DBHelper.getCon();
//定义sql语句
String sql="select *from user where sname=? and spwd=?";
//获得执行对象
PreparedStatement ps=con.prepareStatement(sql);
//给占位符赋值
ps.setString(1, uname);
ps.setString(2, upwd);
//开始执行
rs=ps.executeQuery();
//判断 遍历
if(rs.next()){//说明登录成功
u=new User();
u.setUname(rs.getString(1));
u.setUpwd(rs.getString(2));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.myClose(con, ps, rs);
}
return u;
}
}
C、编写业务逻辑层
ca、编写数据库辅助类
public class DBHelper {
//两个静态常量
private static final String URL="jdbc:oracle:thin:@localhost:1521:orcl";
private static final String CNAME="oracle.jdbc.driver.OracleDriver";//记得导jar包
/**
* 加载驱动
*/
static {
try {
Class.forName(CNAME);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 创建连接
* @return 返回连接
*/
public static Connection getCon() {
Connection con=null;
try {
con=DriverManager.getConnection(URL,"scott","tiger");
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
/**
* 关闭资源
* @param con 连接
* @param ps 执行对象
* @param rs 结果集
*/
public static void myClose(Connection con,PreparedStatement ps,ResultSet rs) {
try {
//关闭资源
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(con!=null&&!con.isClosed()){
con.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
cb、编写业务逻辑层接口
public interface IUserBiz {
/**
* 用户登录
* @param uname 用户名
* @param upwd 密码
* @return 用户
*/
public User login(String uname,String upwd);
}
cc、实现业务逻辑层接口
public class UserBiz implements IUserBiz {
//实例化Dao
IUserDao iud=new UserDao();
@Override
public User login(String uname, String upwd) {
// TODO Auto-generated method stub
return iud.login(uname, upwd);
}
}
D、编写表示层
<%@page import="org.jbit.bean.*" %>
<%@page import="org.jbit.biz.*" %>
<%@page import="org.jbit.biz.impl.*" %>
<%
//设置编码方式
request.setCharacterEncoding("utf-8");
//接收表单传递过来的值
String uname=request.getParameter("user");
String upwd=request.getParameter("pwd");
//调用biz层
IUserBiz iub=new UserBiz();
User u= iub.login(uname, upwd);
if(u!=null){
//说明登录成功
//重定向
response.sendRedirect("news/admin.jsp");
}
else{
//说明登录失败
out.print("<script>alert('用户名或者密码有误');location.href='login.jsp';</script>");
}
%>
三、三层开发遵循的原则
上层依赖其下层,依赖关系不跨层
- 表示层不能直接访问数据访问层
- 上层调用下层的结果,取决于下层的实现
下一层不能调用上一层
下一层不依赖上一层
- 上层的改变不会影响下一层
- 下层的改变会影响上一层得到的结果
在上一层中不能出现下一层的概念
- 分工明确,各司其职
四、分层开发的特点
下层不知道上层的存在
- 仅完成自身的功能
- 不关心结果如何使用
每一层仅知道其下层的存在,忽略其他层的存在
- 只关心结果的取得
- 不关心结果的实现过程
- JSTL通常会与EL表达式合作实现JSP页面的编码
五、分层开发的优势
- 职责划分清晰
- 无损替换
- 复用代码
- 降低了系统内部的依赖程度
两种方式:
你们猜猜博主用的哪种?
OK,以上所有就是今日学习的所有内容了,我是小陽,欢迎个位看官能观看我的文章,如果有写的不好/不足的地方欢迎大家指出来,博主会做出改变,如对各位有所帮助,不介意各位留下免费的三连哦!
下章预告:jsp标准标签