JavaWeb学生系统+教师系统+管理员系统

news2025/4/17 18:00:21

目录:

  • 一、前言:
  • 一、用到的技术:
    • 1.前端:HTML+Css+JavaScript+Ajax+JQuery+BootStrap
    • 2.后端:Servlet+JSP+SpringMVC+JPA
  • 二、系统实现的效果:
    • 1.登录登出功能:
          • (1)不同用户可以跳转到不同的系统页面。
          • (2)设有十天内免密登录功能。
          • (3)用户不登陆无法查看其他网页。
          • (4)退出登录功能
    • 2.管理员系统功能:
          • (1)主页
          • (2)用户信息(学生、教师、管理员)管理
          • (3)班级信息管理
          • (4)教师信息管理
          • (5)学生信息管理
          • (6)课程信息管理
    • 3.学生系统功能:
          • (1)主页
          • (2)选择课程
          • (3)退选课程
          • (4)查看或修改个人信息
    • 4.教师系统功能:
          • (1)主页
          • (2)查看任课信息
          • (3)查询学生选课信息
          • (4)查看或修改个人信息
  • 三、项目结构:
    • 1.后端:
    • 2.前端:
    • 3.数据库表:
    • 4.用到的jar文件:
  • 四、代码:
    • 1.后端:
      • (1)Controller:
      • (2)Service:
      • (3)Dao:
      • (4)filter:
      • (5)model:
      • (6)pojo:
      • (7)persistence.xml:
      • (8)springmvc.xml
    • 2.前端:
      • (1)index.jsp:
      • (2)manager:
      • (3)student:
      • (4)teacher:
      • (5)web.xml:
  • 五、总结:

一、前言:

本系统作为JavaWeb课程的结课作品,是我从0开始独立完成的,历时三天时间,主要想总结一下JavaWeb课程所学知识点,因为时间原因和前端技术以及JPA知识的欠缺,系统的逻辑并不是太难,就是不断重复基本的CRUD功能。

一、用到的技术:

1.前端:HTML+Css+JavaScript+Ajax+JQuery+BootStrap

2.后端:Servlet+JSP+SpringMVC+JPA

二、系统实现的效果:

演示视频

项目文件:点击我的资源

1.登录登出功能:

(1)不同用户可以跳转到不同的系统页面。

在这里插入图片描述

(2)设有十天内免密登录功能。

在这里插入图片描述

(3)用户不登陆无法查看其他网页。

在这里插入图片描述

(4)退出登录功能

在这里插入图片描述

2.管理员系统功能:

(1)主页

在这里插入图片描述

(2)用户信息(学生、教师、管理员)管理

在这里插入图片描述

(3)班级信息管理

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(4)教师信息管理

在这里插入图片描述

(5)学生信息管理

在这里插入图片描述

(6)课程信息管理

在这里插入图片描述

3.学生系统功能:

(1)主页

在这里插入图片描述

(2)选择课程

在这里插入图片描述

(3)退选课程

在这里插入图片描述

(4)查看或修改个人信息

在这里插入图片描述
在这里插入图片描述

4.教师系统功能:

(1)主页

请添加图片描述

(2)查看任课信息

请添加图片描述

(3)查询学生选课信息

请添加图片描述

(4)查看或修改个人信息

请添加图片描述

三、项目结构:

1.后端:

请添加图片描述

2.前端:

在这里插入图片描述

3.数据库表:

在这里插入图片描述

4.用到的jar文件:

(有的其实没用,懒得找哪些没用到了)
请添加图片描述

四、代码:

1.后端:

(1)Controller:

  • LoginController.java
package com.clh.controller;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.clh.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class LoginController {
	@Autowired
	LoginService loginService;

	/**
	 * 欢迎页面,用于判断免密登录
	 * @param request 请求域
	 * @param response 请求域
	 * @param session 会话域
	 * @return 重定向到不同页面
	 */
	@RequestMapping("/welcome")
	public String welcomeServlet(HttpServletRequest request, HttpServletResponse response, HttpSession session){
		//获取Cookies,Cookies中包括:用户名,密码,用户类型
		Cookie cookies[] = request.getCookies();
		//用来存储用户名密码和用户类型
		long username = 0;
		String password = null;
		String userType = null;
		//判断浏览器的请求行的cookie字段是否有信息
		if (cookies != null) {
			for (Cookie cookie : cookies) {
				if ("username".equals(cookie.getName())){//获取cookie中的用户名
					//四大域中的信息都是String类型的,需要做数据类型转换
					username = Long.parseLong(cookie.getValue());
				}
				if("password".equals(cookie.getName())){//获取cookie中的密码
					password = cookie.getValue();
				}
				if("userType".equals(cookie.getName())){//获取cookie中的用户类型
					userType = cookie.getValue();
				}
			}
		}
		//判断用户名,密码,用户类型字段是否为空
		if(username!=0 && password!=null && userType!=null) {
			//运行到这里表示用户之前登陆成功且设置了免登录,浏览器保存了cookie
			String name = loginService.checkUsernameAndPassword(username, password, userType);
			if (name != null) {//cookie中的用户名和密码正确
				//会话域保存用户姓名
				session.setAttribute("name",name);
				//根据不同的用户类型重定向到不同的主页面
				switch (userType) {
					case "manager": {
						session.setAttribute("type","管理员");
						//管理员界面
						return "redirect:/manager/main.jsp";
					}
					case "student": {
						session.setAttribute("type","学生");
						//学生界面
						return "redirect:/student/main.jsp";
					}
					case "teacher": {
						session.setAttribute("type","教师");
						//教师界面
						return "redirect:/teacher/main.jsp";
					}
				}
			}
		}
		//cookie中没有信息或用户名密码为空或cookie中的用户名密码错误,则重定向到登录界面
		return "redirect:/index.jsp";
	}

	/**
	 * 用户登录
	 * @param request 请求域
	 * @param response 请求域
	 * @param session 会话域
	 * @return 重定向到不同的用户界面
	 */
	@RequestMapping(value="/loginValidServlet")
	public String loginvalid(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
		//获取用户在登陆界面输入的信息
		long username = Long.parseLong(request.getParameter("username"));
		String password = request.getParameter("password");
		String userType = request.getParameter("userType");
		//调用业务逻辑层判断用户名密码是否正确
		String name = loginService.checkUsernameAndPassword(username, password, userType);
		//账号密码正确
		if (name != null) {
			//会话域保存用户姓名
			session.setAttribute("name",name);
			//创建cookie并传给浏览器
			Cookie cookie1 = new Cookie("username",request.getParameter("username"));
			Cookie cookie2 = new Cookie("password",request.getParameter("password"));
			Cookie cookie3 = new Cookie("userType",request.getParameter("userType"));
			//设置cookie失效时间10天
			cookie1.setMaxAge(60*60*24*10);
			cookie2.setMaxAge(60*60*24*10);
			cookie3.setMaxAge(60*60*24*10);
			//设置响应路径,很关键,应该设置为根路径才能在系统所有页面中生效,否则只会在特定页面生效
			cookie1.setPath(request.getContextPath());
			cookie2.setPath(request.getContextPath());
			cookie3.setPath(request.getContextPath());
			//cookie传给浏览器保存
			response.addCookie(cookie1);
			response.addCookie(cookie2);
			response.addCookie(cookie3);
			//根据不同的用户类型重定向到不同的主页面
			switch (userType) {
				case "manager": {
					session.setAttribute("type","管理员");
					//管理员界面
					return "redirect:/manager/main.jsp";
				}
				case "student": {
					session.setAttribute("type","学生");
					//学生界面
					return "redirect:/student/main.jsp";
				}
				case "teacher": {
					session.setAttribute("type","教师");
					//教师界面
					return "redirect:/teacher/main.jsp";
				}
			}
		}
		return null;
	}

	/**
	 * 退出登录
	 * @param request 请求域
	 * @param response 请求域
	 * @return 重定向到登录界面
	 */
	@RequestMapping("/logoutServlet")
	public String logout(HttpServletRequest request, HttpServletResponse response){
		//获取Session,false不重建
		HttpSession session = request.getSession(false);
		if (session != null){
			//销毁Session
			session.invalidate();
			//销毁Cooike
			Cookie[] cookies = request.getCookies();
			if (cookies != null){
				for (Cookie cookie : cookies) {
					cookie.setPath(request.getContextPath());//要删除根路径下的cookie,只删除子路径下的cookie没用
					cookie.setMaxAge(0);
					response.addCookie(cookie);
				}
			}
		}
		return "redirect:/index.jsp";
	}
}
  • ManagerController.java:
package com.clh.controller;

import com.clh.model.*;
import com.clh.service.ManagerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

@Controller
@RequestMapping("/manager")
public class ManagerController {
    @Autowired
    private ManagerService managerService;

    /**
     * 获取全部学生信息
     * @param req 请求域
     * @return 转发到学生管理界面
     */
    @RequestMapping(value = "/getStudentsInfo", method = RequestMethod.GET)
    public String getStudentsInfo(HttpServletRequest req){
        List<StudentEntity> studentInfo = managerService.getStudentsInfo();
        req.setAttribute("studentInfo",studentInfo);
        return "forward:/manager/studentManage.jsp";
    }

    /**
     * 获取全部课程信息
     * @param req 请求域
     * @return 转发到课程管理界面
     */
    @RequestMapping(value = "/getCoursesInfo", method = RequestMethod.GET)
    public String getCourcesInfo(HttpServletRequest req){
        List<CourseEntity> courseInfo = managerService.getCourcesInfo();
        req.setAttribute("courseInfo",courseInfo);
        return "forward:/manager/courseManage.jsp";
    }

    /**
     * 获取全部教师信息
     * @param req 请求域
     * @return 转发到教师管理界面
     */
    @RequestMapping(value = "/getTeachersInfo", method = RequestMethod.GET)
    public String getTeachersInfo(HttpServletRequest req){
        List<TeacherEntity> teacherInfo = managerService.getTeachersInfo();
        req.setAttribute("teacherInfo",teacherInfo);
        return "forward:/manager/teacherManage.jsp";
    }

    /**
     * 获取全部班级信息
     * @param req 请求域
     * @return 转发到班级管理界面
     */
    @RequestMapping(value = "/getClassesInfo", method = RequestMethod.GET)
    public String getClassesInfo(HttpServletRequest req){
        List<ClazzEntity> classInfo = managerService.getClassesInfo();
        req.setAttribute("classInfo",classInfo);
        return "forward:/manager/classManage.jsp";
    }

    /**
     * 获取全部用户信息:管理员,教师,学生
     * @param req 请求域
     * @return 转发到用户管理界面
     */
    @RequestMapping(value = "/getUsersInfo", method = RequestMethod.GET)
    public String getUsersInfo(HttpServletRequest req){
        List<StudentEntity> studentInfo = managerService.getStudentsInfo();
        req.setAttribute("studentInfo",studentInfo);
        List<TeacherEntity> teacherInfo = managerService.getTeachersInfo();
        req.setAttribute("teacherInfo",teacherInfo);
        List<ManagerEntity> managerInfo = managerService.getManagersInfo();
        req.setAttribute("managerInfo",managerInfo);
        return "forward:/manager/userManage.jsp";
    }

    /**
     * 删除一门课程
     * @return 是否删除成功 true,false(这里返回true确实有点简陋,应该返回很多数据,用一个特定对象包装)
     */
    @ResponseBody
    @RequestMapping(value = "/dropCourse")
    public Object dropCourse(HttpServletRequest request){
        String courseId = request.getParameter("courseId");
        return managerService.dropCourse(courseId);
    }

    /**
     * 更新一门课程信息
     * @param request 请求域
     * @return 是否更新成功 true,false
     */
    @ResponseBody
    @RequestMapping(value = "/updateCourse")
    public Object updateCourse(HttpServletRequest request){
        String cid = request.getParameter("cid");
        String cname = request.getParameter("cname");
        String cplace = request.getParameter("cplace");
        String ctime = request.getParameter("ctime");
        String cteachername = request.getParameter("cteachername");
        return managerService.updateCourse(cid,cname,cplace,ctime,cteachername);
    }

    /**
     * 删除学生信息
     * @param request 请求域
     * @return 是否删除成功 true,false
     */
    @ResponseBody
    @RequestMapping(value = "/dropStudent")
    public Object dropStudent(HttpServletRequest request){
        String studentId = request.getParameter("studentId");
        return managerService.dropStudent(studentId);
    }

    /**
     * 更新学生信息
     * @param request 请求域
     * @return 是否更新成功 true,false
     */
    @ResponseBody
    @RequestMapping(value = "/updateStudent")
    public Object updateStudent(HttpServletRequest request){
        String sid = request.getParameter("sid");
        String sname = request.getParameter("sname");
        String sclass = request.getParameter("sclass");
        return managerService.updateStudent(sid,sname,sclass);
    }

    /**
     * 删除教师信息
     * @param request 请求域
     * @return 是否删除成功 true,false
     */
    @ResponseBody
    @RequestMapping(value = "/dropTeacher")
    public Object dropTeacher(HttpServletRequest request){
        String teacherId = request.getParameter("teacherId");
        return managerService.dropTeacher(teacherId);
    }

    /**
     * 更新教师信息
     * @param request 请求域
     * @return 是否更新成功 true,false
     */
    @ResponseBody
    @RequestMapping(value = "/updateTeacher")
    public Object updateTeacher(HttpServletRequest request){
        String tid = request.getParameter("tid");
        String tname = request.getParameter("tname");
        return managerService.updateTeacher(tid,tname);
    }

    /**
     * 删除班级信息
     * @param request 请求域
     * @return 是否删除成功 true,false
     */
    @ResponseBody
    @RequestMapping(value = "/dropClazz")
    public Object dropClazz(HttpServletRequest request){
        String clId = request.getParameter("clId");
        return managerService.dropClazz(clId);
    }

    /**
     * 更新班级信息
     * @param request 请求域
     * @return 是否更新成功 true,false
     */
    @ResponseBody
    @RequestMapping(value = "/updateClazz")
    public Object updateClazz(HttpServletRequest request){
        String clid = request.getParameter("clid");
        String clgrade = request.getParameter("clgrade");
        String clnumber = request.getParameter("clnumber");
        return managerService.updateClazz(clid,clgrade,clnumber);
    }

    /**
     * 添加课程信息
     * @param request 请求域
     * @return 是否添加成功 true,false
     */
    @ResponseBody
    @RequestMapping(value = "/addCourse")
    public Object addCourse(HttpServletRequest request){
        String cid = request.getParameter("cid");
        String cname = request.getParameter("cname");
        String cplace = request.getParameter("cplace");
        String ctime = request.getParameter("ctime");
        String cteachername = request.getParameter("cteachername");

        return managerService.addCourse(cid,cname,cplace,ctime,cteachername);
    }

    /**
     * 添加学生信息
     * @param request 请求域
     * @return 是否添加成功 true,false
     */
    @ResponseBody
    @RequestMapping(value = "/addStudent")
    public Object addStudent(HttpServletRequest request){
        String sid = request.getParameter("sid");
        String sname = request.getParameter("sname");
        String sclass = request.getParameter("sclass");
        String spassword = request.getParameter("spassword");

        return managerService.addStudent(sid,sname,sclass,spassword);
    }

    /**
     * 添加教师信息
     * @param request 请求域
     * @return 是否添加成功 true,false
     */
    @ResponseBody
    @RequestMapping(value = "/addTeacher")
    public Object addTeacher(HttpServletRequest request){
        String tid = request.getParameter("tid");
        String tname = request.getParameter("tname");
        String tpassword = request.getParameter("tpassword");

        return managerService.addTeacher(tid,tname,tpassword);
    }

    /**
     * 添加班级信息
     * @param request 请求域
     * @return 是否添加成功 true,false
     */
    @ResponseBody
    @RequestMapping(value = "/addClass")
    public Object addClass(HttpServletRequest request){
        String clid = request.getParameter("clid");
        String clgrade = request.getParameter("clgrade");
        String clnumber = request.getParameter("clnumber");
        return managerService.addClass(clid,clgrade,clnumber);
    }
}
  • StudentController.java:
package com.clh.controller;

import com.clh.model.CourseEntity;
import com.clh.model.StudentEntity;
import com.clh.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;

@Controller
@RequestMapping("/student")
public class StudentController {
    @Autowired
    StudentService studentService;

    /**
     * 获取个人信息
     * @param request 请求域
     * @param session 会话域
     * @return 转发到个人信息界面
     */
    @RequestMapping("/getPersonalInfo")
    public String getPersonalInfo(HttpServletRequest request, HttpSession session){
        String name = (String) session.getAttribute("name");
        StudentEntity personalInfo = studentService.getPersonalInfo(name);
        request.setAttribute("personalInfo",personalInfo);
        return "forward:/student/personalInfo.jsp";
    }

    /**
     * 更新个人信息
     * @param request 请求域
     * @param session 会话域
     * @param student 前端发来的数据,SpringMVC自动包装
     * @return 返回更新后的学生信息
     */
    @ResponseBody //ajax请请求需要使用该注解解析,前端发来的json数据自动注入到student对象中
    @RequestMapping("/updatePersonalInfo")
    public Object updatePersonalInfo(HttpServletRequest request, HttpSession session, StudentEntity student){
        studentService.updatePersonalInfo(student);
        request.setAttribute("personalInfo",student);
        session.setAttribute("name",student.getSname());
        return student;//springmvc使用jackson自动将数据转换为Json类型后发给前端
    }

    /**
     * 获取已选课程
     * @param request 请求域
     * @param session 会话域
     * @return 转发到已选课程界面
     */
    @RequestMapping("/getSelectedCourse")
    public String getSelectedCourse(HttpServletRequest request, HttpSession session){
        //获取姓名
        String name = (String) session.getAttribute("name");
        List<CourseEntity> courses = studentService.getSelectedCourse(name);
        request.setAttribute("courses",courses);
        return "forward:/student/myCourse.jsp";
    }

    /**
     * 获取未选课程
     * @param request 请求域
     * @param session 会话域
     * @return 转发到未选课程界面
     */
    @RequestMapping("/getNotSelectedCourse")
    public String getNotSelectedCourse(HttpServletRequest request, HttpSession session){
        //获取姓名
        String name = (String) session.getAttribute("name");
        List<CourseEntity> courses = studentService.getNotSelectedCourse(name);
        request.setAttribute("courses",courses);
        return "forward:/student/notSelectedCourse.jsp";
    }

    /**
     * 选择一门课程
     * @param request 请求域
     * @param session 会话域
     * @return 返回选课记录
     */
    @ResponseBody //ajax请请求需要使用该注解解析
    @RequestMapping("/pickCourse")
    public Object pickCourse(HttpServletRequest request, HttpSession session){
        String userName = (String) session.getAttribute("name");
        String courseId = request.getParameter("courseId");
        return studentService.pickCourse(userName,courseId);
    }

    /**
     * 退选一门课程
     * @param request 请求域
     * @param session 会话域
     * @return 返回推选记录
     */
    @ResponseBody //ajax请请求需要使用该注解解析
    @RequestMapping("/dropCourse")
    public Object dropCourse(HttpServletRequest request, HttpSession session){
        String userName = (String) session.getAttribute("name");
        String courseId = request.getParameter("courseId");
        return studentService.dropCourse(userName,courseId);
    }
}
  • TeacherController.java:
package com.clh.controller;


import com.clh.model.CourseEntity;
import com.clh.model.TeacherEntity;
import com.clh.service.TeacherService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;

@Controller
@RequestMapping("/teacher")
public class TeacherController {
    @Autowired
    TeacherService teacherService;

    /**
     * 获取个人信息
     * @param request 请求域
     * @param session 会话域
     * @return 转发到个人信息界面
     */
    @RequestMapping("/getPersonalInfo")
    public String getPersonalInfo(HttpServletRequest request, HttpSession session){
        String name = (String) session.getAttribute("name");
        TeacherEntity personalInfo = teacherService.getPersonalInfo(name);
        request.setAttribute("personalInfo",personalInfo);
        return "forward:/teacher/personalInfo.jsp";
    }

    /**
     * 修改个人信息
     * @param request 请求域
     * @param session 会话域
     * @param teacher  前端传来的数据,SpringMVC可以自动封装
     * @return 更新后的教师信息
     */
    @ResponseBody //ajax请请求需要使用该注解解析,前端发来的json数据自动注入到teacher对象中
    @RequestMapping("/updatePersonalInfo")
    public Object updatePersonalInfo(HttpServletRequest request, HttpSession session, TeacherEntity teacher){
        teacherService.updatePersonalInfo(teacher);
        request.setAttribute("personalInfo",teacher);
        session.setAttribute("name",teacher.getTname());
        return teacher;//springmvc使用jackson自动将数据转换为Json类型后发给前端
    }

    /**
     * 获取任课信息
     * @param request 请求域
     * @param session 会话域
     * @return 转发到任课信息界面
     */
    @RequestMapping("/getMyCourse")
    public String getMyCourse(HttpServletRequest request, HttpSession session){
        String name = (String) session.getAttribute("name");
        List<CourseEntity> courses = teacherService.getMyCourse(name);
        request.setAttribute("courses",courses);
        return "forward:/teacher/myCourse.jsp";
    }

    /**
     * 获取任课信息
     * @param session 会话域
     * @return 返回任课信息给前端
     */
    @ResponseBody
    @RequestMapping("/getStudentCourse")
    public Object getStudentCourse(HttpSession session){
        String name = (String) session.getAttribute("name");
        List<CourseEntity> courses = teacherService.getMyCourse(name);
        return courses;
    }

    /**
     * 获取任课下的学生信息
     * @param request 请求域
     * @param session 会话域
     * @return 获取学生信息集合
     */
    @ResponseBody
    @RequestMapping("/getStudentsByCourseName")
    public Object getStudentsByCourseName(HttpServletRequest request,HttpSession session){
        String name = (String) session.getAttribute("name");
        String courseName = request.getParameter("courseName");
        return teacherService.getStudentsByCourseName(name, courseName);
    }
}

(2)Service:

  • LoginService.java:
package com.clh.service;

import com.clh.dao.ManagerMapper;
import com.clh.dao.StudentMapper;
import com.clh.dao.TeacherMapper;
import com.clh.model.ManagerEntity;
import com.clh.model.StudentEntity;
import com.clh.model.TeacherEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class LoginService {
    @Autowired
    ManagerMapper managerMapper;
    @Autowired
    StudentMapper studentMapper;
    @Autowired
    TeacherMapper teacherMapper;

    /**
     * 检查用户名密码和用户类型是否正确
     * @param username
     * @param password
     * @param userType
     * @return
     */
    public String checkUsernameAndPassword(long username,String password,String userType){
        switch (userType) {
            case "manager": {
                ManagerEntity manager = managerMapper.getManagerById(username);
                if (manager != null){
                    if (manager.getMpassword().equals(password) == true){
                        return manager.getMname();
                    }
                }
                return null;
            }
            case "student": {
                StudentEntity student = studentMapper.getStudentById(username);
                if (student != null){
                    if (student.getSpassword().equals(password) == true){
                        return student.getSname();
                    }
                }
                return null;
            }
            case "teacher": {
                TeacherEntity teacher = teacherMapper.getTeacherById(username);
                if (teacher != null){
                    if (teacher.getTpassword().equals(password) == true){
                        return teacher.getTname();
                    }
                }
                return null;
            }
        }
        return null;
    }
}
  • ManagerService.java:
package com.clh.service;

import com.clh.dao.ManagerMapper;
import com.clh.model.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class ManagerService {
    @Autowired
    private ManagerMapper managerMapper;

    /**
     * 获取全部课程信息
     * @return
     */
    public List<CourseEntity> getCourcesInfo(){
        return managerMapper.getAllCourses();
    }

    /**
     * 获取全部学生信息
     * @return
     */
    public List<StudentEntity> getStudentsInfo() {
        return managerMapper.getAllStudents();
    }

    /**
     * 获取全部教师信息
     * @return
     */
    public List<TeacherEntity> getTeachersInfo() {
        return managerMapper.getAllTeachers();
    }

    /**
     * 获取全部班级信息
     * @return
     */
    public List<ClazzEntity> getClassesInfo() {
        return managerMapper.getAllClasses();
    }

    /**
     * 获取全部管理员信息
     * @return
     */
    public List<ManagerEntity> getManagersInfo() {
        return managerMapper.getAllManagers();
    }

    /**
     * 删除一门课程
     * @param courseId
     * @return
     */
    public boolean dropCourse(String courseId) {
        return managerMapper.dropCourse(Long.parseLong(courseId));
    }

    /**
     * 更新一门课程信息
     * @param cid
     * @param cname
     * @param cplace
     * @param ctime
     * @param cteachername
     * @return
     */
    public boolean updateCourse(String cid, String cname, String cplace, String ctime, String cteachername) {
        return managerMapper.updateCourse(Long.parseLong(cid), cname, cplace, ctime, cteachername);
    }

    /**
     * 删除学生信息
     * @param studentId
     * @return
     */
    public boolean dropStudent(String studentId) {
        return managerMapper.dropStudent(Long.parseLong(studentId));
    }

    /**
     * 更新学生信息
     * @param sid
     * @param sname
     * @param sclass
     * @return
     */
    public boolean updateStudent(String sid, String sname, String sclass) {
        return managerMapper.updateStudent(Long.parseLong(sid), sname, sclass);
    }

    /**
     * 删除教师信息
     * @param teacherId
     * @return
     */
    public boolean dropTeacher(String teacherId) {
        return managerMapper.dropTeacher(Long.parseLong(teacherId));
    }

    /**
     * 更新教师信息
     * @param tid
     * @param tname
     * @return
     */
    public boolean updateTeacher(String tid, String tname) {
        return managerMapper.updateTeacher(Long.parseLong(tid), tname);
    }

    /**
     * 删除班级信息
     * @param clId
     * @return
     */
    public boolean dropClazz(String clId) {
        return managerMapper.dropClazz(clId);
    }

    /**
     * 更新班级信息
     * @param clid
     * @param clgrade
     * @param clnumber
     * @return
     */
    public boolean updateClazz(String clid, String clgrade, String clnumber) {
        return managerMapper.updateClazz(clid, clgrade, Integer.parseInt(clnumber));
    }

    /**
     * 添加课程信息
     * @param cid
     * @param cname
     * @param cplace
     * @param ctime
     * @param cteachername
     * @return
     */
    public boolean addCourse(String cid, String cname, String cplace, String ctime, String cteachername) {
        return managerMapper.addCourse(Long.parseLong(cid),cname,cplace,ctime, cteachername);
    }

    /**
     * 添加学生信息
     * @param sid
     * @param sname
     * @param sclass
     * @param spassword
     * @return
     */
    public boolean addStudent(String sid, String sname, String sclass, String spassword) {
        return managerMapper.addStudent(Long.parseLong(sid),sname,sclass,spassword);
    }

    /**
     * 添加教师信息
     * @param tid
     * @param tname
     * @param tpassword
     * @return
     */
    public boolean addTeacher(String tid, String tname, String tpassword) {
        return managerMapper.addTeacher(Long.parseLong(tid),tname,tpassword);
    }

    /**
     * 添加班级信息
     * @param clid
     * @param clgrade
     * @param clnumber
     * @return
     */
    public boolean addClass(String clid, String clgrade, String clnumber) {
        return managerMapper.addClass(clid,clgrade,Integer.parseInt(clnumber));
    }
}
  • StudentService.java:
package com.clh.service;

import com.clh.dao.StudentMapper;
import com.clh.model.CourseEntity;
import com.clh.model.ScEntity;
import com.clh.model.StudentEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class StudentService {
    @Autowired
    StudentMapper studentMapper;

    /**
     * 获取个人信息
     * @param name
     * @return
     */
    public StudentEntity getPersonalInfo(String name){
        return studentMapper.getStudentByName(name);
    }

    /**
     * 更新个人信息
     * @param student
     */
    public void updatePersonalInfo(StudentEntity student) {
        studentMapper.updatePersonalInfo(student);
    }

    /**
     * 获取已选选课信息
     * @param name
     * @return
     */
    public List<CourseEntity> getSelectedCourse(String name) {
        return studentMapper.getSelectedCourseByName(name);
    }

    /**
     * 获取未选课程信息
     * @param name
     * @return
     */
    public List<CourseEntity> getNotSelectedCourse(String name) {
        return studentMapper.getNotSelectedCourseByName(name);
    }

    /**
     * 选择一门课程
     * @param userName
     * @param courseId
     * @return
     */
    public ScEntity pickCourse(String userName, String courseId) {
        StudentEntity student = studentMapper.getStudentByName(userName);
        long sid = student.getSid();
        long cid = Long.parseLong(courseId);
        return studentMapper.insertIntoSc(sid, cid);
    }

    /**
     * 退选一门课程
     * @param userName
     * @param courseId
     * @return
     */
    public ScEntity dropCourse(String userName, String courseId) {
        StudentEntity student = studentMapper.getStudentByName(userName);
        long sid = student.getSid();
        long cid = Long.parseLong(courseId);
        return studentMapper.deleteFromSc(sid, cid);
    }
}
  • TeacherService.java:
package com.clh.service;

