diff --git a/javaweb_project/src/com/hua/servlet/ApplyStudentListServlet.java b/javaweb_project/src/com/hua/servlet/ApplyStudentListServlet.java index 352d473..68494fe 100644 --- a/javaweb_project/src/com/hua/servlet/ApplyStudentListServlet.java +++ b/javaweb_project/src/com/hua/servlet/ApplyStudentListServlet.java @@ -31,114 +31,158 @@ import com.hua.impl.OptionalCourseDAOImpl; import com.hua.impl.StudentBasicInforDAOImpl; import com.hua.impl.StudentOptCourseDAOImpl; +// 使用@WebServlet注解将该类映射为一个Servlet,"*.List"表示匹配以.List结尾的所有路径请求 @WebServlet("*.List") public class ApplyStudentListServlet extends HttpServlet { private static final long serialVersionUID = 1L; - + + // 重写doGet方法,直接调用doPost方法,通常这样做是为了统一处理GET和POST请求逻辑 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } + // 处理POST请求的主要方法,通过反射机制根据请求路径调用相应的业务处理方法 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - //1.获取ServletPath + // 1.获取当前请求的Servlet路径,例如:/xxx.List这样形式的路径 String servletPath = request.getServletPath(); - //2.去除 / 和 .List + // 2.去除路径开头的'/'以及结尾的'.List',得到要调用的方法名称 String methodName = servletPath.substring(1, servletPath.length() - 5); - + try { - //3.利用反射获取methodName对应的方法 + // 3.利用反射获取methodName对应的方法,参数指定了方法的名称以及对应的参数类型 Method method = getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); - //4.利用反射调用对应的方法 + // 4.利用反射调用对应的方法,传入当前对象(this)以及请求和响应对象作为参数 method.invoke(this, request, response); - } catch (Exception e) { + } catch (Exception e) { + // 如果在反射获取方法或者调用方法过程中出现异常,打印异常堆栈信息 e.printStackTrace(); } } - //查询考级报名学生名单 + + // 查询考级报名学生名单的私有方法,处理具体的业务逻辑 @SuppressWarnings("unused") - private void levelExam(HttpServletRequest request, HttpServletResponse response) + private void levelExam(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 获取当前会话对象,可用于在不同请求间共享数据 HttpSession session = request.getSession(); + // 从请求参数中获取学年学期信息,用于筛选对应的数据 String yearTerm = request.getParameter("yearTerm"); - + + // 获取要查询的学生基本信息列表,根据请求中携带的查询条件来获取 List students = getStudent(request, response); - - Map> map = getAllLevelExamMap(students, yearTerm); - + + // 根据学生信息列表和学年学期,获取每个学生对应的考级考试信息,并封装成Map + Map> map = getAllLevelExamMap(students, yearTerm); + + // 将封装好的学生与考级考试信息的Map存储到会话中,方便后续页面获取并展示 session.setAttribute("map", map); + // 重定向到指定的JSP页面(考级报名学生展示页面),用于展示查询到的数据 response.sendRedirect(request.getContextPath() + "/acdemic_dean/levelexaminationmanage/applystudents.jsp"); } - + + // 根据学生列表和学年学期,获取每个学生对应的考级考试信息,封装成Map返回 private Map> getAllLevelExamMap( List students, String yearTerm) { - Map> map = new HashMap<>(); + // 创建一个用于存储学生与对应考级考试信息的Map + Map> map = new HashMap<>(); + // 创建考级考试列表数据访问对象实例,用于操作考级考试列表相关的数据 LevelExamListDAO lel = new LevelExamListDAOImpl(); + // 创建考级考试数据访问对象实例,用于操作考级考试相关的数据 LevelExamDAO led = new LevelExamDAOImpl(); - - for(StudentBasicInformation sbi : students){ + + // 遍历每个学生基本信息对象 + for (StudentBasicInformation sbi : students) { + // 获取该学生的所有考级考试列表信息(通过学生ID查询) List levelExamLists = lel.getAll(String.valueOf(sbi.getStudentId())); + // 创建一个用于存储当前学生对应有效考级考试信息的列表 List levelExams = new ArrayList(); - for(LevelExamList levelExamList: levelExamLists){ - LevelExam levelExam = led.get(levelExamList.getCourseId(),yearTerm); - if(levelExam != null){ + // 遍历该学生的每个考级考试列表记录 + for (LevelExamList levelExamList : levelExamLists) { + // 根据课程ID和学年学期获取具体的考级考试信息,如果获取到不为空则添加到列表中 + LevelExam levelExam = led.get(levelExamList.getCourseId(), yearTerm); + if (levelExam!= null) { levelExams.add(levelExam); } } - + + // 将当前学生与其对应的考级考试信息列表存入Map中 map.put(sbi, levelExams); } return map; } - //获取选修报名的学生 + // 获取选修报名的学生信息的私有方法,处理相关业务逻辑 @SuppressWarnings("unused") - private void optStudent(HttpServletRequest request, HttpServletResponse response) + private void optStudent(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 获取当前会话对象,用于存储和获取共享数据 HttpSession session = request.getSession(); + // 从请求参数中获取学年学期信息,用于筛选选修课程相关的数据 String yearTerm = request.getParameter("yearTerm"); - + + // 获取要查询的学生基本信息列表,依据请求中的查询条件获取 List students = getStudent(request, response); - - Map> map = getAllOptionalCourseMap(students, yearTerm); - + + // 根据学生信息列表和学年学期,获取每个学生对应的选修课程信息,并封装成Map + Map> map = getAllOptionalCourseMap(students, yearTerm); + + // 将封装好的学生与选修课程信息的Map存储到会话中,方便后续页面使用 session.setAttribute("map", map); + // 重定向到指定的JSP页面(选修课程学生展示页面),用于展示查询到的数据 response.sendRedirect(request.getContextPath() + "/acdemic_dean/acdemic/optionalcourse.jsp"); } + // 根据学生列表和学年学期,获取每个学生对应的选修课程信息,封装成Map返回 private Map> getAllOptionalCourseMap( List students, String yearTerm) { - Map> map = new HashMap<>(); + // 创建一个存储学生与对应选修课程信息的Map + Map> map = new HashMap<>(); + // 创建选修课程数据访问对象实例,用于操作选修课程相关的数据 OptionalCourseDAO oc = new OptionalCourseDAOImpl(); + // 创建学生选修课程数据访问对象实例,用于操作学生选修课程相关的数据 StudentOptCourseDAO soc = new StudentOptCourseDAOImpl(); - - for(StudentBasicInformation sbi : students){ + + // 遍历每个学生基本信息对象 + for (StudentBasicInformation sbi : students) { + // 获取该学生的所有选修课程记录(通过学生ID查询) List studentOptCourses = soc.getAll(String.valueOf(sbi.getStudentId())); + // 创建一个用于存储当前学生对应有效选修课程信息的列表 List optionalCourses = new ArrayList(); - for(StudentOptCourse studentOptCourse: studentOptCourses){ - OptionalCourse optionalCourse = oc.get(studentOptCourse.getCourseId(),yearTerm); - if(optionalCourse != null){ + // 遍历该学生的每条选修课程记录 + for (StudentOptCourse studentOptCourse : studentOptCourses) { + // 根据课程ID和学年学期获取具体的选修课程信息,若获取到不为空则添加到列表中 + OptionalCourse optionalCourse = oc.get(studentOptCourse.getCourseId(), yearTerm); + if (optionalCourse!= null) { optionalCourses.add(optionalCourse); } } - + + // 将当前学生与其对应的选修课程信息列表存入Map中 map.put(sbi, optionalCourses); } return map; } - - //获取要查询的学生信息List - private List getStudent(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException{ - String academy = request.getParameter("academy"); //学院 + + // 根据请求中的参数(学院、专业、班级、学号、姓名等)获取要查询的学生信息列表 + private List getStudent(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // 从请求参数中获取学院信息,用于筛选学生 + String academy = request.getParameter("academy"); + // 从请求参数中获取专业信息,用于筛选学生 String profession = request.getParameter("profession"); + // 从请求参数中获取班级信息,用于筛选学生 String className = request.getParameter("className"); + // 从请求参数中获取学号信息,用于筛选学生 String studentId = request.getParameter("studentId"); + // 从请求参数中获取姓名信息,用于筛选学生 String studentName = request.getParameter("studentName"); - + + // 创建一个学生查询条件对象,封装了上述获取到的各种查询条件信息 CriterStudent cs = new CriterStudent(academy, profession, className, studentName, studentId); + // 创建学生基本信息数据访问对象实例,用于根据条件查询学生基本信息 StudentBasicInforDAO sbi = new StudentBasicInforDAOImpl(); - + + // 根据查询条件对象,调用相应方法获取满足条件的学生基本信息列表并返回 return sbi.getForListWithCriterStudent(cs); } - -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/servlet/CourseScheduleServlet.java b/javaweb_project/src/com/hua/servlet/CourseScheduleServlet.java index f873208..d4ddafc 100644 --- a/javaweb_project/src/com/hua/servlet/CourseScheduleServlet.java +++ b/javaweb_project/src/com/hua/servlet/CourseScheduleServlet.java @@ -19,6 +19,9 @@ import com.hua.impl.CourseScheduleDAOImpl; /** * 获取学生课程表 + * 该Servlet类主要用于处理获取学生课程表相关的业务逻辑, + * 根据传入的学年学期、周数以及当前登录用户信息,从数据库中获取课程安排数据, + * 并进行相应的数据处理和转换后,将结果存储到会话中,最后重定向到展示页面。 * @author hua * */ @@ -26,59 +29,96 @@ import com.hua.impl.CourseScheduleDAOImpl; public class CourseScheduleServlet extends HttpServlet { private static final long serialVersionUID = 1L; + // 处理POST请求的方法,用于获取学生课程表信息并进行后续操作 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 获取当前的HttpSession对象,用于在不同请求之间共享数据,例如存储用户信息、查询结果等 HttpSession session = request.getSession(); + // 从请求参数中获取学年学期信息,用于筛选对应的课程表数据 String yearTerm = request.getParameter("yearTerm"); + // 从请求参数中获取周数信息,同样用于明确具体哪一周的课程表数据 String week = request.getParameter("week"); + // 从会话中获取当前登录的用户对象,前提是用户登录时已将用户信息存入会话中,这里假设用户对象包含了学号等关键信息 User user = (User) session.getAttribute("user"); - if(yearTerm != "" && yearTerm != null && week != null && week != ""){ + + // 判断学年学期和周数参数是否有效(不为空且不为空字符串),只有参数有效时才进行后续获取课程表的操作 + if (yearTerm!= "" && yearTerm!= null && week!= null && week!= "") { + // 调用getCourseSchedule方法,根据学生学号、学年学期和周数获取课程安排的原始数据列表,这些数据可能直接来自数据库 List courseSchedules = getCourseSchedule(user.getUsername(), yearTerm, week); + // 调用getCourseScheduleShow方法,对获取到的原始课程安排数据进行处理和转换,将其整理成更适合展示的格式 List courseScheduleShows = getCourseScheduleShow(courseSchedules); - + + // 将整理好的课程表展示数据存入会话中,以便后续在页面中可以获取并展示给用户 session.setAttribute("courseScheduleShows", courseScheduleShows); } - + + // 重定向到指定的JSP页面(这里假设是用于展示考试安排的页面,可能在该页面中也包含课程表展示部分), + // 让用户能够看到最终的课程表信息,具体页面路径是基于项目的上下文路径来构建的 response.sendRedirect(request.getContextPath() + "/student/informationinquiry/examarrange.jsp"); } - + /** + * 将获取到的原始课程安排数据(CourseSchedule类型的列表)进行处理和转换, + * 整理成适合展示的CourseScheduleShow类型的列表,按照特定的时间格式和布局进行整理。 + * + * @param courseSchedules 原始的课程安排数据列表,包含了每门课程在不同时间的安排信息 + * @return 整理好的、适合展示的课程表展示数据列表 + */ private List getCourseScheduleShow( List courseSchedules) { + // 创建一个用于存储整理后课程表展示数据的列表,初始化为空列表 List courseScheduleShows = new ArrayList(); - - - String[] joints = {"1-2","3-4","5","6-7","8-9","10-12"}; - String[] weekdays = {"星期一","星期二","星期三","星期四","星期五","星期六","星期日"}; - - - if(courseSchedules != null){ - for(int i = 0;i < 6;i++){ + + // 定义课程节次的数组,将一天的课程时间划分为不同的节次区间,例如"1-2"表示第1、2节课是一个整体节次等 + String[] joints = {"1-2", "3-4", "5", "6-7", "8-9", "10-12"}; + // 定义一周中各天的名称数组,对应星期一到星期日 + String[] weekdays = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}; + + // 判断传入的原始课程安排数据是否为空,只有不为空时才进行后续的数据整理操作 + if (courseSchedules!= null) { + // 外层循环遍历课程节次数组,共6个节次 + for (int i = 0; i < 6; i++) { + // 创建一个长度为7的CourseSchedule数组,用于存储对应一周七天在当前节次下的课程安排情况,初始值都为null CourseSchedule[] weekday = new CourseSchedule[7]; - for(CourseSchedule courseSchedule : courseSchedules){ - if(courseSchedule.getJoint().equals(joints[i])){ - for(int j = 0;j < 7;j++){ - if(courseSchedule.getWeekday().equals(weekdays[j])){ + // 内层循环遍历每一条原始课程安排数据 + for (CourseSchedule courseSchedule : courseSchedules) { + // 判断当前课程安排的节次是否与正在处理的节次相等 + if (courseSchedule.getJoint().equals(joints[i])) { + // 再嵌套一层循环,遍历一周七天 + for (int j = 0; j < 7; j++) { + // 判断当前课程安排的星期几与正在处理的星期几相等,如果相等则将该课程安排存入对应位置的数组中 + if (courseSchedule.getWeekday().equals(weekdays[j])) { weekday[j] = courseSchedule; } } } } + // 创建一个CourseScheduleShow对象,将当前节次以及对应一周七天的课程安排情况作为参数传入构造函数, + // 用于封装整理好的、适合展示的一节课程表数据 CourseScheduleShow courseScheduleShow = new CourseScheduleShow(joints[i], weekday[0], weekday[1], weekday[2], weekday[3], weekday[4], weekday[5], weekday[6]); + // 将整理好的这一节课程表数据添加到最终的展示数据列表中 courseScheduleShows.add(courseScheduleShow); } } - + return courseScheduleShows; } - + /** + * 通过调用CourseScheduleDAOImpl实现类的方法,根据学生学号、学年学期和周数, + * 从数据库中获取该学生在对应时间段内的课程安排原始数据列表。 + * + * @param studentId 学生的学号,用于确定查询哪个学生的课程安排数据 + * @param yearTerm 学年学期信息,用于筛选对应时间段的课程安排 + * @param week 周数信息,明确具体哪一周的课程安排 + * @return 从数据库中获取到的该学生在指定学年学期、周数下的课程安排数据列表 + */ private List getCourseSchedule(String studentId, - String yearTerm, String week) { + String yearTerm, String week) { + // 创建CourseScheduleDAO的实现类对象,用于与数据库进行交互,执行查询课程安排数据的操作 CourseScheduleDAO csd = new CourseScheduleDAOImpl(); + // 调用其对应的方法,传入学生学号、学年学期和周数参数,获取并返回符合条件的课程安排数据列表 return csd.getAllWithYearTerm(studentId, yearTerm, week); } - - -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/servlet/CoursegradeServlet.java b/javaweb_project/src/com/hua/servlet/CoursegradeServlet.java index b294cbd..1bbfbe8 100644 --- a/javaweb_project/src/com/hua/servlet/CoursegradeServlet.java +++ b/javaweb_project/src/com/hua/servlet/CoursegradeServlet.java @@ -24,11 +24,13 @@ import com.hua.entity.StudentGrade; import com.hua.entity.User; import com.hua.impl.StudentBasicInforDAOImpl; import com.hua.impl.StudentGradeDAOIpml; + /** * 学生成绩servlet - * 1.教务员查询学生成绩 - * 2.获取学生成绩后统计分析:计算总分,平均分,绩点等等 - * 3.学生用户查询自己的成绩 + * 该类主要实现了以下几个功能: + * 1. 教务员查询学生成绩 + * 2. 获取学生成绩后统计分析:计算总分,平均分,绩点等等 + * 3. 学生用户查询自己的成绩 * @author hua * */ @@ -36,172 +38,222 @@ import com.hua.impl.StudentGradeDAOIpml; public class CoursegradeServlet extends HttpServlet { private static final long serialVersionUID = 1L; - protected void doGet(HttpServletRequest request, HttpServletResponse response) + // 处理GET请求,直接调用doPost方法,通常是为了统一处理GET和POST请求的逻辑 + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) + + // 处理POST请求的主要方法,通过反射机制根据请求路径调用相应的业务处理方法 + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - //1.获取ServletPath:/addUser.do + // 1.获取当前请求的Servlet路径,例如:/xxx.grade这样形式的路径 String servletPath = request.getServletPath(); - //2.去除 / 和 .do ,得到类似于addUser这样的字符串 + // 2.去除路径开头的'/'以及结尾的'.grade',得到要调用的方法名称 String methodName = servletPath.substring(1, servletPath.length() - 6); - + try { - //3.利用反射获取methodName对应的方法 + // 3.利用反射获取methodName对应的方法,参数指定了方法的名称以及对应的参数类型 Method method = getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); - //4.利用反射调用对应的方法 + // 4.利用反射调用对应的方法,传入当前对象(this)以及请求和响应对象作为参数 method.invoke(this, request, response); - } catch (Exception e) { + } catch (Exception e) { + // 如果在反射获取方法或者调用方法过程中出现异常,打印异常堆栈信息 e.printStackTrace(); } - - } - - //成绩统计分析:比如计算绩点,绩点排名等等 + + // 成绩统计分析:比如计算绩点、绩点排名等等,处理相关业务逻辑 @SuppressWarnings("unused") - private void gradeAnalysis(HttpServletRequest request, HttpServletResponse response) + private void gradeAnalysis(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 获取当前会话对象,可用于在不同请求间共享数据 HttpSession session = request.getSession(); + // 从请求参数中获取学年学期信息,用于筛选对应的数据 String yearTerm = request.getParameter("yearTerm"); - //获取要查询的所有学生的信息,放进List中 + + // 获取要查询的所有学生的信息,放进List中,根据请求中携带的查询条件来获取 List students = getStudent(request, response); - - //获取每一位学生与其对应的所有的成绩,作为键值对存入map中 - Map> map = getAllGradeMap(students, yearTerm); - //获取每一位学生的成绩统计分析结果 + + // 获取每一位学生与其对应的所有的成绩,作为键值对存入map中,根据学生信息列表和学年学期获取成绩信息 + Map> map = getAllGradeMap(students, yearTerm); + + // 获取每一位学生的成绩统计分析结果,调用相应方法进行成绩分析计算 Map results = getAnalysisResult(map); - //将每一位学生的成绩分析结果放入session中 + + // 将每一位学生的成绩分析结果放入session中,方便后续页面获取并展示 session.setAttribute("results", results); - //重定向到jsp显示页面 + + // 重定向到jsp显示页面(成绩分析结果展示页面),用于展示查询到的成绩分析数据 response.sendRedirect(request.getContextPath() + "/acdemic_dean/acdemic/grademanagement/gradeanalysis.jsp"); } - - //获取成绩分析结果,把结果放入一个数组中 + + // 获取成绩分析结果,把结果放入一个以学生信息为键,成绩分析结果为值的Map中返回 private Map getAnalysisResult( Map> map) { - //List results = new ArrayList(); + // 创建一个用于存储学生与对应成绩分析结果的Map Map GradeMap = new HashMap<>(); - - for(Map.Entry> entry : map.entrySet()){ + + // 遍历存储学生与成绩信息的Map的每一个键值对 + for (Map.Entry> entry : map.entrySet()) { + // 获取当前学生的基本信息对象 StudentBasicInformation stu = entry.getKey(); + // 获取当前学生对应的所有成绩信息列表 List studentGrades = entry.getValue(); - int courseCount = studentGrades.size(); //获取课程门数 - if(courseCount != 0){ - int score = getScore(studentGrades); //获取总分 - double averScore = score / courseCount; //平均分 - double gradePoint = getGradePoint(studentGrades); //平均学分绩点 - double averCreditGrade = (gradePoint + 5) * 10; //平均学分成绩 - - //使平均分、平均学分绩点、平均学分成绩输出两位小数(四舍五入) - DecimalFormat df = new DecimalFormat("#.00"); - + // 获取该学生的课程门数 + int courseCount = studentGrades.size(); + + // 如果课程门数不为0,则进行成绩分析相关计算 + if (courseCount!= 0) { + // 获取该学生的总分,调用相应方法计算总分 + int score = getScore(studentGrades); + // 计算平均分,总分除以课程门数 + double averScore = score / courseCount; + // 计算平均学分绩点,调用相应方法获取 + double gradePoint = getGradePoint(studentGrades); + // 计算平均学分成绩,按照特定公式计算 + double averCreditGrade = (gradePoint + 5) * 10; + + // 创建一个DecimalFormat对象,用于格式化数字,使平均分、平均学分绩点、平均学分成绩输出两位小数(四舍五入) + DecimalFormat df = new DecimalFormat("#.00"); + + // 创建一个成绩分析结果对象,封装学生的学号、课程门数、总分、平均学分绩点、平均学分成绩、平均分等信息 GradeAnalysisResult gradeAnalysisResult = new GradeAnalysisResult(stu.getStudentId(), courseCount, score, df.format(gradePoint), df.format(averCreditGrade), df.format(averScore)); - - GradeMap.put(stu, gradeAnalysisResult); + + // 将当前学生与其对应的成绩分析结果存入GradeMap中 + GradeMap.put(stu, gradeAnalysisResult); } } - + return GradeMap; } - - //求平均学分绩点 + + // 求平均学分绩点的方法,根据学生的每门课程成绩和学分来计算 private double getGradePoint(List studentGrades) { StudentGrade studentGrade = null; - double credit = 0.0,sum = 0.0; - + double credit = 0.0, sum = 0.0; + + // 创建一个迭代器,用于遍历学生成绩列表 Iterator iter = studentGrades.iterator(); - while(iter.hasNext()){ - studentGrade= iter.next(); + // 遍历每一门课程成绩信息 + while (iter.hasNext()) { + studentGrade = iter.next(); + // 按照平均学分绩点的计算公式,累加每门课程的成绩绩点与学分的乘积 sum = sum + studentGrade.getGradePoint() * studentGrade.getCredit(); + // 累加所有课程的学分 credit = credit + studentGrade.getCredit(); - + } - + + // 返回平均学分绩点,即总和除以总学分 return sum / credit; } - + + // 求总分的方法,遍历学生的每门课程成绩并累加得到总分 private int getScore(List studentGrades) { int score = 0; - + + // 创建迭代器用于遍历成绩列表 Iterator iter = studentGrades.iterator(); StudentGrade studentGrade = null; - while(iter.hasNext()){ - studentGrade= iter.next(); - score = score + studentGrade.getScore(); + // 遍历每一门课程成绩信息 + while (iter.hasNext()) { + studentGrade = iter.next(); + // 累加每门课程的成绩到总分变量中 + score = score + studentGrade.getScore(); } return score; } - //教务员查询学生成绩 + // 教务员查询学生成绩的方法,处理相关业务逻辑 @SuppressWarnings("unused") - private void deanQuery(HttpServletRequest request, HttpServletResponse response) + private void deanQuery(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 获取当前会话对象,用于存储和获取共享数据 HttpSession session = request.getSession(); + // 从请求参数中获取学年学期信息,用于筛选学生成绩相关的数据 String yearTerm = request.getParameter("yearTerm"); - + + // 获取要查询的所有学生的信息,依据请求中的查询条件获取 List students = getStudent(request, response); - - - Map> map = getAllGradeMap(students, yearTerm); - + + // 获取每一位学生与其对应的所有的成绩,作为键值对存入map中,根据学生信息和学年学期获取成绩信息 + Map> map = getAllGradeMap(students, yearTerm); + + // 将获取到的学生成绩信息Map存储到会话中,方便后续页面使用 session.setAttribute("map", map); - + + // 重定向到jsp显示页面(教务员查询学生成绩展示页面),用于展示查询到的学生成绩数据 response.sendRedirect(request.getContextPath() + "/acdemic_dean/acdemic/grademanagement/gradequery.jsp"); } - - + // 根据学生信息列表和学年学期,获取每个学生对应的成绩信息,封装成Map返回 private Map> getAllGradeMap( List students, String yearTerm) { - Map> map = new HashMap<>(); + // 创建一个用于存储学生与对应成绩信息的Map + Map> map = new HashMap<>(); + // 创建学生成绩数据访问对象实例,用于操作学生成绩相关的数据 StudentGradeDAO sgd = new StudentGradeDAOIpml(); - - for(StudentBasicInformation sbi : students){ - List studentGrades = sgd.getAllWithYearTerm(sbi.getStudentId(),yearTerm); + + // 遍历每个学生基本信息对象 + for (StudentBasicInformation sbi : students) { + // 获取该学生的所有成绩信息(通过学生ID和学年学期查询) + List studentGrades = sgd.getAllWithYearTerm(sbi.getStudentId(), yearTerm); + // 将当前学生与其对应的成绩信息列表存入Map中 map.put(sbi, studentGrades); } return map; } - - //获取条件查询到的所有学生信息 + + // 根据请求中的参数(学院、专业、班级、学号、姓名等)获取要查询的所有学生信息列表 private List getStudent( - HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ - String academy = request.getParameter("academy"); //学院 + HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 从请求参数中获取学院信息,用于筛选学生 + String academy = request.getParameter("academy"); + // 从请求参数中获取专业信息,用于筛选学生 String profession = request.getParameter("profession"); + // 从请求参数中获取班级信息,用于筛选学生 String className = request.getParameter("className"); + // 从请求参数中获取学号信息,用于筛选学生 String studentId = request.getParameter("studentId"); + // 从请求参数中获取姓名信息,用于筛选学生 String studentName = request.getParameter("studentName"); - + + // 创建一个学生查询条件对象,封装了上述获取到的各种查询条件信息 CriterStudent cs = new CriterStudent(academy, profession, className, studentName, studentId); + // 创建学生基本信息数据访问对象实例,用于根据条件查询学生基本信息 StudentBasicInforDAO sbi = new StudentBasicInforDAOImpl(); - + + // 根据查询条件对象,调用相应方法获取满足条件的学生基本信息列表并返回 return sbi.getForListWithCriterStudent(cs); } - - //学生用户查询自己的成绩 + + // 学生用户查询自己成绩的方法,处理相关业务逻辑 @SuppressWarnings("unused") - private void studentQuery(HttpServletRequest request, HttpServletResponse response) + private void studentQuery(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 获取当前会话对象,用于获取用户相关信息以及存储查询到的成绩信息 HttpSession session = request.getSession(); - + + // 从会话中获取当前登录的用户对象,该对象应该在用户登录时已存入会话中 User user = (User) session.getAttribute("user"); - + + // 获取当前学生用户的所有课程成绩信息列表,调用相应方法通过用户信息获取成绩 List studentGrades = getAllcourseGradeList(user); - + + // 将获取到的学生成绩信息列表存储到会话中,方便后续页面展示 session.setAttribute("studentGrades", studentGrades); - + + // 重定向到jsp显示页面(学生成绩查询结果展示页面),用于展示查询到的学生自己的成绩数据 response.sendRedirect(request.getContextPath() + "/student/informationinquiry/coursegrade.jsp"); } - + + // 根据用户信息获取该用户(学生)的所有课程成绩信息列表 private List getAllcourseGradeList(User user) { + // 创建学生成绩数据访问对象实例,用于操作学生成绩相关的数据 StudentGradeDAO sgd = new StudentGradeDAOIpml(); + // 通过用户的学号(这里假设用户名就是学号)获取该学生的所有课程成绩信息并返回 return sgd.getAllCourseGrade(Long.parseLong(user.getUsername())); } - - - -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/servlet/ExamArrangeServlet.java b/javaweb_project/src/com/hua/servlet/ExamArrangeServlet.java index 681e680..c0bfd68 100644 --- a/javaweb_project/src/com/hua/servlet/ExamArrangeServlet.java +++ b/javaweb_project/src/com/hua/servlet/ExamArrangeServlet.java @@ -15,33 +15,62 @@ import com.hua.entity.ExamArrange; import com.hua.entity.User; import com.hua.impl.ExamArrangeDAOImpl; +// ʹ@WebServletע⽫ӳΪһServletָ·Ϊ"/examArrangeServlet" @WebServlet("/examArrangeServlet") public class ExamArrangeServlet extends HttpServlet { private static final long serialVersionUID = 1L; + // ExamArrangeDAOʵںݿ⽻ȡ԰ ExamArrangeDAO e = new ExamArrangeDAOImpl(); - + + // дHttpServletdoPostڴPOST󣬸÷Ҫȡ԰Ϣݸǰչʾ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // ȡǰHttpSession󣬿ڲͬ乲ݣ洢ûϢѯĿ԰ݵ HttpSession session = request.getSession(); + // лȡѧѧϢɸѡضʱεĿ԰ String yearTerm = request.getParameter("yearTerm"); + // ӻỰлȡǰ¼ûǰû¼ʱѽûϢỰУûѧŵȹؼϢ˴ûȡ԰ţƲûѧжӦϵ User user = (User) session.getAttribute("user"); - + + // ڴ洢ѯĿ԰ϢбʼΪnull List examArranges = null; - - if(yearTerm != "" && yearTerm != null){ + + // жѧѧڲǷЧΪҲΪַݲͬòͬķȡ԰ + if (yearTerm!= "" && yearTerm!= null) { + // ѧѧڲЧgetExamArrangeûѧѧڲȡӦʱεĿ԰ examArranges = getExamArrange(user.getUsername(), yearTerm); - }else{ + } else { + // ѧѧڲЧΪջַͨûȡûп԰ examArranges = getExamArrange(user.getUsername()); } + + // ȡĿ԰бỰУҳлȡչʾû session.setAttribute("examArranges", examArranges); + + // ضָJSPҳ棨"/student/informationinquiry/examarrange.jsp"չʾ԰Ϣû鿴 response.sendRedirect(request.getContextPath() + "/student/informationinquiry/examarrange.jsp"); } + /** + * ͨExamArrangeDAOImplʵķûȡûп԰б + * ÷ҪڲҪضѧѧɸѡʱȡȫؿ԰š + * + * @param username ûûƲѧȷѯĸûĿ԰ + * @return ݿлȡĸûп԰б + */ private List getExamArrange(String username) { return e.getAllWithStudentId(username); } - private List getExamArrange(String username, String yearTerm) { + /** + * ͨExamArrangeDAOImplʵķûѧѧڻȡûڶӦʱڵĿ԰б + * ڰָѧѧɸѡĿ԰Ϣ + * + * @param username ûûƲѧȷѯĸûĿ԰ + * @param yearTerm ѧѧϢɸѡӦʱεĿ԰ + * @return ݿлȡĸûָѧѧµĿ԰б + */ + private List getExamArrange(String username, String yearTerm) { return e.getAllWithYearTerm(username, yearTerm); } -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/servlet/ExemptionApplyServlet.java b/javaweb_project/src/com/hua/servlet/ExemptionApplyServlet.java index 29b9585..d2adbf6 100644 --- a/javaweb_project/src/com/hua/servlet/ExemptionApplyServlet.java +++ b/javaweb_project/src/com/hua/servlet/ExemptionApplyServlet.java @@ -13,26 +13,49 @@ import com.hua.entity.ExemptionApply; import com.hua.entity.User; import com.hua.impl.ExemptionApplyDAOImpl; +// 使用@WebServlet注解将该类映射为一个Servlet,指定其访问路径为"/exemptionApplyServlet", +// 表明该Servlet用于处理与课程免修申请相关的请求 @WebServlet("/exemptionApplyServlet") public class ExemptionApplyServlet extends HttpServlet { private static final long serialVersionUID = 1L; + + // 创建ExemptionApplyDAO的实现类对象,用于与数据库交互,执行与课程免修申请数据相关的操作, + // 比如插入新的免修申请记录等 ExemptionApplyDAO pea = new ExemptionApplyDAOImpl(); - protected void doPost(HttpServletRequest request, HttpServletResponse response) + // 重写HttpServlet的doPost方法,用于处理POST请求,此方法实现了课程免修申请的核心业务逻辑, + // 包括接收申请信息、构建申请对象并插入数据库,以及反馈申请结果信息等操作 + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 获取当前的HttpSession对象,可用于在不同请求间共享数据,例如获取当前登录用户的信息, + // 以及存储申请结果相关的提示信息等 HttpSession session = request.getSession(); + // 从会话中获取当前登录的用户对象,前提是用户登录时已将用户信息存入会话中,这里假设用户对象包含了如用户名等关键信息, + // 并且用户名会作为课程免修申请的关联信息一同存入数据库 User user = (User) session.getAttribute("user"); - + + // 从请求参数中获取学年学期信息,该信息将作为课程免修申请的一部分,表明申请针对的是哪个学年学期的课程 String yearTerm = request.getParameter("yearTerm"); + // 从请求参数中获取课程名称信息,明确要申请免修的具体课程 String courseName = request.getParameter("courseName"); + // 从请求参数中获取申请理由信息,说明为什么要申请该课程的免修 String applyReason = request.getParameter("applyReason"); - + + // 根据获取到的学年学期、用户名、课程名称以及申请理由等信息,创建一个ExemptionApply对象, + // 该对象封装了课程免修申请的各项关键信息,用于后续插入数据库操作 ExemptionApply exemptionApply = new ExemptionApply(yearTerm, user.getUsername(), courseName, applyReason); + + // 调用ExemptionApplyDAO实现类的insert方法,将构建好的课程免修申请对象插入到数据库中, + // 以此完成课程免修申请的提交操作,数据库中会记录下这条申请记录 pea.insert(exemptionApply); - + + // 创建一个提示信息字符串,表示申请提交成功,用于反馈给用户申请操作的结果 String message = "提交成功"; + // 将申请成功的提示信息存入会话中,方便后续在页面中获取并展示给用户,让用户知晓申请操作的执行情况 session.setAttribute("message", message); + + // 重定向到指定的JSP页面("/student/businessmanagement/exemptionapply.jsp"), + // 通常该页面可能用于展示申请结果或者再次进行相关操作等,将用户引导回相应的业务页面 response.sendRedirect(request.getContextPath() + "/student/businessmanagement/exemptionapply.jsp"); } - -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/servlet/FindPasswordServlet.java b/javaweb_project/src/com/hua/servlet/FindPasswordServlet.java index 251e8cd..f11f382 100644 --- a/javaweb_project/src/com/hua/servlet/FindPasswordServlet.java +++ b/javaweb_project/src/com/hua/servlet/FindPasswordServlet.java @@ -11,81 +11,141 @@ import javax.servlet.http.HttpSession; import com.hua.entity.User; import com.hua.impl.UserDAOImpl; +// 使用@WebServlet注解将该类映射为一个Servlet,指定其访问路径为"/findPasswordServlet", +// 表明该Servlet主要用于处理用户找回密码相关的业务逻辑 @WebServlet("/findPasswordServlet") public class FindPasswordServlet extends HttpServlet { private static final long serialVersionUID = 1L; - + + // 重写HttpServlet的doPost方法,用于处理POST请求,此方法实现了用户找回密码的核心业务逻辑, + // 包括获取请求参数、验证参数合法性、防止重复提交、验证账号凭据以及重置密码等操作 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 获取当前的HttpSession对象,可用于在不同请求间共享数据,例如存储提示信息、用户相关信息等, + // 方便在整个找回密码的流程中传递和使用数据 HttpSession session = request.getSession(); - - //获取请求参数username和idCard + + // 从请求参数中获取用户名(username)信息,该信息将用于后续在数据库中查找对应的用户记录, + // 以验证账号的合法性以及关联相关用户信息 String username = request.getParameter("username"); - String idCard = request.getParameter("idCard"); - - //防止重复提交 - if(!repeatSubmit(request, response)) return; - - if(username == "" && idCard == ""){ + // 从请求参数中获取身份证号码(idCard)信息,这里将其作为一种验证用户身份的凭据, + // 与数据库中存储的用户对应信息进行比对来确认用户身份 + String idCard = request.getParameter("idCard"); + + // 调用repeatSubmit方法,检查当前请求是否为重复提交,若为重复提交则直接返回,不再执行后续找回密码的逻辑, + // 以此来防止用户多次重复提交相同的找回密码请求,避免不必要的数据操作和安全风险 + if (!repeatSubmit(request, response)) return; + + // 判断用户名和身份证号码是否都为空字符串,如果都为空,则表示用户未正确填写必要信息 + if (username == "" && idCard == "") { + // 创建一个提示信息字符串,告知用户账号和凭据不能为空,用于反馈给用户操作中存在的问题 String message = "账号和凭据不能为空"; - session.setAttribute("message", message); - }else{ + // 将提示信息存入会话中,方便后续在页面中获取并展示给用户,让用户知晓此次操作失败的原因 + session.setAttribute("message", message); + } else { + // 调用get方法,根据用户名从数据库中查询对应的用户信息,尝试获取用户对象, + // 若能获取到用户对象,则表示该账号存在,可进行后续的密码验证等操作 User user = get(username); - if(user != null && (!user.getFindMMproof().equals(idCard))){ - //密码匹配失败后返回登录页面并带回一条信息:输入密码错误,请重新输入 + // 判断获取到的用户对象是否不为空,并且用户在数据库中存储的身份验证凭据(此处假设为与idCard比对的信息)与传入的不一致, + // 即密码匹配失败的情况 + if (user!= null && (!user.getFindMMproof().equals(idCard))) { + // 创建一个提示信息字符串,告知用户账号或凭据不正确,让用户重新输入, + // 用于反馈给用户身份验证未通过的情况 String message = "账号或凭据不正确,请重新输入"; + // 将提示信息存入会话中,方便后续在页面中获取并展示给用户,让用户知晓此次操作失败的原因 session.setAttribute("message", message); - + + // 同时将用户输入的用户名也存入会话中,方便在返回页面时可以回显给用户,减少用户再次输入的工作量 session.setAttribute("username", username); - }else{ - //重置密码 + } else { + // 如果用户对象不为空且身份验证通过,调用resetPassword方法重置用户密码, + // 进行修改密码的实际操作,并获取重置后的新密码 String newPassword = resetPassword(user); + // 创建一个提示信息字符串,告知用户重置密码的结果,即显示新密码是什么, + // 用于反馈给用户密码重置成功的情况 session.setAttribute("message", "重置密码为:" + newPassword); } - } - //重定向回到登录页面 + + // 重定向回到登录页面(此处路径为相对路径,假设在项目的"login"目录下有"findpassword.jsp"页面用于展示找回密码相关信息和结果), + // 将用户引导回相应的页面,以便用户查看操作结果或者继续进行其他操作(如使用新密码登录等) response.sendRedirect("login/findpassword.jsp"); - } + /** + * 重置用户密码的方法,将用户密码设置为固定值(此处为"000000"), + * 并通过调用UserDAOImpl的update方法将更新后的用户信息保存到数据库中, + * 最后返回重置后的新密码。 + * + * @param user 要重置密码的用户对象,包含了用户的相关信息以及待更新的密码字段等 + * @return 重置后的新密码,即固定设置的"000000"字符串 + */ private String resetPassword(User user) { + // 设置新密码为固定值"000000",实际应用中可能会采用更安全、随机生成密码的方式 String newPassword = "000000"; - + + // 创建UserDAOImpl对象,用于与数据库进行交互,执行更新用户信息(此处主要是更新密码)的操作 UserDAOImpl userDAOImpl = new UserDAOImpl(); - + + // 将用户对象中的密码字段设置为新密码 user.setPassword(newPassword); - + + // 调用UserDAOImpl的update方法,将更新后的用户对象信息保存到数据库中,完成密码重置的数据库操作 userDAOImpl.update(user); - + return newPassword; - } - private boolean repeatSubmit(HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException{ + /** + * 检查当前请求是否为重复提交的方法,通过比较会话中的令牌(token)和请求参数中的令牌值来判断。 + * 如果两者相等,表示不是重复提交,同时移除会话中的令牌以防止下次重复使用; + * 如果两者不相等,则表示是重复提交,会重定向到特定的重复提交提示页面("/repeatsubmit.jsp")。 + * + * @param request 当前的HttpServletRequest对象,用于获取请求参数中的令牌值等信息 + * @param response 当前的HttpServletResponse对象,用于执行重定向操作,将用户引导到相应页面 + * @return 如果不是重复提交返回true,否则返回false + * @throws IOException 可能在重定向操作时抛出的IO异常,例如网络问题等导致无法正确重定向 + * @throws ServletException 可能在处理请求、会话操作等过程中抛出的Servlet相关异常 + */ + private boolean repeatSubmit(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + // 获取当前的HttpSession对象,用于获取会话中存储的令牌信息 HttpSession session = request.getSession(); - + + // 从会话中获取之前存储的令牌(token)对象,该令牌用于标识一次合法的请求操作 Object token = session.getAttribute("token"); + // 从请求参数中获取令牌值(tokenVlaue),用于与会话中的令牌进行比对 String tokenVlaue = request.getParameter("token"); - - if(token != null && token.equals(tokenVlaue)){ + + // 判断会话中的令牌对象不为空,并且与请求参数中的令牌值相等,即表示此次请求不是重复提交 + if (token!= null && token.equals(tokenVlaue)) { + // 移除会话中的令牌,避免下次使用相同令牌进行重复操作,保证每次合法操作的唯一性 session.removeAttribute("token"); return true; - }else{ + } else { + // 如果令牌不匹配,表示是重复提交,重定向到指定的重复提交提示页面("/repeatsubmit.jsp"), + // 告知用户不要重复提交请求,并返回false表示此次请求不符合要求 response.sendRedirect(request.getContextPath() + "/repeatsubmit.jsp"); return false; } - } + /** + * 根据用户名从数据库中查询对应的用户信息的方法,通过创建UserDAOImpl对象并调用其get方法, + * 尝试从数据库中获取指定用户名的用户记录,若能获取到则返回对应的用户对象,否则返回null。 + * + * @param username 要查询的用户名,作为在数据库中查找用户记录的关键依据 + * @return 查询到的用户对象,如果数据库中存在对应用户名的记录则返回该用户对象,否则返回null + */ private User get(String username) { - //进入数据库查询 + // 创建UserDAOImpl对象,用于与数据库进行交互,执行查询用户信息的操作 UserDAOImpl userDAOImpl = new UserDAOImpl(); + // 调用UserDAOImpl的get方法,传入用户名参数,从数据库中获取对应的用户对象 User user = userDAOImpl.get(username); - if(user != null){ + // 如果获取到的用户对象不为空,则直接返回该用户对象 + if (user!= null) { return user; } + // 如果未获取到用户对象(即数据库中不存在对应用户名的记录),则返回null return null; } - -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/servlet/JwTeacherInformationServlet.java b/javaweb_project/src/com/hua/servlet/JwTeacherInformationServlet.java index 94b00fc..d800eff 100644 --- a/javaweb_project/src/com/hua/servlet/JwTeacherInformationServlet.java +++ b/javaweb_project/src/com/hua/servlet/JwTeacherInformationServlet.java @@ -17,62 +17,105 @@ import com.hua.entity.JwTeacher; import com.hua.entity.User; import com.hua.impl.JwTeacherDAOImpl; +// 使用@WebServlet注解将该类映射为一个Servlet,指定其访问路径为"/jwTeacherInformationServlet", +// 表明这个Servlet主要用于处理与教务教师信息相关的请求操作,比如获取教师信息、修改教师信息等 @WebServlet("/jwTeacherInformationServlet") public class JwTeacherInformationServlet extends HttpServlet { private static final long serialVersionUID = 1L; + // 创建JwTeacherDAO的实现类对象,用于与数据库进行交互,执行与教务教师信息数据相关的操作, + // 例如从数据库中获取教师信息、更新教师信息到数据库等 JwTeacherDAO teacherdao = new JwTeacherDAOImpl(); - - //获得教师信息,转换到显示页面显示教师信息 + + // 处理GET请求的方法,主要功能是获取教师信息,并将其转发到显示页面进行展示, + // 实现了从后台获取数据到前端页面展示的逻辑流程 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 获取当前的HttpSession对象,可用于在不同请求间共享数据,比如获取当前登录用户的信息, + // 此处假设用户登录后相关信息已存入会话中,并且与教师信息存在关联(可能通过用户名等关联) HttpSession session = request.getSession(); + // 从会话中获取当前登录的用户对象,后续可能会根据用户信息来获取对应的教师信息(例如以用户名作为查询条件等) User user = (User) session.getAttribute("user"); - + + // 调用get方法,根据获取到的用户信息去查询对应的教师信息,尝试获取教师对象 JwTeacher teacher = get(user); - + + // 将获取到的教师对象设置为请求属性,这样在转发到显示页面后,页面可以通过获取请求属性的方式拿到教师信息进行展示 request.setAttribute("teacher", teacher); - + + // 使用请求转发的方式,将请求和响应对象转发到指定的JSP页面("/acdemic_dean/personalaffair/personalinformation.jsp"), + // 该页面用于展示教师的个人信息,通过这种方式将后台获取到的教师信息传递到前端页面进行展示 request.getRequestDispatcher("/acdemic_dean/personalaffair/personalinformation.jsp").forward(request, response); } + /** + * 根据传入的用户对象,从数据库中查询对应的教师信息的方法。 + * 通过调用JwTeacherDAOImpl的相关方法,尝试获取指定用户对应的教师记录,若能获取到则返回教师对象,否则返回null。 + * + * @param user 与教师信息相关联的用户对象,通常包含如用户名等关键信息,用于在数据库中查找对应的教师记录 + * @return 查询到的教师对象,如果数据库中存在与该用户对应的教师记录则返回该教师对象,否则返回null + */ private JwTeacher get(User user) { - + // 调用JwTeacherDAO实现类的get方法,传入用户的用户名(假设用户名作为关联教师信息的关键字段), + // 从数据库中获取对应的教师对象 JwTeacher teacher = teacherdao.get(user.getUsername()); - if(teacher != null){ + // 如果获取到的教师对象不为空,则直接返回该教师对象,表示成功获取到教师信息 + if (teacher!= null) { return teacher; } - + + // 如果未获取到教师对象(即数据库中不存在与该用户对应的教师记录),则返回null return null; } - //修改教师信息,转换回到显示页面显示修改后的教师信息 - protected void doPost(HttpServletRequest request, HttpServletResponse response) + // 处理POST请求的方法,主要用于接收修改后的教师信息,更新数据库中的教师信息记录, + // 并将操作结果反馈到显示页面展示修改后的信息,实现了修改教师信息的完整业务逻辑 + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 调用getTeacher方法,从请求参数中获取并封装成教师对象,该对象包含了修改后的教师信息内容 JwTeacher teacher = getTeacher(request, response); - - //调用DAO修改数据库中的信息 + + // 调用JwTeacherDAO实现类的update方法,将包含修改后信息的教师对象更新到数据库中, + // 以此完成对教师信息在数据库层面的修改操作 teacherdao.update(teacher); - + + // 将一条表示修改成功的提示信息设置为请求属性,方便在转发到显示页面后展示给用户,让用户知晓信息修改操作已成功完成 request.setAttribute("message", "修改成功"); + + // 调用doGet方法,重新获取修改后的教师信息并转发到显示页面进行展示,使得用户能够看到最新的教师信息情况 doGet(request, response); } - private JwTeacher getTeacher(HttpServletRequest request, - HttpServletResponse response)throws ServletException, IOException{ + /** + * 从请求参数中获取各个参数值,并封装成一个JwTeacher对象的方法。 + * 通过遍历请求参数的名称枚举,获取每个参数对应的具体值,然后按照JwTeacher对象的构造函数要求进行封装, + * 最终返回包含请求中传递的教师信息的JwTeacher对象。 + * + * @param request 当前的HttpServletRequest对象,用于获取请求参数的相关信息,如参数名称、参数值等 + * @param response 当前的HttpServletResponse对象,虽然在此方法中未直接使用,但遵循Servlet方法的参数规范保留该参数 + * @return 封装了请求参数中教师信息的JwTeacher对象,用于后续更新数据库或者传递到页面展示等操作 + * @throws ServletException 在处理请求参数过程中,如果出现Servlet相关异常则抛出 + * @throws IOException 在读取请求参数等涉及IO操作过程中,如果出现IO异常则抛出 + */ + private JwTeacher getTeacher(HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { JwTeacher teacher = null; - + + // 获取请求参数名称的枚举对象,通过该枚举可以遍历所有的请求参数名称,进而获取对应的参数值 Enumeration en = request.getParameterNames(); + // 创建一个List集合,用于存储请求参数的值,方便后续按照顺序获取并封装到教师对象中 List parameterValues = new ArrayList<>(); - while(en.hasMoreElements()){ + // 遍历请求参数名称枚举,将每个参数名称对应的参数值添加到List集合中 + while (en.hasMoreElements()) { parameterValues.add(request.getParameter(en.nextElement())); } - - teacher = new JwTeacher(parameterValues.get(0), parameterValues.get(1), - parameterValues.get(2), parameterValues.get(3), parameterValues.get(4), - parameterValues.get(6), parameterValues.get(5), parameterValues.get(7), + + // 根据获取到的请求参数值列表,按照JwTeacher对象构造函数的参数顺序,创建一个新的JwTeacher对象, + // 该对象封装了从请求中传递过来的教师信息,例如姓名、工号等各个字段信息 + teacher = new JwTeacher(parameterValues.get(0), parameterValues.get(1), + parameterValues.get(2), parameterValues.get(3), parameterValues.get(4), + parameterValues.get(6), parameterValues.get(5), parameterValues.get(7), parameterValues.get(8), parameterValues.get(10), parameterValues.get(9)); - + return teacher; } - -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/servlet/LevelExamServlet.java b/javaweb_project/src/com/hua/servlet/LevelExamServlet.java index b0718cb..08b7ca2 100644 --- a/javaweb_project/src/com/hua/servlet/LevelExamServlet.java +++ b/javaweb_project/src/com/hua/servlet/LevelExamServlet.java @@ -21,80 +21,129 @@ import com.hua.entity.User; import com.hua.impl.LevelExamDAOImpl; import com.hua.impl.LevelExamListDAOImpl; +// 使用@WebServlet注解将该类映射为一个Servlet,"*.apply"表示匹配以.apply结尾的所有路径请求, +// 这个Servlet主要用于处理与等级考试相关的业务操作,比如查询等级考试信息、学生报名等级考试等功能 @WebServlet("*.apply") public class LevelExamServlet extends HttpServlet { - private static final long serialVersionUID = 1L; - - LevelExamDAO led = new LevelExamDAOImpl(); - LevelExamListDAO lel = new LevelExamListDAOImpl(); - - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - doPost(request, response); - } - - - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - //1.获取ServletPath - String servletPath = request.getServletPath(); - //2.去除 / 和 .apply - String methodName = servletPath.substring(1, servletPath.length() - 6); - - try { - //3.利用反射获取methodName对应的方法 - Method method = getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); - //4.利用反射调用对应的方法 - method.invoke(this, request, response); - } catch (Exception e) { - e.printStackTrace(); - } - } - - //查询选修课程信息 - @SuppressWarnings("unused") - private void query(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - HttpSession session = request.getSession(); - User user = (User) session.getAttribute("user"); - String yearTerm = request.getParameter("yearTerm"); - - Map map = new HashMap<>(); - List levelExams = led.getAllWithYearTerm(yearTerm); - //查询该学生已报名的课程 - for(LevelExam levelExam: levelExams){ - LevelExamList levelExamList = new LevelExamList(user.getUsername(), levelExam.getCourseId()); - if(lel.get(levelExamList) != null){ - map.put(levelExam, "是"); - }else{ - map.put(levelExam, "否"); - } - } - session.setAttribute("map", map); - - response.sendRedirect(request.getContextPath() + "/student/courseselect/levelexamapply.jsp"); - } - - //学生报名选修课程 - @SuppressWarnings("unused") - private void apply(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - HttpSession session = request.getSession(); - User user = (User) session.getAttribute("user"); - String courseId = request.getParameter("courseId"); - - - LevelExamList levelExamList = new LevelExamList(user.getUsername(), courseId); - //判断该课程是否已报名,防止重报名 - if(lel.get(levelExamList) != null){ - session.setAttribute("message", "该课程已报名,请勿重复报名!"); - - response.sendRedirect(request.getContextPath() + "/student/courseselect/levelexamapply.jsp"); - - return; - } - lel.insert(levelExamList); - - session.setAttribute("message", "报名成功!"); - - response.sendRedirect(request.getContextPath() + "/student/courseselect/levelexamapply.jsp"); - } -} + private static final long serialVersionUID = 1L; + + // 创建LevelExamDAO的实现类对象,用于与数据库交互,执行与等级考试基本信息相关的数据操作, + // 例如查询指定学年学期的等级考试信息等 + LevelExamDAO led = new LevelExamDAOImpl(); + // 创建LevelExamListDAO的实现类对象,用于与数据库交互,执行与学生等级考试报名记录相关的数据操作, + // 比如查询学生已报名的课程、插入新的报名记录等 + LevelExamListDAO lel = new LevelExamListDAOImpl(); + + // 重写HttpServlet的doGet方法,直接调用doPost方法,通常这样做是为了统一处理GET和POST请求逻辑, + // 确保不管是哪种请求方式,都能进入到相同的业务处理流程中进行后续操作 + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + doPost(request, response); + } + + // 处理POST请求的主要方法,通过反射机制根据请求路径调用相应的业务处理方法, + // 实现根据不同的请求路径执行不同的业务逻辑,使代码结构更加灵活,便于扩展不同的功能模块 + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 1.获取当前请求的Servlet路径,例如:/xxx.apply这样形式的路径 + String servletPath = request.getServletPath(); + // 2.去除路径开头的'/'以及结尾的'.apply',得到要调用的方法名称,后续将通过反射依据此名称找到对应的具体业务处理方法 + String methodName = servletPath.substring(1, servletPath.length() - 6); + + try { + // 3.利用反射获取methodName对应的方法,参数指定了方法的名称以及对应的参数类型(HttpServletRequest和HttpServletResponse), + // 在当前类中查找符合这些要求的方法 + Method method = getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); + // 4.利用反射调用对应的方法,传入当前对象(this)以及请求和响应对象作为参数,执行对应的业务逻辑操作 + method.invoke(this, request, response); + } catch (Exception e) { + // 如果在反射获取方法或者调用方法过程中出现异常,打印异常堆栈信息,方便后续进行问题排查和调试 + e.printStackTrace(); + } + } + + // 查询选修课程信息的私有方法(从方法名"query"推测,此处可能是查询等级考试相关课程信息,虽然注释写的是选修课程信息,可能有误), + // 该方法获取指定学年学期的等级考试信息,并判断当前登录学生是否已报名这些课程,将结果以特定的Map结构存储到会话中, + // 最后重定向到相应的展示页面 + @SuppressWarnings("unused") + private void query(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // 获取当前的HttpSession对象,用于在不同请求间共享数据,比如获取当前登录学生的用户信息, + // 以及存储查询到的等级考试相关信息(如课程报名情况等),方便后续在页面中获取并展示给用户(这里指学生) + HttpSession session = request.getSession(); + // 从会话中获取当前登录的用户对象,前提是学生登录时已将用户信息存入会话中,这里假设用户对象包含了如学号等关键信息, + // 可用于关联学生的报名记录等相关数据 + User user = (User) session.getAttribute("user"); + // 从请求参数中获取学年学期信息,用于筛选对应时间段内的等级考试信息 + String yearTerm = request.getParameter("yearTerm"); + + // 创建一个用于存储等级考试信息与对应报名状态的Map,键为LevelExam对象(表示等级考试信息),值为字符串(表示是否已报名,"是"或"否") + Map map = new HashMap<>(); + // 调用LevelExamDAO实现类的方法,根据学年学期获取所有的等级考试信息列表,这些信息可能包含课程编号、考试时间等内容 + List levelExams = led.getAllWithYearTerm(yearTerm); + + // 遍历获取到的每个等级考试信息 + for (LevelExam levelExam : levelExams) { + // 创建一个LevelExamList对象,用于表示学生与等级考试课程的关联记录(通过学生学号和课程编号来确定), + // 这里主要用于后续查询该学生是否已报名此课程 + LevelExamList levelExamList = new LevelExamList(user.getUsername(), levelExam.getCourseId()); + // 调用LevelExamListDAO实现类的方法,根据创建的关联记录对象去查询数据库中是否存在该学生对此课程的报名记录, + // 如果查询结果不为空,表示学生已报名该课程,则在Map中对应等级考试信息处标记为"是"; + // 如果查询结果为空,表示学生未报名该课程,则在Map中对应等级考试信息处标记为"否" + if (lel.get(levelExamList)!= null) { + map.put(levelExam, "是"); + } else { + map.put(levelExam, "否"); + } + } + + // 将包含等级考试信息及对应报名状态的Map存储到会话中,方便后续页面获取并展示给学生查看,让学生了解各课程的报名情况 + session.setAttribute("map", map); + + // 重定向到指定的JSP页面("/student/courseselect/levelexamapply.jsp"), + // 该页面可能用于展示等级考试课程信息以及学生的报名情况等内容,将学生引导到相应页面查看信息 + response.sendRedirect(request.getContextPath() + "/student/courseselect/levelexamapply.jsp"); + } + + // 学生报名选修课程的私有方法(此处推测是报名等级考试课程,注释中写选修课程可能不准确), + // 该方法接收学生选择的课程编号,先判断学生是否已报名该课程,若未报名则插入报名记录到数据库, + // 并反馈报名成功信息到会话中,最后重定向到相应的展示页面 + @SuppressWarnings("unused") + private void apply(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // 获取当前的HttpSession对象,用于获取当前登录学生的用户信息以及存储报名相关的提示信息等, + // 方便在不同请求间共享数据,确保操作结果能正确反馈给学生 + HttpSession session = request.getSession(); + // 从会话中获取当前登录的用户对象,同样假设其包含学号等关键信息,用于关联报名记录以及确定是哪个学生进行报名操作 + User user = (User) session.getAttribute("user"); + // 从请求参数中获取要报名的课程编号信息,明确学生选择报名的具体课程 + String courseId = request.getParameter("courseId"); + + // 创建一个LevelExamList对象,用于表示学生与要报名的等级考试课程的关联记录(通过学生学号和课程编号来确定), + // 后续将依据此对象进行数据库操作,判断报名情况以及插入报名记录等 + LevelExamList levelExamList = new LevelExamList(user.getUsername(), courseId); + + // 调用LevelExamListDAO实现类的方法,根据创建的关联记录对象去查询数据库中是否已存在该学生对此课程的报名记录, + // 如果查询结果不为空,表示该课程已报名,此时需要给学生反馈相应提示信息,并阻止重复报名操作 + if (lel.get(levelExamList)!= null) { + // 将一条表示课程已报名、请勿重复报名的提示信息存入会话中,方便后续在页面中展示给学生,告知报名情况 + session.setAttribute("message", "该课程已报名,请勿重复报名!"); + + // 重定向到指定的JSP页面("/student/courseselect/levelexamapply.jsp"),将学生引导回报名页面, + // 让学生看到提示信息,同时也可以继续进行其他操作(如查看其他课程报名情况等) + response.sendRedirect(request.getContextPath() + "/student/courseselect/levelexamapply.jsp"); + + // 通过return语句结束当前方法执行,避免继续执行后续插入报名记录等操作,防止重复报名 + return; + } + + // 如果数据库中不存在该学生对此课程的报名记录,表示可以进行报名操作,调用LevelExamListDAO实现类的insert方法, + // 将创建的关联记录对象插入到数据库中,以此完成学生对该课程的报名操作,记录下报名信息 + lel.insert(levelExamList); + + // 将一条表示报名成功的提示信息存入会话中,方便后续在页面中展示给学生,告知报名操作已成功完成 + session.setAttribute("message", "报名成功!"); + + // 重定向到指定的JSP页面("/student/courseselect/levelexamapply.jsp"),将学生引导回报名页面, + // 让学生看到报名成功的提示信息,同时也可以继续进行其他操作(如查看已报名课程情况等) + response.sendRedirect(request.getContextPath() + "/student/courseselect/levelexamapply.jsp"); + } +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/servlet/LevelExaminationGradeServlet.java b/javaweb_project/src/com/hua/servlet/LevelExaminationGradeServlet.java index 151be2c..d5f67d0 100644 --- a/javaweb_project/src/com/hua/servlet/LevelExaminationGradeServlet.java +++ b/javaweb_project/src/com/hua/servlet/LevelExaminationGradeServlet.java @@ -22,99 +22,157 @@ import com.hua.entity.User; import com.hua.impl.LevelExaminationDAOImpl; import com.hua.impl.StudentBasicInforDAOImpl; +// 使用@WebServlet注解将该类映射为一个Servlet,"*.query"表示匹配以.query结尾的所有路径请求, +// 这个Servlet主要用于处理与等级考试成绩相关的不同请求操作 @WebServlet("*.query") public class LevelExaminationGradeServlet extends HttpServlet { private static final long serialVersionUID = 1L; + + // 重写HttpServlet的doGet方法,直接调用doPost方法,通常这样做是为了统一处理GET和POST请求逻辑, + // 使得不管是哪种请求方式,都能进入到相同的业务处理逻辑中 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } + // 处理POST请求的主要方法,通过反射机制根据请求路径调用相应的业务处理方法, + // 实现根据不同的请求路径执行不同的业务逻辑,增加了代码的灵活性和可扩展性 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - //1.获取ServletPath:/studentquery.query + // 1.获取当前请求的Servlet路径,例如:/studentquery.query这样形式的路径 String servletPath = request.getServletPath(); - //2.去除 / 和 .query ,得到类似于studentquery这样的字符串 + // 2.去除路径开头的'/'以及结尾的'.query',得到要调用的方法名称,以便后续通过反射找到对应的业务处理方法 String methodName = servletPath.substring(1, servletPath.length() - 6); - + try { - //3.利用反射获取methodName对应的方法 + // 3.利用反射获取methodName对应的方法,参数指定了方法的名称以及对应的参数类型(HttpServletRequest和HttpServletResponse), + // 从当前类中查找符合要求的方法 Method method = getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); - //4.利用反射调用对应的方法 + // 4.利用反射调用对应的方法,传入当前对象(this)以及请求和响应对象作为参数,执行对应的业务逻辑 method.invoke(this, request, response); - } catch (Exception e) { + } catch (Exception e) { + // 如果在反射获取方法或者调用方法过程中出现异常,打印异常堆栈信息,方便排查问题 e.printStackTrace(); } - } - + + // 处理教务员相关操作的私有方法(从方法名"dean"推测,可能用于教务员查询学生等级考试成绩等业务), + // 该方法获取符合条件的学生等级考试成绩信息,存储到会话中,并重定向到相应的展示页面 @SuppressWarnings("unused") private void dean(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException{ + throws ServletException, IOException { + // 获取当前的HttpSession对象,用于在不同请求间共享数据,比如存储查询到的学生成绩信息等, + // 方便后续在展示页面获取并展示给用户(这里的用户指教务员) HttpSession session = request.getSession(); + // 从请求参数中获取学年学期信息,用于筛选对应时间段的学生等级考试成绩数据 String yearTerm = request.getParameter("yearTerm"); - + + // 调用getStudent方法,根据请求中携带的各种查询条件(如学院、专业等)获取要查询成绩的学生基本信息列表 List students = getStudent(request, response); - - Map> map = getAllGradeMap(students, yearTerm); - + + // 调用getAllGradeMap方法,根据获取到的学生信息列表和学年学期,获取每个学生对应的等级考试成绩信息, + // 并封装成以学生基本信息为键、成绩列表为值的Map结构 + Map> map = getAllGradeMap(students, yearTerm); + + // 将封装好的学生与等级考试成绩信息的Map存储到会话中,方便后续页面获取并展示给教务员查看 session.setAttribute("map", map); - + + // 重定向到指定的JSP页面("/acdemic_dean/levelexaminationmanage/studentgrade.jsp"), + // 该页面用于展示教务员查询到的学生等级考试成绩信息 response.sendRedirect(request.getContextPath() + "/acdemic_dean/levelexaminationmanage/studentgrade.jsp"); } - - - + // 根据学生信息列表和学年学期,获取每个学生对应的等级考试成绩信息,封装成Map返回, + // 用于为上层方法(如dean方法)提供数据支持,实现从数据库获取并整理成绩数据的功能 private Map> getAllGradeMap( List students, String yearTerm) { - Map> map = new HashMap<>(); + // 创建一个用于存储学生与对应等级考试成绩信息的Map,键为学生基本信息对象,值为该学生的等级考试成绩列表 + Map> map = new HashMap<>(); + // 创建LevelExaminationDAO的实现类对象,用于与数据库交互,执行与等级考试相关的数据查询操作 LevelExaminationDAO led = new LevelExaminationDAOImpl(); - - for(StudentBasicInformation sbi : students){ - List levelExaminations = led.getAllWithYearTerm(sbi.getStudentId().toString(),yearTerm); + + // 遍历每个学生基本信息对象 + for (StudentBasicInformation sbi : students) { + // 调用LevelExaminationDAO实现类的方法,根据学生ID和学年学期获取该学生的所有等级考试成绩信息, + // 返回的是一个等级考试成绩列表 + List levelExaminations = led.getAllWithYearTerm(sbi.getStudentId().toString(), yearTerm); + // 将当前学生与其对应的等级考试成绩信息列表存入Map中,建立学生与成绩的对应关系 map.put(sbi, levelExaminations); } return map; } + // 根据请求中的参数(学院、专业、班级、学号、姓名等)获取要查询的学生基本信息列表, + // 这些参数从请求中获取,用于构建查询条件,从数据库中筛选出符合条件的学生信息, + // 为后续获取成绩等操作提供基础数据 private List getStudent( HttpServletRequest request, HttpServletResponse response) { + // 从请求参数中获取学院信息,用于在数据库查询中筛选出属于该学院的学生 String academy = request.getParameter("academy"); + // 从请求参数中获取专业信息,进一步细化查询条件,筛选出特定专业的学生 String profession = request.getParameter("profession"); + // 从请求参数中获取班级信息,更精准地定位要查询的学生所在班级 String className = request.getParameter("className"); + // 从请求参数中获取学号信息,若指定了学号,则可精确查询某个学生的信息 String studentId = request.getParameter("studentId"); + // 从请求参数中获取姓名信息,也可作为查询条件之一,用于查找特定姓名的学生 String studentName = request.getParameter("studentName"); - + + // 创建一个学生查询条件对象,将上述获取到的各种查询条件信息封装进去,方便传递给数据访问层进行查询操作 CriterStudent cs = new CriterStudent(academy, profession, className, studentName, studentId); + // 创建StudentBasicInforDAO的实现类对象,用于与数据库交互,执行根据条件查询学生基本信息的操作 StudentBasicInforDAO sbi = new StudentBasicInforDAOImpl(); - + + // 调用StudentBasicInforDAO实现类的相应方法,传入封装好的查询条件对象,获取满足条件的学生基本信息列表并返回 return sbi.getForListWithCriterStudent(cs); } + // 处理学生查询自己相关操作的私有方法(从方法名"studentquery"推测,用于学生查询自己的等级考试成绩等业务), + // 该方法获取当前登录学生的基本信息和等级考试成绩信息,存储到会话中,并重定向到相应的展示页面 @SuppressWarnings("unused") private void studentquery(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException{ + throws ServletException, IOException { + // 获取当前的HttpSession对象,用于获取当前登录学生的用户信息以及存储要展示的成绩等相关信息, + // 方便在不同请求间共享数据,确保数据能在合适的地方被获取和使用 HttpSession session = request.getSession(); - + + // 从会话中获取当前登录的用户对象,前提是学生登录时已将用户信息存入会话中,这里假设用户对象包含了如学号等关键信息, + // 并且可以通过学号关联到学生的其他相关信息(如基本信息、成绩信息等) User user = (User) session.getAttribute("user"); - + + // 调用getStudent方法,根据获取到的用户对象(通过学号等信息)获取当前登录学生的基本信息对象 StudentBasicInformation student = getStudent(user); - + + // 调用getAllGradeList方法,根据当前登录学生的用户信息获取该学生的所有等级考试成绩信息列表 List levelExamination = getAllGradeList(user); - + + // 将获取到的学生等级考试成绩信息列表存储到会话中,方便后续在展示页面获取并展示给学生查看 session.setAttribute("levelExamination", levelExamination); + // 同时将当前登录学生的基本信息对象也存储到会话中,可能在展示页面中需要展示学生的一些基本情况等信息 session.setAttribute("student", student); - + + // 重定向到指定的JSP页面("/student/informationinquiry/levelExaminationGrade.jsp"), + // 该页面用于展示学生自己查询到的等级考试成绩及相关个人信息 response.sendRedirect(request.getContextPath() + "/student/informationinquiry/levelExaminationGrade.jsp"); } - + + // 根据用户信息(推测主要依据用户对象中的学号信息)从数据库中获取对应的学生基本信息对象, + // 通过调用StudentBasicInforDAO实现类的相关方法,实现从数据库查询并返回学生基本信息的功能, + // 为上层方法(如studentquery方法)提供学生基本信息数据支持 private StudentBasicInformation getStudent(User user) { + // 创建StudentBasicInforDAO的实现类对象,用于与数据库交互,执行根据学号查询学生基本信息的操作 StudentBasicInforDAO sbi = new StudentBasicInforDAOImpl(); + // 调用其对应的方法,传入用户的学号(将用户名转换为长整型,假设用户名与学号有对应关系且可转换), + // 从数据库中获取对应的学生基本信息对象并返回 return sbi.get(Long.parseLong(user.getUsername())); } + // 根据用户信息(推测主要依据用户对象中的学号信息)从数据库中获取该学生的所有等级考试成绩信息列表, + // 通过调用LevelExaminationDAO实现类的相关方法,实现从数据库查询并返回成绩数据的功能, + // 为上层方法(如studentquery方法)提供学生等级考试成绩数据支持 private List getAllGradeList(User user) { + // 创建LevelExaminationDAO的实现类对象,用于与数据库交互,执行根据学号查询学生等级考试成绩的操作 LevelExaminationDAO led = new LevelExaminationDAOImpl(); + // 调用其对应的方法,传入用户的用户名(假设用户名与学号有对应关系,此处用用户名作为查询条件), + // 从数据库中获取该学生的所有等级考试成绩信息列表并返回 return led.getAllLevelWithStudentId(user.getUsername()); } - -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/servlet/LoginChangeServlet.java b/javaweb_project/src/com/hua/servlet/LoginChangeServlet.java index 4f3ee85..deb4e88 100644 --- a/javaweb_project/src/com/hua/servlet/LoginChangeServlet.java +++ b/javaweb_project/src/com/hua/servlet/LoginChangeServlet.java @@ -9,63 +9,86 @@ import javax.servlet.http.HttpServletResponse; import com.hua.entity.User; import com.hua.impl.UserDAOImpl; + /** * 登录转发 - * 获取登录用户的信息,并判断登录用户的身份 - * 根据用户的身份转到对应的用户页面 + * 该类的主要作用是处理用户登录后的转发逻辑,具体包括获取登录用户的信息, + * 判断登录用户的身份,然后根据不同的身份将用户重定向到对应的用户页面, + * 实现了根据用户角色进行页面跳转的功能。 * @author hua * */ @WebServlet("/loginChangeServlet") public class LoginChangeServlet extends HttpServlet { private static final long serialVersionUID = 1L; - - + // 重写HttpServlet的doPost方法,用于处理POST请求,此方法实现了登录后根据用户身份进行转发的核心业务逻辑, + // 包括获取用户名密码、查询用户信息、判断用户身份以及重定向到对应页面等操作。 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - - //获取请求参数username和password + // 从请求参数中获取用户名(username)信息,该信息将作为后续在数据库中查找对应用户记录的关键依据, + // 以此来验证用户登录的合法性以及获取用户的详细信息(如身份等)。 String username = request.getParameter("username"); - - //从数据库获取登录账号信息 + + // 调用get方法,根据获取到的用户名从数据库中查询对应的用户信息,尝试获取用户对象, + // 若能获取到用户对象,则表示该账号存在且可进行后续的身份判断及页面跳转等操作。 User user = get(username); - - //将查到的user放进session中 - if(user != null){ + + // 判断获取到的用户对象是否不为空,若不为空则表示成功从数据库中查询到了对应的用户信息, + // 接下来可以进行用户身份判断以及相关的会话存储和页面重定向操作。 + if (user!= null) { + // 获取用户对象中的身份(identity)信息,该信息用于区分不同角色的用户,例如学生、教师、教务员、管理员等, + // 以便根据不同角色将用户重定向到各自对应的专属页面。 String identity = user.getIdentity(); + // 将查询到的用户对象存入当前的HttpSession中,通过设置名为"user"的属性来存储, + // 这样在后续的其他请求处理中(只要在同一个会话范围内),就可以方便地获取到当前登录用户的信息。 request.getSession().setAttribute("user", user); - - //根据登录账号的身份不同重定向到不同的页面 - if(identity.equals("学生")){ + + // 根据用户的身份信息进行判断,通过比较身份字符串,来决定将用户重定向到哪个对应的页面。 + if (identity.equals("学生")) { + // 如果用户身份是"学生",则重定向到学生对应的页面("/student/student.jsp"), + // 引导学生进入其专属的操作界面,并且使用return语句结束当前方法执行,避免后续不必要的重定向判断操作。 response.sendRedirect(request.getContextPath() + "/student/student.jsp"); return; } - if(identity.equals("教师")){ + if (identity.equals("教师")) { + // 如果用户身份是"教师",则重定向到教师对应的页面("/teacher/teacher.jsp"), + // 引导教师进入其专属的操作界面,同样使用return语句结束当前方法执行。 response.sendRedirect(request.getContextPath() + "/teacher/teacher.jsp"); return; } - if(identity.equals("教务员")){ + if (identity.equals("教务员")) { + // 如果用户身份是"教务员",则重定向到教务员对应的页面("/acdemic_dean/acdemic_dean.jsp"), + // 引导教务员进入其专属的操作界面,使用return语句结束当前方法执行。 response.sendRedirect(request.getContextPath() + "/acdemic_dean/acdemic_dean.jsp"); return; } - if(identity.equals("管理员")){ + if (identity.equals("管理员")) { + // 如果用户身份是"管理员",则重定向到管理员对应的页面("/administrator/administrator.jsp"), + // 引导管理员进入其专属的操作界面,使用return语句结束当前方法执行。 response.sendRedirect(request.getContextPath() + "/administrator/administrator.jsp"); return; } } - - - } + /** + * 根据传入的用户名从数据库中查询对应的用户信息的方法,通过创建UserDAOImpl对象并调用其get方法, + * 尝试从数据库中获取指定用户名的用户记录,若能获取到则返回对应的用户对象,否则返回null。 + * + * @param username 要查询的用户名,作为在数据库中查找用户记录的关键依据。 + * @return 查询到的用户对象,如果数据库中存在对应用户名的记录则返回该用户对象,否则返回null。 + */ private User get(String username) { - //进入数据库查询 + // 创建UserDAOImpl对象,用于与数据库进行交互,执行查询用户信息的操作。 UserDAOImpl userDAOImpl = new UserDAOImpl(); + // 调用UserDAOImpl的get方法,传入用户名参数,从数据库中获取对应的用户对象。 User user = userDAOImpl.get(username); - if(user != null){ - //返回user + // 如果获取到的用户对象不为空,则直接返回该用户对象,表示成功获取到用户信息。 + if (user!= null) { + // 返回查询到的用户对象,供调用该方法的地方使用(例如在doPost方法中用于后续的身份判断等操作)。 return user; } + // 如果未获取到用户对象(即数据库中不存在对应用户名的记录),则返回null。 return null; } -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/servlet/LogoutServlet.java b/javaweb_project/src/com/hua/servlet/LogoutServlet.java index 8ce7517..defad5b 100644 --- a/javaweb_project/src/com/hua/servlet/LogoutServlet.java +++ b/javaweb_project/src/com/hua/servlet/LogoutServlet.java @@ -8,16 +8,25 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +// 使用@WebServlet注解将该类映射为一个Servlet,指定其访问路径为"/logoutServlet", +// 表明这个Servlet主要用于处理用户注销登录相关的业务逻辑 @WebServlet("/logoutServlet") public class LogoutServlet extends HttpServlet { private static final long serialVersionUID = 1L; + // 重写HttpServlet的doGet方法,用于处理GET请求,此方法实现了用户注销登录的核心业务逻辑, + // 即让当前用户的会话失效,并将用户重定向到登录页面 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 获取当前的HttpSession对象,HttpSession用于在不同请求间共享数据,存储用户相关信息等, + // 而注销登录操作需要对当前会话进行处理,使其失效来清除用户相关的会话数据 HttpSession session = request.getSession(); - //使当前session失效 + + // 调用invalidate方法使当前会话失效,这样会话中存储的所有数据(如用户登录信息等)都会被清除, + // 相当于用户退出登录状态,后续再次访问系统需要重新登录 session.invalidate(); - + + // 重定向到登录页面("/login/login.jsp"),将用户引导到登录界面,方便用户重新进行登录操作, + // 实现了注销登录后回到登录页面的功能逻辑 response.sendRedirect(request.getContextPath() + "/login/login.jsp"); } - -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/servlet/ModifyPasswordServlet.java b/javaweb_project/src/com/hua/servlet/ModifyPasswordServlet.java index 62e6082..f5aaf1e 100644 --- a/javaweb_project/src/com/hua/servlet/ModifyPasswordServlet.java +++ b/javaweb_project/src/com/hua/servlet/ModifyPasswordServlet.java @@ -11,26 +11,52 @@ import javax.servlet.http.HttpSession; import com.hua.entity.User; import com.hua.impl.UserDAOImpl; +// 使用@WebServlet注解将该类映射为一个Servlet,指定其访问路径为"/modifyPasswordServlet", +// 表明这个Servlet主要用于处理用户修改密码相关的业务逻辑 @WebServlet("/modifyPasswordServlet") public class ModifyPasswordServlet extends HttpServlet { private static final long serialVersionUID = 1L; + // 重写HttpServlet的doPost方法,用于处理POST请求,此方法实现了用户修改密码的核心业务逻辑, + // 包括获取当前登录用户信息、新密码,调用修改密码的方法,以及反馈修改结果并进行页面重定向等操作 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 获取当前的HttpSession对象,可用于在不同请求间共享数据,例如获取当前登录用户的信息, + // 因为修改密码操作是基于已登录用户进行的,需要知道是哪个用户在修改密码 HttpSession session = request.getSession(); + // 从会话中获取当前登录的用户对象,前提是用户登录时已将用户信息存入会话中,这里的用户对象包含了如用户名等关键信息, + // 并且后续需要通过这个用户对象来更新数据库中对应的用户密码信息 User user = (User) session.getAttribute("user"); + // 从请求参数中获取用户输入的新密码信息,该信息将作为要更新到数据库中的新密码内容 String newpassword = request.getParameter("newpassword"); - - //修改密码 - update(user,newpassword); + + // 调用update方法,将当前登录用户对象和新密码作为参数传入,执行修改数据库中用户密码的操作 + update(user, newpassword); + + // 将一条表示修改密码成功的提示信息存入会话中,方便后续在页面中获取并展示给用户,让用户知晓密码修改操作已成功完成 session.setAttribute("message", "修改密码成功"); + + // 重定向到指定的JSP页面("/modify/modifypassword.jsp"),该页面可能用于展示修改密码成功的提示信息, + // 或者提供其他相关操作选项等,将用户引导回相应的页面,以便用户继续进行后续操作 response.sendRedirect(request.getContextPath() + "/modify/modifypassword.jsp"); } + /** + * 根据传入的用户对象和新密码,更新数据库中对应用户密码信息的方法。 + * 通过创建UserDAOImpl对象,将用户对象中的密码字段设置为新密码,然后调用其update方法, + * 实现将更新后的用户信息保存到数据库中,完成密码修改的数据库操作。 + * + * @param user 要修改密码的用户对象,包含了用户的相关信息以及待更新的密码字段等 + * @param newpassword 用户输入的新密码字符串,用于设置到用户对象中,并更新到数据库里 + */ private void update(User user, String newpassword) { + // 创建UserDAOImpl对象,用于与数据库进行交互,执行更新用户信息(此处主要是更新密码)的操作 UserDAOImpl u = new UserDAOImpl(); - + + // 将用户对象中的密码字段设置为新密码,替换原来存储的旧密码 user.setPassword(newpassword); + + // 调用UserDAOImpl的update方法,将更新后的用户对象信息保存到数据库中,完成密码修改的实际数据库操作, + // 使得数据库中该用户的密码信息得到更新 u.update(user); } - -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/servlet/OptionalCourseServlet.java b/javaweb_project/src/com/hua/servlet/OptionalCourseServlet.java index 441073a..7735264 100644 --- a/javaweb_project/src/com/hua/servlet/OptionalCourseServlet.java +++ b/javaweb_project/src/com/hua/servlet/OptionalCourseServlet.java @@ -21,79 +21,128 @@ import com.hua.entity.User; import com.hua.impl.OptionalCourseDAOImpl; import com.hua.impl.StudentOptCourseDAOImpl; +// 使用@WebServlet注解将该类映射为一个Servlet,"*.optional"表示匹配以.optional结尾的所有路径请求, +// 这个Servlet主要用于处理与选修课程相关的业务操作,例如查询选修课程信息、学生报名选修课程等功能。 @WebServlet("*.optional") public class OptionalCourseServlet extends HttpServlet { private static final long serialVersionUID = 1L; - + + // 创建OptionalCourseDAO的实现类对象,用于与数据库交互,执行与选修课程基本信息相关的数据操作, + // 比如根据学年学期查询选修课程列表等。 OptionalCourseDAO oc = new OptionalCourseDAOImpl(); + // 创建StudentOptCourseDAO的实现类对象,用于与数据库交互,执行与学生选修课程报名记录相关的数据操作, + // 例如查询学生是否已报名某门选修课程、插入学生的选修课程报名记录等。 StudentOptCourseDAO soc = new StudentOptCourseDAOImpl(); + // 重写HttpServlet的doGet方法,直接调用doPost方法,通常是为了统一处理GET和POST请求逻辑, + // 保证不管是以GET还是POST方式发起的请求,都能进入相同的业务处理流程中进行后续操作。 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } - + // 处理POST请求的主要方法,通过反射机制根据请求路径调用相应的业务处理方法, + // 使得代码可以根据不同的请求路径灵活地执行不同的业务逻辑,方便扩展和维护。 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - //1.获取ServletPath + // 1.获取当前请求的Servlet路径,例如请求路径可能是类似 "/queryOptionalCourse.optional" 这样的形式。 String servletPath = request.getServletPath(); - //2.去除 / 和 .optional + // 2.去除路径开头的'/'以及结尾的'.optional',得到要调用的方法名称,后续会依据这个名称通过反射找到对应的业务处理方法。 String methodName = servletPath.substring(1, servletPath.length() - 9); - + try { - //3.利用反射获取methodName对应的方法 + // 3.利用反射获取methodName对应的方法,这里指定了方法的名称以及对应的参数类型(HttpServletRequest和HttpServletResponse), + // 然后在当前类中查找符合这些要求的方法。 Method method = getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); - //4.利用反射调用对应的方法 + // 4.利用反射调用对应的方法,传入当前对象(this)以及请求和响应对象作为参数,从而执行对应的业务逻辑操作。 method.invoke(this, request, response); - } catch (Exception e) { + } catch (Exception e) { + // 如果在反射获取方法或者调用方法过程中出现异常,打印异常堆栈信息,便于后续进行问题排查和调试。 e.printStackTrace(); - } + } } - - //查询选修课程信息 + + // 查询选修课程信息的私有方法,该方法主要功能是获取指定学年学期的选修课程信息, + // 并判断当前登录学生是否已报名这些课程,将结果以特定的Map结构存储到会话中,最后重定向到相应的展示页面。 @SuppressWarnings("unused") - private void queryOptionalCourse(HttpServletRequest request, HttpServletResponse response) + private void queryOptionalCourse(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 获取当前的HttpSession对象,用于在不同请求间共享数据,比如获取当前登录学生的用户信息, + // 以及存储查询到的选修课程相关信息(如课程报名情况等),方便后续在页面中获取并展示给学生用户。 HttpSession session = request.getSession(); + // 从会话中获取当前登录的用户对象,前提是学生登录时已将用户信息存入会话中,这里假设用户对象包含了如学号等关键信息, + // 可以通过学号等信息关联学生的选修课程报名记录等相关数据。 User user = (User) session.getAttribute("user"); + // 从请求参数中获取学年学期信息,用于筛选对应时间段内的选修课程信息,只获取该学年学期开放的选修课程。 String yearTerm = request.getParameter("yearTerm"); - + + // 创建一个用于存储选修课程信息与对应报名状态的Map,键为OptionalCourse对象(表示选修课程的详细信息), + // 值为字符串(表示学生是否已报名该课程,"是"或"否")。 Map map = new HashMap<>(); + // 调用OptionalCourseDAO实现类的方法,根据学年学期获取所有的选修课程信息列表,这些信息可能包含课程编号、课程名称、授课教师等内容。 List optionalCourses = oc.getAllWithYearTerm(yearTerm); - //查询该学生已报名的课程 - for(OptionalCourse optionalCourse: optionalCourses){ + + // 遍历获取到的每一门选修课程信息 + for (OptionalCourse optionalCourse : optionalCourses) { + // 创建一个StudentOptCourse对象,用于表示学生与选修课程的关联记录(通过学生学号和选修课程编号来确定), + // 主要用于后续查询该学生是否已报名此选修课程。 StudentOptCourse studentOptCourse = new StudentOptCourse(user.getUsername(), optionalCourse.getCourseId()); - if(soc.get(studentOptCourse) != null){ + // 调用StudentOptCourseDAO实现类的方法,根据创建的关联记录对象去查询数据库中是否存在该学生对此选修课程的报名记录, + // 如果查询结果不为空,表示学生已报名该课程,则在Map中对应选修课程信息处标记为"是"; + // 如果查询结果为空,表示学生未报名该课程,则在Map中对应选修课程信息处标记为"否"。 + if (soc.get(studentOptCourse)!= null) { map.put(optionalCourse, "是"); - }else{ + } else { map.put(optionalCourse, "否"); } } + + // 将包含选修课程信息及对应报名状态的Map存储到会话中,方便后续页面获取并展示给学生查看,让学生了解各选修课程的报名情况。 session.setAttribute("map", map); - + + // 重定向到指定的JSP页面("/student/courseselect/courseselect.jsp"), + // 该页面可能用于展示选修课程信息以及学生的报名情况等内容,将学生引导到相应页面查看信息。 response.sendRedirect(request.getContextPath() + "/student/courseselect/courseselect.jsp"); } - - //学生报名选修课程 + + // 学生报名选修课程的私有方法,该方法接收学生选择的课程编号,先判断学生是否已报名该课程, + // 若未报名则插入报名记录到数据库,同时反馈报名成功信息到会话中,最后重定向到相应的展示页面。 @SuppressWarnings("unused") - private void studentApply(HttpServletRequest request, HttpServletResponse response) + private void studentApply(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 获取当前的HttpSession对象,用于获取当前登录学生的用户信息以及存储报名相关的提示信息等, + // 方便在不同请求间共享数据,确保操作结果能正确反馈给学生。 HttpSession session = request.getSession(); + // 从会话中获取当前登录的用户对象,同样假设其包含学号等关键信息,用于关联报名记录以及确定是哪个学生进行报名操作。 User user = (User) session.getAttribute("user"); + // 从请求参数中获取要报名的课程编号信息,明确学生选择报名的具体选修课程。 String courseId = request.getParameter("courseId"); - - + + // 创建一个StudentOptCourse对象,用于表示学生与要报名的选修课程的关联记录(通过学生学号和课程编号来确定), + // 后续将依据此对象进行数据库操作,判断报名情况以及插入报名记录等。 StudentOptCourse studentOptCourse = new StudentOptCourse(user.getUsername(), courseId); - if(soc.get(studentOptCourse) != null){ + + // 调用StudentOptCourseDAO实现类的方法,根据创建的关联记录对象去查询数据库中是否已存在该学生对此选修课程的报名记录, + // 如果查询结果不为空,表示该课程已报名,此时需要给学生反馈相应提示信息,并阻止重复报名操作。 + if (soc.get(studentOptCourse)!= null) { + // 将一条表示课程已报名、请勿重复报名的提示信息存入会话中,方便后续在页面中展示给学生,告知报名情况。 session.setAttribute("message", "该课程已报名,请勿重复报名!"); - + + // 重定向到指定的JSP页面("/student/courseselect/courseselect.jsp"),将学生引导回报名页面, + // 让学生看到提示信息,同时也可以继续进行其他操作(如查看其他选修课程报名情况等)。 response.sendRedirect(request.getContextPath() + "/student/courseselect/courseselect.jsp"); - + + // 通过return语句结束当前方法执行,避免继续执行后续插入报名记录等操作,防止重复报名。 return; } + + // 如果数据库中不存在该学生对此选修课程的报名记录,表示可以进行报名操作,调用StudentOptCourseDAO实现类的insert方法, + // 将创建的关联记录对象插入到数据库中,以此完成学生对该选修课程的报名操作,记录下报名信息。 soc.insert(studentOptCourse); - + + // 将一条表示报名成功的提示信息存入会话中,方便后续在页面中展示给学生,告知报名操作已成功完成。 session.setAttribute("message", "报名成功!"); - + + // 重定向到指定的JSP页面("/student/courseselect/courseselect.jsp"),将学生引导回报名页面, + // 让学生看到报名成功的提示信息,同时也可以继续进行其他操作(如查看已报名课程情况等)。 response.sendRedirect(request.getContextPath() + "/student/courseselect/courseselect.jsp"); } -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/servlet/PostponeExamapplyServlet.java b/javaweb_project/src/com/hua/servlet/PostponeExamapplyServlet.java index ee5ec03..422acf5 100644 --- a/javaweb_project/src/com/hua/servlet/PostponeExamapplyServlet.java +++ b/javaweb_project/src/com/hua/servlet/PostponeExamapplyServlet.java @@ -13,26 +13,49 @@ import com.hua.entity.PostponeExamApply; import com.hua.entity.User; import com.hua.impl.PostponeExamApplyDAOImpl; +// 使用@WebServlet注解将该类映射为一个Servlet,指定其访问路径为"/postponeExamapplyServlet", +// 表明这个Servlet主要用于处理学生申请缓考相关的业务逻辑。 @WebServlet("/postponeExamapplyServlet") public class PostponeExamapplyServlet extends HttpServlet { private static final long serialVersionUID = 1L; + + // 创建PostponeExamApplyDAO的实现类对象,用于与数据库交互,执行与缓考申请数据相关的操作, + // 比如将学生提交的缓考申请信息插入到数据库中。 PostponeExamApplyDAO pea = new PostponeExamApplyDAOImpl(); - protected void doPost(HttpServletRequest request, HttpServletResponse response) + // 重写HttpServlet的doPost方法,用于处理POST请求,此方法实现了学生提交缓考申请的核心业务逻辑, + // 包括获取当前登录学生信息、申请相关参数,构建缓考申请对象,插入数据库以及反馈申请结果信息等操作。 + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 获取当前的HttpSession对象,可用于在不同请求间共享数据,例如获取当前登录学生的用户信息, + // 以及存储缓考申请操作的结果提示信息等,方便后续在页面中获取并展示给学生用户。 HttpSession session = request.getSession(); + // 从会话中获取当前登录的用户对象,前提是学生登录时已将用户信息存入会话中,这里假设用户对象包含了如学号等关键信息, + // 并且学号等信息会作为缓考申请的关联信息一同存入数据库,用于标识是哪个学生提交的申请。 User user = (User) session.getAttribute("user"); - + + // 从请求参数中获取学年学期信息,该信息将作为缓考申请的一部分,表明申请针对的是哪个学年学期的课程考试。 String yearTerm = request.getParameter("yearTerm"); + // 从请求参数中获取课程名称信息,明确要申请缓考的具体课程。 String courseName = request.getParameter("courseName"); + // 从请求参数中获取申请理由信息,说明为什么要申请该课程的缓考。 String applyReason = request.getParameter("applyReason"); - + + // 根据获取到的学年学期、用户名(此处用用户名关联学生信息,推测与学号相关联)、课程名称以及申请理由等信息, + // 创建一个PostponeExamApply对象,该对象封装了缓考申请的各项关键信息,用于后续插入数据库操作。 PostponeExamApply postponeExamApply = new PostponeExamApply(yearTerm, user.getUsername(), courseName, applyReason); + + // 调用PostponeExamApplyDAO实现类的insert方法,将构建好的缓考申请对象插入到数据库中, + // 以此完成学生缓考申请的提交操作,数据库中会记录下这条申请记录。 pea.insert(postponeExamApply); - + + // 创建一个提示信息字符串,表示申请提交成功,用于反馈给学生申请操作的结果,让学生知晓申请已成功提交。 String message = "提交成功"; + // 将申请成功的提示信息存入会话中,方便后续在页面中获取并展示给学生,使学生能看到申请操作的执行情况。 session.setAttribute("message", message); + + // 重定向到指定的JSP页面("/student/businessmanagement/postponeExamapply.jsp"), + // 通常该页面可能用于展示申请结果或者再次进行相关操作等,将学生引导回相应的业务页面。 response.sendRedirect(request.getContextPath() + "/student/businessmanagement/postponeExamapply.jsp"); } - -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/servlet/StudentInformationServlet.java b/javaweb_project/src/com/hua/servlet/StudentInformationServlet.java index 2076eda..825c5c3 100644 --- a/javaweb_project/src/com/hua/servlet/StudentInformationServlet.java +++ b/javaweb_project/src/com/hua/servlet/StudentInformationServlet.java @@ -19,62 +19,107 @@ import com.hua.impl.StudentBasicInforDAOImpl; /** * Servlet implementation class StudentInformationServlet + * 该类是一个Servlet,主要用于处理与学生信息相关的操作,包括获取学生信息并展示,以及修改学生信息后重新展示的功能。 */ @WebServlet("/studentInformationServlet") public class StudentInformationServlet extends HttpServlet { private static final long serialVersionUID = 1L; - //获得学生信息,转换到显示页面显示学生信息 + // 处理GET请求的方法,其功能是获取学生信息,并将该信息转发到相应的显示页面进行展示, + // 实现了从后台获取数据传递到前端页面呈现给用户查看的流程。 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 获取当前的HttpSession对象,用于在不同请求间共享数据,例如获取当前登录用户的信息, + // 这里假设登录用户与要查询展示的学生信息存在关联(可能是学生本人登录查看自己信息)。 HttpSession session = request.getSession(); + // 从会话中获取当前登录的用户对象,该用户对象包含了如用户名等关键信息,后续可依据此信息来获取对应的学生信息。 User user = (User) session.getAttribute("user"); + + // 调用get方法,根据获取到的用户信息去查询对应的学生基本信息,尝试获取学生基本信息对象。 StudentBasicInformation sbi = get(user); - + + // 将获取到的学生基本信息对象设置为请求属性,这样在转发到显示页面后,页面可以通过获取请求属性的方式拿到学生信息进行展示。 request.setAttribute("studentBasicInformation", sbi); - + + // 使用请求转发的方式,将请求和响应对象转发到指定的JSP页面("/student/informationinquiry/studentinformation.jsp"), + // 该页面用于展示学生的个人信息,通过这种方式将后台获取到的学生信息传递到前端页面进行展示。 request.getRequestDispatcher("/student/informationinquiry/studentinformation.jsp").forward(request, response); } + /** + * 根据传入的用户对象,从数据库中查询对应的学生基本信息的方法。 + * 通过调用StudentBasicInforDAOImpl的相关方法,尝试获取指定用户对应的学生记录,若能获取到则返回学生基本信息对象,否则返回null。 + * + * @param user 与学生信息相关联的用户对象,通常包含如用户名等关键信息,用于在数据库中查找对应的学生记录, + * 此处假设用户名和学生的学号等关键标识存在对应关系,可以据此查询学生信息。 + * @return 查询到的学生基本信息对象,如果数据库中存在与该用户对应的学生记录则返回该学生基本信息对象,否则返回null。 + */ private StudentBasicInformation get(User user) { + // 创建StudentBasicInforDAO的实现类对象,用于与数据库进行交互,执行查询学生基本信息的操作。 StudentBasicInforDAO sbidao = new StudentBasicInforDAOImpl(); - + + // 调用StudentBasicInforDAO实现类的get方法,传入将用户的用户名转换为长整型后的参数(假设用户名与学号对应且可转换), + // 从数据库中获取对应的学生基本信息对象。 StudentBasicInformation sbi = sbidao.get(Long.parseLong(user.getUsername())); - if(sbi != null){ + // 如果获取到的学生基本信息对象不为空,则直接返回该对象,表示成功获取到学生信息。 + if (sbi!= null) { return sbi; } - + + // 如果未获取到学生基本信息对象(即数据库中不存在与该用户对应的学生记录),则返回null。 return null; } - //修改学生信息,转换到显示页面显示修改后的学生信息 - protected void doPost(HttpServletRequest request, HttpServletResponse response) + // 处理POST请求的方法,主要用于接收修改后的学生信息,更新数据库中的学生信息记录, + // 并将操作结果反馈到显示页面展示修改后的信息,实现了学生信息修改的完整业务逻辑。 + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 调用getStuInformation方法,从请求参数中获取并封装成学生基本信息对象,该对象包含了修改后的学生信息内容。 StudentBasicInformation sbi = getStuInformation(request, response); - - //调用DAO修改数据库中的信息 + + // 创建StudentBasicInforDAO的实现类对象,用于与数据库进行交互,执行更新学生基本信息到数据库的操作。 StudentBasicInforDAO sbidao = new StudentBasicInforDAOImpl(); + // 调用StudentBasicInforDAO实现类的update方法,将包含修改后信息的学生基本信息对象更新到数据库中, + // 以此完成对学生信息在数据库层面的修改操作。 sbidao.update(sbi); - + + // 将一条表示修改成功的提示信息设置为请求属性,方便在转发到显示页面后展示给用户,让用户知晓信息修改操作已成功完成。 request.setAttribute("message", "修改成功"); + + // 调用doGet方法,重新获取修改后的学生信息并转发到显示页面进行展示,使得用户能够看到最新的学生信息情况。 doGet(request, response); } - private StudentBasicInformation getStuInformation(HttpServletRequest request, - HttpServletResponse response)throws ServletException, IOException{ + /** + * 从请求参数中获取各个参数值,并封装成一个StudentBasicInformation对象的方法。 + * 通过遍历请求参数的名称枚举,获取每个参数对应的具体值,然后按照StudentBasicInformation对象的构造函数要求进行封装, + * 最终返回包含请求中传递的学生信息的StudentBasicInformation对象,用于后续更新数据库或者传递到页面展示等操作。 + * + * @param request 当前的HttpServletRequest对象,用于获取请求参数的相关信息,如参数名称、参数值等。 + * @param response 当前的HttpServletResponse对象,虽然在此方法中未直接使用,但遵循Servlet方法的参数规范保留该参数。 + * @return 封装了请求参数中学生信息的StudentBasicInformation对象,该对象可用于后续更新数据库等操作。 + * @throws ServletException 在处理请求参数过程中,如果出现Servlet相关异常则抛出。 + * @throws IOException 在读取请求参数等涉及IO操作过程中,如果出现IO异常则抛出。 + */ + private StudentBasicInformation getStuInformation(HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { StudentBasicInformation sbi = null; - + + // 获取请求参数名称的枚举对象,通过该枚举可以遍历所有的请求参数名称,进而获取对应的参数值。 Enumeration en = request.getParameterNames(); + // 创建一个List集合,用于存储请求参数的值,方便后续按照顺序获取并封装到学生基本信息对象中。 List parameterValues = new ArrayList<>(); - while(en.hasMoreElements()){ + // 遍历请求参数名称枚举,将每个参数名称对应的参数值添加到List集合中。 + while (en.hasMoreElements()) { parameterValues.add(request.getParameter(en.nextElement())); } - - sbi = new StudentBasicInformation(Long.parseLong(parameterValues.get(0)), parameterValues.get(1), - parameterValues.get(2), parameterValues.get(3), parameterValues.get(4), - parameterValues.get(5), parameterValues.get(6), parameterValues.get(7), + + // 根据获取到的请求参数值列表,按照StudentBasicInformation对象构造函数的参数顺序,创建一个新的StudentBasicInformation对象, + // 该对象封装了从请求中传递过来的学生信息,例如学号、姓名、性别等各个字段信息。 + sbi = new StudentBasicInformation(Long.parseLong(parameterValues.get(0)), parameterValues.get(1), + parameterValues.get(2), parameterValues.get(3), parameterValues.get(4), + parameterValues.get(5), parameterValues.get(6), parameterValues.get(7), parameterValues.get(8), parameterValues.get(9)); - + return sbi; } - -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/servlet/TeacherInformationServlet.java b/javaweb_project/src/com/hua/servlet/TeacherInformationServlet.java index 3d49e91..4876aff 100644 --- a/javaweb_project/src/com/hua/servlet/TeacherInformationServlet.java +++ b/javaweb_project/src/com/hua/servlet/TeacherInformationServlet.java @@ -16,8 +16,11 @@ import com.hua.dao.TeacherDAO; import com.hua.entity.Teacher; import com.hua.entity.User; import com.hua.impl.TeacherDAOImpl; + /** * 获取并修改教师信息 + * 该类是一个Servlet,主要用于处理与教师信息相关的操作,具体包括获取教师信息并展示到相应页面, + * 以及接收修改后的教师信息并更新数据库,再将修改后的信息重新展示到页面上,以此实现教师信息管理的相关功能。 * @author hua * */ @@ -25,57 +28,100 @@ import com.hua.impl.TeacherDAOImpl; public class TeacherInformationServlet extends HttpServlet { private static final long serialVersionUID = 1L; + // 创建TeacherDAO的实现类对象,用于与数据库进行交互,执行与教师信息相关的数据操作, + // 例如从数据库中获取教师信息、将修改后的教师信息更新到数据库中等操作。 TeacherDAO teacherdao = new TeacherDAOImpl(); - - //获得教师信息,转换到显示页面显示教师信息 + + // 处理GET请求的方法,其主要功能是获取教师信息,并将该信息转发到对应的显示页面进行展示, + // 实现了从后台获取教师数据传递到前端页面呈现给用户查看的流程。 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 获取当前的HttpSession对象,用于在不同请求间共享数据,例如获取当前登录用户的信息, + // 这里假设登录用户与要查询展示的教师信息存在关联(可能是教师本人登录查看自己信息)。 HttpSession session = request.getSession(); + // 从会话中获取当前登录的用户对象,该用户对象包含了如用户名等关键信息,后续可依据此信息来获取对应的教师信息。 User user = (User) session.getAttribute("user"); + + // 调用get方法,根据获取到的用户信息去查询对应的教师信息,尝试获取教师对象。 Teacher teacher = get(user); - + + // 将获取到的教师对象设置为请求属性,这样在转发到显示页面后,页面可以通过获取请求属性的方式拿到教师信息进行展示。 request.setAttribute("teacher", teacher); - + + // 使用请求转发的方式,将请求和响应对象转发到指定的JSP页面("/teacher/inquirynews/personalinformation.jsp"), + // 该页面用于展示教师的个人信息,通过这种方式将后台获取到的教师信息传递到前端页面进行展示。 request.getRequestDispatcher("/teacher/inquirynews/personalinformation.jsp").forward(request, response); } + /** + * 根据传入的用户对象,从数据库中查询对应的教师信息的方法。 + * 通过调用TeacherDAOImpl的相关方法,尝试获取指定用户对应的教师记录,若能获取到则返回教师对象,否则返回null。 + * + * @param user 与教师信息相关联的用户对象,通常包含如用户名等关键信息,用于在数据库中查找对应的教师记录, + * 此处假设用户名和教师的工号等关键标识存在对应关系,可以据此查询教师信息。 + * @return 查询到的教师对象,如果数据库中存在与该用户对应的教师记录则返回该教师对象,否则返回null。 + */ private Teacher get(User user) { - + // 调用TeacherDAO实现类的get方法,传入用户的用户名(假设用户名作为关联教师信息的关键字段), + // 从数据库中获取对应的教师对象。 Teacher teacher = teacherdao.get(user.getUsername()); - if(teacher != null){ + // 如果获取到的教师对象不为空,则直接返回该教师对象,表示成功获取到教师信息。 + if (teacher!= null) { return teacher; } - + + // 如果未获取到教师对象(即数据库中不存在与该用户对应的教师记录),则返回null。 return null; } - //修改教师信息,转换回到显示页面显示修改后的教师信息 - protected void doPost(HttpServletRequest request, HttpServletResponse response) + // 处理POST请求的方法,主要用于接收修改后的教师信息,更新数据库中的教师信息记录, + // 并将操作结果反馈到显示页面展示修改后的信息,实现了教师信息修改的完整业务逻辑。 + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 调用getTeacher方法,从请求参数中获取并封装成教师对象,该对象包含了修改后的教师信息内容。 Teacher teacher = getTeacher(request, response); - - //调用DAO修改数据库中的信息 + + // 调用TeacherDAO实现类的update方法,将包含修改后信息的教师对象更新到数据库中, + // 以此完成对教师信息在数据库层面的修改操作。 teacherdao.update(teacher); - + + // 将一条表示修改成功的提示信息设置为请求属性,方便在转发到显示页面后展示给用户,让用户知晓信息修改操作已成功完成。 request.setAttribute("message", "修改成功"); + + // 调用doGet方法,重新获取修改后的教师信息并转发到显示页面进行展示,使得用户能够看到最新的教师信息情况。 doGet(request, response); } - private Teacher getTeacher(HttpServletRequest request, - HttpServletResponse response)throws ServletException, IOException{ + /** + * 从请求参数中获取各个参数值,并封装成一个Teacher对象的方法。 + * 通过遍历请求参数的名称枚举,获取每个参数对应的具体值,然后按照Teacher对象的构造函数要求进行封装, + * 最终返回包含请求中传递的教师信息的Teacher对象,用于后续更新数据库或者传递到页面展示等操作。 + * + * @param request 当前的HttpServletRequest对象,用于获取请求参数的相关信息,如参数名称、参数值等。 + * @param response 当前的HttpServletResponse对象,虽然在此方法中未直接使用,但遵循Servlet方法的参数规范保留该参数。 + * @return 封装了请求参数中教师信息的Teacher对象,该对象可用于后续更新数据库等操作。 + * @throws ServletException 在处理请求参数过程中,如果出现Servlet相关异常则抛出。 + * @throws IOException 在读取请求参数等涉及IO操作过程中,如果出现IO异常则抛出。 + */ + private Teacher getTeacher(HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { Teacher teacher = null; - + + // 获取请求参数名称的枚举对象,通过该枚举可以遍历所有的请求参数名称,进而获取对应的参数值。 Enumeration en = request.getParameterNames(); + // 创建一个List集合,用于存储请求参数的值,方便后续按照顺序获取并封装到教师对象中。 List parameterValues = new ArrayList<>(); - while(en.hasMoreElements()){ + // 遍历请求参数名称枚举,将每个参数名称对应的参数值添加到List集合中。 + while (en.hasMoreElements()) { parameterValues.add(request.getParameter(en.nextElement())); } - - teacher = new Teacher(parameterValues.get(0), parameterValues.get(1), - parameterValues.get(2), parameterValues.get(3), parameterValues.get(4), - parameterValues.get(6), parameterValues.get(7), parameterValues.get(5), + + // 根据获取到的请求参数值列表,按照Teacher对象构造函数的参数顺序,创建一个新的Teacher对象, + // 该对象封装了从请求中传递过来的教师信息,例如姓名、工号、联系方式等各个字段信息。 + teacher = new Teacher(parameterValues.get(0), parameterValues.get(1), + parameterValues.get(2), parameterValues.get(3), parameterValues.get(4), + parameterValues.get(6), parameterValues.get(7), parameterValues.get(5), parameterValues.get(8), parameterValues.get(10), parameterValues.get(9)); - + return teacher; } - -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/servlet/ValidateColorServlet.java b/javaweb_project/src/com/hua/servlet/ValidateColorServlet.java index e05b9be..1e6dca5 100644 --- a/javaweb_project/src/com/hua/servlet/ValidateColorServlet.java +++ b/javaweb_project/src/com/hua/servlet/ValidateColorServlet.java @@ -1,7 +1,6 @@ -package com.hua.servlet; +package com.hua.servlet; import java.awt.Color; - import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; @@ -18,106 +17,137 @@ import javax.servlet.http.HttpServletResponse; /** * 生成验证码 + * 该类是一个HttpServlet的子类,主要用于生成包含随机验证码的图片,并将验证码存储到HttpSession中,同时把图片以JPEG格式输出给客户端, + * 常用于需要用户输入验证码进行验证的登录、注册等场景,以增加安全性,防止自动化脚本恶意操作。 * @author hua * */ @WebServlet("/validateColorServlet") public class ValidateColorServlet extends HttpServlet { + // 定义一个常量字符串,作为在HttpSession中存储验证码的键名,方便后续在验证环节通过此键名获取生成的验证码进行比对。 public static final String CHECK_CODE_KEY = "CHECK_CODE_KEY"; - + private static final long serialVersionUID = 1L; - - //设置验证图片的宽度, 高度, 验证码的个数 + + // 设置验证图片的宽度,单位为像素,决定了生成的验证码图片在水平方向上的尺寸大小。 private int width = 152; + // 设置验证图片的高度,单位为像素,决定了生成的验证码图片在垂直方向上的尺寸大小。 private int height = 40; + // 设置验证码包含的字符个数,即生成的验证码是由几个字符组成的,这里默认为4个字符。 private int codeCount = 4; - - //验证码字体的高度 + + // 验证码字体的高度,用于后续创建字体对象时指定字体大小,以适配验证码图片的高度,确保验证码显示清晰、美观。 private int fontHeight = 4; - - //验证码中的单个字符基线. 即:验证码中的单个字符位于验证码图形左上角的 (codeX, codeY) 位置处 + + // 验证码中的单个字符基线的横坐标,用于确定每个验证码字符在图片中的水平位置起始点,后续在绘制验证码字符时以此为参考。 private int codeX = 0; + // 验证码中的单个字符基线的纵坐标,用于确定每个验证码字符在图片中的垂直位置起始点,后续在绘制验证码字符时以此为参考。 private int codeY = 0; - - //验证码由哪些字符组成 - char [] codeSequence = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".toCharArray(); - - //初始化验证码图形属性 - public void init(){ + + // 定义一个字符数组,指定了验证码可由哪些字符组成,包含大小写英文字母和数字,通过随机选取这些字符来生成具体的验证码内容。 + char[] codeSequence = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".toCharArray(); + + // 初始化验证码图形属性的方法,主要用于根据设置的图片宽度、高度以及验证码字符个数等信息,计算出合适的字体高度、字符水平和垂直位置等属性值, + // 为后续准确绘制验证码图片做准备。 + public void init() { + // 根据验证码图片的高度计算出合适的字体高度,通常减去一定的边距(这里减2),使得验证码在图片中显示得较为合适,不会超出图片范围。 fontHeight = height - 2; + // 根据验证码图片宽度和验证码字符个数,计算每个验证码字符在图片中的水平起始位置,使字符均匀分布在图片宽度范围内,这里加上2是为了留一些间隔。 codeX = width / (codeCount + 2); + // 根据验证码图片高度确定每个验证码字符在图片中的垂直位置,通常减去一定的边距(这里减4),确保字符在图片中垂直方向上显示合适。 codeY = height - 4; } + // 重写HttpServlet的service方法,该方法用于处理客户端的请求,在这里实现了生成验证码图片、绘制验证码字符、添加干扰线、存储验证码到会话以及输出图片到客户端的整个业务逻辑。 public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - //定义一个类型为 BufferedImage.TYPE_INT_BGR 类型的图像缓存 + // 定义一个类型为BufferedImage.TYPE_INT_BGR类型的图像缓存对象,BufferedImage是用于处理图像数据的类, + // TYPE_INT_BGR表示图像的颜色模式为每个像素使用3个字节(分别表示蓝、绿、红颜色分量)来存储颜色信息, + // 这里创建的图像缓存对象将用于后续绘制验证码图片的操作。 BufferedImage buffImg = null; buffImg = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); - - //在 buffImg 中创建一个 Graphics2D 图像 + + // 在buffImg图像缓存对象中创建一个Graphics2D图像绘制对象,Graphics2D是Java中用于进行二维图形绘制的高级接口, + // 通过它可以在BufferedImage上进行各种图形绘制操作,如画矩形、绘制文字、画线条等,这里创建的对象将用于后续具体的验证码图片绘制操作。 Graphics2D graphics = null; graphics = buffImg.createGraphics(); - - //设置一个颜色, 使 Graphics2D 对象的后续图形使用这个颜色 + + // 设置一个颜色(这里设置为白色),使Graphics2D对象后续绘制的图形默认使用这个颜色,这里首先将整个图片背景填充为白色, + // 也就是先把整个验证码图片的底色设置为白色,方便后续在上面绘制其他内容。 graphics.setColor(Color.WHITE); - - //填充一个指定的矩形: x - 要填充矩形的 x 坐标; y - 要填充矩形的 y 坐标; width - 要填充矩形的宽度; height - 要填充矩形的高度 + + // 填充一个指定的矩形,通过指定矩形的左上角坐标(0, 0)以及宽度和高度(即验证码图片的宽度和高度), + // 将整个验证码图片区域填充为之前设置的白色,也就是绘制出了验证码图片的白色背景。 graphics.fillRect(0, 0, width, height); - - //创建一个 Font 对象: name - 字体名称; style - Font 的样式常量; size - Font 的点大小 + + // 创建一个Font对象,用于指定后续绘制验证码字符时使用的字体样式,这里第一个参数为空字符串表示使用默认字体名称, + // Font.BOLD表示字体样式为加粗,fontHeight是之前根据图片高度计算出的合适字体大小,以此创建一个合适的字体对象。 Font font = null; font = new Font("", Font.BOLD, fontHeight); - //使 Graphics2D 对象的后续图形使用此字体 + // 使Graphics2D对象的后续图形绘制操作(主要是绘制验证码字符)使用此字体,确保验证码字符按照指定的字体样式进行显示。 graphics.setFont(font); - + + // 设置一个颜色(这里设置为黑色),后续将使用这个颜色绘制验证码图片的边框,用于使验证码图片在视觉上有一个边框轮廓,更加清晰。 graphics.setColor(Color.BLACK); - - //绘制指定矩形的边框, 绘制出的矩形将比构件宽一个也高一个像素 + + // 绘制指定矩形的边框,通过指定矩形的左上角坐标(0, 0)以及宽度减1、高度减1(绘制出的矩形将比构件宽一个也高一个像素,符合常见的边框绘制效果), + // 在验证码图片的外层绘制出一个黑色边框,使验证码图片看起来更规整。 graphics.drawRect(0, 0, width - 1, height - 1); - - //随机产生 15 条干扰线, 使图像中的认证码不易被其它程序探测到 + + // 创建一个Random对象,用于生成随机数,后续将利用随机数来生成干扰线的坐标以及选择验证码字符等操作,增加验证码的随机性和安全性。 Random random = null; random = new Random(); + // 设置一个颜色(这里设置为绿色),后续将使用这个颜色绘制干扰线,干扰线的作用是使图像中的验证码不易被其他程序通过图像识别等方式探测到,增加安全性。 graphics.setColor(Color.GREEN); - for(int i = 0; i < 55; i++){ + // 循环15次,随机产生15条干扰线,通过随机生成每条干扰线的起点坐标(x, y)以及终点相对于起点的偏移量(x1, y1), + // 然后使用drawLine方法在验证码图片上绘制出绿色的干扰线,使验证码更难以被自动化工具识别。 + for (int i = 0; i < 55; i++) { int x = random.nextInt(width); int y = random.nextInt(height); int x1 = random.nextInt(20); int y1 = random.nextInt(20); graphics.drawLine(x, y, x + x1, y + y1); } - - //创建 randomCode 对象, 用于保存随机产生的验证码, 以便用户登录后进行验证 + + // 创建一个StringBuffer对象,用于保存随机产生的验证码字符序列,后续将把生成的验证码字符逐个添加到这个对象中, + // 最后将其转换为字符串用于存储到HttpSession以及和用户输入的验证码进行比对验证。 StringBuffer randomCode; randomCode = new StringBuffer(); - - for(int i = 0; i < codeCount; i++){ - //得到随机产生的验证码数字 + + // 循环codeCount次(即验证码字符个数),用于逐个生成验证码的每个字符,并将其绘制到验证码图片上,同时添加到randomCode对象中保存起来。 + for (int i = 0; i < codeCount; i++) { + // 从codeSequence字符数组中随机选取一个字符,通过生成一个随机索引(范围是0到字符数组长度减1), + // 然后获取对应索引位置的字符,得到随机产生的验证码字符。 String strRand = null; strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]); - - //把正在产生的随机字符放入到 StringBuffer 中 + + // 把正在产生的随机字符添加到StringBuffer对象中,逐步构建完整的验证码字符串。 randomCode.append(strRand); - - //用随机产生的颜色将验证码绘制到图像中 + + // 设置一个颜色(这里设置为蓝色),用于绘制当前生成的验证码字符,使验证码字符以蓝色显示在验证码图片上,增强视觉辨识度。 graphics.setColor(Color.BLUE); - graphics.drawString(strRand, (i + 1)* codeX, codeY); + // 使用drawString方法将当前生成的验证码字符绘制到验证码图片上,指定字符的绘制位置为((i + 1) * codeX, codeY), + // 也就是根据之前计算好的每个字符的水平和垂直位置基准,依次将每个验证码字符绘制到合适的位置上,确保验证码字符排列整齐。 + graphics.drawString(strRand, (i + 1) * codeX, codeY); } - - //再把存放有所有随机字符的 StringBuffer 对应的字符串放入到 HttpSession 中 + + // 把存放有所有随机字符的StringBuffer对应的字符串放入到HttpSession中,使用之前定义的常量CHECK_CODE_KEY作为键名, + // 这样在后续需要验证用户输入的验证码时,可以从HttpSession中通过这个键名获取到正确的验证码进行比对验证。 request.getSession().setAttribute(CHECK_CODE_KEY, randomCode.toString()); - - //禁止图像缓存 + + // 禁止图像缓存,通过设置响应头信息,分别设置了Pragma、Cache-Control和Expires头,告诉客户端不要缓存验证码图片, + // 确保每次请求验证码时都能获取到最新生成的图片,防止因缓存导致验证码验证出现问题。 response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); - - //将图像输出到输出流中 + + // 将图像输出到输出流中,首先获取ServletResponse的输出流对象ServletOutputStream, + // 然后使用ImageIO.write方法将之前绘制好的BufferedImage对象(即包含验证码的图片)以JPEG格式写入到输出流中, + // 这样客户端就能接收到生成的验证码图片进行展示,并且最终关闭输出流,释放相关资源。 ServletOutputStream sos = null; sos = response.getOutputStream(); - ImageIO.write(buffImg, "jpeg", sos); + ImageIO.write(buffImg, "jpeg", sos); sos.close(); } -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/test/JDBCUtilsTest.java b/javaweb_project/src/com/hua/test/JDBCUtilsTest.java index 4f76bf6..b5d75a5 100644 --- a/javaweb_project/src/com/hua/test/JDBCUtilsTest.java +++ b/javaweb_project/src/com/hua/test/JDBCUtilsTest.java @@ -7,14 +7,29 @@ import org.junit.Test; import com.hua.jdbcutil.JDBCUtils; +// ҪڶJDBCUtilsеݿӻȡرطеԪԣ +// ͨJUnit@TestעDzԷ֤书ǷԤڡ public class JDBCUtilsTest { + // ʹJUnit@TestעǸ÷ΪһԷִеԪʱJUnitԶбעǵķ + // ˷ҪԻȡݿԼرӵĹǷ @Test public void test() throws SQLException { + // һConnection͵ıڴ洢ȡݿӶ󣬳ʼΪnull + // ͨJDBCUtilsķԻȡݿӲֵ Connection conn = null; + + // JDBCUtilsgetConnectionԻȡһݿӶ + // ÷ڲͨݿصIJݿURLûȣݿӣ + // ӳɹ򷵻һЧConnectionʧܻܿ׳SQLException쳣 conn = JDBCUtils.getConnection(); + + // ȡݿӶҪΪڲԹв鿴Ƿɹȡӣ + // ʵӦпܻݾϸ֤жǷΪnullȣ System.out.println(conn); + + // JDBCUtilscloseConnectionȡݿӶڹر֮ǰ򿪵ݿӣ + // ͷԴԴй¶÷ڲִйرӵIJֵܳ쳣 JDBCUtils.closeConnection(conn); } - -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/test/StudentBasicInforDAOImplTest.java b/javaweb_project/src/com/hua/test/StudentBasicInforDAOImplTest.java index 0900d61..9f3abdd 100644 --- a/javaweb_project/src/com/hua/test/StudentBasicInforDAOImplTest.java +++ b/javaweb_project/src/com/hua/test/StudentBasicInforDAOImplTest.java @@ -6,44 +6,72 @@ import com.hua.entity.CriterStudent; import com.hua.entity.StudentBasicInformation; import com.hua.impl.StudentBasicInforDAOImpl; +// 这个类是针对 `StudentBasicInforDAOImpl` 类的单元测试类,用于测试 `StudentBasicInforDAOImpl` 中实现的各个数据库操作方法是否能正常工作, +// 通过JUnit的 `@Test` 注解来标记不同的测试方法,每个方法对应测试一个具体的数据库操作功能。 public class StudentBasicInforDAOImplTest { + + // 创建 `StudentBasicInforDAOImpl` 类的实例对象,后续将通过这个对象调用其实现的各种数据库操作方法进行测试, + // 它负责与数据库进行交互,执行如查询、插入、更新、删除学生基本信息等相关操作。 StudentBasicInforDAOImpl sbi = new StudentBasicInforDAOImpl(); + + // 创建一个 `StudentBasicInformation` 类的实例对象,用于模拟一个学生的基本信息, + // 这个对象包含了学生的学号、姓名、性别、年级、班级、学院、专业、校区、联系方式、家庭住址等信息, + // 在部分测试方法中会作为参数传入相关数据库操作方法,用于测试数据的插入、更新等功能。 StudentBasicInformation studentBasicInfor = new StudentBasicInformation(3115001256l, - "Tan","男","2015级","15(1)班","自动化学院", - "电子信息专业","大学城校区","15622365566","广东省湛江市霞山区人民大道"); + "Tan", "男", "2015级", "15(1)班", "自动化学院", + "电子信息专业", "大学城校区", "15622365566", "广东省湛江市霞山区人民大道"); + + // 使用JUnit的 `@Test` 注解标记该方法为一个测试方法,此方法主要用于测试 `StudentBasicInforDAOImpl` 类中获取所有学生基本信息的功能, + // 通过调用 `sbi.getAll()` 方法从数据库中获取所有学生信息,并将结果输出打印,用于查看获取到的信息是否符合预期, + // 不过实际应用中可能需要更严谨的断言(`assert` 语句)来验证返回结果的准确性,比如判断返回的集合是否为空等情况。 @Test public void testGetAll() { System.out.println(sbi.getAll()); } + // 使用JUnit的 `@Test` 注解标记该方法为一个测试方法,该方法用于测试 `StudentBasicInforDAOImpl` 类中根据学号获取单个学生基本信息的功能, + // 通过调用 `sbi.get(3115001256l)` 方法传入一个具体的学号,尝试从数据库中获取对应的学生信息,并将结果输出打印, + // 以便查看是否能正确获取到指定学号的学生信息,同样在实际测试中可以添加更详细的断言来验证返回结果的正确性。 @Test public void testGetLong() { System.out.println(sbi.get(3115001256l)); } + // 使用JUnit的 `@Test` 注解标记该方法为一个测试方法,此方法用于测试 `StudentBasicInforDAOImpl` 类中插入学生基本信息到数据库的功能, + // 通过调用 `sbi.insert(studentBasicInfor)` 方法,将之前创建的模拟学生基本信息对象插入到数据库中, + // 不过这里没有对插入结果进行进一步验证,实际测试中可以通过查询数据库或者查看相关返回值等方式来确认插入操作是否成功。 @Test public void testInsert() { sbi.insert(studentBasicInfor); } + // 使用JUnit的 `@Test` 注解标记该方法为一个测试方法,该方法用于测试 `StudentBasicInforDAOImpl` 类中更新学生基本信息的功能, + // 首先创建了一个新的 `StudentBasicInformation` 对象 `studentBasicInfor1`,它与之前的 `studentBasicInfor` 对象有部分信息不同(如班级、联系方式), + // 然后调用 `sbi.update(studentBasicInfor1)` 方法,尝试将更新后的学生信息更新到数据库中,同样在实际测试中需要进一步验证更新操作是否真正生效。 @Test public void testUpdateStudentBasicInformation() { StudentBasicInformation studentBasicInfor1 = new StudentBasicInformation(3115001256l, - "Tan","男","2015级","15(2)班","自动化学院", - "电子信息专业","大学城校区","15622369988","广东省湛江市霞山区人民大道"); + "Tan", "男", "2015级", "15(2)班", "自动化学院", + "电子信息专业", "大学城校区", "15622369988", "广东省湛江市霞山区人民大道"); sbi.update(studentBasicInfor1); } + // 使用JUnit的 `@Test` 注解标记该方法为一个测试方法,此方法用于测试 `StudentBasicInforDAOImpl` 类中根据学号删除学生基本信息的功能, + // 通过调用 `sbi.delete(3115001256l)` 方法,传入要删除的学生学号,尝试从数据库中删除对应的学生信息记录, + // 实际测试中可以通过再次查询该学号对应的信息或者查看相关删除操作的返回值等方式来确认删除是否成功。 @Test public void testDelete() { sbi.delete(3115001256l); } + // 使用JUnit的 `@Test` 注解标记该方法为一个测试方法,该方法用于测试 `StudentBasicInforDAOImpl` 类中根据特定条件获取学生基本信息列表的功能, + // 首先创建了一个 `CriterStudent` 对象 `student`,并设置了专业名称为 "电子信息工程",用于作为查询条件, + // 然后调用 `sbi.getForListWithCriterStudent(student)` 方法,传入这个查询条件对象,尝试从数据库中获取符合条件的学生信息列表, + // 最后将获取到的结果输出打印,用于查看是否能正确获取到符合指定条件的学生信息,实际测试中可添加更严谨的断言来验证结果准确性。 @Test public void testGetCountWithName() { CriterStudent student = new CriterStudent(null, "电子信息工程", null, null, null); - + System.out.println(sbi.getForListWithCriterStudent(student)); } - -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/test/StudentGradeDAOIpmlTest.java b/javaweb_project/src/com/hua/test/StudentGradeDAOIpmlTest.java index 59c761b..a0e238e 100644 --- a/javaweb_project/src/com/hua/test/StudentGradeDAOIpmlTest.java +++ b/javaweb_project/src/com/hua/test/StudentGradeDAOIpmlTest.java @@ -1,53 +1,75 @@ package com.hua.test; import static org.junit.Assert.*; - import java.util.ArrayList; import java.util.Iterator; import java.util.List; - import org.junit.Test; - import com.hua.dao.StudentGradeDAO; import com.hua.entity.StudentGrade; import com.hua.impl.StudentGradeDAOIpml; +// `StudentGradeDAOIpml` ĵԪּ࣬ڲԸʵֵĸѧɼصݿǷȷִУ +// ͨJUnit `@Test` עDzͬIJԷÿӦһݿܣԴ֤ҵ߼ȷԡ public class StudentGradeDAOIpmlTest { + + // `StudentGradeDAO` ӿڵʵ `StudentGradeDAOIpml` ʵ󣬺ͨʵֵĸݿвԣ + // öݿнִѯѧɼɼ¼³ɼԼɾɼ¼ز StudentGradeDAO sgd = new StudentGradeDAOIpml(); - + + // ʹJUnit `@Test` עǸ÷ΪһԷ˷Ҫڲ `StudentGradeDAOIpml` лȡѧɼϢĹܣ + // ȴһյ `List` ڴ洢ȡѧɼϢȻ `sgd.getAll()` ݿлȡѧɼϢ + // صĽ洢Уͨϣÿ `StudentGrade` ӡڲ鿴ȡϢǷԤڡ + // ʵӦУҪϽĶԣ`assert` 䣩֤ؽ׼ȷԣжϷصļǷΪաԪصĸʽǷȷ @Test public void testGetAll() { List list = new ArrayList<>(); list = sgd.getAll(); Iterator iter = list.iterator(); - while(iter.hasNext()){ + while (iter.hasNext()) { System.out.println(iter.next()); } } + // ʹJUnit `@Test` עǸ÷ΪһԷ÷ڲ `StudentGradeDAOIpml` иѧѧŻȡѧпγ̳ɼĹܣ + // ͨ `sgd.getAllCourseGrade(3115001256l)` һѧѧţԴݿлȡѧŶӦѧпγ̳ɼϢ + // ӡԱ鿴ǷȷȡָѧĿγ̳ɼϢͬʵʲпӸϸĶ֤ؽȷԣ + // жϷصijɼǷɼֵǷںΧڵȡ @Test public void testGetLong() { System.out.println(sgd.getAllCourseGrade(3115001256l)); } + // ʹJUnit `@Test` עǸ÷ΪһԷ˷ڲ `StudentGradeDAOIpml` вѧɼϢݿĹܣ + // ĿǰΪգζŻδʵ־IJ߼ʵIJԳУҪдʵ `StudentGrade` ΪҪݣ + // `sgd.insert(...)` ִвͨʵķʽѯݿ֤Ƿɹ鿴뷽ķֵȣ֤ǷЧ @Test public void testInsert() { - + } + // ʹJUnit `@Test` עǸ÷ΪһԷ÷ڲ `StudentGradeDAOIpml` иѧɼϢĹܣ + // Ŀǰн `fail("Not yet implemented")`ʾԷδʵ֣ʵʲʱҪдǰѧɼݣ + // `sgd.updateStudentGrade(...)` ִи²ͨʵֶ֤ΣٴβѯݿԱȸǰݡ鿴·ķֵȣ + // ȷϸ²ǷȷִУǷﵽԤڵĸЧ @Test public void testUpdateStudentGrade() { fail("Not yet implemented"); } + // ʹJUnit `@Test` עǸ÷ΪһԷ˷ڲ `StudentGradeDAOIpml` иѧѧɾѧɼϢĹܣ + // ǰͬ `fail("Not yet implemented")`˵δʵ־IJ߼ʵʲʱҪд봫Ҫɾɼѧѧţ + // `sgd.delete(...)` ִɾȻͨѯݿȷ϶Ӧѧŵijɼ¼Ƿѱɹɾ鿴ɾķֵȷʽ֤ɾǷɹ @Test public void testDelete() { fail("Not yet implemented"); } + // ʹJUnit `@Test` עǸ÷ΪһԷ÷ڲ `StudentGradeDAOIpml` иѧѧŻȡضѧɼĹܣ + // Ŀǰе `fail("Not yet implemented")`ʾ˲Էδʵ֣ʵʲԳУҪȷ÷ʽԼԤڵͳ߼ + // д `sgd.getCountWithStudentId(...)` ȡͨʵĶ֤صǷԤڣȷͳƹܵȷԡ @Test public void testGetCountWithStudentId() { fail("Not yet implemented"); } - -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/test/TeacherDAOImplTest.java b/javaweb_project/src/com/hua/test/TeacherDAOImplTest.java index 012acca..037b423 100644 --- a/javaweb_project/src/com/hua/test/TeacherDAOImplTest.java +++ b/javaweb_project/src/com/hua/test/TeacherDAOImplTest.java @@ -1,47 +1,70 @@ package com.hua.test; import static org.junit.Assert.*; - import org.junit.Test; - import com.hua.entity.Teacher; import com.hua.impl.TeacherDAOImpl; +// 这个类是针对 `TeacherDAOImpl` 类的单元测试类,主要目的是测试 `TeacherDAOImpl` 中实现的各种与教师信息相关的数据库操作方法是否能正常工作, +// 通过JUnit的 `@Test` 注解来标记不同的测试方法,每个方法对应测试一个具体的数据库操作功能,进而验证业务逻辑的正确性以及数据库交互的准确性。 + public class TeacherDAOImplTest { - + + // 创建 `TeacherDAOImpl` 类的实例对象,后续将通过这个对象调用其实现的各种数据库操作方法进行测试, + // `TeacherDAOImpl` 负责与数据库进行交互,执行诸如查询所有教师信息、根据教师编号获取教师信息、插入教师信息、更新教师信息以及删除教师信息等相关操作。 TeacherDAOImpl tdi = new TeacherDAOImpl(); + + // 创建一个 `Teacher` 类的实例对象,用于模拟一位教师的详细信息,包含教师编号、姓名、性别、政治面貌、民族、所在学院、所授专业、家庭住址、联系电话、电子邮箱以及工作地址等信息, + // 在部分测试方法中会将这个对象作为参数传入相关数据库操作方法,用于测试数据的插入、更新等功能。 Teacher t = new Teacher("123456", "林英", "男", "党员", "汉族", "计算机学院", "计算机科学与技术", - "广东广州", "15626438856","123th@126.com", "广州市越秀区"); - + "广东广州", "15626438856", "123th@126.com", "广州市越秀区"); + + // 使用JUnit的 `@Test` 注解标记该方法为一个测试方法,此方法主要用于测试 `TeacherDAOImpl` 类中获取所有教师信息的功能, + // 通过调用 `tdi.getAll()` 方法从数据库中获取所有教师的信息,并将结果输出打印,用于查看获取到的信息是否符合预期。 + // 不过在实际更严谨的测试应用中,可能需要添加更详细的断言(`assert` 语句)来验证返回结果的准确性,比如判断返回的集合是否为空、集合中元素的格式是否正确等情况。 @Test public void testGetAll() { System.out.println(tdi.getAll()); } + // 使用JUnit的 `@Test` 注解标记该方法为一个测试方法,该方法用于测试 `TeacherDAOImpl` 类中根据教师编号获取单个教师信息的功能, + // 通过调用 `tdi.get("123456")` 方法传入一个具体的教师编号,尝试从数据库中获取对应编号的教师信息,并将结果输出打印, + // 以便查看是否能正确获取到指定编号的教师信息,同样在实际测试中可以添加更具体的断言来验证返回结果的正确性,例如判断返回的教师对象的各个属性是否符合预期等。 @Test public void testGetString() { - System.out.println(tdi.get("123456"));; + System.out.println(tdi.get("123456")); } + // 使用JUnit的 `@Test` 注解标记该方法为一个测试方法,此方法用于测试 `TeacherDAOImpl` 类中插入教师信息到数据库的功能, + // 通过调用 `tdi.insert(t)` 方法,将之前创建的模拟教师信息对象插入到数据库中,不过这里没有对插入结果进行进一步验证, + // 在实际测试中可以通过查询数据库或者查看相关返回值等方式来确认插入操作是否成功,比如判断插入方法返回的是否为预期的成功标识等情况。 @Test public void testInsert() { tdi.insert(t); } + // 使用JUnit的 `@Test` 注解标记该方法为一个测试方法,该方法用于测试 `TeacherDAOImpl` 类中更新教师信息的功能, + // 首先通过 `t.setGender("女")` 修改了之前创建的教师对象 `t` 的性别属性,然后调用 `tdi.update(t)` 方法,尝试将更新后的教师信息更新到数据库中, + // 同样在实际测试中需要进一步验证更新操作是否真正生效,例如再次查询数据库获取该教师信息,对比性别等属性是否已成功更新为预期的值等操作。 @Test public void testUpdateTeacher() { t.setGender("女"); tdi.update(t); } + // 使用JUnit的 `@Test` 注解标记该方法为一个测试方法,此方法用于测试 `TeacherDAOImpl` 类中根据教师编号删除教师信息的功能, + // 通过调用 `tdi.delete("123456")` 方法,传入要删除的教师编号,尝试从数据库中删除对应的教师信息记录, + // 实际测试中可以通过再次查询该编号对应的教师信息或者查看相关删除操作的返回值等方式来确认删除是否成功,例如判断删除后是否无法再查询到对应编号的教师信息等情况。 @Test public void testDelete() { tdi.delete("123456"); } + // 使用JUnit的 `@Test` 注解标记该方法为一个测试方法,该方法用于测试 `TeacherDAOImpl` 类中根据教师姓名获取符合特定条件的教师数量的功能, + // 目前方法体中调用了 `fail("Not yet implemented")`,表示这个测试方法还未被实现,在实际完整的测试场景中,需要明确具体的条件设置以及数量统计逻辑, + // 编写代码调用 `tdi.getCountWithName(...)` 方法获取数量结果,并通过合适的断言来验证返回的数量是否符合预期,确保统计功能的正确性。 @Test public void testGetCountWithName() { fail("Not yet implemented"); } - -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/test/UserDAOImplTest.java b/javaweb_project/src/com/hua/test/UserDAOImplTest.java index cb85178..331e7cc 100644 --- a/javaweb_project/src/com/hua/test/UserDAOImplTest.java +++ b/javaweb_project/src/com/hua/test/UserDAOImplTest.java @@ -1,50 +1,76 @@ package com.hua.test; import static org.junit.Assert.*; - import org.junit.Test; import com.hua.entity.User; import com.hua.impl.UserDAOImpl; +// `UserDAOImpl` ĵԪ࣬Ҫڲ `UserDAOImpl` ʵֵĸûϢصݿǷ +// ͨJUnit `@Test` עDzͬIJԷÿӦһݿܣԴ֤ҵ߼ݿ⽻ȷԡ + public class UserDAOImplTest { + + // `UserDAOImpl` ʵ󣬺ʵֵĸݿչԹ + // `UserDAOImpl` ݿнִѯûϢûȡûϢûϢûϢԼɾûϢز UserDAOImpl udi = new UserDAOImpl(); - + + // ʹJUnit `@Test` עǸ÷ΪһԷ˷ҪĿDz `UserDAOImpl` лȡûϢĹܡ + // ͨ `udi.getAll()` ݿлȡȫûϢѻȡĽӡ鿴ȡϢǷԤ + // ڸϽʵʲӦóӦӸΪϸĶԣ`assert` 䣩ȷ֤ؽ׼ȷԣ֤صļǷΪաԪصݽṹֵǷ @Test public void testGetAll() { - + System.out.println(udi.getAll()); } + // ʹJUnit `@Test` עǸ÷ΪһԷ÷ּڲ `UserDAOImpl` ûȡûϢĹܡ + // ȶһû `username` ֵȻ `udi.get(username)` ûԴݿлȡӦûûϢ + // 󽫻ȡĽӡڲ鿴Ƿ׼ȷȡָûӦûϢͬʵʲԹУɽһӸĶϸ֤ؽȷԣ + // 鷵صûĸֵǷԤ @Test public void testGet() { String username = "3115001256"; - + System.out.println(udi.get(username)); } + // ʹJUnit `@Test` עǸ÷ΪһԷ˷ڲ `UserDAOImpl` ݿûϢĹܡ + // ͨһ `User` ʵ `user`Ȼ `udi.insert(user)` ԰´ûϢ뵽ݿС + // ˴ûжԲĽ֤ʵʵIJԳУӦͨѯݿ鿴Ƿɹ߼뷽ķֵȷʽ + // ȷϲǷﵽԤڵijɹЧжϲ뷽صǷDZʾɹضʶ @Test public void testInsert() { User user = new User(); - + udi.insert(user); } + // ʹJUnit `@Test` עǸ÷ΪһԷ÷ڲ `UserDAOImpl` иûϢĹܡ + // Ǵһ `User` ʵ `user`ŵ `udi.update(user)` ԽûĸºϢµݿС + // ͬʵʲʱҪһ֤²ǷЧٴδݿлȡûϢԱӦǷѰԤɸµȲ + // Դȷ²׼ȷԺԡ @Test public void testUpdate() { User user = new User(); - + udi.update(user); } + // ʹJUnit `@Test` עǸ÷ΪһԷ˷ڲ `UserDAOImpl` ûɾûϢĹܡ + // ͨ `udi.delete("3115001273")` ҪɾûԴݿɾӦûûϢ¼ + // ʵʲУͨٴγԲѯûӦûϢ߲鿴ɾķֵȷʽȷɾǷɹִУ + // жɾǷȷʵ޷ٲѯûӦûϢ @Test public void testDelete() { udi.delete("3115001273"); } + // ʹJUnit `@Test` עǸ÷ΪһԷ÷ڲ `UserDAOImpl` ûȡضûĹܡ + // Ŀǰе `fail("Not yet implemented")`Էδʵ֡ʵIJԳ£Ҫȷ趨ʽԼͳ߼ + // д `udi.getCountWithName(...)` ȡͨʵĶ֤صǷԤڣԴ˱ͳƹܵ׼ȷԺͿɿԡ @Test public void testGetCountWithName() { fail("Not yet implemented"); } - -} +} \ No newline at end of file diff --git a/javaweb_project/web/acdemic_dean/acdemic_dean.jsp b/javaweb_project/web/acdemic_dean/acdemic_dean.jsp index 8ba6222..565300a 100644 --- a/javaweb_project/web/acdemic_dean/acdemic_dean.jsp +++ b/javaweb_project/web/acdemic_dean/acdemic_dean.jsp @@ -1,38 +1,62 @@ <%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> + pageEncoding="UTF-8"%> - -教务管理系统 + + + 教务管理系统 -

