Java_Web之分层架构

当我们把业务处理的代码与JSP代码混在一起,不易于阅读,不易于代码维护,这就需要分层。
分层模式
1、分层模式是最常见的一种架构模式
2、分层模式是很多架构模式的基础
分层
将解决方案的组件分隔到不同的层中
1、在同一个层中组件之间保持内聚性
2、层与层之间保持松耦合
三层模式的划分
1、表示层
2、业务逻辑层
3、数据库访问层
 
 
层与层之间的关系

表示层依赖于业务逻辑层,业务逻辑层依赖于数据访问层

三层开发遵循的原则
(1)上层依赖其下层,依赖关系不跨层
1、表示层不能直接访问数据访问层
2、上层调用下层的结果,取决于下层的实现
(2)下一层不能调用上一层
(3)下一层不依赖上一层
1、上层的改变不会影响下一层
2、下层的改变会影响上一层得到的结果
(4)在上一层中不能出现下一层的概念
1、分工明确,各司其职
 
分层开发的特点
(1)下层不知道上层的存在
1、仅完成自身的功能
2、不关心结果如何使用
 
(2)每一层仅知道其下层的存在,忽略其他层的存在
1、只关心结果的取得
2、不关心结果的实现过程
3、JSTL通常会与EL表达式合作实现JSP页面的编码
 
分层开发的优势
1、职责划分清晰
2、无损替换
3、复用代码
4、降低了系统内部的依赖程度
 
分层开发的案例:
package DB;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 数据库连接帮助类
 * @author Administrator
 *
 */
public class BaseDao {
    //=======数据库连接信息========
    static String url = "jdbc:oracle:thin:@localhost:1521:orcl";
    static String username = "news";
    static String password = "news";
    static String driverClassName = "oracle.jdbc.driver.OracleDriver";
    
    //获取数据库连接
    public static Connection getConnection(){
        
        Connection connection = null;
        
        try {
            //加载驱动
            Class.forName(driverClassName);
            
            //获取连接
            connection = DriverManager.getConnection(url,username,password);
            
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return connection;
    }
    
    /*
     * 释放连接
     * */
    public void close_con(Connection connection,Statement st,ResultSet rs){
        
        try {
            if(connection!= null){
                connection.close();
            }
            if(st!= null){
                st.close();
            }
            if(rs!= null){
                rs.close();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
}
package entity;

/**
 * 用户实体
 * @author Administrator
 *
 */
public class User {
    
    private String username;
    private String password;
    
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
}
package Dao;
import java.util.List;

import entity.User;

/**
 * 用户数据访问层接口
 * @author Administrator
 *
 */
public interface UserDao {
    
    /**
     * 查询用户是否存在
     * @param user
     * @return
     */
    public boolean findUser(User user);
    
    /**
     * 查询用户列表
     */
    public List<User> findUserList();

}
package Dao.Impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import DB.BaseDao;
import Dao.UserDao;
import entity.User;

/**
 * 用户数据访问层实现类
 * @author Administrator
 * 继承数据库连接类
 */
public class UserDaoImpl extends BaseDao implements UserDao {
    
    //数据库连接对象
    Connection conn = null;
    PreparedStatement stm = null;
    ResultSet rs = null;
    
    /**
     * 实现查询用户功能
     */
    public boolean findUser(User user) {
        //获得连接
        conn = this.getConnection();
        //编写sql
        String sql = "select * from news_users where uname = ? and upwd = ?";
        try {
            
            //得到预编译对象
            stm = conn.prepareStatement(sql);
            stm.setString(1, user.getUsername());
            stm.setString(2, user.getPassword());
            
            //执行sql得到结果集
            rs = stm.executeQuery();

            return rs.next();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            //释放连接
            this.close_con(conn, stm, rs);
        }
        
        return false;
    }
    
    /**
     * 查询用户列表
     */
    public List<User> findUserList() {
        //获得连接
        conn = this.getConnection();
        //编写sql
        String sql = "select * from news_users";
        
        //创建泛型集合
        List<User> userlist = new ArrayList<User>();
        try {
            
            //得到预编译对象
            stm = conn.prepareStatement(sql);
            
            //执行sql得到结果集
            rs = stm.executeQuery();
            while(rs.next()){
                User user = new User();
                user.setUsername(rs.getString(2));
                user.setPassword(rs.getString(3));
                
                userlist.add(user);
            }
            
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }finally{
            //释放连接
            this.close_con(conn, stm, rs);
        }
        
        return userlist;
    }

}
package Biz;

import java.util.List;

import entity.User;

/**
 * 用户业务逻辑层接口
 * @author Administrator
 *
 */
public interface UserBiz {
    
    /**
     * 用户登录
     * @param user
     * @return
     */
    public boolean login(User user);
    
    /**
     * 查询用户列表
     */
    public List<User> finduserList();

}
import Dao.UserDao;
import Dao.Impl.UserDaoImpl;
import entity.User;
/**
 * 用户业务逻辑实现类
 * @author Administrator
 *
 */
public class UserBizImpl implements UserBiz {
    
    //创建数据访问层对象
    UserDao userdao = new UserDaoImpl();
    
    /**
     * 实现登录
     */
    public boolean login(User user) {
        //调用数据访问层查询用户
        return userdao.findUser(user);
    }
    
    /**
     * 查询用户列表
     */
    public List<User> finduserList() {
        // TODO Auto-generated method stub
        return userdao.findUserList();
    }

}


JSP页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
  
  <body>
    <form action="dologin.jsp" method="post">
        <p>用户名:<input type="text" name="username" /></p>
        <p>密    码:<input type="password" name="password" /></p>
        <input type="submit" />
    </form>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="Biz.UserBiz"%>
<%@page import="Biz.Impl.UserBizImpl"%>
<%@page import="entity.User"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    
    //调用业务逻辑层
    UserBiz userbiz = new UserBizImpl();
    
    //获取表单项
    request.setCharacterEncoding("utf-8");
    
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    
    //创建用户实体
    User user = new User();
    user.setUsername(username);
    user.setPassword(password);
    
    //实现登录
    boolean f = userbiz.login(user);
    
    if(f){
        request.getRequestDispatcher("success.jsp").forward(request,response);
    }else{
        %>
            <script type="text/javascript">
                alert("用户名或密码错误!");
                location.href="index.jsp";
            </script>
        <%
    }
    
%>
原文地址:https://www.cnblogs.com/wlx520/p/4522950.html