阶段五-JavaWeb综合练习-学生管理系统

一.项目说明

1.前台 (用户使用)

        前端,后端

2.后台 (管理员使用)

        前端,后端

3.该项目为后台管理系统

项目开发流程:

1.需求分析

1.1 登录功能  

用户访问登录页面输入用户名和密码,并且输入验证码。全部输入正确后点击登录,登录成功跳转主页面;登录失败,则再次返回登录页面,并提示用户,用户名或者密码错误! 如果是验证码错误,则登录失败,并提示用户验证码错误!

1.2 班级管理功能
1.2.1 添加班级

用户访问添加班级功能,进入到班级添加的页面,输入要添加的班级信息,点击提交完成 班级信息的添加,并在当前页面中提示班级新增的结果.

1.2.2 查询班级

用户访问查询班级功能,分页显示所有的班级信息,并且可以对班级信息进行修改和删除操作.

1.2.3 各班人数

统计各班人数,以条形图的方式显示给用户

1.3 学生管理功能
1.3.1 添加学生

用户访问添加学生功能,进入学生信息添加页面,在输入添加的学生信息后,点击提交完成学生信息的添加,并且在当前页面中提示用户添加结果!

1.3.2 展示学生

用户访问展示学生信息功能,进入学生信息展示页面,并分页显示所有的学生信息,同时用户可以按照指定的条件对学生信息查询,并可以对学生信息进行修改和删除操作,以及导出查询的学生信息.

2.划分模块

页面

java代码

mysql数据库

3.库表设计

用户表user

字段说明
uid用户id
ukey用户账号
pwd密码
realname真实姓名

班级表class

字段说明
cid班级ID
cname班级名称
teacher老师
remark备注

学生表student

字段说明
sid学生id
sname学生姓名
hobby爱好
sex性别
bir生日
phone手机号
remark备注
cid班级编号

     

二、项目环境搭建

1. 创建项目

创建JavaEE项目,名字为:MUI。

2. 导入相关jar包

  1. 数据库驱动包

  2. json工具包

  3. jstl的两个包

3. 静态页面的修改

  1. 将模板中的静态资源(js、css、images)复制到项目的web目录下

  2. 在web目录下导入html文件

4. 创建项目包结构

创建MVC分层开发的包结构

5. 创建实体类

按照orm映射创建实体类,和表中的字段一一对应

Clazz班级实体类

package com.sh.pojo;import java.io.Serializable;public class Clazz implements Serializable {private int cid;private String cname;private String teacher;private String remark;@Overridepublic String toString() {return "Clazz{" +"cid=" + cid +", cname='" + cname + '\'' +", teacher='" + teacher + '\'' +", remark='" + remark + '\'' +'}';}public int getCid() {return cid;}public void setCid(int cid) {this.cid = cid;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}public String getTeacher() {return teacher;}public void setTeacher(String teacher) {this.teacher = teacher;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}public Clazz(int cid, String cname, String teacher, String remark) {this.cid = cid;this.cname = cname;this.teacher = teacher;this.remark = remark;}public Clazz() {}
}

Student学生实体类

