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>
        <%
    }
    
%>

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM