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系统&…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...