${sessionScope.user.name },您好!

-
- <%session.setAttribute("path", request.getRequestURI()); %> - 修改密码 - 注销 -
- -
-

学籍管理

- 学生基本信息 -
-
-

考级管理

- 考级报名学生 -

- 考级学生成绩 -
-
-

教务管理

- 成绩管理 -

- 选修报名学生 -
-
-

个人事务

- 个人信息 -
+ +

${sessionScope.user.name },您好!

+
+ + <%session.setAttribute("path", request.getRequestURI()); %> + + 修改密码 + + 注销 +
+ + +
+

学籍管理

+ + 学生基本信息 +
+ +
+

考级管理

+ + 考级报名学生 +

+ + 考级学生成绩 +
+ +
+

教务管理

+ + 成绩管理 +

+ + 选修报名学生 +
+ +
+

个人事务

+ + 个人信息 +
\ No newline at end of file diff --git a/javaweb_project/web/acdemic_dean/personalaffair/personalinformation.jsp b/javaweb_project/web/acdemic_dean/personalaffair/personalinformation.jsp index 25fa7f3..ae41889 100644 --- a/javaweb_project/web/acdemic_dean/personalaffair/personalinformation.jsp +++ b/javaweb_project/web/acdemic_dean/personalaffair/personalinformation.jsp @@ -1,56 +1,83 @@ <%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> + pageEncoding="UTF-8"%> - -Insert title here + + + Insert title here -

