【JavaWeb 篇】使用Servlet、JdbcTemplate和Durid连接池实现用户登录功能与测试

在现代Web应用程序开发中,用户登录功能是基础中的基础。它为用户提供了安全访问系统的途径。本篇博客将引导您通过使用Servlet、Spring框架的JdbcTemplate以及Durid连接池,来构建一个完整的用户登录功能。我们将详细展示每个部分的代码,并解释其作用和功能。

数据库和数据模型

首先,我们需要创建一个数据库表来存储用户信息。我们创建了一个名为user的表,用于存储用户的登录信息,每个用户有一个唯一的ID、用户名和密码。为了与数据库中的用户数据建立映射,我们创建了一个Java类User,其中包含了idusernamepassword属性。

java 复制代码
public class User {
    private int id;
    private String username;
    private String password;

    // 省略构造方法、getter和setter
}

数据库访问层

我们使用Spring框架的JdbcTemplate来处理与数据库的交互。在UserDao类中,我们封装了登录逻辑。它通过SQL语句检索用户名和密码,然后使用BeanPropertyRowMapper将数据库结果映射到User对象。

java 复制代码
public class UserDao {
    private JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());

    public User login(User loginUser) {
        try {
            String sql = "SELECT * FROM user WHERE username=? AND password=?";
            User user = jdbcTemplate.queryForObject(sql,
                    new BeanPropertyRowMapper<>(User.class),
                    loginUser.getUsername(),
                    loginUser.getPassword());

            return user;
        } catch (DataAccessException e) {
            e.printStackTrace();
            return null;
        }
    }
}

使用Durid连接池

Durid是一个强大的数据库连接池,可以提升数据库连接的性能和管理。在JDBCUtils类中,我们初始化了Durid连接池。这样,我们可以通过getDataSource方法获取连接池对象,以及通过getConnections方法获取数据库连接。

java 复制代码
public class JDBCUtils {
    private static DataSource dataSource;

    static {
        try {
            Properties properties = new Properties();
            InputStream inputStream = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
            properties.load(inputStream);

            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException | Exception e) {
            e.printStackTrace();
        }
    }
    // 省略其他方法
}

Servlet处理用户登录请求

Servlet是处理HTTP请求的核心组件。以下是一个处理用户登录请求的LoginServlet示例。在这里,我们从请求中获取用户名和密码,并调用UserDao中的login方法来验证用户身份。

java 复制代码
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");

        Map<String, String[]> map = request.getParameterMap();
        User loginUser = new User();

        try {
            BeanUtils.populate(loginUser, map);
        } catch (IllegalAccessException | InvocationTargetException e) {
            throw new RuntimeException(e);
        }

        UserDao dao = new UserDao();
        User user = dao.login(loginUser);

        if (user != null) {
            request.getSession().setAttribute("user", user);
            request.getRequestDispatcher("/successServlet").forward(request, response);
        } else {
            request.getRequestDispatcher("/failServlet").forward(request, response);
        }
    }
}

显示登录失败和成功信息

为了向用户提供友好的反馈,我们创建了FailServletSuccessServlet。在登录失败时,FailServlet将显示登录失败的消息。在登录成功时,SuccessServlet将显示欢迎消息,并向用户展示其用户名。

java 复制代码
@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
    // ... (之前的代码)
}

@WebServlet("/successServlet")
public class SuccessServlet extends HttpServlet {
    // ... (之前的代码)
}

编写测试用例

为了确保代码的正确性,我们编写了测试用例。UserDaoTest类测试了UserDao中的登录功能。BeanUtilsTest类测试了BeanUtils库的功能。通过JUnit进行单元测试,我们可以验证代码的正确性和预期行为。

java 复制代码
public class UserDaoTest {

    @Test
    public void testLogin() {
        User loginuser = new User();
        loginuser.setUsername("Brenda Butler");
        loginuser.setPassword("Z3CSAFZDp7");

        UserDao dao = new UserDao();
        User user = dao.login(loginuser);

        System.out.println(user);
    }
}

public class BeanUtilsTest {

    @Test
    public void test() {
        User user = new User();
        try {
            BeanUtils.setProperty(user, "username", "Ishida Rin");
        } catch (IllegalAccessException | InvocationTargetException e) {
            throw new RuntimeException(e);
        }

        System.out.println(user);
    }
}

创建用户登录页面

最后,我们创建了一个用户登录页面,让用户输入用户名和密码。通过表单提交数据,我们可以将用户的登录请求发送到LoginServlet来进行验证。

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>User Login</title>
</head>
<body>
    <h2>User Login</h2>
    <form action="loginServlet" method="post">
        用户名:<input type="text" name="username"> <br>
        密码:<input type="password" name="password"> <br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

总结与展望

通过本篇博客,我们深入地探讨了使用Servlet、JdbcTemplate和Durid连接池来实现用户登录功能。我们从数据库建模、数据访问层、Servlet处理、前端页面创建、编写测试用例等多个方面详细介绍了实现过程。通过这个实例,您已经具备了构建更复杂Web应用的基础知识。

当然,实际项目中的登录功能可能需要考虑更多的安全性、验证、错误处理等。此外,我们还可以进一步优化代码、提高用户体验、加入验证码等功能。希望您能将这个示例作为一个起点,不断探索和学习,将知识应用到实际开发中。

通过这篇博客,您学会了如何使用Servlet、JdbcTemplate和Durid连接池来实现一个完整的用户登录功能,并通过测试用例验证代码的正确性。如果您还有疑问或需要进一步的帮助,欢迎随时提问。祝您在Web应用开发中取得成功!

相关推荐
NE_STOP2 分钟前
SpringBoot--简单入门
java·spring
hqxstudying29 分钟前
Java创建型模式---原型模式
java·开发语言·设计模式·代码规范
Dcs1 小时前
VSCode等多款主流 IDE 爆出安全漏洞!插件“伪装认证”可执行恶意命令!
java
保持学习ing1 小时前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
京东云开发者1 小时前
Java的SPI机制详解
java
超级小忍1 小时前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
发仔1231 小时前
Oracle与MySQL核心差异对比
mysql·oracle
程序无bug2 小时前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
小莫分享2 小时前
Java Lombok 入门
java
程序无bug2 小时前
Spring 对于事务上的应用的详细说明
java·后端