Java Web学生成绩管理系统(JSP+Servlet+JDBC+Dao)

学完java web后,期末期间用所学知识写了一个简单的学生管理系统,现在有空整理分享下。

注意:本文章仅供参考和学习,源码和数据库设计在文章的底部,点击展开然后往下翻就可以找到,其实数据库就六张表,很简单,可以看尾部第11项 数据实例表 自己写。导入报异常可能是导包的问题,BUG千千万,原因很多种,自己复制下eclipse报的错误报告,然后百度一下,基本能解决,因为我们现在遇到的错误,很多前人已经遇到并解决了,或者找身边的大佬帮忙看看。我只偶尔上线,做课程设计应急的话请直接点击链接下载,想学到东西的建议跟着文章自己写一写。

2020-05-17更新:好多人私信我要代码,我以为传到CSDN的盘上你们都能拿到的,但看见CSDN的积分要求越来越高,我就知道大伙搞不定了。我比较讨厌不劳而获,直接拿着项目跑结果的行为,但考虑的部分人在复现时确实存在着些许问题,可能是我博客写的不够好的原因吧,所以现在我重新上传至百度网盘,供大家下载,希望大家能在这基础上做一些改进,比如说数据库写的很烂,你们可以写一些视图、存储过程等,功能上也可以作进一步的优化,前端也可以做的更精致……但别问我技术问题,这个课设项目做完后我没有去维护,一些原因下,我也不想去改bug。

链接:https://pan.baidu.com/s/1xRonKzSeIuEK7JEn6rvhzA
提取码:4pgr
复制这段内容后打开百度网盘手机App,操作更方便哦

1.简述

编写该系统的目的是为了对学生的成绩进行信息化管理,降低教师管理的成本,提高工作效率。该系统有六张数据表:学生表、教师(管理员)表、成绩表、课程表、班级表、登录表。学生表和教师表用来存储系统用户;成绩表用来存储学生成绩;课程表用来储存课程信息;班级表用来存储班级信息;登录表用来存储登录信息。该系统使用了MVC设计模式,实现了权限管理、登录登出、自动登录、验证码,成绩的增加、删除、修改、查询等功能。数据库使用的是mysql8.0,数据库的版本不同,那么连接驱动和连接方式也有所不同。

2.流程图

2.1登录

2.2管理员界面

2.3学生界面

3.项目目录

3.1项目目录图

 

 3.2项目目录结构

  1. Controller(控制器)包下存放的是负责转发请求,对请求进行处理的Servlet类。其中有AddScoreServlet.java(添加成绩)、AutoLoginFilter.java(自动登录)、CheckServlet.java(生成验证码)、DelScoreServlet.java(删除成绩)、ExitServlet.java(返回)、FindScoreServlet.java(查询成绩)、LoginServlet.java(登陆)、LogoutServlet.java(登出)、UpdScoreServlet.java(更改删除成绩)。
  2. Dao(数据访问)包下存放的是负责进行数据库访问的类。其中有AdministratorDao.java(管理员)、ClassesDao.java(班级)、CourseDao(课程)、GradeDao(成绩)、StudentDao(学生)、UserDao(登陆信息)。
  3. Model(模型)包下存放的是JavaBean类。其中包括Administrator.java(管理员)、Classes.java(班级)、Course(课程)、Grade(成绩)、Student(学生)、User(登陆信息)。
  4. Util(多用途)包下存放的是工具类。其中包括JDBCUtil.java(数据连接)。
  5. Jsp(动态网页)包下存放的是动态网页界面。其中包括AddScore.jsp(添加成绩界面)、Admin.jsp(管理员界面)、FindScore.jsp(查询成绩界面)、Foot.jsp(公用界面)、Login.jsp(登录界面)、Student.jsp(学生界面)、UpdDelScore.jsp(更改删除界面)。

3.3MVC模式

 4.技术说明

4.1 权限管理

本系统的使用者分为两种:学生和管理员(教师)。权限管理分为数据权限、页面权限、功能权限。数据权限是控制用户看那些数据;页面权限是控制用户可以进入哪些页面;功能权限是控制用户可以使用哪些功能。这些权限的实现通过:EequesDispatch接口中的forward()进行请求转发技术、HttpServletResponse接口中的sendRedirect()进行重定向技术、HttpSession接口进行传参技术、EL表达式中隐式对象PageContest和SessionScope、JSTL中Core标签库的<c:if>和<c:choose>和<c:when>。每个JSP页面在进行动态加载时,都会先在标签中对session域的user.identity属性进行判断,没有登陆或没有相关权限的,则不提供该界面的操作权限,并提供登录链接。

 4.2 登录登出

登录登出功能的实现主要运用了Session、Cookie技术。登录操作:当JSP的From表单提交相关的数据后,Servlet类会对提交的账号、密码、验证码、身份进行判断,通过对数据库中相关表单查询的得出结果。如果结果正确,则会将用户的状态user存入session域,接着发送一个用户的Cookie给浏览器,最后自动跳转到首页,否则会提示相应的错误提示。登出操作:首先是session对象无效,然后删除自动登录的Cookie,最后跳转至登陆界面。

4.3自动登录

自动登录技术的实现,运用了Cookie会话、Filter过滤器等技术。单一的使用Cookie也可以实现自动登录,但这样做会造成每个Servlet类中出现大量重复的校验程序,所以加入Filter对服务器的所有请求进行拦截。Filter会对用户的访问请求进行拦截,判断请求是否包含用户自动登录的Cookie。如果包含,则获取Cookie中的用户名、密码、身份,并验证用户名、密码、身份是否正确。如果正确,则将用户的登录信息封装到User对象存入Session域中,完成自动登录,完成自动登录

4.4验证码

验证码技术的实现,主要运用了Session技术。先产生4位随机数和图片,然后将图像以字节流的形式输出至客户端,最后把随机数存储至Session域中。

4.5成绩的增删改查

增、删、查、改的实现,主要运用了Java数据库连接技术。我使用的是MySQL。在与数据库连接前,需要安装MySQL的连接驱动jar包,然后注册数据库驱动,最后通过DiverManager获取数据库Connection连接对象。连接成功后再获取Statement状态对象,然后就可以使用Statement对象进行数据库的操作。对于查询操作的结果,运用ResultSet对象进行存储。

5Controller包下的类

5.1AddScoreServlet类

package Controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import Dao.AdministratorDao;
import Dao.ClassesDao;
import Dao.CourseDao;
import Dao.GradeDao;
import Dao.StudentDao;
import Model.Administrator;
import Model.Classes;
import Model.Course;
import Model.Grade;
import Model.Student;

/**
 * Servlet implementation class AddScoreServlet
 */