package com.sh.pojo;import java.io.Serializable;
import java.util.Arrays;
import java.util.Date;public class Student implements Serializable {private int sid;private String sname;private String hobby;private String sex;private Date bir;private String phone;private String remark;private int cid;@Overridepublic String toString() {return "Student{" +"sid=" + sid +", sname='" + sname + '\'' +", hobby='" + hobby + '\'' +", sex='" + sex + '\'' +", bir=" + bir +", phone='" + phone + '\'' +", remark='" + remark + '\'' +", cid=" + cid +'}';}public int getSid() {return sid;}public void setSid(int sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public String getHobby() {return hobby;}public void setHobby(String hobby) {this.hobby = hobby;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Date getBir() {return bir;}public void setBir(Date bir) {this.bir = bir;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}public int getCid() {return cid;}public void setCid(int cid) {this.cid = cid;}public Student(int sid, String sname, String hobby, String sex, Date bir, String phone, String remark, int cid) {this.sid = sid;this.sname = sname;this.hobby = hobby;this.sex = sex;this.bir = bir;this.phone = phone;this.remark = remark;this.cid = cid;}public Student() {}
}

User用户类

package com.sh.pojo;import java.io.Serializable;public class User implements Serializable {private int uid;private String uname;private String pwd;private String realname;@Overridepublic String toString() {return "User{" +"uid=" + uid +", uname='" + uname + '\'' +", pwd='" + pwd + '\'' +", realname='" + realname + '\'' +'}';}public int getUid() {return uid;}public void setUid(int uid) {this.uid = uid;}public String getUname() {return uname;}public void setUname(String uname) {this.uname = uname;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}public String getRealname() {return realname;}public void setRealname(String realname) {this.realname = realname;}public User(int uid, String uname, String pwd, String realname) {this.uid = uid;this.uname = uname;this.pwd = pwd;this.realname = realname;}public User() {}
}

StudentDto是根据需求创建的临时实体类,用来完成具体的需求

package com.sh.pojo;import java.io.Serializable;
import java.util.Date;public class StudentDto implements Serializable {private int sid;private String sname;private String phone;private String sex;private String cname;private Date bir;@Overridepublic String toString() {return "StudentDto{" +"sid=" + sid +", sname='" + sname + '\'' +", phone='" + phone + '\'' +", sex='" + sex + '\'' +", cname='" + cname + '\'' +", bir=" + bir +'}';}public int getSid() {return sid;}public void setSid(int sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}public Date getBir() {return bir;}public void setBir(Date bir) {this.bir = bir;}public StudentDto(int sid, String sname, String phone, String sex, String cname, Date bir) {this.sid = sid;this.sname = sname;this.phone = phone;this.sex = sex;this.cname = cname;this.bir = bir;}public StudentDto() {}
}

三、实现验证码功能

1.需求

在登录页面中有验证码,用户一旦进入登录页面就能看到验证码图片。

如果看不清,用户可以点击验证码图片,然后会重新得到一个验证码图片。

2. 思路分析

  1. 编写一个Servlet,专门用来生成验证码(不用自己编写,参照资料即可,里面用到了Java的画图类,直接将该类复制过来)

  2. 将生成的验证码存储到Session中,因为后面点击登录按钮后还要将用户输入的和之前生成的验证码进行比对

  3. 在登录页面中,验证码使用的是图片,将图片标签的src属性值写为生成验证码的Servlet的访问路径即可

  4. 给图片加个点击事件,每次点击将图片标签的src值给稍微改动一下,比如在正常的Servlet地址后面拼一个随机数,目的是为了防止浏览器缓存而不会发送请求。

3. 具体实现

package com.sh.controller;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/getCode")
public class RandomServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 在内存中创建图象int width = 110, height = 30;BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);// 获取图形上下文Graphics g = image.getGraphics();// 生成随机类Random random = new Random();// 设定背景色g.setColor(getRandColor(200, 250));g.fillRect(0, 0, width, height);// 设定字体g.setFont(new Font("Times New Roman", Font.PLAIN, 20));// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到g.setColor(getRandColor(160, 200));for (int i = 0; i < 155; i++) {int x = random.nextInt(width);int y = random.nextInt(height);int xl = random.nextInt(12);int yl = random.nextInt(12);g.drawLine(x, y, x + xl, y + yl);}// 取随机产生的认证码(4位数字)String sRand = "";String[] strings = {"A","B","C","D","E","1","2","3","4","5"};for (int i = 0; i < 4; i++) {/*String rand = String.valueOf(random.nextInt(10));*/String rand = strings[random.nextInt(strings.length)];sRand += rand;// 将认证码显示到图象中g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成g.drawString(rand, 13 * i + 20, 20);}//保存验证码到Sessionrequest.getSession().setAttribute("randStr", sRand);// 图象生效g.dispose();try {ImageIO.write(image, "JPEG", response.getOutputStream());} catch (Exception e) {System.out.println("验证码图片产生出现错误:" + e.toString());}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}/** 给定范围获得随机颜色*/private Color getRandColor(int fc, int bc) {Random random = new Random();if (fc > 255)fc = 255;if (bc > 255)bc = 255;int r = fc + random.nextInt(bc - fc);int g = fc + random.nextInt(bc - fc);int b = fc + random.nextInt(bc - fc);return new Color(r, g, b);}
}