import com.clh.dao.StudentMapper;
import com.clh.dao.TeacherMapper;
import com.clh.model.CourseEntity;
import com.clh.model.StudentEntity;
import com.clh.model.TeacherEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TeacherService {
    @Autowired
    TeacherMapper teacherMapper;

    /**
     * 获取个人信息
     * @param name
     * @return
     */
    public TeacherEntity getPersonalInfo(String name){
        return teacherMapper.getTeacherByName(name);
    }

    /**
     * 更行个人信息
     * @param teacher
     */
    public void updatePersonalInfo(TeacherEntity teacher) {
        teacherMapper.updatePersonalInfo(teacher);
    }

    /**
     * 获取任课信息
     * @param name
     * @return
     */
    public List<CourseEntity> getMyCourse(String name) {
        return teacherMapper.getCoursesByTeahcerName(name);
    }

    /**
     * 获取任课下的学生信息
     * @param name
     * @param courseName
     * @return
     */
    public List<StudentEntity> getStudentsByCourseName(String name, String courseName) {
        List<CourseEntity> courses = getMyCourse(name);
        for (CourseEntity course:courses) {
            if (course.getCname().equals(courseName) == true){
                return course.getStudents();
            }
        }
        return null;
    }
}

(3)Dao:

  • ManagerMapper.java:
package com.clh.dao;

import com.clh.model.*;
import com.clh.util.EntityManagerUtil;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;

@Repository
public class ManagerMapper {
    /**
     * 根据ID获取管理员信息
     * @param id 管理员ID主键
     * @return 管理员信息
     */
    public ManagerEntity getManagerById(long id){
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        ManagerEntity manager = entityManager.find(ManagerEntity.class, id);
        entityManager.close();
        return manager;
    }

    /**
     * 获取所有课程信息
     * @return 所有课程信息
     */
    public List<CourseEntity> getAllCourses(){
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        Query query = entityManager.createQuery("select c from CourseEntity c");
        List<CourseEntity> courses = query.getResultList();
        entityManager.close();
        return courses;
    }

    /**
     * 获取所有学生信息
     * @return 所有学生信息
     */
    public List<StudentEntity> getAllStudents() {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        Query query = entityManager.createQuery("select s from StudentEntity s");
        List<StudentEntity> students = query.getResultList();
        entityManager.close();
        return students;
    }

    /**
     * 获取所有教师信息
     * @return 所有教师信息
     */
    public List<TeacherEntity> getAllTeachers() {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        Query query = entityManager.createQuery("select t from TeacherEntity t");
        List<TeacherEntity> teachers = query.getResultList();
        entityManager.close();
        return teachers;
    }

    /**
     * 获取所有班级信息
     * @return 所有课程信息
     */
    public List<ClazzEntity> getAllClasses() {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        Query query = entityManager.createQuery("select cl from ClazzEntity cl");
        List<ClazzEntity> classes = query.getResultList();
        entityManager.close();
        return classes;
    }

    /**
     * 获取所有管理员信息
     * @return 所有管理员信息
     */
    public List<ManagerEntity> getAllManagers() {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        Query query = entityManager.createQuery("select m from ManagerEntity m");
        List<ManagerEntity> managers = query.getResultList();
        entityManager.close();
        return managers;
    }

    /**
     * 根据ID删除课程信息
     * @param courseId 课程ID主键
     * @return 是否删除成功
     */
    public boolean dropCourse(long courseId) {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        CourseEntity course = entityManager.find(CourseEntity.class, courseId);
        entityManager.getTransaction().begin();
        entityManager.remove(course);
        entityManager.getTransaction().commit();
        entityManager.close();
        return true;
    }

    /**
     * 根据ID更新课程信息
     * @param cid 课程ID主键
     * @param cname 课程名
     * @param cplace 上课地点
     * @param ctime 上课时间
     * @param cteachername 任课老师姓名
     * @return
     */
    public boolean updateCourse(long cid, String cname, String cplace, String ctime, String cteachername) {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        entityManager.getTransaction().begin();
        //踩坑:这里不能用merge,会导致关联栈溢出
        Query query = entityManager.createQuery(" UPDATE CourseEntity c SET c.cname = :cname,c.cplace = :cplace,c.ctime = :ctime WHERE c.cid = :cid");
        query.setParameter("cname",cname);
        query.setParameter("cplace",cplace);
        query.setParameter("ctime",ctime);
        query.setParameter("cid",cid);
        query.executeUpdate();
        entityManager.getTransaction().commit();
        entityManager.close();
        return true;
    }

    /**
     * 根据ID删除学生信息
     * @param studentId 学生ID主键
     * @return 是否删除成功
     */
    public boolean dropStudent(long studentId) {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        StudentEntity student = entityManager.find(StudentEntity.class, studentId);
        entityManager.getTransaction().begin();
        entityManager.remove(student);
        entityManager.getTransaction().commit();
        entityManager.close();
        return true;
    }

    /**
     * 根据ID更新学生信息
     * @param sid 学生ID主键
     * @param sname 学生姓名
     * @param sclass 所在班级
     * @return 是否更新成功
     */
    public boolean updateStudent(long sid, String sname, String sclass) {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        entityManager.getTransaction().begin();
        //踩坑:这里不能用merge,会导致关联栈溢出
        Query query = entityManager.createQuery(" UPDATE StudentEntity s SET s.sname = :sname,s.sclass = :sclass WHERE s.sid = :sid");
        query.setParameter("sname",sname);
        query.setParameter("sclass",sclass);
        query.setParameter("sid",sid);
        query.executeUpdate();
        entityManager.getTransaction().commit();
        entityManager.close();
        return true;
    }

    /**
     * 根据ID删除教师信息
     * @param teacherId 教师ID主键
     * @return 是否删除成功
     */
    public boolean dropTeacher(long teacherId) {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        TeacherEntity teacher = entityManager.find(TeacherEntity.class, teacherId);
        entityManager.getTransaction().begin();
        entityManager.remove(teacher);
        entityManager.getTransaction().commit();
        entityManager.close();
        return true;
    }

    /**
     * 根据ID更新教师信息
     * @param tid 教师ID主键
     * @param tname 教师姓名
     * @return 是否更新成功
     */
    public boolean updateTeacher(long tid, String tname) {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        entityManager.getTransaction().begin();
        //踩坑:这里不能用merge,会导致关联栈溢出
        Query query = entityManager.createQuery(" UPDATE TeacherEntity t SET t.tname = :tname WHERE t.tid = :tid");
        query.setParameter("tname",tname);
        query.setParameter("tid",tid);
        query.executeUpdate();
        entityManager.getTransaction().commit();
        entityManager.close();
        return true;
    }

    /**
     * 根据ID删除班级信息
     * @param clId 课程ID主键
     * @return 是否删除成功
     */
    public boolean dropClazz(String clId) {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        ClazzEntity clazz = entityManager.find(ClazzEntity.class, clId);
        entityManager.getTransaction().begin();
        entityManager.remove(clazz);
        entityManager.getTransaction().commit();
        entityManager.close();
        return true;
    }

    /**
     * 根据ID更新班级信息
     * @param clid 班级ID主键
     * @param clgrade 年级字段
     * @param clnumber 班级人数
     * @return 是否更新成功
     */
    public boolean updateClazz(String clid, String clgrade, int clnumber) {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        entityManager.getTransaction().begin();
        //踩坑:这里不能用merge,会导致关联栈溢出
        Query query = entityManager.createQuery(" UPDATE ClazzEntity cl SET cl.clgrade = :clgrade, cl.clnumber = :clnumber  WHERE cl.clid = :clid");
        query.setParameter("clgrade",clgrade);
        query.setParameter("clnumber",clnumber);
        query.setParameter("clid",clid);
        query.executeUpdate();
        entityManager.getTransaction().commit();
        entityManager.close();
        return true;
    }

    /**
     * 添加课程信息
     * @param cid 课程ID主键
     * @param cname 课程名
     * @param cplace 上课地点
     * @param ctime 上课时间
     * @param cteachername 任课老师姓名
     * @return 是否添加成功
     */
    public boolean addCourse(long cid, String cname, String cplace, String ctime, String cteachername) {
        CourseEntity course = new CourseEntity();
        course.setCid(cid);
        course.setCname(cname);
        course.setCplace(cplace);
        course.setCtime(ctime);
        for(TeacherEntity t:getAllTeachers()){
            if (cteachername.equals(t.getTname())){
                course.setTeacher(t);
            }
        }
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        entityManager.getTransaction().begin();
        entityManager.persist(course);
        entityManager.getTransaction().commit();
        entityManager.close();
        return true;
    }

    /**
     * 添加学生信息
     * @param sid 学生ID主键
     * @param sname 学生姓名
     * @param sclass 班级
     * @param spassword 密码
     * @return 是否添加成功
     */
    public boolean addStudent(long sid, String sname, String sclass, String spassword) {
        StudentEntity student = new StudentEntity();
        student.setSid(sid);
        student.setSname(sname);
        student.setSclass(sclass);
        student.setSpassword(spassword);
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        entityManager.getTransaction().begin();
        entityManager.persist(student);
        entityManager.getTransaction().commit();
        entityManager.close();
        return true;
    }

    /**
     * 添加教师信息
     * @param tid 教师ID主键
     * @param tname 教师姓名
     * @param tpassword 密码
     * @return 是否添加成功
     */
    public boolean addTeacher(long tid, String tname, String tpassword) {
        TeacherEntity teacher = new TeacherEntity();
        teacher.setTid(tid);
        teacher.setTname(tname);
        teacher.setTpassword(tpassword);
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        entityManager.getTransaction().begin();
        entityManager.persist(teacher);
        entityManager.getTransaction().commit();
        entityManager.close();
        return true;
    }

    /**
     * 添加班级信息
     * @param clid 班级ID主键
     * @param clgrade 年级字段
     * @param clnumber 班级人数
     * @return 是否添加成功
     */
    public boolean addClass(String clid, String clgrade, int clnumber) {
        ClazzEntity clazz = new ClazzEntity();
        clazz.setClid(clid);
        clazz.setClgrade(clgrade);
        clazz.setClnumber(clnumber);
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        entityManager.getTransaction().begin();
        entityManager.persist(clazz);
        entityManager.getTransaction().commit();
        entityManager.close();
        return true;
    }
}
  • StudentMapper.java:
package com.clh.dao;

import com.clh.model.CourseEntity;
import com.clh.model.ScEntity;
import com.clh.model.StudentEntity;
import com.clh.util.EntityManagerUtil;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;

@Repository
public class StudentMapper {
    /**
     * 根据ID获取学生信息
     * @param id 学生ID主键
     * @return 学生信息
     */
    public StudentEntity getStudentById(long id){
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        StudentEntity student = entityManager.find(StudentEntity.class, id);
        entityManager.close();
        return student;
    }

    /**
     * 根据姓名获取学生信息
     * @param name 学生姓名
     * @return 学生信息
     */
    public StudentEntity getStudentByName(String name){
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        Query query = entityManager.createQuery("select s from StudentEntity s where s.sname = :name ");
        StudentEntity student = (StudentEntity) query.setParameter("name", name).getSingleResult();
        entityManager.close();
        return student;
    }

    /**
     * 更新个人信息
     * @param student 学生信息
     */
    public void updatePersonalInfo(StudentEntity student) {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        entityManager.getTransaction().begin();
        //踩坑:这里不能用merge,会导致关联栈溢出
        Query query = entityManager.createQuery(" UPDATE StudentEntity s SET s.sname = :sname,s.sclass = :sclass,s.spassword = :spassword WHERE s.sid = :sid");
        query.setParameter("sname",student.getSname());
        query.setParameter("sclass",student.getSclass());
        query.setParameter("spassword",student.getSpassword());
        query.setParameter("sid",student.getSid());
        query.executeUpdate();
        entityManager.getTransaction().commit();
        entityManager.close();
    }

    /**
     * 根据学生姓名获取选择的课程
     * @param name 学生姓名
     * @return 学生已选课程
     */
    public List<CourseEntity> getSelectedCourseByName(String name) {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        //先获取用户id
        long sid = getStudentByName(name).getSid();
        //根据用户id查中间表,查出已选的课程id根据id集合级联查询已选的课程信息
        Query query = entityManager.createQuery("select c from CourseEntity c where c.cid in(select sc.cid from ScEntity sc where sc.sid = :sid)");
        List<CourseEntity> courses  = query.setParameter("sid", sid).getResultList();
        entityManager.close();
        return courses;
        /*不知道这么写为什么不对,做个记号(排除懒加载原因)
        StudentEntity student = getStudentByName(name);
        return student.getCourses();
        */
    }

    /**
     * 根据学生姓名获取未选的课程
     * @param name 学生姓名
     * @return 学生未选课程
     */
    public List<CourseEntity> getNotSelectedCourseByName(String name) {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        //先获取用户id
        long sid = getStudentByName(name).getSid();
        //根据用户id查中间表,查出已选的课程id根据id集合级联查询未选的课程信息
        Query query = entityManager.createQuery("select c from CourseEntity c where c.cid not in(select sc.cid from ScEntity sc where sc.sid = :sid)");
        List<CourseEntity> courses  = query.setParameter("sid", sid).getResultList();
        entityManager.close();
        return courses;
    }

    /**
     * 插入选课记录
     * @param sid 学生ID主键
     * @param cid 课程ID主键
     * @return sc表中添加的一条记录
     */
    public ScEntity insertIntoSc(long sid, long cid) {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        ScEntity sc = new ScEntity();
        sc.setCid(cid);
        sc.setSid(sid);
        //插入操作必须开始事务
        entityManager.getTransaction().begin();
        entityManager.persist(sc);
        entityManager.getTransaction().commit();
        entityManager.close();
        return sc;
    }

    /**
     * 删除选课记录
     * @param sid 学生ID主键
     * @param cid 课程ID主键
     * @return sc表中删除的一条字段
     */
    public ScEntity deleteFromSc(long sid, long cid) {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        Query query = entityManager.createQuery("select sc from ScEntity sc where sc.cid = :cid and sc.sid = :sid");
        ScEntity sc = (ScEntity) query.setParameter("sid", sid).setParameter("cid", cid).getSingleResult();
        //删除操作必须开始事务
        entityManager.getTransaction().begin();
        System.out.println(sc.getCid());
        entityManager.remove(sc);
        entityManager.getTransaction().commit();
        entityManager.close();
        return sc;
    }

}
  • TeacherMapper.java:
package com.clh.dao;

import com.clh.model.CourseEntity;
import com.clh.model.TeacherEntity;
import com.clh.util.EntityManagerUtil;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;

@Repository
public class TeacherMapper {
    /**
     * 根据ID获取教师信息
     * @param id 教师ID主键
     * @return 教师信息
     */
        public TeacherEntity getTeacherById(long id){
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        TeacherEntity teacher = entityManager.find(TeacherEntity.class, id);
        entityManager.close();
        return teacher;
    }

    /**
     * 根据姓名获取教师信息
     * @param name 教师姓名
     * @return 教师信息
     */
    public TeacherEntity getTeacherByName(String name){
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        Query query = entityManager.createQuery("select t from TeacherEntity t where t.tname = :name ");
        TeacherEntity teacher = (TeacherEntity) query.setParameter("name", name).getSingleResult();
        entityManager.close();
        return teacher;
    }

    /**
     * 更新个人信息
     * @param teacher 教师信息
     */
    public void updatePersonalInfo(TeacherEntity teacher) {
        EntityManager entityManager = EntityManagerUtil.getEntityManager();
        entityManager.getTransaction().begin();
        //踩坑:这里不能用merge,会导致关联栈溢出
        Query query = entityManager.createQuery(" UPDATE TeacherEntity t SET t.tname = :tname,t.tpassword = :tpassword WHERE t.tid = :tid");
        query.setParameter("tname",teacher.getTname());
        query.setParameter("tpassword",teacher.getTpassword());
        query.setParameter("tid",teacher.getTid());
        query.executeUpdate();
        entityManager.getTransaction().commit();
        entityManager.close();
    }

    /**
     * 根据教师姓名获取教师任课信息
     * @param name 教师姓名
     * @return 教师任课信息
     */
    public List<CourseEntity>  getCoursesByTeahcerName(String name) {
        TeacherEntity teacher = getTeacherByName(name);
        List<CourseEntity> courses = teacher.getCourses();
        return courses;
    }
}

(4)filter:

  • CheckFilter.java:
package com.clh.filter;

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

/**
 * 过滤器:检查是否已登录,防止有些用户不登录而是直接输入URL就能跳转到相关网页的情况发生
 */
public class CheckFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpSession session = request.getSession(false);//获取session,没有不会新建
        String servletPath = request.getServletPath();//获取用户的请求路径
        /*放行允许系统进入的情况:
        1.会话域中的name字段不为空(每次登录成功我的代码都会向Session域添加name字段)
        2.用户访问/welcome欢迎页
        3.用户访问/index.jsp登录页
        4.前端访问后端的/loginValidServlet判断用户名密码是否正确Servlet
         */
        if((session != null && session.getAttribute("name") != null)||"/welcome".equals(servletPath)||
                "/error.jsp".equals(servletPath)||"/index.jsp".equals(servletPath)||"/loginValidServlet".equals(servletPath)){//放行条件
            chain.doFilter(request,response);
        }else{
            //作用:为了防止有些用户不登录而是直接输入URL就能跳转到相关网页的情况发生
            //强制用户必须先登录或之前设置了十天免密登录,且登陆成功,否则无法访问该webapp下的其他网页
            response.sendRedirect(request.getContextPath()+"/welcome");//注意执行该语句代表不放行,但是执行该语句跳转到/welcome时也会执行该过滤器
        }
    }

    @Override
    public void destroy() {

    }
}

(5)model:

  • ClazzEntity.java:
package com.clh.model;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Objects;

@Entity
@Table(name = "clazz")
public class ClazzEntity{
    @Id
    @Column(name = "clid")
    private String clid;
    @Basic
    @Column(name = "clgrade")
    private String clgrade;
    @Basic
    @Column(name = "clnumber")
    private Integer clnumber;

    public String getClid() {
        return clid;
    }

    public void setClid(String clid) {
        this.clid = clid;
    }

    public Integer getClnumber() {
        return clnumber;
    }

    public void setClnumber(Integer clnumber) {
        this.clnumber = clnumber;
    }

    public String getClgrade() {
        return clgrade;
    }

    public void setClgrade(String clgrade) {
        this.clgrade = clgrade;
    }
}
  • CourseEntity.java:
package com.clh.model;


import com.fasterxml.jackson.annotation.JsonIgnore;

import javax.persistence.*;
import java.io.Serializable;
import java.util.List;

@Entity
@Table(name = "course")
public class CourseEntity{
    @Id
    @Column(name = "cid")
    private long cid;
    @Basic
    @Column(name = "cname")
    private String cname;
    @Basic
    @Column(name = "cplace")
    private String cplace;
    @Basic
    @Column(name = "ctime")
    private String ctime;
    //课程和老师是多对一关系
    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "cteacherid")
    private TeacherEntity teacher;
    //课程和学生是多对多关系
    @JsonIgnore
    @ManyToMany(mappedBy="courses",fetch = FetchType.EAGER)
    private List<StudentEntity> students;

    public long getCid() {
        return cid;
    }
    public void setCid(long cid) {
        this.cid = cid;
    }
    public String getCname() {
        return cname;
    }
    public void setCname(String cname) {
        this.cname = cname;
    }

    public TeacherEntity getTeacher() {
        return teacher;
    }

    public void setTeacher(TeacherEntity teacher) {
        this.teacher = teacher;
    }

    public List<StudentEntity> getStudents() {
        return students;
    }
    public void setStudents(List<StudentEntity> students) {
        this.students = students;
    }

    public String getCplace() {
        return cplace;
    }

    public void setCplace(String cplace) {
        this.cplace = cplace;
    }

    public String getCtime() {
        return ctime;
    }

    public void setCtime(String ctime) {
        this.ctime = ctime;
    }
}
  • ManagerEntity.java:
package com.clh.model;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Objects;

@Entity
@Table(name = "manager")
public class ManagerEntity{
    @Id
    @Column(name = "mid")
    private long mid;
    @Basic
    @Column(name = "mname")
    private String mname;
    @Basic
    @Column(name = "mpassword")
    private String mpassword;

    public long getMid() {
        return mid;
    }

    public void setMid(long mid) {
        this.mid = mid;
    }

    public String getMname() {
        return mname;
    }

    public void setMname(String mname) {
        this.mname = mname;
    }

    public String getMpassword() {
        return mpassword;
    }

    public void setMpassword(String mpassword) {
        this.mpassword = mpassword;
    }

}
  • ScEntity.java:
package com.clh.model;

import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name = "sc")
public class ScEntity{
    @Id
    @Column(name = "sid")
    private Long sid;
    @Id
    @Column(name = "cid")
    private Long cid;

    public Long getSid() {
        return sid;
    }

    public void setSid(Long sid) {
        this.sid = sid;
    }

    public Long getCid() {
        return cid;
    }

    public void setCid(Long cid) {
        this.cid = cid;
    }
}

  • StudentEntity.java:
package com.clh.model;

import javax.persistence.*;
import java.io.Serializable;
import java.util.List;

@Entity
@Table(name = "student")
public class StudentEntity{
    @Id
    @Column(name = "sid")
    private long sid;
    @Basic
    @Column(name = "sname")
    private String sname;
    @Basic
    @Column(name = "spassword")
    private String spassword;
    @Basic
    @Column(name = "sclass")
    private String sclass;
    //课程和学生是多对多关系
    @ManyToMany
    @JoinTable(name="sc", joinColumns={@JoinColumn(name="sid")}, inverseJoinColumns={@JoinColumn(name="cid")})
    private List<CourseEntity> courses;

    public String getSclass() {
        return sclass;
    }

    public void setSclass(String sclass) {
        this.sclass = sclass;
    }

    public long getSid() {
        return sid;
    }

    public void setSid(long sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getSpassword() {
        return spassword;
    }

    public void setSpassword(String spassword) {
        this.spassword = spassword;
    }

    public List<CourseEntity> getCourses() {
        return courses;
    }

    public void setCourses(List<CourseEntity> courses) {
        this.courses = courses;
    }
}

  • TeacherEntity.java:
package com.clh.model;

import javax.persistence.*;
import java.io.Serializable;
import java.util.List;

@Entity
@Table(name = "teacher")
public class TeacherEntity{
    @Id
    @Column(name = "tid")
    private long tid;
    @Basic
    @Column(name = "tname")
    private String tname;
    @Basic
    @Column(name = "tpassword")
    private String tpassword;
    //老师和课程是一对多关系
    @OneToMany(mappedBy = "teacher")
    List<CourseEntity> courses;

    public List<CourseEntity> getCourses() {
        return courses;
    }

    public void setCourses(List<CourseEntity> courses) {
        this.courses = courses;
    }

    public long getTid() {
        return tid;
    }

    public void setTid(long tid) {
        this.tid = tid;
    }

    public String getTname() {
        return tname;
    }

    public void setTname(String tname) {
        this.tname = tname;
    }

    public String getTpassword() {
        return tpassword;
    }

    public void setTpassword(String tpassword) {
        this.tpassword = tpassword;
    }
}

(6)pojo:

  • Message.java:
package com.clh.pojo;

/**
 * 返回给前端数据的规范,包括返回编码,分页数等信息。。。。。。时间原因不想写了
 */
public class Message {
    private String status;
}

(7)persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
	<persistence-unit name="myjpa">
		<class>com.clh.model.CourseEntity</class>
		<class>com.clh.model.ManagerEntity</class>
		<class>com.clh.model.ScEntity</class>
		<class>com.clh.model.StudentEntity</class>
		<class>com.clh.model.TeacherEntity</class>
        <class>com.clh.model.ClazzEntity</class>
        <properties>
			<property name="eclipselink.jdbc.url" value="jdbc:mysql://localhost:3306/javaweb?characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC&amp;rewriteBatchedStatements=true"/>
			<property name="eclipselink.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
			<property name="eclipselink.jdbc.user" value="root"/>
			<property name="eclipselink.jdbc.password" value="root"/>
		</properties>
	</persistence-unit>
</persistence>

(8)springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--允许使用ResponseBody等注解-->
    <mvc:annotation-driven/>

    <!--添加包扫描,通过扫描包内的注解使用IOC创建对象-->
    <context:component-scan base-package="com.clh.controller"></context:component-scan>
    <context:component-scan base-package="com.clh.service"></context:component-scan>
    <context:component-scan base-package="com.clh.model"></context:component-scan>
    <context:component-scan base-package="com.clh.dao"></context:component-scan>

    <!--添加视图解析器
        视图解析器作用:
             比如我们要访问/admin/main.jsp时,传统页面跳转需要输入完整URI访问路径,
             而使用了视图解析器后,会自动在访问路径前后添加配置前缀和配置后缀,
             比如配置了如下前缀和后缀后,我们要访问/admin/main.jsp,访问路径只需要写main就可以了
        注意:使用return redirect:/或forward作为返回值字段时视图解析器不生效

    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--配置前缀-->
        <property name="prefix" value="/"></property>
        <!--配置后缀-->
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

2.前端:

(1)index.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
<head>
	<title>登陆窗口</title>
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="container">
	<div class="col-4 pt-5 ms-auto me-auto">
		<form action="${pageContext.request.contextPath}/loginValidServlet" method="post" class="form">
			<h1 class="h3 mb-3 fw-normal text-center">用户登录</h1>
			<div class="form-floating">
				<input type="text" class="form-control" name='username' placeholder="请输入用户名">
				<label>用户名</label>
			</div>
			<div class="form-floating">
				<input type="password" class="form-control" name='password' placeholder="请输入密码">
				<label>密码</label>
			</div>
			<div class="form-floating">
				<select name="userType" class="form-control">
					<option selected>请选择用户类型</option>
					<option value="manager">管理员</option>
					<option value="student">学生</option>
					<option value="teacher">教师</option>
				</select>
				<label>用户类型</label>
			</div>
			<div class="form-check" style="float: right;">
				<input type="radio" class="form-check-input" id="radio1" name="remember" value="true">
				<label class="form-check-label" for="radio1">十天内免密登录</label>
			</div>
			<button class="w-100 mt-5 btn btn-lg btn-primary" type="submit">登录</button>
		</form>
	</div>
</body>
</html>

(2)manager:

  • classManage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
  <title>管理员系统</title>
  <link href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>
  <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<div class="d-flex flex-row" style="width: 100%;height: 100%;">
  <!-- menu -->
  <jsp:include page="menu.jsp" flush="true"/>
  <div class="d-flex flex-column" style="width: 100%; height: 100%;">
    <!-- header -->
    <jsp:include page="header.jsp" flush="true"/>
    <!-- content -->
    <div class="container mt-3">
      <h1 class="float-start pb-3 text-dark text-opacity-75">班级信息</h1>
      <div class="float-end me-5 mb-4">
        <button type="button" class="mt-3 ps-4 pe-4 btn btn-primary" id="addClass">增加</button>
      </div>
      <table class="table table-striped table-bordered table-hover">
        <thead>
        <tr>
          <th>班级</th>
          <th>年级</th>
          <th>人数</th>
          <th>操作</th>
        </tr>
        </thead>
        <tbody>
        <c:forEach items="${requestScope.classInfo}" var="clazz" varStatus="i">
          <tr>
            <td>${clazz.clid}</td>
            <td>${clazz.clgrade}</td>
            <td>${clazz.clnumber}</td>
            <td>
              <button class="p-1 btn btn-outline-danger" type="button" id="dropClazz${i.index}" value="${clazz.clid}">删除</button>
              <button class="p-1 btn btn-outline-success" type="button" id="updateClazz${i.index}" value="${clazz.clid}">修改</button>
              <button class="p-1 btn btn-outline-primary" type="button" id="detailClazz${i.index}" value="${clazz.clid}">详情</button>
            </td>
          </tr>
        </c:forEach>
        </tbody>
      </table>
    </div>
  </div>
</div>

<%--模态框1:用于修改数据--%>
<div class="modal" tabindex="-1" id="clModal">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">修改班级信息</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        <form class="needs-validation ms-auto me-auto">
          <div class="row g-3">
            <div class="col-6">
              <label class="form-label">班级</label>
              <input id="clid" type="text" disabled class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">年级</label>
              <input id="clgrade" type="text" class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">人数</label>
              <input id="clnumber" type="text" class="form-control" value="">
            </div>
          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-primary" id="clSubmit">提交</button>
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="clClose">关闭</button>
      </div>
    </div>
  </div>
</div>

<%--模态框2:用于展示详情--%>
<div class="modal" tabindex="-1" id="clModal1">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">班级信息详情</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        <form class="needs-validation ms-auto me-auto">
          <div class="row g-3">
            <div class="col-6">
              <label class="form-label">班级</label>
              <input id="clid1" type="text" disabled class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">年级</label>
              <input id="clgrade1" type="text" disabled class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">人数</label>
              <input id="clnumber1" type="text" disabled class="form-control" value="">
            </div>
          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="clClose1">关闭</button>
      </div>
    </div>
  </div>
</div>

<%--模态框3:用于添加数据--%>
<div class="modal" tabindex="-1" id="clModal2">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">添加班级信息</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        <form class="needs-validation ms-auto me-auto">
          <div class="row g-3">
            <div class="col-6">
              <label class="form-label">班级</label>
              <input id="clid2" type="text" class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">年级</label>
              <input id="clgrade2" type="text" class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">人数</label>
              <input id="clnumber2" type="text" class="form-control" value="">
            </div>
          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-primary" id="clSubmit2">提交</button>
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="clClose2">关闭</button>
      </div>
    </div>
  </div>
</div>

</body>
<script>
  $(function () {
    //修改班级信息模态框
    var clModal = $("#clModal");
    //班级信息详情模态框
    var clModal1 = $("#clModal1");
    //添加班级信息模态框
    var clModal2 = $("#clModal2");
    for (let i = 0; i < ${requestScope.classInfo.size()}; i++) {

      //显示修改班级信息模态框,获取数据写入弹窗
      $("#updateClazz"+i).click(function () {
        $("#clid").val($("#updateClazz"+i).parent().parent().children().eq(0).text());
        $("#clgrade").val($("#updateClazz"+i).parent().parent().children().eq(1).text());
        $("#clnumber").val($("#updateClazz"+i).parent().parent().children().eq(2).text());
        clModal.css("display","block");
      })
      //关闭修改班级信息模态框
      $("#clClose").click(function () {
        clModal.css("display","none");
      })

      //删除班级信息ajax请求
      $("#dropClazz"+i).click(function (){
        let clJson = {
          "clId":$("#dropClazz"+i).val()
        };
        $.post({
          url:"${pageContext.request.contextPath}/manager/dropClazz",
          dataType:"json",
          data:clJson,
          success(res){
            //一定要刷新页面,不然ajax异步机制不会修改整个页面的信息
            location.reload();
          }
        })
      });

      //修改班级信息ajax请求
      $("#clSubmit").click(function (){
        var clJson = {
          "clid":$("#clid").val(),
          "clgrade":$("#clgrade").val(),
          "clnumber":$("#clnumber").val()
        };
        $.post({
          url:"${pageContext.request.contextPath}/manager/updateClazz",
          dataType:"json",
          data:clJson,
          success(res){
            //一定要刷新页面,不然ajax异步机制不会修改整个页面的信息
            location.reload();
          }
        })
      })

      //显示班级信息详情模态框,获取数据写入弹窗
      $("#detailClazz"+i).click(function () {
        $("#clid1").val($("#detailClazz"+i).parent().parent().children().eq(0).text());
        $("#clgrade1").val($("#detailClazz"+i).parent().parent().children().eq(1).text());
        $("#clnumber1").val($("#detailClazz"+i).parent().parent().children().eq(2).text());
        clModal1.css("display","block");
      })
      //关闭班级信息详情模态框
      $("#clClose1").click(function () {
        clModal1.css("display","none");
      })
    }
    //显示添加学生信息模态框
    $("#addStudent").click(function () {
      sModal2.css("display","block");
    })
    //关闭添加学生信息模态框
    $("#sClose2").click(function () {
      sModal2.css("display","none");
    })
    //提交添加课程信息的ajax请求
    $("#sSubmit2").click(function (){
      let sJson = {
        "sid":$("#sid2").val(),
        "sname":$("#sname2").val(),
        "spassword":$("#spassword2").val(),
        "sclass":$("#sclass2").val(),
      };
      //提交增加
      $.post({
        url:"${pageContext.request.contextPath}/manager/addStudent",
        dataType:"json",
        data:sJson,
        success(res){
          //一定要刷新页面,不然ajax异步机制不会修改整个页面的信息
          location.reload();
        }
      })
    })

    //显示添加班级信息模态框
    $("#addClass").click(function () {
      clModal2.css("display","block");
    })
    //关闭添加班级信息模态框
    $("#clClose2").click(function () {
      clModal2.css("display","none");
    })
    //提交添加班级信息的ajax请求
    $("#clSubmit2").click(function (){
      let clJson = {
        "clid":$("#clid2").val(),
        "clgrade":$("#clgrade2").val(),
        "clnumber":$("#clnumber2").val()
      };
      //提交增加
      $.post({
        url:"${pageContext.request.contextPath}/manager/addClass",
        dataType:"json",
        data:clJson,
        success(res){
          //一定要刷新页面,不然ajax异步机制不会修改整个页面的信息
          location.reload();
        }
      })
    })
  })
</script>
</html>

  • courseManage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
  <title>管理员系统</title>
  <link href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>
  <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<div class="d-flex flex-row" style="width: 100%;height: 100%;">
  <!-- menu -->
  <jsp:include page="menu.jsp" flush="true"/>
  <div class="d-flex flex-column" style="width: 100%; height: 100%;">
    <!-- header -->
    <jsp:include page="header.jsp" flush="true"/>
    <!-- content -->
    <div class="container mt-3">
      <h1 class="float-start pb-3 text-dark text-opacity-75">课程信息</h1>
      <div class="float-end me-5 mb-4">
        <button type="button" class="mt-3 ps-4 pe-4 btn btn-primary" id="addCourse">增加</button>
      </div>
      <table class="table table-striped table-bordered table-hover">
        <thead>
        <tr>
          <th>课程号</th>
          <th>课程名</th>
          <th>上课地点</th>
          <th>上课时间</th>
          <th>任课教师</th>
          <th>操作</th>
        </tr>
        </thead>
        <tbody>
        <c:forEach items="${requestScope.courseInfo}" var="course" varStatus="i">
          <tr>
            <td>${course.cid}</td>
            <td>${course.cname}</td>
            <td>${course.cplace}</td>
            <td>${course.ctime}</td>
            <td>${course.teacher.tname}</td>
            <td>
              <button class="p-1 btn btn-outline-danger" type="button" id="dropCourse${i.index}" value="${course.cid}">删除</button>
              <button class="p-1 btn btn-outline-success" type="button" id="updateCourse${i.index}" value="${course.cid}">修改</button>
              <button class="p-1 btn btn-outline-primary" type="button" id="detailCourse${i.index}" value="${course.cid}">详情</button>
            </td>
          </tr>
        </c:forEach>
        </tbody>
      </table>
    </div>
  </div>
</div>
<%--模态框1:用于修改数据--%>
<div class="modal" tabindex="-1" id="cModal">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">修改课程信息</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        <form class="needs-validation ms-auto me-auto">
          <div class="row g-3">
            <div class="col-6">
              <label class="form-label">课程号</label>
              <input id="cid" type="text" disabled class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">课程名</label>
              <input id="cname" type="text" class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">上课地点</label>
              <input id="cplace" type="text" class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">上课时间</label>
              <input id="ctime" type="text" class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">任课教师</label>
              <input id="cteachername" type="text" disabled class="form-control" value="">
            </div>
          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-primary" id="cSubmit">提交</button>
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="cClose">关闭</button>
      </div>
    </div>
  </div>
</div>

<%--模态框2:用于展示详情--%>
<div class="modal" tabindex="-1" id="cModal1">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">修改课程信息</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        <form class="needs-validation ms-auto me-auto">
          <div class="row g-3">
            <div class="col-6">
              <label class="form-label">课程号</label>
              <input id="cid1" type="text" disabled class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">课程名</label>
              <input id="cname1" type="text" disabled class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">上课地点</label>
              <input id="cplace1" type="text" disabled class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">上课时间</label>
              <input id="ctime1" type="text" disabled class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">任课教师</label>
              <input id="cteachername1" type="text" disabled class="form-control" value="">
            </div>
          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="cClose1">关闭</button>
      </div>
    </div>
  </div>
</div>

<%--模态框3:用于添加数据--%>
<div class="modal" tabindex="-1" id="cModal2">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">添加课程信息</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        <form class="needs-validation ms-auto me-auto">
          <div class="row g-3">
            <div class="col-6">
              <label class="form-label">课程号</label>
              <input id="cid2" type="text" class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">课程名</label>
              <input id="cname2" type="text" class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">上课地点</label>
              <input id="cplace2" type="text" class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">上课时间</label>
              <input id="ctime2" type="text" class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">任课教师</label>
              <input id="cteachername2" type="text" class="form-control" value="">
            </div>
          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-primary" id="cSubmit2">提交</button>
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="cClose2">关闭</button>
      </div>
    </div>
  </div>
</div>

</body>
<script>
  $(function () {
    //修改课程信息模态框
    var cModal = $("#cModal");
    //课程信息详情模态框
    var cModal1 = $("#cModal1");
    //添加课程信息模态框
    var cModal2 = $("#cModal2");
    for (let i = 0; i < ${requestScope.courseInfo.size()}; i++) {

      //显示修改课程信息模态框,获取数据写入弹窗
      $("#updateCourse"+i).click(function () {
        $("#cid").val($("#updateCourse"+i).parent().parent().children().eq(0).text());
        $("#cname").val($("#updateCourse"+i).parent().parent().children().eq(1).text());
        $("#cplace").val($("#updateCourse"+i).parent().parent().children().eq(2).text());
        $("#ctime").val($("#updateCourse"+i).parent().parent().children().eq(3).text());
        $("#cteachername").val($("#updateCourse"+i).parent().parent().children().eq(4).text());
        cModal.css("display","block");
      })
      //关闭修改课程信息模态框
      $("#cClose").click(function () {
        cModal.css("display","none");
      })

      //删除课程信息ajax请求
      $("#dropCourse"+i).click(function (){
        let cJson = {
          "courseId":$("#dropCourse"+i).val()
        };
        $.post({
          url:"${pageContext.request.contextPath}/manager/dropCourse",
          dataType:"json",
          data:cJson,
          success(res){
            //一定要刷新页面,不然ajax异步机制不会修改整个页面的信息
            location.reload();
          }
        })
      });

      //修改课程信息ajax请求
      $("#cSubmit").click(function (){
        let cJson = {
          "cid":$("#cid").val(),
          "cname":$("#cname").val(),
          "cplace":$("#cplace").val(),
          "ctime":$("#ctime").val(),
          "cteachername":$("#cteachername").val()
        };
        $.post({
          url:"${pageContext.request.contextPath}/manager/updateCourse",
          dataType:"json",
          data:cJson,
          success(res){
            //一定要刷新页面,不然ajax异步机制不会修改整个页面的信息
            location.reload();
          }
        })
      })

      //显示课程信息详情模态框,获取数据写入弹窗
      $("#detailCourse"+i).click(function () {
        $("#cid1").val($("#detailCourse"+i).parent().parent().children().eq(0).text());
        $("#cname1").val($("#detailCourse"+i).parent().parent().children().eq(1).text());
        $("#cplace1").val($("#detailCourse"+i).parent().parent().children().eq(2).text());
        $("#ctime1").val($("#detailCourse"+i).parent().parent().children().eq(3).text());
        $("#cteachername1").val($("#detailCourse"+i).parent().parent().children().eq(4).text());
        cModal1.css("display","block");
      })
      //关闭课程信息详情模态框
      $("#cClose1").click(function () {
        cModal1.css("display","none");
      })
    }

    //显示添加课程信息模态框
    $("#addCourse").click(function () {
      cModal2.css("display","block");
    })
    //关闭添加课程信息模态框
    $("#cClose2").click(function () {
      cModal2.css("display","none");
    })
    //提交添加课程信息的ajax请求
    $("#cSubmit2").click(function (){
      let cJson = {
        "cid":$("#cid2").val(),
        "cname":$("#cname2").val(),
        "cplace":$("#cplace2").val(),
        "ctime":$("#ctime2").val(),
        "cteachername":$("#cteachername2").val()
      };
      //提交增加
      $.post({
        url:"${pageContext.request.contextPath}/manager/addCourse",
        dataType:"json",
        data:cJson,
        success(res){
          //一定要刷新页面,不然ajax异步机制不会修改整个页面的信息
          location.reload();
        }
      })
    })
  })
</script>
</html>
  • header.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"  pageEncoding="utf-8" %>
<div class="p-3 bg-dark  bg-gradient text-white" >
	<div class="container">
		<div class="d-flex flex-wrap align-items-center justify-content-center justify-content-lg-start">

			<ul class="nav col-12 col-lg-auto me-lg-auto mb-2 justify-content-center mb-md-0">
				<li><a href="${pageContext.request.contextPath}/manager/main.jsp" class="nav-link px-2 text-white">主页</a></li>
			</ul>
		</div>
	</div>
</div>
  • main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>管理员系统</title>
    <link href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<div class="d-flex flex-row" style="width: 100%;height: 100%;">
    <!-- menu -->
    <jsp:include page="menu.jsp" flush="true"/>
    <div class="d-flex flex-column" style="width: 100%; height: 100%;">
        <!-- header -->
        <jsp:include page="header.jsp" flush="true"/>
        <!-- content -->
        <div class="container mt-3">
            <div class="mt-4 p-5 bg-primary text-white rounded">
                <h1>${sessionScope.type}系统</h1>
                <p>欢迎您,${sessionScope.name}</p>
                <p>当前时间:<%=(new java.util.Date()).toString() %></p>
            </div>
        </div>
    </div>

</div>
</body>
</html>

  • menu.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<div class=" d-flex flex-column flex-shrink-0 text-white bg-dark bg-gradient" style="width: 280px; height: 100%;">
	<span class="pt-3 fs-3 text-center text-white text-opacity-75">${sessionScope.type}系统</span>
	<hr>
	<ul class="nav nav-pills flex-column mb-auto">
		<li>
			<a href="${pageContext.request.contextPath}/manager/getUsersInfo" class="nav-link text-white">用户信息管理</a>
		</li>
		<li>
			<a href="${pageContext.request.contextPath}/manager/getClassesInfo" class="nav-link text-white">班级信息管理</a>
		</li>
		<li>
			<a href="${pageContext.request.contextPath}/manager/getTeachersInfo" class="nav-link text-white">教师信息管理</a>
		</li>
		<li>
			<a href="${pageContext.request.contextPath}/manager/getStudentsInfo" class="nav-link text-white">学生信息管理</a>
		</li>
		<li>
			<a href="${pageContext.request.contextPath}/manager/getCoursesInfo" class="nav-link text-white">课程信息管理</a>
		</li>
	</ul>
	<hr>
	<div class="dropdown pb-3">
		<a href="#" class="d-flex align-items-center text-white text-decoration-none dropdown-toggle" id="dropdownUser" data-bs-toggle="dropdown" aria-expanded="false">
			<strong>${sessionScope.type}:${sessionScope.name}</strong>
		</a>
		<ul class="dropdown-menu dropdown-menu-dark text-small shadow" aria-labelledby="dropdownUser">
			<li><a class="dropdown-item" href="${pageContext.request.contextPath}/logoutServlet">退出登录</a></li>
		</ul>
	</div>
</div>
  • studentManage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
  <title>管理员系统</title>
  <link href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>
  <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<div class="d-flex flex-row" style="width: 100%;height: 100%;">
  <!-- menu -->
  <jsp:include page="menu.jsp" flush="true"/>
  <div class="d-flex flex-column" style="width: 100%; height: 100%;">
    <!-- header -->
    <jsp:include page="header.jsp" flush="true"/>
    <!-- content -->
    <div class="container mt-3">
      <h1 class="float-start pb-3 text-dark text-opacity-75">学生信息</h1>
      <div class="float-end me-5 mb-4">
        <button type="button" class="mt-3 ps-4 pe-4 btn btn-primary" id="addStudent">增加</button>
      </div>
      <table class="table table-striped table-bordered table-hover">
        <thead>
        <tr>
          <th>学号</th>
          <th>姓名</th>
          <th>班级</th>
          <th>操作</th>
        </tr>
        </thead>
        <tbody>
        <c:forEach items="${requestScope.studentInfo}" var="student" varStatus="i">
          <tr>
            <td>${student.sid}</td>
            <td>${student.sname}</td>
            <td>${student.sclass}</td>
            <td>
              <button class="p-1 btn btn-outline-danger" type="button" id="dropStudent${i.index}" value="${student.sid}">删除</button>
              <button class="p-1 btn btn-outline-success" type="button" id="updateStudent${i.index}" value="${student.sid}">修改</button>
              <button class="p-1 btn btn-outline-primary" type="button" id="detailStudent${i.index}" value="${student.sid}">详情</button>
            </td>
          </tr>
        </c:forEach>
        </tbody>
      </table>
    </div>
  </div>
</div>

<%--模态框1:用于修改数据--%>
<div class="modal" tabindex="-1" id="sModal">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">修改学生信息</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        <form class="needs-validation ms-auto me-auto">
          <div class="row g-3">
            <div class="col-6">
              <label class="form-label">学号</label>
              <input id="sid" type="text" disabled class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">姓名</label>
              <input id="sname" type="text" class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">班级</label>
              <input id="sclass" type="text" class="form-control" value="">
            </div>
          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-primary" id="sSubmit">提交</button>
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="sClose">关闭</button>
      </div>
    </div>
  </div>
</div>

<%--模态框2:用于展示详情--%>
<div class="modal" tabindex="-1" id="sModal1">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">学生信息详情</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        <form class="needs-validation ms-auto me-auto">
          <div class="row g-3">
            <div class="col-6">
              <label class="form-label">学号</label>
              <input id="sid1" type="text" disabled class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">姓名</label>
              <input id="sname1" type="text" disabled class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">班级</label>
              <input id="sclass1" type="text" disabled class="form-control" value="">
            </div>
          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="sClose1">关闭</button>
      </div>
    </div>
  </div>
</div>

<%--模态框3:用于添加数据--%>
<div class="modal" tabindex="-1" id="sModal2">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">添加学生信息</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        <form class="needs-validation ms-auto me-auto">
          <div class="row g-3">
            <div class="col-6">
              <label class="form-label">学号</label>
              <input id="sid2" type="text" class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">密码</label>
              <input id="spassword2" type="text" class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">姓名</label>
              <input id="sname2" type="text" class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">班级</label>
              <input id="sclass2" type="text" class="form-control" value="">
            </div>
          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-primary" id="sSubmit2">提交</button>
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="sClose2">关闭</button>
      </div>
    </div>
  </div>
</div>

</body>
<script>
  $(function () {
    //修改学生信息模态框
    var sModal = $("#sModal");
    //学生信息详情模态框
    var sModal1 = $("#sModal1");
    //添加学生信息模态框
    var sModal2 = $("#sModal2");
    for (let i = 0; i < ${requestScope.studentInfo.size()}; i++) {

      //显示修改学生信息模态框,获取数据写入弹窗
      $("#updateStudent"+i).click(function () {
        $("#sid").val($("#updateStudent"+i).parent().parent().children().eq(0).text());
        $("#sname").val($("#updateStudent"+i).parent().parent().children().eq(1).text());
        $("#sclass").val($("#updateStudent"+i).parent().parent().children().eq(2).text());
        sModal.css("display","block");
      })
      //关闭修改学生信息模态框
      $("#sClose").click(function () {
        sModal.css("display","none");
      })

      //删除学生信息ajax请求
      $("#dropStudent"+i).click(function (){
        let sJson = {
          "studentId":$("#dropStudent"+i).val()
        };
        $.post({
          url:"${pageContext.request.contextPath}/manager/dropStudent",
          dataType:"json",
          data:sJson,
          success(res){
            //一定要刷新页面,不然ajax异步机制不会修改整个页面的信息
            location.reload();
          }
        })
      });

      //修改学生信息ajax请求
      $("#sSubmit").click(function (){
        let sJson = {
          "sid":$("#sid").val(),
          "sname":$("#sname").val(),
          "sclass":$("#sclass").val()
        };
        $.post({
          url:"${pageContext.request.contextPath}/manager/updateStudent",
          dataType:"json",
          data:sJson,
          success(res){
            //一定要刷新页面,不然ajax异步机制不会修改整个页面的信息
            location.reload();
          }
        })
      })

      //显示学生信息详情模态框,获取数据写入弹窗
      $("#detailStudent"+i).click(function () {
        $("#sid1").val($("#detailStudent"+i).parent().parent().children().eq(0).text());
        $("#sname1").val($("#detailStudent"+i).parent().parent().children().eq(1).text());
        $("#sclass1").val($("#detailStudent"+i).parent().parent().children().eq(2).text());
        sModal1.css("display","block");
      })
      //关闭课程信息详情模态框
      $("#sClose1").click(function () {
        sModal1.css("display","none");
      })
    }

    //显示添加学生信息模态框
    $("#addStudent").click(function () {
      sModal2.css("display","block");
    })
    //关闭添加学生信息模态框
    $("#sClose2").click(function () {
      sModal2.css("display","none");
    })
    //提交添加学生信息的ajax请求
    $("#sSubmit2").click(function (){
      let sJson = {
        "sid":$("#sid2").val(),
        "sname":$("#sname2").val(),
        "spassword":$("#spassword2").val(),
        "sclass":$("#sclass2").val(),
      };
      //提交增加
      $.post({
        url:"${pageContext.request.contextPath}/manager/addStudent",
        dataType:"json",
        data:sJson,
        success(res){
          //一定要刷新页面,不然ajax异步机制不会修改整个页面的信息
          location.reload();
        }
      })
    })
  })
</script>
</html>
  • teacherManage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
  <title>管理员系统</title>
  <link href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>
  <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<div class="d-flex flex-row" style="width: 100%;height: 100%;">
  <!-- menu -->
  <jsp:include page="menu.jsp" flush="true"/>
  <div class="d-flex flex-column" style="width: 100%; height: 100%;">
    <!-- header -->
    <jsp:include page="header.jsp" flush="true"/>
    <!-- content -->
    <div class="container mt-3">
      <h1 class="float-start pb-3 text-dark text-opacity-75">教师信息</h1>
      <div class="float-end me-5 mb-4">
        <button type="button" class="mt-3 ps-4 pe-4 btn btn-primary" id="addTeacher">增加</button>
      </div>
      <table class="table table-striped table-bordered table-hover">
        <thead>
        <tr>
          <th>教工号</th>
          <th>姓名</th>
          <th>操作</th>
        </tr>
        </thead>
        <tbody>
        <c:forEach items="${requestScope.teacherInfo}" var="teacher" varStatus="i">
          <tr>
            <td>${teacher.tid}</td>
            <td>${teacher.tname}</td>
            <td>
              <button class="p-1 btn btn-outline-danger" type="button" id="dropTeacher${i.index}" value="${teacher.tid}">删除</button>
              <button class="p-1 btn btn-outline-success" type="button" id="updateTeacher${i.index}" value="${teacher.tid}">修改</button>
              <button class="p-1 btn btn-outline-primary" type="button" id="detailTeacher${i.index}" value="${teacher.tid}">详情</button>
            </td>
          </tr>
        </c:forEach>
        </tbody>
      </table>
    </div>
  </div>
</div>

<%--模态框1:用于修改数据--%>
<div class="modal" tabindex="-1" id="tModal">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">修改教师信息</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        <form class="needs-validation ms-auto me-auto">
          <div class="row g-3">
            <div class="col-6">
              <label class="form-label">教工号</label>
              <input id="tid" type="text" disabled class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">姓名</label>
              <input id="tname" type="text" class="form-control" value="">
            </div>
          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-primary" id="tSubmit">提交</button>
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="tClose">关闭</button>
      </div>
    </div>
  </div>
</div>

<%--模态框2:用于展示详情--%>
<div class="modal" tabindex="-1" id="tModal1">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">教师信息详情</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        <form class="needs-validation ms-auto me-auto">
          <div class="row g-3">
            <div class="col-6">
              <label class="form-label">教工号</label>
              <input id="tid1" type="text" disabled class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">姓名</label>
              <input id="tname1" type="text" disabled class="form-control" value="">
            </div>
          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="tClose1">关闭</button>
      </div>
    </div>
  </div>
</div>

<%--模态框3:用于添加信息--%>
<div class="modal" tabindex="-1" id="tModal2">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">添加教师信息</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        <form class="needs-validation ms-auto me-auto">
          <div class="row g-3">
            <div class="col-6">
              <label class="form-label">教工号</label>
              <input id="tid2" type="text" class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">姓名</label>
              <input id="tname2" type="text" class="form-control" value="">
            </div>
            <div class="col-6">
              <label class="form-label">密码</label>
              <input id="tpassword2" type="text" class="form-control" value="">
            </div>
          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-primary" id="tSubmit2">提交</button>
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="tClose2">关闭</button>
      </div>
    </div>
  </div>
</div>

</body>
<script>
  $(function () {
    //修改教师信息模态框
    var tModal = $("#tModal");
    //学生信息详情模态框
    var tModal1 = $("#tModal1");
    //添加学生信息模态框
    var tModal2 = $("#tModal2");
    for (let i = 0; i < ${requestScope.teacherInfo.size()}; i++) {

      //显示修改教师信息模态框,获取数据写入弹窗
      $("#updateTeacher"+i).click(function () {
        $("#tid").val($("#updateTeacher"+i).parent().parent().children().eq(0).text());
        $("#tname").val($("#updateTeacher"+i).parent().parent().children().eq(1).text());
        tModal.css("display","block");
      })
      //关闭修改学生信息模态框
      $("#tClose").click(function () {
        tModal.css("display","none");
      })

      //删除教师信息ajax请求
      $("#dropTeacher"+i).click(function (){
        let tJson = {
          "teacherId":$("#dropTeacher"+i).val()
        };
        $.post({
          url:"${pageContext.request.contextPath}/manager/dropTeacher",
          dataType:"json",
          data:tJson,
          success(res){
            //一定要刷新页面,不然ajax异步机制不会修改整个页面的信息
            location.reload();
          }
        })
      });

      //修改教师信息ajax请求
      $("#tSubmit").click(function (){
        var tJson = {
          "tid":$("#tid").val(),
          "tname":$("#tname").val()
        };
        $.post({
          url:"${pageContext.request.contextPath}/manager/updateTeacher",
          dataType:"json",
          data:tJson,
          success(res){
            //一定要刷新页面,不然ajax异步机制不会修改整个页面的信息
            location.reload();
          }
        })
      })

      //显示教师信息详情模态框,获取数据写入弹窗
      $("#detailTeacher"+i).click(function () {
        $("#tid1").val($("#detailTeacher"+i).parent().parent().children().eq(0).text());
        $("#tname1").val($("#detailTeacher"+i).parent().parent().children().eq(1).text());
        tModal1.css("display","block");
      })
      //关闭教师信息详情模态框
      $("#tClose1").click(function () {
        tModal1.css("display","none");
      })
    }

    //显示添加教师信息模态框
    $("#addTeacher").click(function () {
      tModal2.css("display","block");
    })
    //关闭添加教师信息模态框
    $("#tClose2").click(function () {
      tModal2.css("display","none");
    })
    //提交添加教师信息的ajax请求
    $("#tSubmit2").click(function (){
      let tJson = {
        "tid":$("#tid2").val(),
        "tname":$("#tname2").val(),
        "tpassword":$("#tpassword2").val(),
      };
      //提交增加
      $.post({
        url:"${pageContext.request.contextPath}/manager/addTeacher",
        dataType:"json",
        data:tJson,
        success(res){
          //一定要刷新页面,不然ajax异步机制不会修改整个页面的信息
          location.reload();
        }
      })
    })
  })
</script>
</html>

  • userManage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
  <title>管理员系统</title>
  <link href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>
  <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<div class="d-flex flex-row" style="width: 100%;height: 100%;">
  <!-- menu -->
  <jsp:include page="menu.jsp" flush="true"/>
  <div class="d-flex flex-column" style="width: 100%; height: 100%;">
    <!-- header -->
    <jsp:include page="header.jsp" flush="true"/>
    <!-- content -->
    <div class="container mt-3">
      <h1 class=" pb-3 text-dark text-opacity-75">用户信息</h1>
      <table class="table table-striped table-bordered table-hover">
        <thead>
        <tr>
          <th>用户名</th>
          <th>密码</th>
          <th>用户类型</th>
          <th>操作</th>
        </tr>
        </thead>
        <tbody>
        <c:forEach items="${requestScope.managerInfo}" var="manager">
          <tr>
            <td>${manager.mid}</td>
            <td>${manager.mpassword}</td>
            <td>管理员</td>
            <td>
              <button class="p-1 btn btn-danger" type="button" id="dropManagerKey${i.index}" value="${manager.mid}">删除</button>
              <button class="p-1 btn btn-success" type="button" id="updateManagerKey${i.index}" value="${manager.mid}">修改</button>
              <button class="p-1 btn btn-primary" type="button" id="detailManagerKey${i.index}" value="${manager.mid}">详情</button>
            </td>
          </tr>
        </c:forEach>
        <c:forEach items="${requestScope.studentInfo}" var="student">
          <tr>
            <td>${student.sid}</td>
            <td>${student.spassword}</td>
            <td>学生</td>
            <td>
              <button class="p-1 btn btn-outline-warning" type="button" id="dropStudentKey${i.index}" value="${student.sid}">删除</button>
              <button class="p-1 btn btn-outline-dark" type="button" id="updateStudentKey${i.index}" value="${student.sid}">修改</button>
              <button class="p-1 btn btn-outline-info" type="button" id="detailStudentKey${i.index}" value="${student.sid}">详情</button>
            </td>
          </tr>
        </c:forEach>
        <c:forEach items="${requestScope.teacherInfo}" var="teacher">
          <tr>
            <td>${teacher.tid}</td>
            <td>${teacher.tpassword}</td>
            <td>教师</td>
            <td>
              <button class="p-1 btn btn-outline-danger" type="button" id="dropTeacherKey${i.index}" value="${teacher.tid}">删除</button>
              <button class="p-1 btn btn-outline-success" type="button" id="updateTeacherKey${i.index}" value="${teacher.tid}">修改</button>
              <button class="p-1 btn btn-outline-primary" type="button" id="detailTeacherKey${i.index}" value="${teacher.tid}">详情</button>
            </td>
          </tr>
        </c:forEach>
        </tbody>
      </table>
    </div>
  </div>
</div>
</body>
</html>

(3)student:

  • header.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"  pageEncoding="utf-8" %>
<div class="p-3 bg-dark bg-gradient text-white" >
	<div class="container">
		<div class="d-flex flex-wrap align-items-center justify-content-center justify-content-lg-start">

			<ul class="nav col-12 col-lg-auto me-lg-auto mb-2 justify-content-center mb-md-0">
				<li><a href="${pageContext.request.contextPath}/student/main.jsp" class="nav-link px-2 text-white">主页</a></li>
			</ul>
		</div>
	</div>
</div>
  • main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>学生系统</title>
    <link href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<div class="d-flex flex-row" style="width: 100%;height: 100%;">
    <!-- menu -->
    <jsp:include page="menu.jsp" flush="true"/>
    <div class="d-flex flex-column" style="width: 100%; height: 100%;">
        <!-- header -->
        <jsp:include page="header.jsp" flush="true"/>
        <!-- content -->
        <div class="container mt-3">
            <div class="mt-4 p-5 bg-primary text-white rounded">
                <h1>${sessionScope.type}系统</h1>
                <p>欢迎您,${sessionScope.name}</p>
                <p>当前时间:<%=(new java.util.Date()).toString() %></p>
            </div>
        </div>
    </div>

</div>
</body>
</html>

  • menu.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
		 pageEncoding="UTF-8"%>
<div class="d-flex flex-column flex-shrink-0 text-white bg-dark bg-gradient" style="width: 280px; height: 100%;">
	<span class="pt-3 fs-2 text-center text-white text-opacity-75">${sessionScope.type}系统</span>
	<hr>
	<ul class="nav nav-pills flex-column mb-auto">
		<li>
			<a href="${pageContext.request.contextPath}/student/getNotSelectedCourse" class="nav-link text-white">选择课程</a>
		</li>
		<li>
			<a href="${pageContext.request.contextPath}/student/getSelectedCourse" class="nav-link text-white">已选课程</a>
		</li>
		<li>
			<a href="${pageContext.request.contextPath}/student/getPersonalInfo" class="nav-link text-white">个人信息</a>
		</li>
	</ul>
	<hr>
	<div class="dropdown pb-3">
		<a href="#" class="d-flex align-items-center text-white text-decoration-none dropdown-toggle" id="dropdownUser" data-bs-toggle="dropdown" aria-expanded="false">
			<strong>${sessionScope.type}:${sessionScope.name}</strong>
		</a>
		<ul class="dropdown-menu dropdown-menu-dark text-small shadow" aria-labelledby="dropdownUser">
			<li><a class="dropdown-item" href="${pageContext.request.contextPath}/logoutServlet">退出登录</a></li>
		</ul>
	</div>
</div>


  • myCourse.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
  <title>学生系统</title>
  <link href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>
  <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<div class="d-flex flex-row" style="width: 100%;height: 100%;">
  <!-- menu -->
  <jsp:include page="menu.jsp" flush="true"/>
  <div class="d-flex flex-column" style="width: 100%; height: 100%;">
    <!-- header -->
    <jsp:include page="header.jsp" flush="true"/>
    <!-- content -->
    <div class="container mt-3">
      <h1 class="pb-3 text-dark text-opacity-75">已选课程</h1>
      <table class="table table-striped table-bordered table-hover">
        <thead>
        <tr>
          <th>课程号</th>
          <th>课程名</th>
          <th>上课地点</th>
          <th>上课时间</th>
          <th>状态</th>
          <th>操作</th>
        </tr>
        </thead>
        <tbody>
        <c:forEach items="${requestScope.courses}" var="course" varStatus="i">
          <tr>
            <td>${course.cid}</td>
            <td>${course.cname}</td>
            <td>${course.cplace}</td>
            <td>${course.ctime}周</td>
            <td>已选</td>
            <td>
              <button class="btn btn-outline-primary" type="button" id="dropCourse${i.index}" value="${course.cid}">退选课程</button>
            </td>
          </tr>
        </c:forEach>
        </tbody>
      </table>
    </div>
  </div>
</div>
</body>
<script>
  $(function () {
    for (let i = 0; i < ${requestScope.courses.size()}; i++) {
      $("#dropCourse"+i).click(function () {
        var cJson = {
          "courseId":$("#dropCourse"+i).val()
        };
        $.post({
          url:"${pageContext.request.contextPath}/student/dropCourse",
          dataType:"json",
          data:cJson,
          success(res){
            alert("退选成功! 操作码:"+res.sid+res.cid);
            //一定要刷新页面,不然ajax异步机制不会修改整个页面的信息
            location.reload();
          }
        })
      })
    }
  })
</script>
</html>
  • notSelectedCourse.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
  <title>学生系统</title>
  <link href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>
  <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<div class="d-flex flex-row" style="width: 100%;height: 100%;">
  <!-- menu -->
  <jsp:include page="menu.jsp" flush="true"/>
  <div class="d-flex flex-column" style="width: 100%; height: 100%;">
    <!-- header -->
    <jsp:include page="header.jsp" flush="true"/>
    <!-- content -->
    <div class="container mt-3">
      <h1 class="pb-3 text-dark text-opacity-75">选择课程</h1>
      <table class="table table-striped table-bordered table-hover">
        <thead>
        <tr>
          <th>课程号</th>
          <th>课程名</th>
          <th>上课地点</th>
          <th>上课时间</th>
          <th>状态</th>
          <th>操作</th>
        </tr>
        </thead>
        <tbody>
        <c:forEach items="${requestScope.courses}" var="course" varStatus="i">
          <tr>
            <td>${course.cid}</td>
            <td>${course.cname}</td>
            <td>${course.cplace}</td>
            <td>${course.ctime}周</td>
            <td>未选</td>
            <td>
                <button class="btn btn-outline-primary" type="button" id="pickCourse${i.index}" value="${course.cid}">选择课程</button>
            </td>
          </tr>
        </c:forEach>
        </tbody>
      </table>
    </div>
  </div>
</div>
</body>
<script>
  $(function () {
    for (let i = 0; i < ${requestScope.courses.size()}; i++) {
      $("#pickCourse"+i).click(function () {
        var cJson = {
          "courseId":$("#pickCourse"+i).val()
        };
        $.post({
          url:"${pageContext.request.contextPath}/student/pickCourse",
          dataType:"json",
          data:cJson,
          success(res){
            alert("选课成功! 操作码:"+res.sid+res.cid);
            //一定要刷新页面,不然ajax异步机制不会修改整个页面的信息
            location.reload();
          }
        })
      })
    }
  })
</script>
</html>
  • personalInfo.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>学生系统</title>
  <link href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>
  <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<div class="d-flex flex-row" style="width: 100%;height: 100%;">
  <!-- menu -->
  <jsp:include page="menu.jsp" flush="true"/>
  <div class="d-flex flex-column" style="width: 100%; height: 100%;">
    <!-- header -->
    <jsp:include page="header.jsp" flush="true"/>
    <!-- content -->
    <div class="container">
      <h1 class=" pb-3 text-dark text-opacity-75" align="center">个人信息</h1>
      <div class="mt-2 ms-auto me-auto">
        <div class="row g-3">
          <div class="col-12">
            <label class="form-label">学号</label>
            <input type="text" class="form-control" disabled name="sid" value="${personalInfo.sid}">
          </div>
          <div class="col-12">
            <label class="form-label">姓名</label>
            <input type="text" class="form-control" disabled name="sid" value="${personalInfo.sname}">
          </div>
          <div class="col-12">
            <label class="form-label">班级</label>
            <input type="text" class="form-control" disabled name="sid" value="${personalInfo.sclass}">
          </div>
          <div class="col-12">
            <label class="form-label">密码</label>
            <input type="text" class="form-control" disabled name="sid" value="${personalInfo.spassword}">
          </div>
          <button class="col-4 btn btn-primary ms-auto me-auto" type="button" id="sUpdate">修改个人信息</button>
        </div>
      </div>
      <div class="modal" tabindex="-1" id="sModal">
        <div class="modal-dialog">
          <div class="modal-content">
            <div class="modal-header">
              <h5 class="modal-title">修改个人信息</h5>
              <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <div class="modal-body">
              <form class="needs-validation ms-auto me-auto">
                <div class="row g-3">
                  <div class="col-6">
                    <label class="form-label">学号</label>
                    <input id="sid" type="text" disabled class="form-control" name="sid" value="${personalInfo.sid}">
                  </div>
                  <div class="col-6">
                    <label class="form-label">姓名</label>
                    <input id="sname" type="text" class="form-control" name="sid" value="${personalInfo.sname}">
                  </div>
                  <div class="col-6">
                    <label class="form-label">班级</label>
                    <input id="sclass" type="text" class="form-control" name="sid" value="${personalInfo.sclass}">
                  </div>
                  <div class="col-6">
                    <label class="form-label">密码</label>
                    <input id="spassword" type="text" class="form-control" name="sid" value="${personalInfo.spassword}">
                  </div>
                </div>
              </form>
            </div>
            <div class="modal-footer">
              <button type="button" class="btn btn-primary" id="sSubmit">提交</button>
              <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="sClose">关闭</button>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>
<script>
  $(function(){
    var sModal = $("#sModal");

    //显示模态框
    $("#sUpdate").click(function () {
      sModal.css("display","block");
    })
    //关闭模态框
    $("#sClose").click(function () {
      sModal.css("display","none");
    })
    //提交修改发送ajax请求
    $("#sSubmit").click(function () {
      var sJson = {
        "sid":$("#sid").val(),
        "sname":$("#sname").val(),
        "sclass":$("#sclass").val(),
        "spassword":$("#spassword").val()
      };
      $.post({
        url:"${pageContext.request.contextPath}/student/updatePersonalInfo",
        dataType:"json",
        data:sJson,
        success(res){
          sModal.css("display","none");
          //一定要刷新页面,不然ajax异步机制不会修改整个页面的信息
          location.reload();
        }
      });
    })
  })
</script>
</body>
</html>

(4)teacher:

  • header.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"  pageEncoding="utf-8" %>
<div class="p-3 bg-dark  bg-gradient text-white" >
	<div class="container">
		<div class="d-flex flex-wrap align-items-center justify-content-center justify-content-lg-start">

			<ul class="nav col-12 col-lg-auto me-lg-auto mb-2 justify-content-center mb-md-0">
				<li><a href="${pageContext.request.contextPath}/teacher/main.jsp" class="nav-link px-2 text-white">主页</a></li>

			</ul>
		</div>
	</div>
</div>
  • main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>教师系统</title>
    <link href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<div class="d-flex flex-row" style="width: 100%;height: 100%;">
    <!-- menu -->
    <jsp:include page="menu.jsp" flush="true"/>
    <div class="d-flex flex-column" style="width: 100%; height: 100%;">
        <!-- header -->
        <jsp:include page="header.jsp" flush="true"/>
        <!-- content -->
        <div class="container mt-3">
            <div class="mt-4 p-5 bg-primary text-white rounded">
                <h1>${sessionScope.type}系统</h1>
                <p>欢迎您,${sessionScope.name}</p>
                <p>当前时间:<%=(new java.util.Date()).toString() %></p>
            </div>
        </div>
    </div>

</div>
</body>
</html>

  • menu.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<div class="d-flex flex-column flex-shrink-0 text-white bg-dark bg-gradient" style="width: 280px; height: 100%;">
    <span class="pt-3 fs-3 text-center text-white text-opacity-75">${sessionScope.type}系统</span>
    <hr>
    <ul class="nav nav-pills flex-column mb-auto" id="mul">
        <li>
            <a href="${pageContext.request.contextPath}/teacher/getMyCourse" class="nav-link text-white">查询任课信息</a>
        </li>
        <li>
            <a href="${pageContext.request.contextPath}/teacher/studentCourse.jsp" class="nav-link text-white">查询学生选课信息</a>
        </li>
        <li>
            <a href="${pageContext.request.contextPath}/teacher/getPersonalInfo" class="nav-link text-white">个人信息</a>
        </li>
    </ul>
    <hr>
    <div class="dropdown pb-3">
        <a href="#" class="d-flex align-items-center text-white text-decoration-none dropdown-toggle" id="dropdownUser" data-bs-toggle="dropdown" aria-expanded="false">
            <strong>${sessionScope.type}:${sessionScope.name}</strong>
        </a>
        <ul class="dropdown-menu dropdown-menu-dark text-small shadow" aria-labelledby="dropdownUser">
            <li><a class="dropdown-item" href="${pageContext.request.contextPath}/logoutServlet">退出登录</a></li>
        </ul>
    </div>
</div>


  • myCourse.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
  <title>教师系统</title>
  <link href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>
  <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<div class="d-flex flex-row" style="width: 100%;height: 100%;">
  <!-- menu -->
  <jsp:include page="menu.jsp" flush="true"/>
  <div class="d-flex flex-column" style="width: 100%; height: 100%;">
    <!-- header -->
    <jsp:include page="header.jsp" flush="true"/>
    <!-- content -->
    <div class="container mt-3">
      <h1 class=" pb-3 text-dark text-opacity-75">任课信息</h1>
      <table class="table table-striped table-bordered table-hover">
        <thead>
        <tr>
          <th>课程号</th>
          <th>课程名</th>
          <th>上课地点</th>
          <th>上课时间</th>
        </tr>
        </thead>
        <tbody>
        <c:forEach items="${requestScope.courses}" var="course">
          <tr>
            <td>${course.cid}</td>
            <td>${course.cname}</td>
            <td>${course.cplace}</td>
            <td>${course.ctime}周</td>
          </tr>
        </c:forEach>
        </tbody>
      </table>
    </div>
  </div>
</div>
</body>
</html>
  • personalInfo.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>教师系统</title>
  <link href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>
  <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<div class="d-flex flex-row" style="width: 100%;height: 100%;">
  <!-- menu -->
  <jsp:include page="menu.jsp" flush="true"/>
  <div class="d-flex flex-column" style="width: 100%; height: 100%;">
    <!-- header -->
    <jsp:include page="header.jsp" flush="true"/>
    <!-- content -->
    <div class="container">
      <h1 class=" pb-3 text-dark text-opacity-75" align="center">个人信息</h1>
      <div class="mt-2 ms-auto me-auto">
        <div class="row g-3">
          <div class="col-12">
            <label class="form-label">教工号</label>
            <input type="text" class="form-control" disabled name="sid" value="${personalInfo.tid}">
          </div>
          <div class="col-12">
            <label class="form-label">姓名</label>
            <input type="text" class="form-control" disabled name="sid" value="${personalInfo.tname}">
          </div>
          <div class="col-12">
            <label class="form-label">密码</label>
            <input type="text" class="form-control" disabled name="sid" value="${personalInfo.tpassword}">
          </div>
          <button class="col-4 btn btn-primary ms-auto me-auto" type="button" id="sUpdate">修改个人信息</button>
        </div>
      </div>
      <div class="modal" tabindex="-1" id="sModal">
        <div class="modal-dialog">
          <div class="modal-content">
            <div class="modal-header">
              <h5 class="modal-title">修改个人信息</h5>
              <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <div class="modal-body">
              <form class="needs-validation ms-auto me-auto">
                <div class="row g-3">
                  <div class="col-6">
                    <label class="form-label">教工号</label>
                    <input id="tid" type="text" disabled class="form-control" name="sid" value="${personalInfo.tid}">
                  </div>
                  <div class="col-6">
                    <label class="form-label">姓名</label>
                    <input id="tname" type="text" class="form-control" name="sid" value="${personalInfo.tname}">
                  </div>
                  <div class="col-6">
                    <label class="form-label">密码</label>
                    <input id="tpassword" type="text" class="form-control" name="sid" value="${personalInfo.tpassword}">
                  </div>
                </div>
              </form>
            </div>
            <div class="modal-footer">
              <button type="button" class="btn btn-primary" id="sSubmit">提交</button>
              <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="sClose">关闭</button>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>
<script>
  $(function(){
    var sModal = $("#sModal");

    //显示模态框
    $("#sUpdate").click(function () {
      sModal.css("display","block");
    })
    //关闭模态框
    $("#sClose").click(function () {
      sModal.css("display","none");
    })
    //提交修改发送ajax请求
    $("#sSubmit").click(function () {
      var tJson = {
        "tid":$("#tid").val(),
        "tname":$("#tname").val(),
        "tclass":$("#tclass").val(),
        "tpassword":$("#tpassword").val()
      };
      $.post({
        url:"${pageContext.request.contextPath}/teacher/updatePersonalInfo",
        dataType:"json",
        data:tJson,
        success(res){
          sModal.css("display","none");
          //一定要刷新页面,不然ajax异步机制不会修改整个页面的信息
          location.reload();
        }
      });
    })
  })
</script>
</body>
</html>

