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系统&…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
