各位看官好,好久不见。今天我们来认识一下jsp的三层架构简称-分层
目录
一、为什么要使用三层架构
面向接口编程:为了将设计和实现完全分离
A、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,以上所有就是今日学习的所有内容了,我是小陽,欢迎个位看官能观看我的文章,如果有写的不好/不足的地方欢迎大家指出来,博主会做出改变,如对各位有所帮助,不介意各位留下免费的三连哦!










