【JavaWeb 篇】使用Servlet、JdbcTemplate和Durid连接池实现用户登录功能与测试
在现代Web应用程序开发中,用户登录功能是基础中的基础。它为用户提供了安全访问系统的途径。本篇博客将引导您通过使用Servlet、Spring框架的JdbcTemplate以及Durid连接池,来构建一个完整的用户登录功能。我们将详细展示每个部分的代码,并解释其作用和功能。
数据库和数据模型
首先,我们需要创建一个数据库表来存储用户信息。我们创建了一个名为user
的表,用于存储用户的登录信息,每个用户有一个唯一的ID、用户名和密码。为了与数据库中的用户数据建立映射,我们创建了一个Java类User
,其中包含了id
、username
和password
属性。
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);}}
}
显示登录失败和成功信息
为了向用户提供友好的反馈,我们创建了FailServlet
和SuccessServlet
。在登录失败时,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应用程序开发中,用户登录功能是基础中的基础。它为用户提供了安全访问系统的途径。本篇博客将引导您通过使用Servlet、Spring框架的JdbcTemplate以及Durid连接池,来构建一个完整的用户登录功能。我们将详细展示每个部分的代码,并解释…...

【Unity3D赛车游戏】【六】如何在Unity中为汽车添加发动机和手动挡变速?
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...

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

龙芯2K1000LA移植交叉编译环境以及QT
嵌入式大赛结束了,根据这次比赛中记的凌乱的笔记,整理了一份龙芯2K1000LA的环境搭建过程,可能笔记缺少了一部分步骤或者错误,但是大致步骤可以当作参考。 一、交叉编译工具链 下载连接:龙芯 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 集合, 也叫作容器,主要是由两大接口派生而来:一个是 Collection接口,主要用于存放单一元素;另一个是 Map 接口,主要用于存放键值对。对于Col…...

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

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

浙大陈越何钦铭数据结构07-图6 旅游规划
题目: 有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。 输入…...
VUE笔记(七)项目登录
1、安装elementui 在终端执行 vue add element 注册组件 如果要使用哪个组件,大家需要在plugins/element.js中注册该组件 import Vue from vue import { Button } from element-ui Vue.use(Button) 在页面组件中使用 <el-button type"primary"&…...

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

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

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

Java虚拟机
文章目录 JVM运行时数据区域HotSpot虚拟机对象探秘实战:OutOfMemoryError异常 JVM 运行时数据区域 HotSpot虚拟机对象探秘 实战: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 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组&#…...

C#,数值计算——调适数值积分法(adaptive quadrature)的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 调适数值积分法 /// adaptive quadrature /// </summary> public class Adapt { private double x1 { get; } 0.942882415695480; private …...

微信小程序发布迭代版本后如何提示用户强制更新新版本
在点击小程序发布的时候选择,升级选项 之前用户使用过的再打开小程序页面就会弹出升级弹窗modal...

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

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

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...