  • studentCourse.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
  <title>教师系统</title>
  <link href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>
  <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<div class="d-flex flex-row" style="width: 100%;height: 100%;">
  <!-- menu -->
  <jsp:include page="menu.jsp" flush="true"/>
  <div class="d-flex flex-column" style="width: 100%; height: 100%;">
    <!-- header -->
    <jsp:include page="header.jsp" flush="true"/>
    <!-- content -->
    <div class="container mt-3">
      <h1 class="float-start pb-3 text-dark text-opacity-75">学生选课信息</h1>
      <div class="float-end me-5 mb-4">
        <select class="form-select" id="courses">
        </select>
      </div>
      <table class="table table-striped table-bordered table-hover">
        <thead>
        <tr>
          <th>学号</th>
          <th>姓名</th>
          <th>班级</th>
        </tr>
        </thead>
        <tbody id="students">
        </tbody>
      </table>
    </div>
  </div>
</div>
</body>
<script>
  $(function(){
    var courses = $("#courses");
    var students = $("#students");
    //打开页面时就发送ajax请求获取课程信息到下拉列表框
    $.get({
      url:"${pageContext.request.contextPath}/teacher/getStudentCourse",
      dataType:"json",
      success(res){
        var chtml = "";
        for (let i = 0; i < res.length; i++) {
          chtml += "<option value='"+res[i].cname+"'>"+res[i].cname+"</option>";
        }
        courses.html(chtml);
        getStudent(courses.val());
      }
    })
    courses.change(function (){
      console.log(courses.val())
      getStudent(courses.val());
    })
    //获取该课程下选课的学生信息
    function getStudent(couseName){
      $.get({
        url:"${pageContext.request.contextPath}/teacher/getStudentsByCourseName?courseName="+couseName,
        dataType:"json",
        success(res){
          var shtml = "";
          for (let i = 0; i < res.length; i++) {
            shtml += "<tr><td>"+res[i].sid+"</td><td>"+res[i].sname+"</td><td>"+res[i].sclass+"</td></tr>"
          }
          students.html(shtml);
        }
      })
    }
  })
</script>
</html>

(5)web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    <display-name>System</display-name>

    <!--设置欢迎页主页-->
    <welcome-file-list>
        <welcome-file>welcome</welcome-file>
    </welcome-file-list>

    <!--过滤器,用来过滤用户是否登录-->
    <filter>
        <filter-name>logfilter</filter-name>
        <filter-class>com.clh.filter.CheckFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>logfilter</filter-name>
        <!--所有请求都经过过滤器-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!--SpringMVC控制器,规定什么类型的请求会被SpringMVC捕获并处理-->
    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <!--捕获全部类型的请求-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

五、总结:

由控制台编程阶段转变成了C/S前后端交互阶段,我的编程之路又走过了一个关键点,我觉得应该好好的做一下总结:

从之前纯粹的Servlet+JSP+JDBC完成JavaWeb项目到现在使用JPA代替JDBC,使用SpringMVC优化Servlet,三层架构优化代码逻辑。未来还有Spring优化业务逻辑和管理项目,SpringBoot优化项目配置,还有Vue、ElementUI优化前端,还有一些我没学到的SpringCloud,Docker等。我觉得这些技术都会大大方便我们的编程。
之前我也写过Spring+SpringMVC+Mybatis的项目,现在回头用更原生更底层的方式来写项目,在这个阶段中我发现不管是原生Servlet还是原生JSP都会造成很多不必要的冗余,这些冗余没有技术含量,反而需要我们花费很多时间来CV,现在想想使用框架真的很方便,我终于理解了老杜说过的一句话:不学习底层逻辑你永远不会理解框架的遍历。我认为这是难得的经历。

在这个学期的学习中,不管是JavaWeb、Vue还是SSM框架,我都在不断地完善自己的知识体系,不仅仅是知识本身,在学习每个知识的时候,我都有一种对项目的整体搭建越来越透彻的感觉。就像是学习Serlvet的时候我明白了前后端各自的作用,学习Vue的时候我理解了如何将一个个独立的HTML界面联系起来构建一个完整的项目体,学习Ajax的时候我理解了前端纯HTML界面如何如后端进行交互,还有最后做SSM项目的时候老师给出的前后端接口说明文档,真的震撼到我了,原来前后端分离是通过接口文档来统一请求和响应的。

这个学期结束后,我感觉我对未来的共工作内容不迷茫了,从需求分析,编写接口文档,前后端程序员根据文档进行编程,我发现这其中也包含了软件项目管理,软件工程的内容,所以说我觉得我形成了一个比较完善的知识体系,不过仅凭现在的知识还远远不够,我身边也有很多厉害的大佬,像我写的这个小系统他们看都不看一眼,因为确实很简单很基础,他们经常聊很多高深的知识,我都还没学过,他们接的很多单子也是我现在还远远不能胜任的,他们的简历也没有Servlet,没有JSP,没有SSM,反而是满满一页的其他技术,我一个都没学过,有时候压力还是蛮大的,因为他们简历上少说30多个技术,我一个学过,所以说我还是需要不断的虚心学习,努力跟上他们的脚步,做一个不甘只写单表CRUD的人。

如果你停下脚步选择考研,我支持你,我相信你会做出最有利的选择。

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

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

相关文章

window 和虚拟机ubuntu通讯的网络设置 本地连接桥接和NAT

工作需要&#xff0c;最近在linux下开发&#xff0c;需要将windows里的文件传至虚拟机里以及下位机树莓派中&#xff0c;三者需要实现互传。 windows连接树莓派时是采用网口建立本地连接的&#xff0c;而当不需要连接树莓派时&#xff0c;windows和虚拟机不能通过有线本地连接…

09、SpringCloud 系列:Nacos - 配置文件中心

SpringCloud 系列列表&#xff1a; 文章名文章地址01、Eureka - 集群、服务发现https://blog.csdn.net/qq_46023503/article/details/12831902302、Ribbon - 负载均衡https://blog.csdn.net/qq_46023503/article/details/12833228803、OpenFeign - 远程调用https://blog.csdn.…

Python接口测试实战1(下)- 接口测试工具的使用

本节内容 抓包工具的使用Postman的使用 抓包工具的使用 抓包工具简介 Chrome/Firefox 开发者工具: 浏览器内置&#xff0c;方便易用Fiddler/Charles: 基于代理的抓包&#xff0c;功能强大&#xff0c;可以手机抓包&#xff0c;模拟弱网&#xff0c;拦截请求&#xff0c;定制…

xpdf在windows下的编译记录

目录 1、下载源码 ​编辑 2、准备工作 3、编译freetype 3.1 打开vs工程 3.2 生成之后查看 4、编译zlib 5、编译libpng 6、编译lcms 7、编译xpdf 8、存在问题 1、下载源码 Xpdf官网下载&#xff1a;Download Xpdf and XpdfReader 2、准备工作 3、编译freetype 3.1 打…

财务数字化转型怎么转?从哪几个方面出发

财务的数字化转型如何进行&#xff1f;许多企业在推动各大业务部门进行数字化转型时&#xff0c;往往会忽略财务部门。然而&#xff0c;作为掌握公司核心资源与数据和推动企业数字化建设的部门&#xff0c;财务也应成为企业数字化转型的重要突破口。 这篇就用几个案例详细拆解…

React 入门:实战案例 Github搜索_静态组件

文章目录开发前的准备实现组件静态代码开发前的准备 目标实现页面效果, 及组件拆分&#xff0c;如下图所示 组件代码结构规划 外部资源准备 引入第三方样式 bootstrap CSS 样式库 bootstrap 官网有 v3、v4、v5 三个版本&#xff0c;本文使用的 v3 版本的样式&#xff0c;可…

JavaScript篇.day05-数组, 基本/引用数据类型函数调用区别

目录 1.Array数组 (1)简介 (2)数组的基本操作 (3)数组的遍历 a. 普通数组的遍历 b.对象数组的遍历 (4)数组对象常用方法 2.基本/引用数据类型函数调用区别 1.Array数组 (1)简介 数组时存放一组数据,长度可变的有序集合索引: 从0开始, 空数组索引无效稀疏数组, 其中含…

一文搞懂中台与产品微服务、SaaS的区别

出处&#xff1a;本文摘录自《中台产品经理》一书 谈到“中台”&#xff0c;我们不得不说的另外两个概念就是“微服务”与“SaaS”&#xff0c;有很多人会把“中台”与这两个概念画上等号。但实际上&#xff0c;中台 ≠产品微服务 ≠ SaaS。这两个概念看似与中台很相似&#xf…

因斯布鲁克大学发明一种更快的新型量子计算机

奇偶校验计算机可以在单个量子比特上执行两个或多个量子比特之间的操作&#xff0c;更容易实现复杂的算法。 该团队由 Wolfgang Lechner&#xff08;右一&#xff09;领导&#xff0c;包括Kilian Ender&#xff08;右二&#xff09;、Anette Messinger&#xff08;左二&#xf…

七天免登录(Cookie+session)+ 页面显示动画人物效果(萌娘+气泡效果)

一.七天免登录&#xff08;Cookiesession&#xff09;&#xff0c;基于实现jsp页面 页面效果&#xff1a;勾选7天免登录复选框&#xff0c;输入用户名和密码&#xff0c;点击登录即可&#xff0c;登录后可在cookie中查看用户登录信息&#xff0c;以及用户过期时间 1.登录页面&…

通过heartbeat实现mysql高可用

192.168.6.128 主/heartbeat1 192.168.6.129 从/heartbeat2 192.168.6.131 漂移地址 主备基础&#xff1a;需要在128和129服务器上&#xff0c;搭建mysql主从复制 环境基础配置 128、129操作 # sed -i "s/SELINUXenforcing/SELINUXdisabled/g" /etc/selinux/…

C语言进阶-字符

C语言进阶-字符 #include <stdio.h> int main(int argc, char const *argv[]) {int ch;while ( (ch getchar()) ! EOF ) [putchar(ch);{printf("EOF\n"); }return 0; }强制程序结束 window 字符串数组

java和python调用matlab程序详细记录

Background 关于Java和Python调用matlab程序&#xff0c;网上相关文章很多&#xff0c;但质量不佳&#xff0c;有的前提条件也没介绍&#xff0c;你按照他的步骤来&#xff0c;他成功了&#xff0c;你失败了&#xff0c;很懵啊。我觉得&#xff0c;现在我们查询点什么东西费劲&…

C++11特性-多线程

多线程 线程不是越多越好&#xff0c;每个线程有有一个独立的堆栈空间1M.线程切换需要保存很多中间状态 商用程序的必须要求 并发的实现方法 多进程并发&#xff1a;进程通信&#xff08;同一电脑-文件、管道、共享内存、消息队列&#xff1b;不同电脑-socket&#xff09; 多线…

JSP课设:学生信息管理系统(附源码+调试)

JSP学生信息管理系统 &#xff08;1&#xff09;登录模块&#xff1a;本系统提供用户和管理员两种登陆方式&#xff0c;用户通过输入账号和密码&#xff0c;进行登录。 &#xff08;2&#xff09;注册模块&#xff1a;注册者输入账号和密码&#xff0c;并选择对应的权限级别&a…

交互式仪表板!Python轻松完成!⛵

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; 数据分析实战系列&#xff1a;https://www.showmeai.tech/tutorials/40 &#x1f4d8; 本文地址&#xff1a;https://www.showmeai.tech/article-detail/410 &#x1f4e2; 声明&#xff1a;版权所有&#xff0c;转…

2022年iFLYTEKA.I.开发者大赛疫情微博情绪识别挑战赛

自然语言技术 零基础入门NLP - 新闻文本分类 基于word2vec的word相似度 疫情微博情绪识别挑战赛自然语言技术背景一、赛事任务二、使用步骤1.README2.数据下载3.模型训练及保存4.模型预测5.比赛结果背景 疫情发生对人们生活生产的方方面面产生了重要影响&#xff0c;并引发了…

写一个计算器【后缀表达式】(C++)

前言&#xff1a; 闲来无事&#xff0c; 用后缀表达式写了个计算器。。。 支持加()、减(-)、乘(*)、除(/)、乘方(^) 啥是后缀表达式&#xff1a; 波兰逻辑学家卢卡西维奇发明的表示表达式的方法 后缀式即逆波兰式&#xff0c;是波兰逻辑学家卢卡西维奇&#xff08;&#…

mysql根据父节点递归查询所有子节点,List转树形结构工具类

经常有业务需要递归查询MySQL树形结构某一节点的所有子节点&#xff0c;每次从网上扒拉找都得找半天&#xff0c;索性就自己总结一些自己遇到的比较好用的一些方法。 SQL方法一&#xff1a; SELECT* FROM(SELECTt1.*,IF( FIND_IN_SET( parent_id, parent_ids ) > 0, paren…

2022年先进封装行业研究报告

第一章 行业概况 封装为半导体产业核心一环&#xff0c;主要目的为保护芯片。半导体封装测试处于晶圆制造过程中的后段部分&#xff0c;在芯片制造完后&#xff0c;将晶圆进行封装测试&#xff0c;将通过测试的晶圆按需求及功能加工得到芯片&#xff0c;属于整个 IC 产业链中技…