JavaWeb--09Servlet深入:JavaWeb三层架构---注册系统
一套完整的网页到Java到数据库的创建:

html:进行数据收集以及呈现
第一层:根据servlet处理前台html的响应和请求,对数据进行接收,封装和验证
第二层:业务,验证是否存在调用创建的dao查,以及存在就直接返回,没有存在就调用将数据传输到数据库
第三层:对数据库进行操作,比如:用户添加或者进行查咋,无非就是增删改查
思想:
分析业务:从前往后
开始业务:从后往前
以下是一个简单登录系统业务,对于这用户登录系统将分成多个小的业务进行完成:
①注册界面
②显示所有用户界面
③删除用户
④修改用户信息界面
⑤动态搜索栏
⑥批量删除
开始业务前的准备工作:
打开idea创建一个web工程,并将Tomcat进行整合,导入所需要的包具体用到的包放在这里:
bao.zip_免费高速下载|百度网盘-分享无限制 (baidu.com)
这些包都放在创建的web工程下WEB-INF包创建的lib下,具体怎么整合传送门:JavaWeb--纯小白笔记04:Tomcat整合IDEA-CSDN博客
一.注册用户界面
根据业务的分析,从前往后:
1.创建数据库:(数据库安装包以及教程:百度网盘 请输入提取码)

记住自己的数据库的用户名,密码,以及数据库的名字和创建的表的名字,这里我的数据库的相关信息为:用户名:root ;密码:123456 ;数据库名:db.test ;表名:user 字符集编码使用utf-8

2.连接数据库:
在ideaa创建的web工程下的src创建一个file包再创建一个properties文件装我们数据库的信息

创建一个工具包Utils,创建一个DBUtils类进行连接数据库,关闭数据库的操作,这里为了优化数据库的连接将使用导入的io流的包,创建一个类加载器---普通java类利用自身类的类加载器读取外部文件。
类加载器:

连接数据库:

因为业务的太多,在测试类中使用导入的junit包用来测试每一步:

2.将数据库的用户信息进行封装---放在domain包下---注意id是不用进行有参的,且toString里的id是不用打印的

3。创建一个dao包里面先创建一个接口再创建一个包,包里创建一个类实现接口。在接口里写方法。

查询注册的用户的姓名是否存在,以及添加用户

在测试类进行测试查找用户以及添加用户:

4.在service层,进行业务的处理:
在src下创建一个service包,同样使用接口实现的方法。创建一个接口在从创建一个包去实现:


5.创建一个controller包,里面进行对html网页内容的请求和响应:

点击发布,就是右上角的运行,选择tomcat发布,在打开的网页注册一个用户,如下

点击注册后会提示,注册成功,打开数据库就能看见添加的用户

以上就是一个简单的注册系统,但是还要进行数据验证合法性,这里只对用户名和年龄进行数据合法进行验证,不合法就进行提示且红色:
6.在src创建一个validate包,在包里进行数据的合法性验证,具体代码如下:

因为需要的时在注册用户时,对用户名以及密码进行不合法提示,所有在rejister.jsp对用户栏和密码栏要添加如下代码:这里的代码时jsp代码elo表达式:
<span style="color: red">${errors.username}
<span style="color: red">${errors.age}

最后在UserServlet的register业务下进行将跳转---将信息跳转到页面上:

补充知识:
转发:一次请求
重定向:2次请求,地址也会发生变化
跳转使用的时域对象,四大域对象如下介绍:
| request(实际开发中一般都用request实现转发) | 一次响应 |
| session(默认时间30min在服务器端内存) | 一次会话(浏览器打开到关闭为一次) |
| pagecontext | |
| servletcontext(在jsp中就是application) | 最大的域对象 |
所以在register处就要进行一个对错误信息的跳转,这里使用的session,登录信息一般放在session中

现在启动tomcat,进行注册,当用户名长度小于6大于18时以及年龄小0大120提示不合法


这里用户名和年龄不合法,在点击注册后就会清空进行提示
二.查找所有用户信息界面
该业务就是将数据库里的所有数据进行打印出来反映到界面上,要重新写2个界面,一个是放查询超链接的界面,另一个是跳转进超链接显示所有用户信息的界面
1.编辑超链接的界面,在web下的index.jsp写一个显示所有用户的超链接代码如下:

这里要注意导入在daomain写的user类,这里再jsp写的是jsp语句进行连接再showUserAll写的显示所有信息。

这里的红线使用的是导入的包jstl,便于进行的就是jsp的写法,elo表达式。
以上只是对前台的设置,接下来将对数据库的数据进行读取
2.在dao层的接口先写抽象方法,再在实现类UserDaoImpl进行属性具体的查找所有用户的方法:


在测试类进行测试是否查找到所有的用户:

3.测试成功,在service层进行业务逻辑编写:

4.在controller层进行连接前台获取数据,在原本的UserServlet类中进行业务的判断:
这里的业务,是在index.jsp里的业务名字

5.最后发布tomcat点击超链接就会显示如下的界面:

三.删除用户业务
在显示用户的界面游两个超链接:修改和删除,这里将对删除进行业务实现:
思想:在页面展示信息,点击删除的超链接后,获取id,在controller层进行调用service的业务逻辑处理,service层调用dao层的对数据库的处理方法;
开始业务:
1.在dao层的接口书写删除的抽象方法,再在实现类UserDaoImpl进行实现。注意:这里还要进行一个id查找用户,用于判断是否用户存在----因为在页面操作的可能同时在操作


2.在service层进行业务逻辑处理:先在接口进行定义抽象方法,再在实现类进行实现:


3.在显示界面,showuserall.jsp里的删除处的连接添加连接代码以及业务的名称:
<a href="UserServlet?id=${user.id}&business=delete">删除</a>-----这里的超链接就是后台的UserServlet里进行判断业务,再工具id查找。

4.在controller层的UserServlet类进行,进行删除业务的进行

红圈是在删除后,显示删除后的所有用户的页面。
5.发布tomcat,在显示界面进行删除

删除id4号

四·.修改页面
分析:点击修改超链接,就跳转到一个修改界面,要显示原本的数据,且密码显示出来,在该页面将对用户的数据的进行修改,最后提交。
开始业务:
1.在web下创建一个修改界面update.jsp----写法和register没有太大的区别,主要是对文本框获得值

获取的代码就是elo表达式value=${user.id}.....
注意:修改信息是要展示密码的文本内容,所以在password处type="text";
2.在dao层进行对数据库的修改信息操作,但是要先展示选择的内容,所以这里书写2个方法:
findUserByID()----显示原本的内容,update()---修改数据库内容的方法

在dao层实现:
3.在service层进行调用,完成对业务逻辑的处理:
先在接口进行定义:

再在实现类UserServiceImpl进行调用dao层的业务:

4.在controller进行连接前台的数据进行对数据的修改,在点击修改业务就要进行回显的业务,展示一个界面

在UserServlet里先进行回显:

这里就会获取要修改的用户的id,返回用户,再把这个用户重定向跳转到update.jsp页面。在再UserServlet里书写修改的代码

进行修改操作:


将上面信息进行修改:

修改后:
修改完成了。
五.动态搜索栏
分析:在显示用户信息的表单里有一个下拉框选择用户的信息,一个文本框进行输入,一个按钮就行搜索,在下拉框选择了性别或许姓名的某一个包含字就会返回所有满足的用户。在controller层进行接收选择的搜索条件,调取service层的逻辑处理业务---就是dao层写的查找业务。找到符合条件的用户集合返回。
开始业务:
1.在显示用户信息的表单里添加一个动态搜索栏:
具体代码:
这样就是把动态搜索栏放在了最右侧,下拉就可以选择具体查找的要求 ,业务名为quer:
2.在dao层进行对数据库代码的操作:
先在接口中定义方法,因为要先接收选的具属性,再接收具体的值找到满足条件的用户,用集合进行装,这里的方法findUserBy为:

再实现这个方法这里的性别是直接查找,但是姓名和地址是模糊查找,所以sql语句不同需要判断key的值就是下拉列表的选择:

3.在service层进行业务逻辑处理,调用dao层的方法:
依旧是先在接口定义抽象方法:

实现类:

4.在controller层接收前台的数据,在进行对业务进行调用:
在找到对应的用户放进集合后,使用前面的显示跳转到显示页面5.
5.发布tomcat进行查找,这里提前给数据库添加了用户:

对性别--男进行检索:
动态栏业务就完毕了。
相关文章:
JavaWeb--09Servlet深入:JavaWeb三层架构---注册系统
一套完整的网页到Java到数据库的创建: html:进行数据收集以及呈现 第一层:根据servlet处理前台html的响应和请求,对数据进行接收,封装和验证 第二层:业务,验证是否存在调用创建的dao查&#x…...
教育技术革新:SpringBoot在线教育系统开发指南
6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…...
EasyAnimate
https://github.com/aigc-apps/EasyAnimate/blob/main/README_zh-CN.mdhttps://github.com/aigc-apps/EasyAnimate/blob/main/README_zh-CN.md EasyAnimate v4是一个用于生成高分辨率和长视频的端到端解决方案。我们可以训练基于转换器的扩散生成器,训练用于处理长视频的VAE,…...
Unity实现自定义图集(五)
以下内容是根据Unity 2020.1.0f1版本进行编写的 在Unity编辑器上的自定义图集已经完成了,但是如何将自定义图集文件打包,以及在移动平台将自定义图集和对应的纹理图(Texture)加载出来是个问题,本篇就来解决这些问题 1、思路 首先是自定义图集的打包。 自定义图集实际…...
2024年最佳平替电容笔对比:西圣、摩米士、倍思,哪款更适合你?
作为一位专注于数码产品的博主,我深知近年来平替电容笔在消费者中的热度不断攀升。这种电容笔以其亲民的价格和卓越的书写体验引起了广泛关注,尤其适合那些需要用iPad学习和办公的无纸化爱好者。 西圣这款自带充电仓的电容笔备受关注,尤其因…...
关系型数据库索引操作
前言:关系型数据库索引总结-作用,类型,适用场景,缺点简介 在MySQL、SQL Server、Oracle中,建立、修改、删除索引的操作有很多相似之处,但由于每个数据库系统的语法和特性不同,具体操作有一些差异。以下是三种数据库中关于索引操作…...
深度学习基础—卷积神经网络示例
1.卷积神经网络的结构 在之前的博客《深度学习—简单的卷积神经网络》,仅由卷积层构成网络的全部,这还不是标准的网络结构,本文将继续介绍标准的卷积神经网络结构有哪些? 深度学习基础—简单的卷积神经网络https://blog.csdn.net…...
vite学习教程03、vite+vue2打包配置
文章目录 前言一、修改vite.config.js二、配置文件资源/路径提示三、测试打包参考文章资料获取 前言 博主介绍:✌目前全网粉丝3W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容&…...
Java | Leetcode Java题解之第461题汉明距离
题目: 题解: class Solution {public int hammingDistance(int x, int y) {int s x ^ y, ret 0;while (s ! 0) {s & s - 1;ret;}return ret;} }...
ubuntu 开放 8080 端口快捷命令
文章目录 查看防火墙状态开放 80 端口开放 8080 端口开放 22端口开启防火墙重启防火墙**使用 xhell登录**: 查看防火墙状态 sudo ufw status [sudo] password for crf: Status: inactivesudo ufw enable Firewall is active and enabled on system startup sudo…...
关于头文件为什么要加条件编译语句
因为有些情况重复包含头文件会出现重复定义或者导致多次包含导致增加编译时间。 下述是没有假如条件编译和宏定义的例子: // common_functions.h int addTwoNumbers(int a, int b); // data_structures.h #include "common_functions.h"struct MyStruc…...
strstr
strstr函数原型: char *strstr(conset char *s, conset char *s2); 功能:在字符串s中查找字符串s2出现的位置 返回值: 成功:返回第一次出现的s2的地址 失败:NULL...
C语言 | Leetcode C语言题解之第454题四数相加II
题目: 题解: struct hashTable {int key;int val;UT_hash_handle hh; };int fourSumCount(int* A, int ASize, int* B, int BSize, int* C, int CSize, int* D, int DSize) {struct hashTable* hashtable NULL;for (int i 0; i < ASize; i) {for (…...
Leetcode 删除链表倒数第 N 个节点
算法思想: 使用了双指针法。下面是详细的算法思想: 1. 引入虚拟头节点(dummy node) 为了处理链表的一些边界情况(比如删除头节点),我们在链表的头部引入了一个虚拟节点 dummy,并让…...
[移植] tgi 编译
这里写自定义目录标题 报错 报错 Collecting numpy1.26.4 (from -r requirements_cuda.txt (line 21))Downloading numpy-1.26.4.tar.gz (15.8 MB)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 15.8/15.8 MB 15.0 MB/s eta 0:00:00Inst…...
vue-element-admin后台集成方案
文章目录 vue-element-admin后台集成方案介绍使用安装目录介绍 vue-element-admin后台集成方案 介绍 官方网站 https://panjiachen.github.io/vue-element-admin-site/zh/guide/#%E5%8A%9F%E8%83%BD使用 安装 这里有三个模板,我们一般选择基础模板进行开发就好…...
40条经典ChatGPT论文指令,圈定选题和进行论文构思
目录 1、用ChatGPT圈定选题范围2、用ChatGPT生成研究方法和思路3、用ChatGPT扩展论文观点和论证4、用ChatGPT辅助论文结构设计5、如何直接使用ChatGPT4o、o1、OpenAI Canvas6、OpenAI Canvas增强了啥?7、编程功能增强 👇 ChatGPT o1网页入口在文末&#…...
在不支持WSL2的Windows环境下安装Redis并添加环境变量的方法
如果系统版本支持 WSL 2 可跳过本教程。使用官网提供的教程即可 官网教程 查看是否支持 WSL 2 如果不支持或者觉得麻烦可以按照下面的方式安装 下载 点击打开下载地址 下载 zip 文件即可 安装 将下载的 zip 文件解压到自己想要解压的地方即可。(注意&#x…...
《Electron 基础知识》代码打开开发者工具DevTools
初始化 const mainWindow new BrowserWindow({width: 1400,height: 800 );打开 接口 openDevTools mainWindow.webContents.openDevTools();关闭 接口 closeDevTools mainWindow.webContents.closeDevTools();...
小米R3G刷机OP
小米R3G刷机OP 22年购买了一个小米R3G路由器,刷OP系统后可以中继校园网,从而让智能开关、小爱同学可以联网。 当年的价格还是55元,现在只需要30元了,价格越来越便宜,并且OP版本越来越完善了。 之前刷机过breed系统&…...
AcousticSense AI进阶使用:批量处理上百首歌曲的实战方法
AcousticSense AI进阶使用:批量处理上百首歌曲的实战方法 1. 为什么需要批量处理音乐文件? 在音乐流媒体平台、唱片公司或广播电台的实际工作中,我们经常需要处理海量音频文件。手动上传单首歌曲进行流派分析不仅效率低下,也难以…...
Video2X:用AI突破视频质量瓶颈的全栈解决方案
Video2X:用AI突破视频质量瓶颈的全栈解决方案 【免费下载链接】video2x A lossless video/GIF/image upscaler achieved with waifu2x, Anime4K, SRMD and RealSR. Started in Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/video…...
基于Mirage Flow的Java智能助手开发:SpringBoot集成与API封装
基于Mirage Flow的Java智能助手开发:SpringBoot集成与API封装 最近在做一个内部知识库项目,需要给系统加个智能问答的“大脑”。一开始想直接用现成的SaaS服务,但考虑到数据安全和定制化需求,还是决定自己动手,把大模…...
Qwen3-ForcedAligner-0.6B效果对比:较Whisper-v3在粤语场景提升12.7%准确率
Qwen3-ForcedAligner-0.6B效果对比:较Whisper-v3在粤语场景提升12.7%准确率 1. 引言:当语音识别遇上粤语,谁更懂你? 想象一下,你正在处理一段重要的粤语会议录音,需要把它转成文字并配上精确到每个字的时…...
AHB-Lite时序图深度解读:那些官方文档没明说的‘潜规则’与设计陷阱
AHB-Lite时序图深度解读:那些官方文档没明说的‘潜规则’与设计陷阱 在数字IC设计中,AHB-Lite总线作为AMBA3.0协议家族的核心成员,以其简洁高效的架构成为片上系统互连的首选方案。然而,许多工程师在通过官方文档掌握基础协议后&a…...
解锁AI创作自由:ComfyUI节点式工作流从入门到精通
解锁AI创作自由:ComfyUI节点式工作流从入门到精通 【免费下载链接】ComfyUI 最强大且模块化的具有图形/节点界面的稳定扩散GUI。 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI 你是否遇到过这样的困境:想要调整AI生成图像的某个细节…...
Linux系统auditd审计服务实战:从零配置到规则优化(附常用命令大全)
Linux系统auditd审计服务实战:从零配置到规则优化(附常用命令大全) 当服务器遭遇入侵时,大多数管理员的第一反应往往是查看历史命令记录。但现实情况是,黑客通常会第一时间清空.bash_history文件。这时,一个…...
CMIP6数据降尺度实战:用Python从零构建区域气候模型(附完整代码)
CMIP6数据降尺度实战:用Python从零构建区域气候模型 当全球气候模型(GCM)的分辨率无法满足区域研究需求时,降尺度技术成为连接全球与局部气候信息的桥梁。本文将带您从CMIP6数据获取开始,逐步实现统计降尺度和动力降尺…...
AI 模型部署中的内存瓶颈
AI模型部署中的内存瓶颈:挑战与优化 随着AI技术的快速发展,大型神经网络模型(如GPT、ResNet等)在各类应用中大放异彩。模型部署过程中面临的内存瓶颈问题却成为制约其广泛应用的关键因素。无论是边缘设备还是云端服务器ÿ…...
储能变流器双模式切换避坑指南:VF控制与PQ控制实战解析
储能变流器双模式切换实战手册:从原理到避坑全解析 引言:为什么双模式切换是储能系统的技术高地? 去年参与某大型光储项目时,我们团队在系统验收前72小时遭遇了令人窒息的场景——每当微网从并网切换到孤岛模式时,关键…...