修改干扰线的条数,干扰线越多越看不清 

验证码的设置

将验证码保存到session中

修改登录页面中的验证码图片地址 

四、实现登录功能

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/593124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

清风数学建模笔记-因子分析

内容&#xff1a;因子分析 概念&#xff1a; 通过分析研究变量间的相关系数矩阵&#xff0c;把这些变量间错综复杂的关系归结成少数几个综合因子&#xff0c;由于归结出的因子个数少于原始变量的个数&#xff0c;但是又包含原始变量的信息&#xff0c;所以这一过程也称之为降…

清风数学建模-数学规划模型

内容&#xff1a;数学规划模型&#xff08;cab aeqbeq lbub&#xff09; 一.题型类型 1.线性规划linprog 2.非线性规划 fmincon 3.整数规划 intlinprog 4.&#xff08;0-1规划&#xff09;&#xff08;特殊的线性整数规划&#xff09;intlinprog 5.多目标规划 linprog 标…

STM32 ESP8266 物联网智能温室大棚 (附源码 PCB 原理图 设计文档)

资料下载: https://download.csdn.net/download/vvoennvv/88680924 一、概述 本系统以STM32F103C8T6单片机为主控芯片&#xff0c;采用相关传感器构建系统硬件电路。其中使用DHT11温湿度传感器对温度和湿度的采集&#xff0c;MQ-7一氧化碳传感器检测CO浓度&#xff0c;GP2Y101…

设计模式:简单工厂模式、工厂方法模式、抽象工厂模式

简单工厂模式、工厂方法模式、抽象工厂模式 1. 为什么需要工厂模式&#xff1f;2. 简单工厂模式2.1. 定义2.2. 代码实现2.3. 优点2.4. 缺点2.5. 适用场景 3. 工厂方法模式3.1. 有了简单工厂模式为什么还需要有工厂方法模式&#xff1f;3.2. 定义3.3. 代码实现3.4. 主要优点3.5.…

深入数组扩展应用

一、字符串反转 例如&#xff1a;‘123abc’----->‘cba321’ 字符串方法实现: var str 123abcvar reversFn function(str) {var newStr for (var i str.length - 1; i > 0; i--) {newStr str[i]}return newStr }console.log(reversFn(str));数组方法实现&#xf…

Elasticsearch:如何使用 Elasticsearch 进行排序

虽然你在唱这首歌时可能会想象圣诞老人&#xff0c;但欧洲民间传说&#xff0c;尤其是阿尔卑斯地区的民间传说&#xff0c;有两个传奇人物圣尼古拉斯和坎普斯。 象征着慷慨和善良的圣尼古拉斯&#xff0c;在 12 月 6 日 为乖巧的孩子们带来礼物和欢乐&#xff01; 相比之下&…

【C语言】作用域 和 生命周期

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

计算机网络--作业

作业一 1、比较电路交换、报文交换和分组报文交换优缺点 电路交换 电路交换是以电路连接为目的的交换方式&#xff0c;通信之前要在通信双方之间建立一条被双方独占的物理通道&#xff08;由通信双方之间的交换设备和链路逐段连接而成&#xff09;。 优点&#xff1a; ①由于…

实战SRC | api接口未授权 + 越权漏洞

本文由掌控安全学院 - zxl2605 投稿 一次在fofa上通过学习的fofa语句进行查询&#xff0c;无意中查询到了一个网址 其登录界面如下&#xff1a; 使用浏览器的F12打开开发者工具&#xff0c;查看JS寻找接口&#xff1a; 从JS代码中查询到一处接口如下&#xff1a; 发现是以p…

bilibili深入理解计算机系统笔记(3):使用C语言实现静态链接器