${sessionScope.user.name },您好!

+ +

${sessionScope.user.name },您好!

+
+ + <%session.setAttribute("path", request.getRequestURI()); %> + + 修改密码 + + 注销 +

+ + 返回上一步 +
+ +
+

个人信息

+
+
+ + ${requestScope.message } +
+
+ +
- <%session.setAttribute("path", request.getRequestURI()); %> - 修改密码 - 注销 -

- 返回上一步 + + 教师编号: + + 姓名: + + 性别:
- +

-

个人信息

+ + 政治面貌: + + 民族: + + 籍贯:
+

- ${requestScope.message } + + 学院: + + QQ: + + 联系电话:
-
- -
- 教师编号: - 姓名: - 性别: -
-

-
- 政治面貌: - 民族: - 籍贯: -
-

-
- 学院: - QQ: - 联系电话: -
-

-
- 邮箱: - 地址: - -
-

-
- -
-
+

+
+ + 邮箱: + + 地址: +
+

+
+ + +
+ \ No newline at end of file diff --git a/javaweb_project/web/acdemic_dean/schoolroll/studentinformation.jsp b/javaweb_project/web/acdemic_dean/schoolroll/studentinformation.jsp index d73731c..462e98e 100644 --- a/javaweb_project/web/acdemic_dean/schoolroll/studentinformation.jsp +++ b/javaweb_project/web/acdemic_dean/schoolroll/studentinformation.jsp @@ -1,52 +1,77 @@ <%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> + pageEncoding="UTF-8"%> - -学籍信息 + + + 学籍信息 -

