软件架构风格-BS三层架构

news/2024/6/17 20:29:29 标签: 架构, microsoft

BS三层架构概念

BS三层架构(Browser/Server three-tier architecture)是一种常见的软件架构模式,将一个应用程序分为三个主要的逻辑层:表示层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data Access Layer)。每个层有不同的职责和功能,通过清晰的分层结构提高了应用程序的可维护性、可扩展性和可测试性。

  1. 表示层(Presentation Layer):表示层是用户与系统交互的界面,负责接收用户的输入、展示数据和处理用户的操作。它通常包括用户界面、用户交互逻辑和展示数据的逻辑。表示层可以是Web页面、移动应用程序或桌面应用程序等。它与用户直接交互,并将用户的请求传递给业务逻辑层进行处理。

  2. 业务逻辑层(Business Logic Layer):业务逻辑层是应用程序的核心,负责处理业务逻辑和业务规则。它包含了应用程序的核心功能和处理逻辑。业务逻辑层接收来自表示层的请求,根据业务规则进行处理,并调用数据访问层来获取或更新数据。它独立于具体的表示层和数据访问层,可重用和测试。

  3. 数据访问层(Data Access Layer):数据访问层负责与数据存储系统(如数据库)进行交互,提供数据的读取和写入功能。它封装了与数据存储系统的交互细节,提供了对数据的访问接口供业务逻辑层使用。数据访问层可以使用SQL语句或ORM(对象关系映射)框架来操作数据库。

这种三层架构的好处是明确了各层之间的职责和关系,提高了代码的可维护性和可扩展性。表示层负责用户界面,业务逻辑层负责处理业务规则,数据访问层负责数据的读写。每个层都可以独立开发、测试和部署,降低了耦合度,方便团队合作和项目维护。

此外,BS三层架构还可以支持跨平台开发和前后端分离。前端可以使用不同的技术栈开发用户界面,后端可以使用不同的技术栈实现业务逻辑和数据访问。前后端通过API接口进行通信,实现了前后端的解耦和灵活性。

下面是详细例子

  1. 数据访问层(Data Access Layer)

数据访问层负责与数据库进行交互,提供数据的读取和写入功能。在本示例中,我们使用了Java语言和JDBC技术来实现数据访问层。

public class UserDao {
    // 数据库连接信息
    private static final String URL = "jdbc:mysql://localhost:3306/test";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "123456";

