JavaWeb之三层架构

各位看官好,好久不见。今天我们来认识一下jsp的三层架构简称-分层

目录

一、为什么要使用三层架构

A、JSP开发弊端

B、软件设计中的分层模式

ba、分层模式

bb、分层

C、三层模式

ca、层与层之间的关系

二、使用分层实现用户登录

A、创建实体类

B、编写数据库访问层

ba、数据访问接口

bb、实现接口

C、编写业务逻辑层

ca、编写数据库辅助类

cb、编写业务逻辑层接口

cc、实现业务逻辑层接口

D、编写表示层

   三、三层开发遵循的原则

四、分层开发的特点

五、分层开发的优势


一、为什么要使用三层架构


面向接口编程:为了将设计和实现完全分离

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标准标签

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

歐陽。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值