${sessionScope.user.name },您好!

+ +

${sessionScope.user.name },您好!

+
+ + 修改密码 + + 注销 +
+
+

学籍信息

+
+
+ + ${requestScope.message } +
+
+ +
- 修改密码 - 注销 + + 学号: + + 姓名: + + 性别:
+

-

学籍信息

+ + 年级: + + 班级: + + 学院:
+

- ${requestScope.message } + + 专业: + + 所在校区: + + 联系电话:
-
- -
- 学号: - 姓名: - 性别: -
-

-
- 年级: - 班级: - 学院: -
-

-
- 专业: - 所在校区: - 联系电话: -
-

-
- 家庭地址: - -
-

- -
+

+
+ + 家庭地址: +
+

+
+ + + + 返回上一步 +
+ \ No newline at end of file diff --git a/javaweb_project/web/administrator/adduser.jsp b/javaweb_project/web/administrator/adduser.jsp index 2e1455a..09e8879 100644 --- a/javaweb_project/web/administrator/adduser.jsp +++ b/javaweb_project/web/administrator/adduser.jsp @@ -1,54 +1,72 @@ <%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> + pageEncoding="UTF-8"%> - -Insert title here + + + Insert title here - -

${sessionScope.user.name },您好!

+ +

${sessionScope.user.name },您好!