    // 获取数据库连接
    public Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USERNAME, PASSWORD);
    }

    // 查询所有用户
    public List<User> findAll() {
        List<User> userList = new ArrayList<>();
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = getConnection();
            String sql = "SELECT * FROM user";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            while (rs.next()) {
                User user = new User();
                user.setId(rs.getInt("id"));
                user.setName(rs.getString("name"));
                user.setAge(rs.getInt("age"));
                userList.add(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) rs.close();
                if (ps != null) ps.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return userList;
    }

    // 根据ID查询用户
    public User findById(int id) {
        User user = null;
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = getConnection();
            String sql = "SELECT * FROM user WHERE id=?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1, id);
            rs = ps.executeQuery();
            if (rs.next()) {
                user = new User();
                user.setId(rs.getInt("id"));
                user.setName(rs.getString("name"));
                user.setAge(rs.getInt("age"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) rs.close();
                if (ps != null) ps.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return user;
    }

    // 添加用户
    public void add(User user) {
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = getConnection();
            String sql = "INSERT INTO user(name, age) VALUES(?,?)";
            ps = conn.prepareStatement(sql);
            ps.setString(1, user.getName());
            ps.setInt(2, user.getAge());
            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (ps != null) ps.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    // 更新用户
    public void update(User user) {
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = getConnection();
            String sql = "UPDATE user SET name=?, age=? WHERE id=?";
            ps = conn.prepareStatement(sql);
            ps.setString(1, user.getName());
            ps.setInt(2, user.getAge());
            ps.setInt(3, user.getId());
            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (ps != null) ps.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    // 删除用户
    public void delete(int id) {
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = getConnection();
            String sql = "DELETE FROM user WHERE id=?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1, id);
            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (ps != null) ps.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
  1. 业务逻辑层(Business Logic Layer)

业务逻辑层负责处理业务逻辑和业务规则。在本示例中,我们使用了Java语言和Servlet技术来实现业务逻辑层。

@WebServlet("/user")
public class UserServlet extends HttpServlet {
    private UserDao userDao = new UserDao();

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String action = request.getParameter("action");
        if ("list".equals(action)) {
            list(request, response);
        } else if ("add".equals(action)) {
            add(request, response);
        } else if ("edit".equals(action)) {
            edit(request, response);
        } else if ("update".equals(action)) {
            update(request, response);
        } else if ("delete".equals(action)) {
            delete(request, response);
        } else {
            list(request, response);
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    // 显示用户列表
    private void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<User> userList = userDao.findAll();
        request.setAttribute("userList", userList);
        request.getRequestDispatcher("/user/list.jsp").forward(request, response);
    }

    // 显示添加用户页面
    private void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("/user/add.jsp").forward(request, response);
    }

    // 显示编辑用户页面
    private void edit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int id = Integer.parseInt(request.getParameter("id"));
        User user = userDao.findById(id);
        request.setAttribute("user", user);
        request.getRequestDispatcher("/user/edit.jsp").forward(request, response);
    }

    // 添加用户
    private void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        int age = Integer.parseInt(request.getParameter("age"));
        User user = new User();
        user.setName(name);
        user.setAge(age);
        userDao.add(user);
        response.sendRedirect(request.getContextPath() + "/user?action=list");
    }

    // 更新用户
    private void update(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int id = Integer.parseInt(request.getParameter("id"));
        String name = request.getParameter("name");
        int age = Integer.parseInt(request.getParameter("age"));
        User user = new User();
        user.setId(id);
        user.setName(name);
        user.setAge(age);
        userDao.update(user);
        response.sendRedirect(request.getContextPath() + "/user?action=list");
    }

    // 删除用户
    private void delete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int id = Integer.parseInt(request.getParameter("id"));
        userDao.delete(id);
        response.sendRedirect(request.getContextPath() + "/user?action=list");
    }
}
  1. 表示层(Presentation Layer)

表示层负责用户与系统交互的界面,负责接收用户的输入、展示数据和处理用户的操作。在本示例中,我们使用了JSP技术来实现表示层。

<!-- 用户列表页面 -->
<%-- user/list.jsp --%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>用户列表</title>
</head>
<body>
    <h1>用户列表</h1>
    <table border="1">
        <tr>
            <th>ID</th>
            <th>姓名</th>
            <th>年龄</th>
            <th>操作</th>
        </tr>
        <c:forEach items="${userList}" var="user">
            <tr>
                <td>${user.id}</td>
                <td>${user.name}</td>
                <td>${user.age}</td>
                <td>
                    <a href="${pageContext.request.contextPath}/user?action=edit&id=${user.id}">编辑</a>
                    <a href="${pageContext.request.contextPath}/user?action=delete&id=${user.id}">删除</a>
                </td>
            </tr>
        </c:forEach>
    </table>
    <br>
    <a href="${pageContext.request.contextPath}/user?action=add">添加用户</a>
</body>
</html>

<!-- 添加用户页面 -->
<%-- user/add.jsp --%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>添加用户</title>
</head>

BS三层架构的优缺点

BS三层架构的优点:

  1. 分层清晰:BS三层架构将系统分为表示层、业务逻辑层和数据访问层,各层职责清晰,便于开发和维护。

  2. 可扩展性强:由于各层之间松耦合,所以可以很方便地对系统进行扩展和修改,而不会影响其他层的功能。

  3. 可重用性高:由于各层之间的分离,可以将每一层的功能进行封装和抽象,提高代码的可重用性。

  4. 并发性好:由于业务逻辑层和数据访问层可以部署在不同的服务器上,所以可以提高系统的并发性能。

BS三层架构的缺点:

  1. 开发复杂:相比于传统的MVC架构,BS三层架构需要开发更多的代码和配置,增加了开发的复杂度。

  2. 性能问题:由于业务逻辑层和数据访问层分布在不同的服务器上,所以在处理一些复杂的业务逻辑时可能会存在性能问题。

  3. 系统依赖:由于各层之间存在依赖关系,所以在修改某一层的代码时,可能会影响其他层的功能,增加了系统维护的难度。

  4. 学习成本高:BS三层架构需要掌握多种技术和工具,对开发人员的技术要求较高,学习成本相对较高。


http://www.niftyadmin.cn/n/5096156.html

相关文章

NTP时间同步协议

NTP net working protocol网络时间同步协议概述 同步互联网中主机和路由器之间的时钟在局域网上提供亚毫秒精度&#xff0c;在广域网上提供几十毫秒精度冗余服务器和多种网络路径保证了可靠性工程算法用于减少抖动&#xff0c;缓解多个源和避免不正确操作的服务器 How NTP wo…

C++【命名空间详解】

系列文章目录 本篇文章呢主要说的是C中关于命名空间相关知识点哦~ 文章目录 一、C简单介绍二、详解 1.命名空间2.输入输出总结 一、C简单介绍 前面我们学习的C语言&#xff0c;它是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。那么&#xff0c;对于一些复杂的问…

申请者用Chat GPT写申请文书?国外大学纷纷采取措施

近来&#xff0c;人工智能聊天机器人ChatGPT实火。ChatGPT拥有强大的信息整合能力、自然语言处理能力&#xff0c;可谓是“上知天文&#xff0c;下知地理”&#xff0c;而且还能根据要求进行聊天、撰写文章等。 ChatGPT一经推出&#xff0c;便迅速在社交媒体上走红&#xff0c…

Py之trl:trl(一款采用强化学习训练Transformer语言模型和稳定扩散模型的全栈库)的简介、安装、使用方法之详细攻略

Py之trl&#xff1a;trl(一款采用强化学习训练Transformer语言模型和稳定扩散模型的全栈库)的简介、安装、使用方法之详细攻略 目录 trl的简介 1、亮点 2、PPO是如何工作的&#xff1a;PPO对语言模型微调三步骤&#xff0c;Rollout→Evaluation→Optimization trl的安装 t…

Mybatis <where>标签的小问题

我们都知道Mybatis的<where>标签是可以自动去掉子句第一个and或者or的&#xff0c;具体如下&#xff1a; <select id"selectSelective" resultType"com.study.entity.User">select * from t_user<where><if test"name ! null an…

Mini小主机All-in-one搭建教程4-安装Windows11系统

Mini小主机All-in-one搭建教程4-安装Windows11系统 硬件介绍 在狗东买的 极摩客M2 到手价是2799元 具体配置如下&#xff1a; 酷睿英特尔11代标压i7 11390H 64G1TB固态。 以下是 安装Windows11系统的教程。 安装Windows11系统 下载镜像包 首先下Windows系统的懒人镜像包&…

http代理有什么好处,怎么通过http代理服务安全上网呢?

通过http代理上网是一种常见的网络代理方式。http代理是指通过代理服务器进行网络连接&#xff0c;以实现隐藏自己的真实IP地址、保护个人隐私等目的。下面我们将介绍通过http代理上网的好处以及如何使用http代理服务来安全上网。 一、通过http代理上网的好处 1. 保护个人隐私 …

二维码智慧门牌管理系统:地址管理的现代革命

文章目录 前言一、标准地址的革新二、广泛的应用前景 前言 在科技不断发展和社会进步的背景下&#xff0c;高效、精准、智能的管理系统已经成为当今社会的迫切需求。传统的门牌管理系统在应对这一需求方面已显得力不从心&#xff0c;因此&#xff0c;二维码智慧门牌管理系统的…