当前位置: 首页 > 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底层维护多…...

cookie技术介绍

title: cookie技术 date: 2023-08-27 21:34:19 tags: [cookie, 网络, http] categories: 网络 我们经常说的cookie缓存数据&#xff0c;允许cookie是什么意思? Cookie也被称作Cookies&#xff0c;它是一种让网站的服务器端可以把少量数据存储在客户端的硬盘或内存中&#x…...

网络摄像头:SparkoCam Crack

SparkoCam 网络摄像头软件 SparkoCam 是一款网络摄像头和视频效果软件&#xff0c;用于广播实时网络摄像头效果并将其应用到视频聊天和录音中。 使用佳能/尼康数码单反相机作为常规网络摄像头通过向实时视频聊天和视频录制添加酷炫的网络摄像头效果和图形来增强 USB 网络摄像…...

【缓存设计】记一种不错的缓存设计思路

文章目录 前言场景设计思路小结 前言 之前与同事讨论接口性能问题时听他介绍了一种缓存设计思路&#xff0c;觉得不错&#xff0c;做个记录供以后参考。 场景 假设有个以下格式的接口&#xff1a; GET /api?keys{key1,key2,key3,...}&types{1,2,3,...}其中 keys 是业务…...

微信小程序大学校园二手教材与书籍拍卖系统设计与实现

摘 要 随着应用技术的发展以及电子商务平台的崛起&#xff0c;利用线上平台实现的二手交易为传统的二手交易市场注入了新的生机&#xff0c;大学校园内的新生和应届毕业生的相互交替产生了巨大的二手交易空间&#xff0c;同时考虑到环保和资源再利用&#xff0c;大学校园的书籍…...

涛然自得周刊(第06期):韩版苏东坡的突围

作者&#xff1a;何一涛 日期&#xff1a;2023 年 8 月 27 日 涛然自得周刊主要精选作者阅读过的书影音内容&#xff0c;不定期发布。历史周刊内容可以看这里。 电影 兹山鱼谱 讲述丁若铨因政治事件被贬黜到了遥远的黑山岛。来到岛上后&#xff0c;丁被大自然环境疗愈&#…...

DOCKER 部署 webman项目

# 设置基础镜像 FROM php:8.2-fpm# 安装必要的软件包和依赖项 RUN apt-get update && apt-get install -y \nginx \libzip-dev \libpng-dev \libjpeg-dev \libfreetype6-dev \&& rm -rf /var/lib/apt/lists/*# 安装 PHP 扩展 RUN docker-php-ext-configure gd …...

LLMs:LangChain-Chatchat(一款可实现本地知识库问答应用)的简介、安装、使用方法之详细攻略

LLMs&#xff1a;LangChain-Chatchat(一款可实现本地知识库问答应用)的简介、安装、使用方法之详细攻略 目录 LangChain-Chatchat的简介 1、原理图解 2、文档处理实现流程 1、模型支持 (1)、LLM 模型支持 (2)、Embedding 模型支持 LangChain-Chatchat的安装 1、镜像部署…...

Qt 解析XML文件 QXmlStreamReader

如何使用QXmlStreamReader来解析格式良好的XML&#xff0c;Qt的文档中指出&#xff0c;它是一种更快、更方便的Qt自己的SAX解析器&#xff08;QXmlSimpleReader&#xff09;的替代&#xff0c;它也较快&#xff0c;在某种情况下&#xff0c;比DOM&#xff08;QDomDocument&…...

图像线段检测几种方法

1、方法一 当我将OpenCV提升到4.1.0时&#xff0c;LineSegmentDetector&#xff08;LSD&#xff09;消失了。 OpenCV-contrib有一个名为FastLineDetector的东西&#xff0c;如果它被用作LSD的替代品似乎很好。如果你有点感动&#xff0c;你会得到与LSD几乎相同的结果。 2、方…...

【Vue2.0源码学习】生命周期篇-初始化阶段(initEvents)

文章目录 1. 前言2. 解析事件3. initEvents函数分析4. 总结 1. 前言 本篇文章介绍生命周期初始化阶段所调用的第二个初始化函数——initEvents。从函数名字上来看&#xff0c;这个初始化函数是初始化实例的事件系统。我们知道&#xff0c;在Vue中&#xff0c;当我们在父组件中…...

用asp做网站大概多久/营销到底是干嘛的

【计算机】数据结构-严蔚敏/清华大学P6 第二章 线性表 2.3线性表类型的实现 三、 purge算法当以链式映像实现时&#xff0c;时间复杂度是平方级的。 四、一个带头结点的线性链表类型 -----------------END-----------------...

全国公共资源交易中心官网/seo专业课程

本文实例讲述了Python实现多条件筛选目标数据功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a; python中提供了一些数据过滤功能&#xff0c;可以使用内建函数&#xff0c;也可以使用循环语句来判断&#xff0c;或者使用pandas库&#xff0c;当然在有些情况下使用p…...

大气医院网站源码/sem与seo

MyClouds企业级微服务平台 MyClouds-V2.1-RC 已发布。更新如下1. [缺陷] 完善了直接访问静态html页面时的权限控制逻辑。2. [重构] 在LayUI前端框架下实现了根据权限数据动态生成主页左侧导航菜单。3. [重构] 放弃使用spring session redis集中存储的模式进行分布式会话管理&a…...

做网站编程在程序/网站的营销策略

进程间通讯( IPC&#xff1a;Inter Processes Communication ) 一. 管道(PIPE) 管道是一种特殊类型的文件&#xff0c;在应用层体现为两个打开的文件描述符。 对于管道本身而言&#xff0c;不是普通的文件&#xff0c;不属于某个文件系统&#xff0c;其只存在于内存中&#xf…...

石家庄专业网站设计电话/百度电话号码查询平台

box-shadow 以逗号分割列表来描述一个或多个阴影效果&#xff0c;可以用到几乎任何元素上。 如果元素同时设置了 border-radius &#xff0c;阴影也会有圆角效果。多个阴影时和多个 text shadows 规则相同(第一个阴影在最上面)。默认值: none 不可继承值&#xff1a; inset 默…...

Wordpress网站转zblog/外贸网站如何推广优化

推荐阅读第一篇博客&#xff1a;https://blog.csdn.net/qq_37534947/article/details/106628308 因为在写第一篇的时候对于kitti数据集的用法总结的不是太清楚&#xff0c;这里根据可视化代码&#xff0c;然后重新总结一下其主要的流程认知&#xff1a; 一&#xff1a;点云数据…...