+
+ + <%session.setAttribute("path", request.getRequestURI()); %> + + 修改密码 + + 注销 +

+ + 返回上一步 +
+

学生用户管理

+ +
- <%session.setAttribute("path", request.getRequestURI()); %> - 修改密码 - 注销 + + ${requestScope.message }

- 返回上一步
-

学生用户管理

- -
- ${requestScope.message } -

-
- - - - - - - - - - - - - - - - - - - - - - - - - -
用户名:
登录密码:
用户姓名:
用户身份:
找回密码凭据:
- -
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户名:
登录密码:
用户姓名:
用户身份:
找回密码凭据:
+ \ No newline at end of file diff --git a/javaweb_project/web/administrator/administrator.jsp b/javaweb_project/web/administrator/administrator.jsp index dae8dc6..04c6837 100644 --- a/javaweb_project/web/administrator/administrator.jsp +++ b/javaweb_project/web/administrator/administrator.jsp @@ -1,24 +1,37 @@ <%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> + pageEncoding="UTF-8"%> - -教务管理系统 + + + 教务管理系统 - -

${sessionScope.user.name },您好!

-
- <%session.setAttribute("path", request.getRequestURI()); %> - 修改密码 - 注销 -
+ +

${sessionScope.user.name },您好!

+
+ + <%session.setAttribute("path", request.getRequestURI()); %> + + 修改密码 + + 注销 +
+

