三层架构概述
三层架构是一种软件架构模式,它将应用程序划分为三个逻辑层:表示层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data Access Layer)。这种架构模式有助于分离关注点,使得每一层都专注于自己的职责,从而提高代码的可维护性、可扩展性和可重用性。
1. 表示层(Presentation Layer)
表示层是用户界面的部分,负责与用户进行交互,接收用户输入并显示数据。它通常不涉及业务逻辑或数据访问逻辑,而是将这些任务委托给下层的业务逻辑层和数据访问层。
代码示例(基于Servlet和JSP):
// UserServlet.java
@WebServlet("/user")
public class UserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
// 调用业务逻辑层的方法来处理用户登录
UserService userService = new UserService();
User user = userService.login(username, password);
if (user != null) {
// 登录成功,重定向到主页
request.setAttribute("user", user);
request.getRequestDispatcher("/home.jsp").forward(request, response);
} else {
// 登录失败,显示错误消息
request.setAttribute("error", "Invalid username or password");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
}
2. 业务逻辑层(Business Logic Layer)
业务逻辑层是应用程序的核心部分,负责处理业务规则和逻辑。它接收来自表示层的请求,调用数据访问层的方法来访问数据库,然后将处理结果返回给表示层。
代码示例:
// UserService.java
public class UserService {
private UserDAO userDAO = new UserDAOImpl();
public User login(String username, String password) {
// 调用数据访问层的方法来验证用户信息
return userDAO.findUserByUsernameAndPassword(username, password);
}
// 其他业务逻辑方法...
}
3. 数据访问层(Data Access Layer)
数据访问层负责与数据库进行交互,执行SQL语句并管理数据库连接。它通常包含DAO(Data Access Object)类,这些类封装了CRUD(创建、读取、更新、删除)操作的方法。
代码示例(使用JDBC):
// UserDAO.java
public interface UserDAO {
User findUserByUsernameAndPassword(String username, String password);
}
// UserDAOImpl.java
public class UserDAOImpl implements UserDAO {
private Connection connection;
public UserDAOImpl() {
// 初始化数据库连接(这里省略了具体的连接代码)
}
@Override
public User findUserByUsernameAndPassword(String username, String password) {
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
try (PreparedStatement statement = connection.prepareStatement(sql)) {
statement.setString(1, username);
statement.setString(2, password);
try (ResultSet resultSet = statement.executeQuery()) {
if (resultSet.next()) {
// 从结果集中提取用户信息并创建User对象
User user = new User();
user.setId(resultSet.getInt("id"));
user.setUsername(resultSet.getString("username"));
// ...其他字段
return user;
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return null; // 未找到用户
}
// 关闭数据库连接的方法(这里省略了具体的关闭代码)
}
注意:在实际应用中,数据库连接通常使用连接池来管理,以提高性能和可靠性。此外,密码在存储和比较时应该进行加密处理,以确保安全性。
练习题
-
描述三层架构中各层的职责,并解释为什么这种分离是有益的。
- 答案:表示层负责与用户交互,接收用户输入并显示数据;业务逻辑层处理业务规则和逻辑;数据访问层负责与数据库交互。这种分离使得代码更加模块化、易于维护和扩展,同时也提高了代码的可重用性和可测试性。
-
基于上述三层架构,编写一个Java程序来实现用户注册功能。要求包括表示层(使用Servlet和JSP)、业务逻辑层和数据访问层(使用JDBC)。
- 提示:
- 表示层:创建一个注册页面(JSP)和一个Servlet来处理表单提交。
- 业务逻辑层:创建一个
UserService
类来处理注册逻辑。 - 数据访问层:创建一个
UserDAO
接口和一个UserDAOImpl
实现类来与数据库交互。
- 提示:
-
解释DAO模式在三层架构中的作用,并给出一个具体的DAO接口和实现类的示例(不必使用完整的数据库连接代码)。
- 答案:DAO模式在三层架构中用于封装数据访问逻辑,使得业务逻辑层无需直接处理数据库连接和SQL语句等底层细节。它提供了一个统一的接口来访问数据库,从而简化了数据访问操作并提高了代码的可维护性。
- 示例(已在上文中给出,即
UserDAO
接口和UserDAOImpl
实现类)。
通过完成这些练习题,你可以更好地理解和应用Java DAO模式的三层架构。