当前位置: 首页 > news >正文

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

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

数据库和数据模型

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

public class User {private int id;private String username;private String password;// 省略构造方法、getter和setter
}

数据库访问层

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

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方法获取数据库连接。

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方法来验证用户身份。

@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将显示欢迎消息,并向用户展示其用户名。

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

编写测试用例

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

public class UserDaoTest {@Testpublic 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 {@Testpublic 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来进行验证。

<!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应用开发中取得成功!

相关文章:

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

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

【Unity3D赛车游戏】【六】如何在Unity中为汽车添加发动机和手动挡变速?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…...

【Go 基础篇】切片:Go语言中的灵活数据结构

在Go语言中&#xff0c;切片&#xff08;Slice&#xff09;是一种强大且灵活的数据结构&#xff0c;用于管理和操作一系列元素。与数组相比&#xff0c;切片的大小可以动态调整&#xff0c;这使得它成为处理动态数据集合的理想选择。本文将围绕Go语言中切片的引入&#xff0c;介…...

龙芯2K1000LA移植交叉编译环境以及QT

嵌入式大赛结束了&#xff0c;根据这次比赛中记的凌乱的笔记&#xff0c;整理了一份龙芯2K1000LA的环境搭建过程&#xff0c;可能笔记缺少了一部分步骤或者错误&#xff0c;但是大致步骤可以当作参考。 一、交叉编译工具链 下载连接&#xff1a;龙芯 GNU 编译工具链 | 龙芯开…...

javaee spring依赖注入之spel方式

spring依赖注入之spel方式 <dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>4.3.18.RELEASE</version></dependency>package com.test.pojo;import java.util.List; …...

【Java集合学习1】ArrayList集合学习及集合概述分析

JavaArrayList集合学习及集合学习概述 一、Java集合概述 Java 集合&#xff0c; 也叫作容器&#xff0c;主要是由两大接口派生而来&#xff1a;一个是 Collection接口&#xff0c;主要用于存放单一元素&#xff1b;另一个是 Map 接口&#xff0c;主要用于存放键值对。对于Col…...

TouchGFX之调试

DebugPrinter类是一种在显示屏上打印调试消息的简单方法&#xff0c;无需向屏幕添加控件。 在使用DebugPrinter之前&#xff0c;需要分配一个实例并将其传递给Application类&#xff0c;且DebugPrinter实例必须兼容所使用的LCD类。 该表列出了DebugPrinter类名称&#xff1a; …...

C# winform加载yolov8模型测试(附例程)

第一步&#xff1a;在NuGet中下载Yolov8.Net 第二步&#xff1a;引用 using Yolov8Net; 第三步&#xff1a;加载模型 private IPredictor yolov8 YoloV8Predictor.Create("D:\\0MyWork\\Learn\\vs2022\\yolov_onnx\\best.onnx", mylabel); 第四步&#xff1a;图…...

浙大陈越何钦铭数据结构07-图6 旅游规划

题目: 有了一张自驾旅游路线图&#xff0c;你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序&#xff0c;帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的&#xff0c;那么需要输出最便宜的一条路径。 输入…...

VUE笔记(七)项目登录

1、安装elementui 在终端执行 vue add element 注册组件 如果要使用哪个组件&#xff0c;大家需要在plugins/element.js中注册该组件 import Vue from vue import { Button } from element-ui Vue.use(Button) 在页面组件中使用 <el-button type"primary"&…...

大语言模型之六- LLM之企业私有化部署

数据安全是每个公司不得不慎重对待的&#xff0c;为了提高生产力&#xff0c;降本增效又不得不接受新技术带来的工具&#xff0c;私有化部署对于公司还是非常有吸引力的。大语言模型这一工具结合公司的数据可以大大提高公司生产率。 私有化LLM需要处理的问题 企业内私有化LLM…...

Python3 列表

Python3 列表 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;依此类推。 Python 有 6 个序列的内置类型&#xff0c;但最常见的是列表和元组。 列表都可以进…...

OpenCV基础知识(8)— 图形检测

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。图形检测是计算机视觉的一项重要功能。通过图形检测可以分析图像中可能存在的形状&#xff0c;然后对这些形状进行描绘&#xff0c;例如搜索并绘制图像的边缘&#xff0c;定位图像的位置&#xff0c;判断图像中有没有直线、…...

Java虚拟机

文章目录 JVM运行时数据区域HotSpot虚拟机对象探秘实战&#xff1a;OutOfMemoryError异常 JVM 运行时数据区域 HotSpot虚拟机对象探秘 实战&#xff1a;OutOfMemoryError异常...

c++学习 之 函数重载注意事项

文章目录 引用作为函数重载的条件函数重载遇到默认参数 引用作为函数重载的条件 #include <iostream> using namespace std; void fun(int &a) {cout << "void fun(int & a)" << endl; }void fun(const int &a) {cout << "…...

2023-08-27 LeetCode每日一题(合并区间)

2023-08-27每日一题 一、题目编号 56. 合并区间二、题目链接 点击跳转到题目位置 三、题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#…...

C#,数值计算——调适数值积分法(adaptive quadrature)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 调适数值积分法 /// adaptive quadrature /// </summary> public class Adapt { private double x1 { get; } 0.942882415695480; private …...

微信小程序发布迭代版本后如何提示用户强制更新新版本

在点击小程序发布的时候选择&#xff0c;升级选项 之前用户使用过的再打开小程序页面就会弹出升级弹窗modal...

星际争霸之小霸王之小蜜蜂(七)--消失的子弹

目录 前言 一、删除子弹 二、限制子弹数量 三、继续重构代码 总结 前言 昨天我们已经让子弹飞了起来&#xff0c;但是会面临一个和之前小蜜蜂一样的问题&#xff0c;小蜜蜂的行动应该限制在窗口内&#xff0c;那么子弹也是有相同之处&#xff0c;也需要限制一个移动范围&…...

Hadoop入门机安装hadoop

0目录 1.Hadoop入门 2.linux安装hadoop 1.Hadoop入门 定义 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。充分利用集群的威力进行高速运算和存储。 优势 高可靠性&#xff1a;Hadoop底层维护多…...

ColorControl:让Windows显示控制变得简单直观的跨设备管理工具

ColorControl&#xff1a;让Windows显示控制变得简单直观的跨设备管理工具 【免费下载链接】ColorControl Easily change NVIDIA display settings and/or control LG TVs 项目地址: https://gitcode.com/gh_mirrors/co/ColorControl 当您在Windows系统中切换显示模式时…...

HS2汉化补丁完整指南:3步轻松实现Honey Select 2中文界面

HS2汉化补丁完整指南&#xff1a;3步轻松实现Honey Select 2中文界面 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为Honey Select 2的日语界面感到困扰吗…...

从STM32到华大HC32F460:USB HOST MSC + FatFs R0.13c移植避坑全记录

从STM32到华大HC32F460&#xff1a;USB HOST MSC FatFs R0.13c移植实战指南 作为一名长期使用STM32的嵌入式开发者&#xff0c;第一次接触华大半导体的HC32F460系列MCU时&#xff0c;既兴奋又忐忑。兴奋的是国产MCU的性能已经能够媲美国际大厂&#xff0c;忐忑的是生态差异带来…...

告别虚拟机臃肿:用QEMU+OVMF在Ubuntu上快速搭建一个32MB的极简Linux内核调试环境

极简Linux内核调试环境&#xff1a;QEMUOVMF实战指南 每次打开臃肿的虚拟机都要等待漫长的启动时间&#xff0c;看着进度条缓慢爬行&#xff0c;作为开发者的你是否感到效率被无情吞噬&#xff1f;在调试内核模块或研究启动流程时&#xff0c;我们真正需要的只是一个轻量级、即…...

LumenPnP真空系统架构:双喷嘴拾放技术深度解析

LumenPnP真空系统架构&#xff1a;双喷嘴拾放技术深度解析 【免费下载链接】lumenpnp The LumenPnP is an open source pick and place machine. 项目地址: https://gitcode.com/gh_mirrors/lu/lumenpnp LumenPnP作为一款开源桌面贴片机&#xff0c;其真空系统是实现精准…...

SpringBoot项目里用Sharding-JDBC做分库分表,这5个配置项最容易踩坑

SpringBoot整合Sharding-JDBC分库分表&#xff1a;五大高频配置陷阱与实战解决方案 当数据库单表数据量突破千万级大关时&#xff0c;分库分表几乎是每个Java开发者必须面对的课题。作为Apache ShardingSphere的核心模块&#xff0c;Sharding-JDBC以其轻量级、低侵入的特性成为…...

分布式制造转型:SAP解决方案与实施路径

1. 分布式制造的行业挑战与转型机遇高科技制造业正面临前所未有的变革压力。产品生命周期从过去的18-24个月缩短到现在的6-9个月&#xff0c;某些消费电子产品甚至只有3个月的市场窗口期。与此同时&#xff0c;全球贸易政策波动率在2020-2023年间增长了47%&#xff0c;这使得传…...

ARM虚拟化关键寄存器HIFAR与HMAIR详解

1. ARM架构中的HIFAR与HMAIR寄存器概述 在ARMv7和ARMv8架构的虚拟化扩展中&#xff0c;Hyp模式&#xff08;即EL2&#xff09;提供了一套完整的系统寄存器来支持虚拟化功能。其中HIFAR&#xff08;Hyp Instruction Fault Address Register&#xff09;和HMAIR&#xff08;Hyp M…...

从示波器到数据记录仪:基于STM32H7+AD7606+J-Scope的实时波形采集系统搭建全流程

基于STM32H7与AD7606的高性能数据采集系统设计与实战 1. 系统架构设计理念 现代工业监测和实验室数据采集对信号采集系统提出了更高要求——需要同步捕获多通道模拟信号&#xff0c;并实现实时可视化分析。基于STM32H7高性能微控制器与AD7606 ADC模块的组合&#xff0c;配合J-S…...

AIAgent系统崩溃前的7个征兆:基于SITS2026容错框架的实时预警与自愈方案

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;SITS2026容错框架的理论根基与演进脉络 SITS2026&#xff08;Self-Integrating Tolerance System 2026&#xff09;并非凭空而生&#xff0c;其设计深度植根于分布式系统可靠性理论、形式化验证方法论与…...