+ \ No newline at end of file diff --git a/javaweb_project/web/administrator/adminuser.jsp b/javaweb_project/web/administrator/adminuser.jsp index 3f7da20..a4aaab8 100644 --- a/javaweb_project/web/administrator/adminuser.jsp +++ b/javaweb_project/web/administrator/adminuser.jsp @@ -1,91 +1,111 @@ <%@page import="com.hua.entity.User"%> <%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> + pageEncoding="UTF-8"%> - -教务管理系统 + + + 教务管理系统 - -

${sessionScope.user.name },您好!

-
- <%session.setAttribute("path", request.getRequestURI()); %> - 修改密码 - 注销 -

- 返回上一步 -
-

用户管理

-
- - - - - - - - - - - - - - - - - - - -
用户名:
用户姓名:
用户身份:
添加用户
- -
- + +

${sessionScope.user.name },您好!

+
+ + <%session.setAttribute("path", request.getRequestURI()); %> + + 修改密码 + + 注销

- + + 返回上一步 +
+

用户管理

+ +
+ + + + + + + + + + + + + + + + + + + + +
用户名:
用户姓名:
用户身份:
+ + 添加用户 +
+
+

+<% + // 从请求作用域(request)中获取名为"users"的属性值,并将其强制转换为List类型, + // 这个属性值通常是由服务器端在处理相关业务逻辑(比如查询用户信息后)设置到请求作用域中的,代表查询到的用户信息列表。 + List users = (List) request.getAttribute("users"); + // 判断获取到的用户列表是否不为空且包含至少一个元素,只有在满足这个条件时,才进行后续的用户信息表格展示操作。 + if (users!= null && users.size() > 0) { +%> +
+

