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

一、前言:

本系统作为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)EntityManagerUtil:

package com.clh.util;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class EntityManagerUtil {
	  private static final EntityManagerFactory entityManagerFactory;
	  static {
	    try {
	      entityManagerFactory = Persistence.createEntityManagerFactory("myjpa");
	    } catch (ExceptionInInitializerError ex) {
	      System.err.println("初始化实体管理器工厂失败。" + ex);
	      throw new ExceptionInInitializerError(ex);
	    }
	  }
	  public static EntityManager getEntityManager() {
	    return entityManagerFactory.createEntityManager();
	  }
	}

(8)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>

(9)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的人。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姓蔡小朋友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值