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系统&…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...

五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...