+ + + + + + + + + + + + + <% - List users = (List)request.getAttribute("users"); - if(users != null && users.size() > 0){ + // 循环遍历获取到的用户列表,对于每个用户对象,在表格中添加一行来展示其详细信息。 + for (User user : users) { %> -
-

-
用户名密码姓名身份找回密码凭据最近一次登录时间最近一次修改密码时间修改/删除
- - - - - - - - - - - <% - for(User user : users){ - %> - - - - - - - - - - - - - <% - } - %> -
用户名密码姓名身份找回密码凭据最近一次登录时间最近一次修改密码时间修改/删除
<%= user.getUsername() %><%= user.getPassword() %><%= user.getName() %><%= user.getIdentity() %><%= user.getFindMMproof() %><%= user.getLogin_last_time() %><%= user.getPassword_last_changed() %> - UPDATE/ - DELETE -
+ + + <%= user.getUsername() %> + <%= user.getPassword() %> + <%= user.getName() %> + <%= user.getIdentity() %> + <%= user.getFindMMproof() %> + <%= user.getLogin_last_time() %> + <%= user.getPassword_last_changed() %> + + + UPDATE/ + DELETE + + <% - } + } %> + +<% + } +%> \ No newline at end of file diff --git a/javaweb_project/web/administrator/systemmaintain/systemmaintain.jsp b/javaweb_project/web/administrator/systemmaintain/systemmaintain.jsp index fa126d2..0b1df82 100644 --- a/javaweb_project/web/administrator/systemmaintain/systemmaintain.jsp +++ b/javaweb_project/web/administrator/systemmaintain/systemmaintain.jsp @@ -1,20 +1,34 @@ <%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> + pageEncoding="UTF-8"%> - -教务管理系统 + + + 教务管理系统 -