public class AddScoreServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		
		String stuId = request.getParameter("stuId");
		String stuName = request.getParameter("stuName");
		String courseId = request.getParameter("courseId");
		String tcId = request.getParameter("tcId");
		String courseGrade = request.getParameter("courseGrade");
		String classId = request.getParameter("classId");
		
		try{
			StudentDao stuDao = new StudentDao();
			CourseDao courseDao = new CourseDao();
			AdministratorDao adminDao = new AdministratorDao();
			ClassesDao classesDao = new ClassesDao();
			GradeDao gradeDao = new GradeDao();
			
			Student stu = stuDao.find(stuId);
			Course course = courseDao.find(courseId);
			Administrator admin = adminDao.find(tcId);
			Classes classes = classesDao.find(classId);
			Grade grade = new Grade();
			
			grade.setStuId(stuId);
			grade.setStuName(stuName);
			grade.setCourseId(courseId);
			grade.setTcId(tcId);
			grade.setCourseGrade(courseGrade);
			grade.setClassId(classId);
			if (stu.getStuName() == null) {
				request.setAttribute("errerMsg", "姓名为空");
				request.getRequestDispatcher("/Jsp/AddScore.jsp").forward(request, response);
			}
			if(stu != null || stu.getStuName() == stuName){
				if(course != null){
					if(admin != null){
						if(classes != null){
							if(gradeDao.insert(grade)){
								response.sendRedirect(request.getContextPath() + "/Jsp/AddScore.jsp");
							}else{
								request.setAttribute("errerMsg", "添加失败");
								request.getRequestDispatcher("/Jsp/AddScore.jsp").forward(request, response);
							}
						}else{
							request.setAttribute("errerMsg", "没有该班级");
							request.getRequestDispatcher("/Jsp/AddScore.jsp").forward(request, response);
						}
					}else{
						request.setAttribute("errerMsg", "没有该教师ID");
						request.getRequestDispatcher("/Jsp/AddScore.jsp").forward(request, response);
					}
				} else {
					request.setAttribute("errerMsg", "没有该课程ID");
					request.getRequestDispatcher("/Jsp/AddScore.jsp").forward(request, response);
				}
			} 
		} catch (Exception ee) {
			ee.printStackTrace();
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

5.2AutoLoginFilter类

package Controller;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

import Dao.AdministratorDao;
import Dao.StudentDao;
import Model.Administrator;
import Model.Student;
import Model.User;

/**
 * Servlet Filter implementation class AutoLoginFilter
 */
public class AutoLoginFilter implements Filter {

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest req, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		//获取一个名为autologin的cookie
		Cookie[] cookies = request.getCookies();
		String autologin = null;
		for (int i=0; cookies != null && i<cookies.length; i++){
			if("autologin".equals(cookies[i].getName())){
				//找到了指定的cookie
				autologin = cookies[i].getValue();
				break;
			}
		}
		if(autologin != null){
			//做自动登陆
			System.out.println("进入过滤器。");
			String [] parts = autologin.split("-");
			String username = parts[0];
			String password = parts[1];
			String num = parts[2];
			User user = new User();
			int flag = 0;
			if(num == "1"){
				AdministratorDao adminDao = new AdministratorDao();
				Administrator admin = adminDao.find(username);
				if(admin != null) {
					if (admin.getTcPassword().equals(password)){
						flag = 1;
						user.setIdentity("admin");
					}
				}
			} else {
				StudentDao stuDao = new StudentDao();
				Student stu = stuDao.find(username);
				if (stu != null){
					if (stu.getStuPassword().equals(password)){
						flag = 1;
						user.setIdentity("student");
					}
				}
			}
			//检查用户名和密码
			if (flag == 1 ){
				//登陆成功,将用户状态user对象存入session域
				user.setUsername(username);
				user.setPassword(password);
				request.getSession().setAttribute("user", user);
			}
		}
		//放行
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

5.3CheckServlet类

package Controller;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;


/**
 * Servlet implementation class CheckServlet
 */
public class CheckServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    private static int WIDTH = 60;
    private static int HEIGHT = 20;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		HttpSession session = request.getSession();
		response.setContentType("image/jpeg");
		ServletOutputStream sos = response.getOutputStream();
		//设置浏览器不要缓存图片
		response.setHeader("Pragma", "No-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		//创建内存图像并获得其图形上下文
		BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
		Graphics g = image.getGraphics();
		//产生随机的认证码
		char[] rands = generateCheckCode();
		//产生图片
		drawBackground(g);
		drawRands(g, rands);
		//结束图像的绘制过程,完成图像
		g.dispose();
		//将图像输出到客户端
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		ImageIO.write(image, "JPEG", bos);
		byte[] buf = bos.toByteArray();
		response.setContentLength(buf.length);
		//下面语句也可写成:bos.writeTo(sos);
		sos.write(buf);
		bos.close();
		sos.close();
		//将当前验证码存入到Session中
		session.setAttribute("check_code", new String(rands));
		//直接使用下面的代码将有问题,session对象在提交响应前获取
//		request.getSession().setAttribute("check_code", new String(rands));
	}

	private void drawRands(Graphics g, char[] rands) {
		g.setColor(Color.BLACK);
		g.setFont(new Font(null, Font.ITALIC|Font.BOLD, 18));
		//在不同的高度上输出验证码的每个字符
		g.drawString("" + rands[0], 1, 17);
		g.drawString("" + rands[1], 16, 15);
		g.drawString("" + rands[2], 31, 18);
		g.drawString("" + rands[3], 46, 16);
		System.out.println(rands);
	}

	private void drawBackground(Graphics g) {
		//画背景
		g.setColor(new Color(0xDCDCDC));
		g.fillRect(0, 0, WIDTH, HEIGHT);
		//随机产生120个干扰点
		for (int i=0; i<120; i++)
		{
			int x = (int)(Math.random() * WIDTH);
			int y = (int)(Math.random() * HEIGHT);
			int red = (int)(Math.random() * 255);
			int green = (int)(Math.random() * 255);
			int blue= (int)(Math.random() * 255);
			g.setColor(new Color(red, green, blue));
			g.drawOval(x, y, 1, 0);
		}
	}

	//生成一个4字符的验证码
	private char[] generateCheckCode() {
		//定义验证码的字符表
		String chars = "0123456789zxcvbnmasdfghjklqwertyuiop";
		char [] rands = new char[4];
		for(int i=0; i<4; i++)
		{
			int rand = (int)(Math.random() * 36);
			rands[i] = chars.charAt(rand);
		}
		return rands;
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

5.4DelScoreServlet类

package Controller;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import Dao.GradeDao;
import Model.Grade;

/**
 * Servlet implementation class DelScoreServlet
 */
public class DelScoreServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		
		String stuId = request.getParameter("stuId");
		String stuName = request.getParameter("stuName");
		String courseId = request.getParameter("courseId");
		String tcId = request.getParameter("tcId");
		String classId = request.getParameter("classId");
		String grade = request.getParameter("grade");
		
		Grade grades = new Grade();
		grades.setStuId(stuId);
		grades.setStuName(stuName);
		grades.setCourseId(courseId);
		grades.setTcId(tcId);
		grades.setClassId(classId);
		grades.setCourseGrade(grade);
		
		HttpSession session = request.getSession();
		ArrayList<Grade> list = (ArrayList<Grade>) session.getAttribute("grade");
        try {
			GradeDao gradeDao = new GradeDao();
			if (gradeDao.delete(grades)) {
				 for(int j=0;j<list.size();j++){
		             if(list.get(j) == null){
		                 list.remove(j);
		             }
		             if(list.get(j)!=null && list.get(j).getStuId().equals(stuId)
		            	&& list.get(j).getCourseId().equals(courseId)
		            	&& list.get(j).getStuName().equals(stuName)
		            	&& list.get(j).getTcId().equals(tcId)
		            	&& list.get(j).getCourseGrade().equals(grade)
		            	&& list.get(j).getClassId().equals(classId)){
		            		 list.remove(j);
		            		 break;
		            	 }
		          }
				 response.sendRedirect(request.getContextPath() + "/Jsp/UpdDelScore.jsp");
			} else {
				request.setAttribute("errerMsg", "删除失败");
				request.getRequestDispatcher("/Jsp/UpdDelScore.jsp").forward(request, response);
			}
        } catch (Exception ee) {
        	ee.printStackTrace();
        }
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

5.5ExitServlet类

package Controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import Model.User;

/**
 * Servlet implementation class ExitServlet
 */
public class ExitServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=utf-8");
		
		HttpSession session = request.getSession();
		User user = (User)session.getAttribute("user");
		System.out.println(user.getIdentity());
		if(user.getIdentity().equals("student")){
			session.removeAttribute("grade");
			response.sendRedirect(request.getContextPath() + "/Jsp/Student.jsp");
		}else{
			session.removeAttribute("grade");
			response.sendRedirect(request.getContextPath() + "/Jsp/Admin.jsp");
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

5.6FindScoreServlet类

package Controller;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse
  • 178
    点赞
  • 1071
    收藏
    觉得还不错? 一键收藏
  • 158
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 158
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值