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

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三层架构需要掌握多种技术和工具,对开发人员的技术要求较高,学习成本相对较高。

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
BS架构(Browser/Server)是一种常见的软件架构,将系统分成三层:展示层(Browser)、业务逻辑层(Server)和数据层(Database)。 展示层(Browser)是用户与系统交互的界面,通常是通过浏览器访问。它负责接收用户的请求,并将用户的输入信息发送给服务器。展示层可以是一个网页,也可以是一个移动应用程序。它负责将服务器返回的数据和信息以可视化的方式展示给用户,包括界面的布局、样式和交互等。 业务逻辑层(Server)是整个系统的核心,也是系统的处理中心。它负责处理用户的请求,进行数据的处理和计算,完成各种业务逻辑。业务逻辑层接收展示层传递过来的请求,根据请求的内容进行相应的处理,并返回给展示层相应的数据或结果。在业务逻辑层中,通常包含了各种功能模块和服务,如用户身份验证、数据加工、业务规则验证等。 数据层(Database)负责存储和管理数据,是系统的数据源。它用于存储展示层和业务逻辑层需要的各种数据,包括用户信息、业务数据、配置信息等。数据层可以是关系型数据库、非关系型数据库、或者其他数据存储技术。业务逻辑层通过与数据层的交互,完成对数据的读取、写入和更新等操作。 以上三层结构是相互独立的,各层之间通过网络进行通信和交互。展示层发送请求给业务逻辑层,业务逻辑层处理请求并返回相应的结果,然后展示层将结果展示给用户。业务逻辑层通过与数据层的交互获取需要的数据进行处理。通过分层的结构,BS架构可以实现系统的灵活性、可扩展性和可维护性,使得不同层的功能模块可以相对独立地开发和维护,提高了系统的可靠性和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一花一world

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

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

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

打赏作者

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

抵扣说明:

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

余额充值