本文是2022年的项目笔记&#xff0c;2024年1月1日整理文件的时候发现之&#xff0c;还是决定发布出来。 Github链接&#xff1a;https://github.com/shizhengLi/csapp_bilibili 文章目录 可执行链接文件(ELF)ELF headerSection header符号表symtab二进制数如何和symtab结构成员…

ELK+kafka+filebeat企业内部日志分析系统搭建

看上面的拓扑图&#xff0c;我们至少准备七台机器进行下面的实验项目。 机器主要作用分布如下: 三台安装elasticsearch来搭建ES集群实现高可用&#xff0c;其他机器就依次安装filebeat,kafka,logstash和kibana软件 一、部署elasticsearch来搭建ES集群 1.安装jdk 由于ES运行…

C语言数组习题

1.数组遍历 #include <stdio.h>int main(){int i,a[10];for(i0;i<9;i) //对数组元素a[0]~a[9]赋值 a[i]i;for(i9;i>0;i--) //输出a[9]~a[0]共10个数组元素 printf("%d ",a[i]);printf("\n");return 0;} 运行结果&#xff1a; 2.数组应用&a…

atoi函数的模拟实现

这里强力推荐一篇文章 http://t.csdnimg.cn/kWuAm 详细解析了atoi函数以及其模拟实现&#xff0c;我这里就不说了。 这里作者先把自己模拟的代码给大家看一下。 int add(char* arr) {char* arr2 arr;while (*arr!-48){arr;}arr--;int sum 0;int n 0;while (arr ! (arr2-…

如何构建高效测试体系?掌握5大自动化测试模式就够了

软件开发过程中&#xff0c;高效的自动化测试体系是提升测试效率、保证产品质量关键&#xff0c;一个全面的测试体系涵盖多个维度&#xff0c;从功能性到用户界面&#xff0c;再到性能和安全性。 每个维度均采用不同的测试模式来满足特定的需求和解决特别的挑战&#xff0c;本…

快速打通 Vue 3(三):Vue3 中的 watch 监听器与新特性

很激动进入了 Vue 3 的学习&#xff0c;作为一个已经上线了三年多的框架&#xff0c;很多项目都开始使用 Vue 3 来编写了 这一组文章主要聚焦于 Vue 3 的新技术和新特性 如果想要学习基础的 Vue 语法可以看我专栏中的其他博客 Vue&#xff08;一&#xff09;&#xff1a;Vue 入…

为什么国产操作系统是基于linux研发的呢?

为什么国产操作系统是基于linux研发的呢&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「Linux的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&…

2023年AIGC发展回顾与展望

2023年是人工智能内容生成&#xff08;AIGC&#xff09;技术飞速发展的一年。从年初ChatGPT一炮打响&#xff0c;大家纷纷加入到大模型研究之中。期间Midjourney和Stable Diffusion AI绘画技术持续火热&#xff0c;基于AIGC类的应用也如雨后春笋般遍地开花。万众瞩目的OpenAI G…

1.1 理解大数据(2)

小肥柴的Hadoop之旅 1.1 理解大数据&#xff08;2&#xff09; 目录1.1 理解大数据1.1.3 大数据概述1.1.4 更多思考 参考文献和资料 目录 1.1 理解大数据 1.1.3 大数据概述 step_0 大数据定义 【《大数据算法设计分析》】&#xff1a; 通常来讲大数据&#xff08;Big Data&am…

生态系统服务构建生态安全格局中的实践技术应用

生态安全是指生态系统的健康和完整情况。生态安全的内涵可以归纳为&#xff1a;一&#xff0c;保持生态系统活力和内外部组分、结构的稳定与持续性&#xff1b;二&#xff0c;维持生态系统生态功能的完整性&#xff1b;三&#xff0c;面临外来不利因素时&#xff0c;生态系统具…

解决jenkins的Exec command命令不生效,或者执行停不下来的问题

Jenkins构建完后将war包通过 Publish Over SSH 的插件发布到服务器上&#xff0c;在服务器上执行脚本时&#xff0c;脚本中的 nohup 命令无法执行&#xff0c;并不生效&#xff0c;我配置的Exec command命令是后台启动一个war包&#xff0c;并输出日志文件。 nohup java -jar /…