${sessionScope.user.name },您好!

-
- <%session.setAttribute("path", request.getRequestURI()); %> - 修改密码 - 注销 -

- 返回上一步 -
-

系统维护

+ +

${sessionScope.user.name },您好!

+
+ + <%session.setAttribute("path", request.getRequestURI()); %> + + 修改密码 + + 注销 +

+ + 返回上一步 +
+

系统维护

+ \ No newline at end of file diff --git a/javaweb_project/web/administrator/updateuser.jsp b/javaweb_project/web/administrator/updateuser.jsp index 93a8d27..7ff74c9 100644 --- a/javaweb_project/web/administrator/updateuser.jsp +++ b/javaweb_project/web/administrator/updateuser.jsp @@ -1,58 +1,76 @@ <%@page import="com.hua.entity.User"%> <%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> + pageEncoding="UTF-8"%> - -Insert title here + + + Insert title here -

${sessionScope.user.name },您好!

+ +

${sessionScope.user.name },您好!

+
+ + <%session.setAttribute("path", request.getRequestURI()); %> + + 修改密码 + + 注销 +

+ + 返回上一步 +
+

学生用户管理

+ +
- <%session.setAttribute("path", request.getRequestURI()); %> - 修改密码 - 注销 + + ${requestScope.message }

- 返回上一步
-

学生用户管理

- -
- ${requestScope.message } -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
用户名:
用户名:
登录密码:
用户姓名:
用户身份:
找回密码凭据:
- -
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户名:
用户名:
登录密码:
用户姓名:
用户身份:
找回密码凭据:
+ \ No newline at end of file diff --git a/javaweb_project/web/login/findpassword.jsp b/javaweb_project/web/login/findpassword.jsp index d8f6a0c..4a6fe42 100644 --- a/javaweb_project/web/login/findpassword.jsp +++ b/javaweb_project/web/login/findpassword.jsp @@ -1,49 +1,75 @@ <%@page import="java.util.Date"%> <%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> + pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - -找回密码 + + + 找回密码 - -
+ +
+
+ + <% String tokenValue = new Date().getTime() + ""; %> + + +
+ +
- <% String tokenValue = new Date().getTime() +""; %> - -
- -
+ ${sessionScope.message } -
-
- -
-
- 账号: - <%session.removeAttribute("message"); %> -
-
-
- 凭据: -
-
-
- 验证码: - -
-
-
- 凭据默认是身份证或护照 -
-
- - 返回登录 -
-
-
+
+
+ + +
+
+ + 账号: + + <%session.removeAttribute("message"); %> +
+
+
+ + 凭据: +
+
+
+ + 验证码: + +
+
+
+ + 凭据默认是身份证或护照 +
+
+ + + + 返回登录 +
+ + \ No newline at end of file diff --git a/javaweb_project/web/login/login.jsp b/javaweb_project/web/login/login.jsp index dcd9d35..5f0ec33 100644 --- a/javaweb_project/web/login/login.jsp +++ b/javaweb_project/web/login/login.jsp @@ -1,68 +1,93 @@ <%@page import="java.util.Date"%> <%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> + pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - -教务管理系统 + + + 教务管理系统 - -
- -
-