Compare commits

..

17 Commits

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

@ -4,31 +4,38 @@ import java.util.List;
import com.hua.entity.CourseSchedule;
// 定义一个接口用于操作CourseSchedule实体类的数据访问对象DAO
public interface CourseScheduleDAO {
// 获取所有CourseSchedule记录
public List<CourseSchedule> getAll();
// 根据学生ID获取对应的CourseSchedule记录
public CourseSchedule get(String studentId);
// 插入一条新的CourseSchedule记录
public void insert(CourseSchedule courseSchedule);
// 更新一条CourseSchedule记录
public void update(CourseSchedule courseSchedule);
// 根据学生ID删除对应的CourseSchedule记录
public void delete(String studentId);
/**
* studentId
* @param studentId
* @return
* @param studentId ID
* @return studentId
*/
public long getCountWithName(String studentId);
/**
* studentIdyearTermweek
* @param studentId
* @param yearTerm
* @param week
* @return
* @param studentId ID
* @param yearTerm
* @param week
* @return studentIdyearTermweek
*/
public List<CourseSchedule> getAllWithYearTerm(String studentId,
String yearTerm, String week);
}
String yearTerm, String week);
}

@ -19,105 +19,132 @@ import com.hua.jdbcutil.JDBCUtils;
* @author hua
*
*/
// 定义一个泛型类DAO用于封装通用的数据库操作方法
public class DAO<T> {
// 创建QueryRunner对象用于执行SQL语句
private QueryRunner qr = new QueryRunner();
// 定义一个Class对象用于表示泛型T的实际类型
private Class<T> clazz;
// 构造方法用于初始化clazz对象
@SuppressWarnings("unchecked")
public DAO(){
// 获取当前类的父类的类型
Type superClass = getClass().getGenericSuperclass();
// 判断父类是否是参数化类型
if(superClass instanceof ParameterizedType){
// 将父类类型转换为参数化类型
ParameterizedType pt = (ParameterizedType)superClass;
// 获取参数化类型的实际类型参数
Type[] typeArgs = pt.getActualTypeArguments();
if(typeArgs != null && typeArgs.length > 0){
// 判断第一个类型参数是否是Class类型
if(typeArgs[0] instanceof Class){
// 将第一个类型参数赋值给clazz
clazz = (Class<T>)typeArgs[0];
}
}
}
}
/**
* T
* @param sql
* @param args
* @return
*/
// 根据SQL语句和参数返回一个T类型的对象
public T get(String sql, Object...args){
Connection conn = null;
try {
// 获取数据库连接
conn = JDBCUtils.getConnection();
// 执行查询并将结果封装为T类型的对象
return qr.query(conn, sql,new BeanHandler<>(clazz),args);
} catch (Exception e) {
e.printStackTrace();
}finally{
// 关闭数据库连接
JDBCUtils.closeConnection(conn);
}
return null;
return null;
}
/**
* TList
* @param sql
* @param args
* @return
*/
// 根据SQL语句和参数返回一个T类型的List集合
public List<T> getForList(String sql, Object...args){
Connection conn = null;
try {
// 获取数据库连接
conn = JDBCUtils.getConnection();
// 执行查询并将结果封装为T类型的List集合
return qr.query(conn, sql, new BeanListHandler<>(clazz), args);
} catch (Exception e) {
e.printStackTrace();
}finally{
// 关闭数据库连接
JDBCUtils.closeConnection(conn);
}
return null;
}
/**
* InsertDeleteUpdate
* @param sql : SQL
* @param args
*/
// 执行Insert、Delete、Update操作
public void update(String sql, Object...args){
Connection conn = null;
try {
// 获取数据库连接
conn = JDBCUtils.getConnection();
// 执行SQL语句
qr.update(conn, sql, args);
} catch (Exception e) {
e.printStackTrace();
}finally{
// 关闭数据库连接
JDBCUtils.closeConnection(conn);
}
}
/**
* customerName
* @param sql
* @param args
* @return
*/
// 根据SQL语句和参数返回某个字段的值
public <E> E getForValue(String sql, Object...args){
Connection conn = null;
try {
// 获取数据库连接
conn = JDBCUtils.getConnection();
// 执行查询,并将结果封装为指定类型的值
return qr.query(conn, sql,new ScalarHandler<E>(),args);
} catch (Exception e) {
e.printStackTrace();
}finally{
// 关闭数据库连接
JDBCUtils.closeConnection(conn);
}
return null;
return null;
}
}
}

@ -4,31 +4,37 @@ import java.util.List;
import com.hua.entity.ExamArrange;
// 定义一个接口用于操作ExamArrange实体类的数据访问对象DAO
public interface ExamArrangeDAO {
// 获取所有ExamArrange记录
public List<ExamArrange> getAll();
// 根据学生ID获取对应的ExamArrange记录列表
public List<ExamArrange> getAllWithStudentId(String studentId);
// 插入一条新的ExamArrange记录
public void insert(ExamArrange examArrange);
// 更新一条ExamArrange记录
public void update(ExamArrange examArrange);
// 根据学生ID删除对应的ExamArrange记录
public void delete(String studentId);
/**
* studentId
* @param studentId
* @return
* @param studentId ID
* @return studentId
*/
public long getCountWithName(String studentId);
/**
* studentIdyearTerm
* @param studentId
* @param yearTerm
* @param week
* @return
* @param studentId ID
* @param yearTerm
* @return studentIdyearTerm
*/
public List<ExamArrange> getAllWithYearTerm(String studentId,
String yearTerm);
}
String yearTerm);
}

@ -4,15 +4,21 @@ import java.util.List;
import com.hua.entity.ExemptionApply;
// 定义一个接口用于操作ExemptionApply实体类的数据访问对象DAO
public interface ExemptionApplyDAO {
// 获取所有ExemptionApply记录
public List<ExemptionApply> getAll();
// 根据学生ID获取对应的ExemptionApply记录
public ExemptionApply get(String studentId);
// 插入一条新的ExemptionApply记录
public void insert(ExemptionApply exemptionApply);
// 更新一条ExemptionApply记录
public void update(ExemptionApply exemptionApply);
// 根据学生ID删除对应的ExemptionApply记录
public void delete(String studentId);
}
}

@ -4,22 +4,28 @@ import java.util.List;
import com.hua.entity.JwTeacher;
// 定义一个接口用于操作JwTeacher实体类的数据访问对象DAO
public interface JwTeacherDAO {
// 获取所有JwTeacher记录
public List<JwTeacher> getAll();
// 根据教师ID获取对应的JwTeacher记录
public JwTeacher get(String teacherId);
// 插入一条新的JwTeacher记录
public void insert(JwTeacher teacher);
// 更新一条JwTeacher记录
public void update(JwTeacher teacher);
// 根据教师ID删除对应的JwTeacher记录
public void delete(String teacherId);
/**
* teacherId
* @param teacherId
* @return
* @param teacherId ID
* @return teacherId
*/
public long getCountWithName(String teacherId);
}
}

@ -4,30 +4,38 @@ import java.util.List;
import com.hua.entity.LevelExam;
// 定义一个接口用于操作LevelExam实体类的数据访问对象DAO
public interface LevelExamDAO {
// 获取所有LevelExam记录
public List<LevelExam> getAll();
// 根据课程ID获取对应的LevelExam记录
public LevelExam get(String courseId);
// 根据课程ID和学年学期获取对应的LevelExam记录
public LevelExam get(String courseId, String yearTerm);
// 插入一条新的LevelExam记录
public void insert(LevelExam levelExam);
// 更新一条LevelExam记录
public void update(LevelExam levelExam);
// 根据课程ID删除对应的LevelExam记录
public void delete(String courseId);
/**
* courseId
* @param courseId
* @return
* @param courseId ID
* @return courseId
*/
public long getCountWithName(String courseId);
/**
* yearTerm
* @param yearTerm
* @return
* @param yearTerm
* @return yearTerm
*/
public List<LevelExam> getAllWithYearTerm(String yearTerm);
}
}

@ -4,26 +4,34 @@ import java.util.List;
import com.hua.entity.LevelExamList;
// 定义一个接口用于操作LevelExamList实体类的数据访问对象DAO
public interface LevelExamListDAO {
// 获取所有LevelExamList记录
public List<LevelExamList> getAll();
// 根据学生ID获取对应的LevelExamList记录列表
public List<LevelExamList> getAll(String studentId);
// 根据学生ID获取对应的LevelExamList记录
public LevelExamList get(String studentId);
// 根据LevelExamList对象获取对应的记录
public LevelExamList get(LevelExamList levelExamList);
// 插入一条新的LevelExamList记录
public void insert(LevelExamList levelExamList);
// 更新一条LevelExamList记录
public void update(LevelExamList levelExamList);
// 根据学生ID删除对应的LevelExamList记录
public void delete(String studentId);
/**
* studentId
* @param studentId
* @return
* @param studentId ID
* @return studentId
*/
public long getCountWithName(String studentId);
}
}

@ -4,22 +4,28 @@ import java.util.List;
import com.hua.entity.LevelExamination;
// 定义一个接口用于操作LevelExamination实体类的数据访问对象DAO
public interface LevelExaminationDAO {
public List<LevelExamination> getAllWithYearTerm(String studentId,String yearTerm);
// 根据学生ID和学年学期获取对应的LevelExamination记录列表
public List<LevelExamination> getAllWithYearTerm(String studentId, String yearTerm);
// 根据学生ID获取对应的LevelExamination记录列表
public List<LevelExamination> getAllLevelWithStudentId(String studentId);
public void insert(LevelExamination levalExamination);
public void update(LevelExamination levalExamination);
// 插入一条新的LevelExamination记录
public void insert(LevelExamination levalExamination);
// 更新一条LevelExamination记录
public void update(LevelExamination levalExamination);
// 根据学生ID删除对应的LevelExamination记录
public void delete(Long studentId);
/**
* studentId
* @param name
* @return
* @param studentId ID
* @return studentId
*/
public Integer getCountWithStudentId(Long studentId);
}
}

@ -4,30 +4,38 @@ import java.util.List;
import com.hua.entity.OptionalCourse;
// 定义一个接口用于操作OptionalCourse实体类的数据访问对象DAO
public interface OptionalCourseDAO {
// 获取所有OptionalCourse记录
public List<OptionalCourse> getAll();
// 根据课程ID获取对应的OptionalCourse记录
public OptionalCourse get(String courseId);
// 根据课程ID和学年学期获取对应的OptionalCourse记录
public OptionalCourse get(String courseId, String yearTerm);
// 插入一条新的OptionalCourse记录
public void insert(OptionalCourse optionalCourse);
// 更新一条OptionalCourse记录
public void update(OptionalCourse optionalCourse);
// 根据课程ID删除对应的OptionalCourse记录
public void delete(String courseId);
/**
* studentId
* @param courseId
* @return
* courseId
* @param courseId ID
* @return courseId
*/
public long getCountWithName(String courseId);
/**
* yearTerm
* @param yearTerm
* @return
* @param yearTerm
* @return yearTerm
*/
public List<OptionalCourse> getAllWithYearTerm(String yearTerm);
}
}

@ -4,15 +4,21 @@ import java.util.List;
import com.hua.entity.PostponeExamApply;
// 定义一个接口用于操作PostponeExamApply实体类的数据访问对象DAO
public interface PostponeExamApplyDAO {
// 获取所有PostponeExamApply记录
public List<PostponeExamApply> getAll();
// 根据学生ID获取对应的PostponeExamApply记录
public PostponeExamApply get(String studentId);
// 插入一条新的PostponeExamApply记录
public void insert(PostponeExamApply postponeExamApply);
// 更新一条PostponeExamApply记录
public void update(PostponeExamApply postponeExamApply);
// 根据学生ID删除对应的PostponeExamApply记录
public void delete(String studentId);
}
}

@ -5,24 +5,32 @@ import java.util.List;
import com.hua.entity.CriterStudent;
import com.hua.entity.StudentBasicInformation;
// 定义一个接口用于操作学生基本信息的DAO层
public interface StudentBasicInforDAO {
// 获取所有学生基本信息列表
public List<StudentBasicInformation> getAll();
// 根据学生ID获取单个学生的基本信息
public StudentBasicInformation get(Long studentId);
// 插入一条新的学生基本信息记录
public void insert(StudentBasicInformation studentBasicInfor);
// 更新一条学生基本信息记录
public void update(StudentBasicInformation studentBasicInfor);
// 根据学生ID删除一条学生基本信息记录
public void delete(Long studentId);
/**
* studentId
* @param name
* @return
*/
// 根据学生ID查询数据库中匹配的记录数
public Integer getCountWithStudentId(Long studentId);
// 根据CriterStudent对象的条件查询学生基本信息列表
public List<StudentBasicInformation> getForListWithCriterStudent(CriterStudent student);
}
}

@ -4,24 +4,32 @@ import java.util.List;
import com.hua.entity.StudentGrade;
// 定义一个接口用于操作学生成绩的DAO层
public interface StudentGradeDAO {
// 获取所有学生的成绩信息列表
public List<StudentGrade> getAll();
// 根据学生ID获取该学生的所有课程成绩信息列表
public List<StudentGrade> getAllCourseGrade(Long studentId);
// 插入一条新的学生成绩记录
public void insert(StudentGrade studentGrade);
// 更新一条学生成绩记录
public void update(StudentGrade studentGrade);
// 根据学生ID删除该学生的所有成绩记录
public void delete(Long studentId);
/**
* studentId
* @param name
* @return
*/
// 根据学生ID查询数据库中匹配的记录数
public Integer getCountWithStudentId(Long studentId);
public List<StudentGrade> getAllWithYearTerm(Long studentId,
String yearTerm);
}
// 根据学生ID和学年学期yearTerm获取该学生的成绩信息列表
public List<StudentGrade> getAllWithYearTerm(Long studentId, String yearTerm);
}

@ -3,26 +3,36 @@ package com.hua.dao;
import java.util.List;
import com.hua.entity.StudentOptCourse;
// 定义一个接口用于操作学生选课信息的DAO层
public interface StudentOptCourseDAO {
// 获取所有学生选课信息列表
public List<StudentOptCourse> getAll();
// 根据学生ID获取单个学生的选课信息
public StudentOptCourse get(String studentId);
// 根据学生ID获取该学生的所有选课信息列表
public List<StudentOptCourse> getAll(String studentId);
// 根据StudentOptCourse对象获取单个学生的选课信息
public StudentOptCourse get(StudentOptCourse studentOptCourse);
// 插入一条新的学生选课记录
public void insert(StudentOptCourse studentOptCourse);
// 更新一条学生选课记录
public void update(StudentOptCourse studentOptCourse);
// 根据学生ID删除该学生的所有选课记录
public void delete(String studentId);
/**
* studentId
* @param studentId
* @return
*/
// 根据学生ID查询数据库中匹配的记录数
public long getCountWithName(String studentId);
}
}

@ -4,22 +4,30 @@ import java.util.List;
import com.hua.entity.Teacher;
// 定义一个接口用于操作教师信息的DAO层
public interface TeacherDAO {
// 获取所有教师信息列表
public List<Teacher> getAll();
// 根据教师ID获取单个教师的信息
public Teacher get(String teacherId);
// 插入一条新的教师信息记录
public void insert(Teacher teacher);
// 更新一条教师信息记录
public void update(Teacher teacher);
// 根据教师ID删除一条教师信息记录
public void delete(String teacherId);
/**
* teacherId
* @param teacherId
* @return
*/
// 根据教师ID查询数据库中匹配的记录数
public long getCountWithName(String teacherId);
}
}

@ -5,24 +5,32 @@ import java.util.List;
import com.hua.entity.CriterUser;
import com.hua.entity.User;
// 定义一个接口用于操作用户信息的DAO层
public interface UserDAO {
// 获取所有用户信息列表
public List<User> getAll();
// 根据用户名获取单个用户的信息
public User get(String username);
// 插入一条新的用户信息记录
public void insert(User user);
// 更新一条用户信息记录
public void update(User user);
// 根据用户名删除一条用户信息记录
public void delete(String username);
/**
* name
* @param name
* @return
*/
// 根据用户名查询数据库中匹配的记录数
public long getCountWithName(String username);
// 根据CriterUser对象的条件查询用户信息列表
public List<User> getForListWithCriterCustomer(CriterUser user);
}
}

@ -1,26 +1,37 @@
package com.hua.entity;
// 定义一个名为 CourseSchedule 的类,用于表示课程表信息
public class CourseSchedule {
private String studentId; //学号
private String week; //第几周
private String weekday; //星期几
private String joint; //第几节
private String course; //课程
private String teacher; //上课老师
private String classplace; //上课地点
// 学号,表示学生的唯一标识
private String studentId;
// 第几周,表示课程所在的周数
private String week;
// 星期几,表示课程所在的星期
private String weekday;
// 第几节,表示课程所在的节次
private String joint;
// 课程名称,表示课程的具体名称
private String course;
// 上课老师,表示教授该课程的教师
private String teacher;
// 上课地点,表示课程的上课地点
private String classplace;
// 无参构造函数,用于创建一个空的 CourseSchedule 对象
public CourseSchedule() {
super();
}
// 带参构造函数,用于创建一个包含所有属性的 CourseSchedule 对象
public CourseSchedule(String studentId, String week, String weekday,
String joint, String course, String teacher, String classplace) {
String joint, String course, String teacher, String classplace) {
super();
this.studentId = studentId;
this.week = week;
@ -31,62 +42,77 @@ public class CourseSchedule {
this.classplace = classplace;
}
// 获取学号的方法
public String getStudentId() {
return studentId;
}
// 设置学号的方法
public void setStudentId(String studentId) {
this.studentId = studentId;
}
// 获取周数的方法
public String getWeek() {
return week;
}
// 设置周数的方法
public void setWeek(String week) {
this.week = week;
}
// 获取星期几的方法
public String getWeekday() {
return weekday;
}
// 设置星期几的方法
public void setWeekday(String weekday) {
this.weekday = weekday;
}
// 获取节次的方法
public String getJoint() {
return joint;
}
// 设置节次的方法
public void setJoint(String joint) {
this.joint = joint;
}
// 获取课程名称的方法
public String getCourse() {
return course;
}
// 设置课程名称的方法
public void setCourse(String course) {
this.course = course;
}
// 获取上课老师的方法
public String getTeacher() {
return teacher;
}
// 设置上课老师的方法
public void setTeacher(String teacher) {
this.teacher = teacher;
}
// 获取上课地点的方法
public String getClassplace() {
return classplace;
}
// 设置上课地点的方法
public void setClassplace(String classplace) {
this.classplace = classplace;
}
// 重写 toString 方法,用于将 CourseSchedule 对象转换为字符串
@Override
public String toString() {
return "CourseSchedule [studentId=" + studentId + ", week=" + week
@ -95,6 +121,7 @@ public class CourseSchedule {
+ classplace + "]";
}
// 重写 hashCode 方法,用于计算 CourseSchedule 对象的哈希码
@Override
public int hashCode() {
final int prime = 31;
@ -111,6 +138,7 @@ public class CourseSchedule {
return result;
}
// 重写 equals 方法,用于比较两个 CourseSchedule 对象是否相等
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -157,6 +185,5 @@ public class CourseSchedule {
return false;
return true;
}
}
}

@ -1,32 +1,42 @@
package com.hua.entity;
// 定义一个名为 CourseScheduleShow 的类,用于展示一周的课程表
public class CourseScheduleShow {
private String joint; //第几节
private CourseSchedule monday;
private CourseSchedule tuesday;
private CourseSchedule wesneday;
private CourseSchedule thursday;
private CourseSchedule friday;
private CourseSchedule saturday;
// 第几节,表示课程所在的节次
private String joint;
// 星期一的课程安排
private CourseSchedule monday;
// 星期二的课程安排
private CourseSchedule tuesday;
// 星期三的课程安排(注意:拼写错误,应为 "wednesday"
private CourseSchedule wesneday;
// 星期四的课程安排
private CourseSchedule thursday;
// 星期五的课程安排
private CourseSchedule friday;
// 星期六的课程安排
private CourseSchedule saturday;
// 星期日的课程安排
private CourseSchedule sunday;
// 无参构造函数,用于创建一个空的 CourseScheduleShow 对象
public CourseScheduleShow() {
super();
}
// 带参构造函数,用于创建一个包含所有属性的 CourseScheduleShow 对象
public CourseScheduleShow(String joint, CourseSchedule monday,
CourseSchedule tuesday, CourseSchedule wesneday,
CourseSchedule thursday, CourseSchedule friday,
CourseSchedule saturday, CourseSchedule sunday) {
CourseSchedule tuesday, CourseSchedule wesneday,
CourseSchedule thursday, CourseSchedule friday,
CourseSchedule saturday, CourseSchedule sunday) {
super();
this.joint = joint;
this.monday = monday;
@ -38,72 +48,87 @@ public class CourseScheduleShow {
this.sunday = sunday;
}
// 获取节次的方法
public String getJoint() {
return joint;
}
// 设置节次的方法
public void setJoint(String joint) {
this.joint = joint;
}
// 获取星期一课程安排的方法
public CourseSchedule getMonday() {
return monday;
}
// 设置星期一课程安排的方法
public void setMonday(CourseSchedule monday) {
this.monday = monday;
}
// 获取星期二课程安排的方法
public CourseSchedule getTuesday() {
return tuesday;
}
// 设置星期二课程安排的方法
public void setTuesday(CourseSchedule tuesday) {
this.tuesday = tuesday;
}
// 获取星期三课程安排的方法(注意:拼写错误,应为 "getWednesday"
public CourseSchedule getWesneday() {
return wesneday;
}
// 设置星期三课程安排的方法(注意:拼写错误,应为 "setWednesday"
public void setWesneday(CourseSchedule wesneday) {
this.wesneday = wesneday;
}
// 获取星期四课程安排的方法
public CourseSchedule getThursday() {
return thursday;
}
// 设置星期四课程安排的方法
public void setThursday(CourseSchedule thursday) {
this.thursday = thursday;
}
// 获取星期五课程安排的方法
public CourseSchedule getFriday() {
return friday;
}
// 设置星期五课程安排的方法
public void setFriday(CourseSchedule friday) {
this.friday = friday;
}
// 获取星期六课程安排的方法
public CourseSchedule getSaturday() {
return saturday;
}
// 设置星期六课程安排的方法
public void setSaturday(CourseSchedule saturday) {
this.saturday = saturday;
}
// 获取星期日课程安排的方法
public CourseSchedule getSunday() {
return sunday;
}
// 设置星期日课程安排的方法
public void setSunday(CourseSchedule sunday) {
this.sunday = sunday;
}
// 重写 hashCode 方法,用于计算 CourseScheduleShow 对象的哈希码
@Override
public int hashCode() {
final int prime = 31;
@ -122,6 +147,7 @@ public class CourseScheduleShow {
return result;
}
// 重写 equals 方法,用于比较两个 CourseScheduleShow 对象是否相等
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -174,6 +200,7 @@ public class CourseScheduleShow {
return true;
}
// 重写 toString 方法,用于将 CourseScheduleShow 对象转换为字符串
@Override
public String toString() {
return "CourseScheduleShow [joint=" + joint + ", Monday=" + monday
@ -181,7 +208,4 @@ public class CourseScheduleShow {
+ ", Thursday=" + thursday + ", Friday=" + friday
+ ", Saturday=" + saturday + ", Sunday=" + sunday + "]";
}
}
}

@ -1,17 +1,24 @@
package com.hua.entity;
// 定义一个名为 CriterStudent 的类,用于表示学生查询条件
public class CriterStudent {
// 学院名称,用于查询时匹配学院
private String academy;
// 专业名称,用于查询时匹配专业
private String profession;
// 班级名称,用于查询时匹配班级
private String className;
// 学生姓名,用于查询时匹配学生姓名
private String studentName;
// 学生学号,用于查询时匹配学生学号
private String studentId;
// 获取学院名称的方法,如果为空则返回通配符 "%%",否则返回 "%" + academy + "%"
public String getAcademy() {
if(academy == null)
academy = "%%";
@ -20,70 +27,79 @@ public class CriterStudent {
return academy;
}
// 设置学院名称的方法
public void setAcademy(String academy) {
this.academy = academy;
}
// 获取学生姓名的方法,如果为空则返回通配符 "%%",否则返回 "%" + studentName + "%"
public String getStudentName() {
if(studentName == null)
studentName = "%%";
else
studentName = "%" + studentName + "%";
return studentName;
}
// 设置学生姓名的方法
public void setStudentName(String studentName) {
this.studentName = studentName;
}
// 获取专业名称的方法,如果为空则返回通配符 "%%",否则返回 "%" + profession + "%"
public String getProfession() {
if(profession == null)
profession = "%%";
else
profession = "%" + profession + "%";
return profession;
}
// 设置专业名称的方法
public void setProfession(String profession) {
this.profession = profession;
}
// 获取班级名称的方法,如果为空则返回通配符 "%%",否则返回 "%" + className + "%"
public String getClassName() {
if(className == null)
className = "%%";
else
className = "%" + className + "%";
return className;
}
// 设置班级名称的方法
public void setClassName(String className) {
this.className = className;
}
// 获取学生学号的方法,如果为空则返回通配符 "%%",否则返回 "%" + studentId + "%"
public String getStudentId() {
if(studentId == null)
studentId = "%%";
else
studentId = "%" + studentId + "%";
return studentId;
}
// 设置学生学号的方法
public void setStudentId(String studentId) {
this.studentId = studentId;
}
// 无参构造函数,用于创建一个空的 CriterStudent 对象
public CriterStudent() {
super();
}
// 带参构造函数,用于创建一个包含所有属性的 CriterStudent 对象
public CriterStudent(String academy, String profession, String className,
String studentName, String studentId) {
String studentName, String studentId) {
super();
this.academy = academy;
this.profession = profession;
@ -91,5 +107,5 @@ public class CriterStudent {
this.studentName = studentName;
this.studentId = studentId;
}
}
}

@ -1,13 +1,18 @@
package com.hua.entity;
// 定义一个名为 CriterUser 的类,用于表示用户查询条件
public class CriterUser {
// 用户姓名,用于查询时匹配用户姓名
private String name;
// 用户名,用于查询时匹配用户名
private String username;
// 用户身份,用于查询时匹配用户身份
private String identity;
// 获取用户姓名的方法,如果为空则返回通配符 "%%",否则返回 "%" + name + "%"
public String getName() {
if(name == null)
name = "%%";
@ -16,36 +21,42 @@ public class CriterUser {
return name;
}
// 设置用户姓名的方法
public void setName(String name) {
this.name = name;
}
// 获取用户名的方法,如果为空则返回通配符 "%%",否则返回 "%" + username + "%"
public String getUsername() {
if(username == null)
username = "%%";
else
username = "%" + username + "%";
return username;
}
// 设置用户名的方法
public void setUsername(String username) {
this.username = username;
}
// 获取用户身份的方法,如果为空则返回通配符 "%%",否则返回 "%" + identity + "%"
public String getIdentity() {
if(identity == null)
identity = "%%";
else
identity = "%" + identity + "%";
return identity;
}
// 设置用户身份的方法(注意:方法名应为 setIdentity而不是 setPhone
public void setPhone(String phone) {
this.identity = phone;
}
// 带参构造函数,用于创建一个包含所有属性的 CriterUser 对象
public CriterUser(String username, String name, String identity) {
super();
this.name = name;
@ -53,8 +64,9 @@ public class CriterUser {
this.identity = identity;
}
// 无参构造函数,用于创建一个空的 CriterUser 对象
public CriterUser() {
super();
}
}
}

@ -1,37 +1,51 @@
package com.hua.entity;
// 定义一个名为 ExamArrange 的类,用于表示考试安排信息
public class ExamArrange {
private String yearTerm; //学年学期
private String studentId; //学号
private String studentName; //学生姓名
private String examCourse; //考试课程
private String examWay; //考试形式
private String examDate; //考级日期
private String examTime; //考级时间
private String examWeek; //考试周次
private String examCampus; //考试校区
private String examplace; //考试地点
private String examSeatNum; //考试座位号
// 学年学期,表示考试所在的学年和学期
private String yearTerm;
// 学号,表示学生的唯一标识
private String studentId;
// 学生姓名,表示学生的姓名
private String studentName;
// 考试课程,表示考试的具体课程
private String examCourse;
// 考试形式,表示考试的形式(如笔试、机试等)
private String examWay;
// 考试日期,表示考试的具体日期
private String examDate;
// 考试时间,表示考试的具体时间
private String examTime;
// 考试周次,表示考试所在的周次
private String examWeek;
// 考试校区,表示考试所在的校区
private String examCampus;
// 考试地点,表示考试的具体地点
private String examplace;
// 考试座位号,表示学生的考试座位号
private String examSeatNum;
// 无参构造函数,用于创建一个空的 ExamArrange 对象
public ExamArrange() {
super();
}
// 带参构造函数,用于创建一个包含所有属性的 ExamArrange 对象
public ExamArrange(String yearTerm, String studentId, String studentName,
String examCourse, String examWay, String examDate,
String examTime, String examWeek, String examCampus,
String examplace, String examSeatNum) {
String examCourse, String examWay, String examDate,
String examTime, String examWeek, String examCampus,
String examplace, String examSeatNum) {
super();
this.yearTerm = yearTerm;
this.studentId = studentId;
@ -46,94 +60,117 @@ public class ExamArrange {
this.examSeatNum = examSeatNum;
}
// 获取学年学期的方法
public String getYearTerm() {
return yearTerm;
}
// 设置学年学期的方法
public void setYearTerm(String yearTerm) {
this.yearTerm = yearTerm;
}
// 获取学号的方法
public String getStudentId() {
return studentId;
}
// 设置学号的方法
public void setStudentId(String studentId) {
this.studentId = studentId;
}
// 获取学生姓名的方法
public String getStudentName() {
return studentName;
}
// 设置学生姓名的方法
public void setStudentName(String studentName) {
this.studentName = studentName;
}
// 获取考试课程的方法
public String getExamCourse() {
return examCourse;
}
// 设置考试课程的方法
public void setExamCourse(String examCourse) {
this.examCourse = examCourse;
}
// 获取考试形式的方法
public String getExamWay() {
return examWay;
}
// 设置考试形式的方法
public void setExamWay(String examWay) {
this.examWay = examWay;
}
// 获取考试日期的方法
public String getExamDate() {
return examDate;
}
// 设置考试日期的方法
public void setExamDate(String examDate) {
this.examDate = examDate;
}
// 获取考试时间的方法
public String getExamTime() {
return examTime;
}
// 设置考试时间的方法
public void setExamTime(String examTime) {
this.examTime = examTime;
}
// 获取考试周次的方法
public String getExamWeek() {
return examWeek;
}
// 设置考试周次的方法
public void setExamWeek(String examWeek) {
this.examWeek = examWeek;
}
// 获取考试校区的方法
public String getExamCampus() {
return examCampus;
}
// 设置考试校区的方法
public void setExamCampus(String examCampus) {
this.examCampus = examCampus;
}
// 获取考试地点的方法
public String getExamplace() {
return examplace;
}
// 设置考试地点的方法
public void setExamplace(String examplace) {
this.examplace = examplace;
}
// 获取考试座位号的方法
public String getExamSeatNum() {
return examSeatNum;
}
// 设置考试座位号的方法
public void setExamSeatNum(String examSeatNum) {
this.examSeatNum = examSeatNum;
}
// 重写 toString 方法,用于将 ExamArrange 对象转换为字符串
@Override
public String toString() {
return "ExamArrange [yearTerm=" + yearTerm + ", studentId=" + studentId
@ -144,6 +181,7 @@ public class ExamArrange {
+ ", examSeatNum=" + examSeatNum + "]";
}
// 重写 hashCode 方法,用于计算 ExamArrange 对象的哈希码
@Override
public int hashCode() {
final int prime = 31;
@ -172,6 +210,7 @@ public class ExamArrange {
return result;
}
// 重写 equals 方法,用于比较两个 ExamArrange 对象是否相等
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -238,7 +277,4 @@ public class ExamArrange {
return false;
return true;
}
}
}

@ -1,21 +1,28 @@
package com.hua.entity;
//缓考申请信息
// 定义一个名为 ExemptionApply 的类,用于表示缓考申请信息
public class ExemptionApply {
private String yearTerm; //学年学期
private String studentId; //学号
private String courseName; //免修课程
private String applyReason; //免修原因
// 学年学期,表示申请缓考的学年和学期
private String yearTerm;
// 学号,表示申请缓考的学生的唯一标识
private String studentId;
// 免修课程,表示申请缓考的具体课程名称
private String courseName;
// 免修原因,表示申请缓考的原因
private String applyReason;
// 无参构造函数,用于创建一个空的 ExemptionApply 对象
public ExemptionApply() {
super();
}
// 带参构造函数,用于创建一个包含所有属性的 ExemptionApply 对象
public ExemptionApply(String yearTerm, String studentId, String courseName,
String applyReason) {
String applyReason) {
super();
this.yearTerm = yearTerm;
this.studentId = studentId;
@ -23,45 +30,55 @@ public class ExemptionApply {
this.applyReason = applyReason;
}
// 获取学年学期的方法
public String getYearTerm() {
return yearTerm;
}
// 设置学年学期的方法
public void setYearTerm(String yearTerm) {
this.yearTerm = yearTerm;
}
// 获取学号的方法
public String getStudentId() {
return studentId;
}
// 设置学号的方法
public void setStudentId(String studentId) {
this.studentId = studentId;
}
// 获取免修课程名称的方法
public String getCourseName() {
return courseName;
}
// 设置免修课程名称的方法
public void setCourseName(String courseName) {
this.courseName = courseName;
}
// 获取免修原因的方法
public String getApplyReason() {
return applyReason;
}
// 设置免修原因的方法
public void setApplyReason(String applyReason) {
this.applyReason = applyReason;
}
// 重写 toString 方法,用于将 ExemptionApply 对象转换为字符串
@Override
public String toString() {
return "PostponeExamApply [yearTerm=" + yearTerm +", studentId="
+ studentId + ", courseName="+ courseName + ", applyReason="
+ studentId + ", courseName="+ courseName + ", applyReason="
+ applyReason + "]";
}
// 重写 hashCode 方法,用于计算 ExemptionApply 对象的哈希码
@Override
public int hashCode() {
final int prime = 31;
@ -77,6 +94,7 @@ public class ExemptionApply {
return result;
}
// 重写 equals 方法,用于比较两个 ExemptionApply 对象是否相等
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -108,6 +126,4 @@ public class ExemptionApply {
return false;
return true;
}
}
}

@ -1,26 +1,35 @@
package com.hua.entity;
public class GradeAnalysisResult{
private Long studentId; //课程编号
// 定义一个名为 GradeAnalysisResult 的类,用于表示成绩分析结果
public class GradeAnalysisResult {
private Integer courseCount; //课程门数
// 学生编号,表示学生的唯一标识
private Long studentId;
private Integer score; //总分
// 课程门数,表示学生所修课程的总数
private Integer courseCount;
private String gradePoint; //绩点
private String averCreditGrade; //平均学分成绩
// 总分,表示学生所有课程的总分
private Integer score;
private String averScore; //平均分
// 绩点,表示学生的平均绩点
private String gradePoint;
// 平均学分成绩,表示学生的平均学分成绩
private String averCreditGrade;
// 平均分,表示学生的平均分数
private String averScore;
// 无参构造函数,用于创建一个空的 GradeAnalysisResult 对象
public GradeAnalysisResult() {
super();
}
// 带参构造函数,用于创建一个包含所有属性的 GradeAnalysisResult 对象
public GradeAnalysisResult(Long studentId, Integer courseCount,
Integer score, String gradePoint, String averCreditGrade,
String averScore) {
Integer score, String gradePoint, String averCreditGrade,
String averScore) {
super();
this.studentId = studentId;
this.courseCount = courseCount;
@ -30,54 +39,67 @@ public class GradeAnalysisResult{
this.averScore = averScore;
}
// 获取学生编号的方法
public Long getStudentId() {
return studentId;
}
// 设置学生编号的方法
public void setStudentId(Long studentId) {
this.studentId = studentId;
}
// 获取课程门数的方法
public Integer getCourseCount() {
return courseCount;
}
// 设置课程门数的方法
public void setCourseCount(Integer courseCount) {
this.courseCount = courseCount;
}
// 获取总分的方法
public Integer getScore() {
return score;
}
// 设置总分的方法
public void setScore(Integer score) {
this.score = score;
}
// 获取绩点的方法
public String getGradePoint() {
return gradePoint;
}
// 设置绩点的方法
public void setGradePoint(String gradePoint) {
this.gradePoint = gradePoint;
}
// 获取平均学分成绩的方法
public String getAverCreditGrade() {
return averCreditGrade;
}
// 设置平均学分成绩的方法
public void setAverCreditGrade(String averCreditGrade) {
this.averCreditGrade = averCreditGrade;
}
// 获取平均分的方法
public String getAverScore() {
return averScore;
}
// 设置平均分的方法
public void setAverScore(String averScore) {
this.averScore = averScore;
}
// 重写 hashCode 方法,用于计算 GradeAnalysisResult 对象的哈希码
@Override
public int hashCode() {
final int prime = 31;
@ -96,6 +118,7 @@ public class GradeAnalysisResult{
return result;
}
// 重写 equals 方法,用于比较两个 GradeAnalysisResult 对象是否相等
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -138,6 +161,7 @@ public class GradeAnalysisResult{
return true;
}
// 重写 toString 方法,用于将 GradeAnalysisResult 对象转换为字符串
@Override
public String toString() {
return "GradeAnalysisResult [studentId=" + studentId + ", courseCount="
@ -145,6 +169,4 @@ public class GradeAnalysisResult{
+ gradePoint + ", averCreditGrade=" + averCreditGrade
+ ", averScore=" + averScore + "]";
}
}
}

@ -1,37 +1,51 @@
package com.hua.entity;
// 定义一个名为 JwTeacher 的类,用于表示教师信息
public class JwTeacher {
private String teacherId; //教师编号
private String teacherName; //教师姓名
private String gender; //性别
private String politicstatus; //政治面貌
private String nation; //民族
private String academy; //学院
private String nativeplace; //籍贯
private String qq; //联系电话
private String phone; //联系电话
private String address; //家庭地址
private String email; //邮件地址
// 教师编号,表示教师的唯一标识
private String teacherId;
// 教师姓名,表示教师的姓名
private String teacherName;
// 性别,表示教师的性别
private String gender;
// 政治面貌,表示教师的政治面貌
private String politicstatus;
// 民族,表示教师的民族
private String nation;
// 学院,表示教师所属的学院
private String academy;
// 籍贯,表示教师的籍贯
private String nativeplace;
// QQ号码表示教师的QQ联系方式
private String qq;
// 联系电话,表示教师的联系电话
private String phone;
// 家庭地址,表示教师的家庭地址
private String address;
// 邮件地址,表示教师的电子邮件地址
private String email;
// 无参构造函数,用于创建一个空的 JwTeacher 对象
public JwTeacher() {
super();
}
// 带参构造函数,用于创建一个包含所有属性的 JwTeacher 对象
public JwTeacher(String teacherId, String teacherName, String gender,
String politicstatus, String nation, String academy,
String nativeplace, String qq, String phone,
String address, String email) {
String politicstatus, String nation, String academy,
String nativeplace, String qq, String phone,
String address, String email) {
super();
this.teacherId = teacherId;
this.teacherName = teacherName;
@ -46,94 +60,117 @@ public class JwTeacher {
this.email = email;
}
// 获取教师编号的方法
public String getTeacherId() {
return teacherId;
}
// 设置教师编号的方法
public void setTeacherId(String teacherId) {
this.teacherId = teacherId;
}
// 获取教师姓名的方法
public String getTeacherName() {
return teacherName;
}
// 设置教师姓名的方法
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
// 获取性别的方法
public String getGender() {
return gender;
}
// 设置性别的方法
public void setGender(String gender) {
this.gender = gender;
}
// 获取政治面貌的方法
public String getPoliticstatus() {
return politicstatus;
}
// 设置政治面貌的方法
public void setPoliticstatus(String politicstatus) {
this.politicstatus = politicstatus;
}
// 获取民族的方法
public String getNation() {
return nation;
}
// 设置民族的方法
public void setNation(String nation) {
this.nation = nation;
}
// 获取学院的方法
public String getAcademy() {
return academy;
}
// 设置学院的方法
public void setAcademy(String academy) {
this.academy = academy;
}
// 获取籍贯的方法
public String getNativeplace() {
return nativeplace;
}
// 获取QQ号码的方法
public String getQq() {
return qq;
}
// 设置QQ号码的方法
public void setQq(String qq) {
this.qq = qq;
}
// 设置籍贯的方法
public void setNativeplace(String nativeplace) {
this.nativeplace = nativeplace;
}
// 获取联系电话的方法
public String getPhone() {
return phone;
}
// 设置联系电话的方法
public void setPhone(String phone) {
this.phone = phone;
}
// 获取家庭地址的方法
public String getAddress() {
return address;
}
// 设置家庭地址的方法
public void setAddress(String address) {
this.address = address;
}
// 获取邮件地址的方法
public String getEmail() {
return email;
}
// 设置邮件地址的方法
public void setEmail(String email) {
this.email = email;
}
// 重写 toString 方法,用于将 JwTeacher 对象转换为字符串
@Override
public String toString() {
return "Teacher [teacherId=" + teacherId + ", teacherName="
@ -144,6 +181,7 @@ public class JwTeacher {
+ email + "]";
}
// 重写 hashCode 方法,用于计算 JwTeacher 对象的哈希码
@Override
public int hashCode() {
final int prime = 31;
@ -166,6 +204,7 @@ public class JwTeacher {
return result;
}
// 重写 equals 方法,用于比较两个 JwTeacher 对象是否相等
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -232,9 +271,4 @@ public class JwTeacher {
return false;
return true;
}
}
}

@ -1,26 +1,34 @@
package com.hua.entity;
// 定义一个名为 LevelExam 的类,用于表示考级信息
public class LevelExam {
private String yearTerm; //学年学期
private String courseId; //考级课程编号
private String courseName; //考级课程名称
private String applyTime; //报名时间
private String examTime; //考试时间
private String examCost; //考试花费
// 学年学期,表示考级所在的学年和学期
private String yearTerm;
// 考级课程编号,表示考级课程的唯一标识
private String courseId;
// 考级课程名称,表示考级课程的具体名称
private String courseName;
// 报名时间,表示考级的报名时间
private String applyTime;
// 考试时间,表示考级的具体考试时间
private String examTime;
// 考试花费,表示考级的费用
private String examCost;
// 无参构造函数,用于创建一个空的 LevelExam 对象
public LevelExam() {
super();
}
// 带参构造函数,用于创建一个包含所有属性的 LevelExam 对象
public LevelExam(String yearTerm, String courseId, String courseName,
String applyTime, String examTime, String examCost) {
String applyTime, String examTime, String examCost) {
super();
this.yearTerm = yearTerm;
this.courseId = courseId;
@ -30,67 +38,67 @@ public class LevelExam {
this.examCost = examCost;
}
// 获取学年学期的方法
public String getYearTerm() {
return yearTerm;
}
// 设置学年学期的方法
public void setYearTerm(String yearTerm) {
this.yearTerm = yearTerm;
}
// 获取考级课程编号的方法
public String getCourseId() {
return courseId;
}
// 设置考级课程编号的方法
public void setCourseId(String courseId) {
this.courseId = courseId;
}
// 获取考级课程名称的方法
public String getCourseName() {
return courseName;
}
// 设置考级课程名称的方法
public void setCourseName(String courseName) {
this.courseName = courseName;
}
// 获取报名时间的方法
public String getApplyTime() {
return applyTime;
}
// 设置报名时间的方法
public void setApplyTime(String applyTime) {
this.applyTime = applyTime;
}
// 获取考试时间的方法
public String getExamTime() {
return examTime;
}
// 设置考试时间的方法
public void setExamTime(String examTime) {
this.examTime = examTime;
}
// 获取考试花费的方法
public String getExamCost() {
return examCost;
}
// 设置考试花费的方法
public void setExamCost(String examCost) {
this.examCost = examCost;
}
// 重写 toString 方法,用于将 LevelExam 对象转换为字符串
@Override
public String toString() {
return "LevelExam [yearTerm=" + yearTerm + ", courseId=" + courseId
@ -98,7 +106,7 @@ public class LevelExam {
+ ", examTime=" + examTime + ", examCost=" + examCost + "]";
}
// 重写 hashCode 方法,用于计算 LevelExam 对象的哈希码
@Override
public int hashCode() {
final int prime = 31;
@ -118,7 +126,7 @@ public class LevelExam {
return result;
}
// 重写 equals 方法,用于比较两个 LevelExam 对象是否相等
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -160,6 +168,4 @@ public class LevelExam {
return false;
return true;
}
}
}

@ -1,46 +1,57 @@
package com.hua.entity;
/**
*
* @author hua
*
*/
public class LevelExamList {
private String studentId; //学号
private String courseId; //已报名的课程编号
// 学号,表示学生的唯一标识
private String studentId;
// 已报名的课程编号,表示学生已报名的课程的唯一标识
private String courseId;
// 带参构造函数,用于创建一个包含学号和课程编号的 LevelExamList 对象
public LevelExamList(String studentId, String courseId) {
super();
this.studentId = studentId;
this.courseId = courseId;
}
// 无参构造函数,用于创建一个空的 LevelExamList 对象
public LevelExamList() {
super();
}
// 获取学号的方法
public String getStudentId() {
return studentId;
}
// 设置学号的方法
public void setStudentId(String studentId) {
this.studentId = studentId;
}
// 获取课程编号的方法
public String getCourseId() {
return courseId;
}
// 设置课程编号的方法
public void setCourseId(String courseId) {
this.courseId = courseId;
}
// 重写 toString 方法,用于将 LevelExamList 对象转换为字符串
@Override
public String toString() {
return "StudentOptCourse [studentId=" + studentId + ", courseId="
+ courseId + "]";
}
// 重写 hashCode 方法,用于计算 LevelExamList 对象的哈希码
@Override
public int hashCode() {
final int prime = 31;
@ -52,6 +63,7 @@ public class LevelExamList {
return result;
}
// 重写 equals 方法,用于比较两个 LevelExamList 对象是否相等
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -73,6 +85,4 @@ public class LevelExamList {
return false;
return true;
}
}
}

@ -1,32 +1,43 @@
package com.hua.entity;
// 定义一个名为 LevelExamination 的类,用于表示考级成绩信息
public class LevelExamination {
private String yearTerm; //学年学期
private String studentId; //学号
private String levelEaxmCourse; //考级课程
private String eaxmTime; //考级时间
private String grade; //总成绩
private String examId; //准考证号
private String listenGrade; //听力成绩
private String readingGrade; //阅读成绩
private String writingGrade; //写作成绩
private String spokenGrade; //口语成绩
// 学年学期,表示考级所在的学年和学期
private String yearTerm;
// 学号,表示学生的唯一标识
private String studentId;
// 考级课程,表示考级的具体课程名称
private String levelEaxmCourse;
// 考级时间,表示考级的具体时间
private String eaxmTime;
// 总成绩,表示考级的总成绩
private String grade;
// 准考证号,表示考级的准考证号
private String examId;
// 听力成绩,表示考级的听力部分成绩
private String listenGrade;
// 阅读成绩,表示考级的阅读部分成绩
private String readingGrade;
// 写作成绩,表示考级的写作部分成绩
private String writingGrade;
// 口语成绩,表示考级的口语部分成绩
private String spokenGrade;
// 带参构造函数,用于创建一个包含所有属性的 LevelExamination 对象
public LevelExamination(String yearTerm, String studentId,
String levelEaxmCourse, String eaxmTime, String grade,
String examId, String listenGrade, String readingGrade,
String writingGrade, String spokenGrade) {
String levelEaxmCourse, String eaxmTime, String grade,
String examId, String listenGrade, String readingGrade,
String writingGrade, String spokenGrade) {
super();
this.yearTerm = yearTerm;
this.studentId = studentId;
@ -40,90 +51,112 @@ public class LevelExamination {
this.spokenGrade = spokenGrade;
}
// 无参构造函数,用于创建一个空的 LevelExamination 对象
public LevelExamination() {
super();
}
// 获取学年学期的方法
public String getYearTerm() {
return yearTerm;
}
// 设置学年学期的方法
public void setYearTerm(String yearTerm) {
this.yearTerm = yearTerm;
}
// 获取学号的方法
public String getStudentId() {
return studentId;
}
// 设置学号的方法
public void setStudentId(String studentId) {
this.studentId = studentId;
}
// 获取考级课程的方法
public String getLevelEaxmCourse() {
return levelEaxmCourse;
}
// 设置考级课程的方法
public void setLevelEaxmCourse(String levelEaxmCourse) {
this.levelEaxmCourse = levelEaxmCourse;
}
// 获取考级时间的方法
public String getEaxmTime() {
return eaxmTime;
}
// 设置考级时间的方法
public void setEaxmTime(String eaxmTime) {
this.eaxmTime = eaxmTime;
}
// 获取总成绩的方法
public String getGrade() {
return grade;
}
// 设置总成绩的方法
public void setGrade(String grade) {
this.grade = grade;
}
// 获取准考证号的方法
public String getExamId() {
return examId;
}
// 设置准考证号的方法
public void setExamId(String examId) {
this.examId = examId;
}
// 获取听力成绩的方法
public String getListenGrade() {
return listenGrade;
}
// 设置听力成绩的方法
public void setListenGrade(String listenGrade) {
this.listenGrade = listenGrade;
}
// 获取阅读成绩的方法
public String getReadingGrade() {
return readingGrade;
}
// 设置阅读成绩的方法
public void setReadingGrade(String readingGrade) {
this.readingGrade = readingGrade;
}
// 获取写作成绩的方法
public String getWritingGrade() {
return writingGrade;
}
// 设置写作成绩的方法
public void setWritingGrade(String writingGrade) {
this.writingGrade = writingGrade;
}
// 获取口语成绩的方法
public String getSpokenGrade() {
return spokenGrade;
}
// 设置口语成绩的方法
public void setSpokenGrade(String spokenGrade) {
this.spokenGrade = spokenGrade;
}
// 重写 toString 方法,用于将 LevelExamination 对象转换为字符串
@Override
public String toString() {
return "LevalExamination [yearTerm=" + yearTerm + ", studentId="
@ -134,6 +167,7 @@ public class LevelExamination {
+ ", spokenGrade=" + spokenGrade + "]";
}
// 重写 hashCode 方法,用于计算 LevelExamination 对象的哈希码
@Override
public int hashCode() {
final int prime = 31;
@ -159,6 +193,7 @@ public class LevelExamination {
return result;
}
// 重写 equals 方法,用于比较两个 LevelExamination 对象是否相等
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -220,6 +255,4 @@ public class LevelExamination {
return false;
return true;
}
}
}

@ -1,29 +1,41 @@
package com.hua.entity;
// 定义一个名为 OptionalCourse 的类,用于表示可选课程信息
public class OptionalCourse {
private String yearTerm; //学年学期
private String courseId; //课程编号
private String courseName; //课程名称
private String credit; //学分
private String courseType; //课程类型
private String teacher; //上课老师
private String classWay; //上课方式
private String classTime; //上课时间
// 学年学期,表示课程所在的学年和学期
private String yearTerm;
// 课程编号,表示课程的唯一标识
private String courseId;
// 课程名称,表示课程的具体名称
private String courseName;
// 学分,表示课程的学分
private String credit;
// 课程类型,表示课程的类型(如必修、选修等)
private String courseType;
// 上课老师,表示教授该课程的教师
private String teacher;
// 上课方式,表示课程的上课方式(如线上、线下等)
private String classWay;
// 上课时间,表示课程的具体上课时间
private String classTime;
// 无参构造函数,用于创建一个空的 OptionalCourse 对象
public OptionalCourse() {
super();
}
// 带参构造函数,用于创建一个包含所有属性的 OptionalCourse 对象
public OptionalCourse(String yearTerm, String courseId, String courseName,
String credit, String courseType, String teacher, String classWay,
String classTime) {
String credit, String courseType, String teacher, String classWay,
String classTime) {
super();
this.yearTerm = yearTerm;
this.courseId = courseId;
@ -35,70 +47,87 @@ public class OptionalCourse {
this.classTime = classTime;
}
// 获取学年学期的方法
public String getYearTerm() {
return yearTerm;
}
// 设置学年学期的方法
public void setYearTerm(String yearTerm) {
this.yearTerm = yearTerm;
}
// 获取课程编号的方法
public String getCourseId() {
return courseId;
}
// 设置课程编号的方法
public void setCourseId(String courseId) {
this.courseId = courseId;
}
// 获取课程名称的方法
public String getCourseName() {
return courseName;
}
// 设置课程名称的方法
public void setCourseName(String courseName) {
this.courseName = courseName;
}
// 获取学分的方法
public String getCredit() {
return credit;
}
// 设置学分的方法
public void setCredit(String credit) {
this.credit = credit;
}
// 获取课程类型的方法
public String getCourseType() {
return courseType;
}
// 设置课程类型的方法
public void setCourseType(String courseType) {
this.courseType = courseType;
}
// 获取上课老师的方法
public String getTeacher() {
return teacher;
}
// 设置上课老师的方法
public void setTeacher(String teacher) {
this.teacher = teacher;
}
// 获取上课方式的方法
public String getClassWay() {
return classWay;
}
// 设置上课方式的方法
public void setClassWay(String classWay) {
this.classWay = classWay;
}
// 获取上课时间的方法
public String getClassTime() {
return classTime;
}
// 设置上课时间的方法
public void setClassTime(String classTime) {
this.classTime = classTime;
}
// 重写 toString 方法,用于将 OptionalCourse 对象转换为字符串
@Override
public String toString() {
return "OptionalCourse [yearTerm=" + yearTerm + ", courseId="
@ -108,6 +137,7 @@ public class OptionalCourse {
+ classTime + "]";
}
// 重写 hashCode 方法,用于计算 OptionalCourse 对象的哈希码
@Override
public int hashCode() {
final int prime = 31;
@ -129,6 +159,7 @@ public class OptionalCourse {
return result;
}
// 重写 equals 方法,用于比较两个 OptionalCourse 对象是否相等
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -180,5 +211,4 @@ public class OptionalCourse {
return false;
return true;
}
}
}

@ -1,21 +1,28 @@
package com.hua.entity;
//缓考申请信息
// 定义一个名为 PostponeExamApply 的类,用于表示缓考申请信息
public class PostponeExamApply {
private String yearTerm; //学年学期
private String studentId; //学号
private String courseName; //申请课程
private String applyReason; //申请原因
// 学年学期,表示申请缓考的学年和学期
private String yearTerm;
// 学号,表示申请缓考的学生的唯一标识
private String studentId;
// 申请课程,表示申请缓考的具体课程名称
private String courseName;
// 申请原因,表示申请缓考的原因
private String applyReason;
// 无参构造函数,用于创建一个空的 PostponeExamApply 对象
public PostponeExamApply() {
super();
}
// 带参构造函数,用于创建一个包含所有属性的 PostponeExamApply 对象
public PostponeExamApply(String yearTerm, String studentId, String courseName,
String applyReason) {
String applyReason) {
super();
this.yearTerm = yearTerm;
this.studentId = studentId;
@ -23,45 +30,55 @@ public class PostponeExamApply {
this.applyReason = applyReason;
}
// 获取学年学期的方法
public String getYearTerm() {
return yearTerm;
}
// 设置学年学期的方法
public void setYearTerm(String yearTerm) {
this.yearTerm = yearTerm;
}
// 获取学号的方法
public String getStudentId() {
return studentId;
}
// 设置学号的方法
public void setStudentId(String studentId) {
this.studentId = studentId;
}
// 获取申请课程名称的方法
public String getCourseName() {
return courseName;
}
// 设置申请课程名称的方法
public void setCourseName(String courseName) {
this.courseName = courseName;
}
// 获取申请原因的方法
public String getApplyReason() {
return applyReason;
}
// 设置申请原因的方法
public void setApplyReason(String applyReason) {
this.applyReason = applyReason;
}
// 重写 toString 方法,用于将 PostponeExamApply 对象转换为字符串
@Override
public String toString() {
return "PostponeExamApply [yearTerm=" + yearTerm +", studentId="
+ studentId + ", courseName="+ courseName + ", applyReason="
+ studentId + ", courseName="+ courseName + ", applyReason="
+ applyReason + "]";
}
// 重写 hashCode 方法,用于计算 PostponeExamApply 对象的哈希码
@Override
public int hashCode() {
final int prime = 31;
@ -77,6 +94,7 @@ public class PostponeExamApply {
return result;
}
// 重写 equals 方法,用于比较两个 PostponeExamApply 对象是否相等
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -108,6 +126,4 @@ public class PostponeExamApply {
return false;
return true;
}
}
}

@ -1,14 +1,23 @@
package com.hua.entity;
// 定义一个名为 Student 的抽象类,用于表示学生信息
public abstract class Student {
// 学生编号,表示学生的唯一标识
public Long studentId;
// 学生姓名,表示学生的姓名
public String studentName;
// 抽象方法,用于设置学生编号
public abstract void setStudentId(Long studentId);
// 抽象方法,用于获取学生编号
public abstract Long getStudentId();
// 抽象方法,用于设置学生姓名
public abstract void setStudentName(String studentName);
// 抽象方法,用于获取学生姓名
public abstract String getStudentName();
}
}

@ -1,31 +1,41 @@
package com.hua.entity;
public class StudentBasicInformation extends Student{
// 定义一个名为 StudentBasicInformation 的类,该类继承自 Student 类
public class StudentBasicInformation extends Student {
// 定义一个私有字符串变量 gender用于存储学生的性别
private String gender;
private String gender; //性别
private String grade; //年级
private String className; //班别
// 定义一个私有字符串变量 grade用于存储学生的年级
private String grade;
private String academy; //学院
private String profession; //专业
// 定义一个私有字符串变量 className用于存储学生的班别
private String className;
private String campus; //所在校区
private String phone; //联系电话
private String homeAddress; //家庭地址
// 定义一个私有字符串变量 academy用于存储学生所在的学院
private String academy;
// 定义一个私有字符串变量 profession用于存储学生的专业
private String profession;
// 定义一个私有字符串变量 campus用于存储学生所在的校区
private String campus;
// 定义一个私有字符串变量 phone用于存储学生的联系电话
private String phone;
// 定义一个私有字符串变量 homeAddress用于存储学生的家庭地址
private String homeAddress;
// 无参构造函数,调用父类的无参构造函数
public StudentBasicInformation() {
super();
}
// 带参构造函数,初始化所有字段
public StudentBasicInformation(Long studentId, String studentName, String gender,
String grade, String className, String academy, String profession,
String campus, String phone, String homeAddress) {
String grade, String className, String academy, String profession,
String campus, String phone, String homeAddress) {
super();
this.studentId = studentId;
this.studentName = studentName;
@ -39,86 +49,107 @@ public class StudentBasicInformation extends Student{
this.homeAddress = homeAddress;
}
// 获取学生ID的方法
public Long getStudentId() {
return studentId;
}
// 设置学生ID的方法
public void setStudentId(Long studentId) {
this.studentId = studentId;
}
// 获取学生姓名的方法
public String getStudentName() {
return studentName;
}
// 设置学生姓名的方法
public void setStudentName(String studentName) {
this.studentName = studentName;
}
// 获取学生性别的方法
public String getGender() {
return gender;
}
// 设置学生性别的方法
public void setGender(String gender) {
this.gender = gender;
}
// 获取学生年级的方法
public String getGrade() {
return grade;
}
// 设置学生年级的方法
public void setGrade(String grade) {
this.grade = grade;
}
// 获取学生班别的方法
public String getClassName() {
return className;
}
// 设置学生班别的方法
public void setClassName(String className) {
this.className = className;
}
// 获取学生所在学院的方法
public String getAcademy() {
return academy;
}
// 设置学生所在学院的方法
public void setAcademy(String academy) {
this.academy = academy;
}
// 获取学生专业的方法
public String getProfession() {
return profession;
}
// 设置学生专业的方法
public void setProfession(String profession) {
this.profession = profession;
}
// 获取学生所在校区的方法
public String getCampus() {
return campus;
}
// 设置学生所在校区的方法
public void setCampus(String campus) {
this.campus = campus;
}
// 获取学生联系电话的方法
public String getPhone() {
return phone;
}
// 设置学生联系电话的方法
public void setPhone(String phone) {
this.phone = phone;
}
// 获取学生家庭地址的方法
public String getHomeAddress() {
return homeAddress;
}
// 设置学生家庭地址的方法
public void setHomeAddress(String homeAddress) {
this.homeAddress = homeAddress;
}
// 重写 toString 方法,返回学生信息的字符串表示
@Override
public String toString() {
return "Student [studentid=" + studentId + ", studentName="
@ -128,6 +159,7 @@ public class StudentBasicInformation extends Student{
+ ", phone=" + phone + ", homeHddress=" + homeAddress + "]";
}
// 重写 hashCode 方法,计算对象的哈希码
@Override
public int hashCode() {
final int prime = 31;
@ -149,6 +181,7 @@ public class StudentBasicInformation extends Student{
return result;
}
// 重写 equals 方法,判断两个对象是否相等
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -210,7 +243,4 @@ public class StudentBasicInformation extends Student{
return false;
return true;
}
}
}

@ -1,39 +1,54 @@
package com.hua.entity;
public class StudentGrade extends Student{
// 定义一个名为 StudentGrade 的类,该类继承自 Student 类
public class StudentGrade extends Student {
private String yearTerm; //学年学期
private String courseId; //课程编号
// 定义一个私有字符串变量 yearTerm用于存储学年学期
private String yearTerm;
private String courseName; //课程名称
// 定义一个私有字符串变量 courseId用于存储课程编号
private String courseId;
private Integer score; //分数
// 定义一个私有字符串变量 courseName用于存储课程名称
private String courseName;
private Double gradePoint; //绩点
private Double credit; //学分
// 定义一个私有整数变量 score用于存储分数
private Integer score;
private String courseClass; //课程大类
private String studyWay; //修读方式:选修、必修
private String examWay; //考试性质:正常考试、补考、重修
private String gradeWay; //成绩方式:百分制、五级制
private String effectivity; //成绩有效
private String remarks; //备注
// 定义一个私有双精度浮点数变量 gradePoint用于存储绩点
private Double gradePoint;
// 定义一个私有双精度浮点数变量 credit用于存储学分
private Double credit;
// 定义一个私有字符串变量 courseClass用于存储课程大类
private String courseClass;
// 定义一个私有字符串变量 studyWay用于存储修读方式如选修、必修
private String studyWay;
// 定义一个私有字符串变量 examWay用于存储考试性质如正常考试、补考、重修
private String examWay;
// 定义一个私有字符串变量 gradeWay用于存储成绩方式如百分制、五级制
private String gradeWay;
// 定义一个私有字符串变量 effectivity用于存储成绩有效性
private String effectivity;
// 定义一个私有字符串变量 remarks用于存储备注信息
private String remarks;
// 无参构造函数,调用父类的无参构造函数
public StudentGrade() {
super();
}
public StudentGrade(String yearTerm, Long studentId, String studentName,
String courseId, String courseName,Integer score, Double gradePoint,
Double credit, String courseClass, String studyWay, String examWay,
String gradeWay, String effectivity, String remarks) {
// 带参构造函数,初始化所有字段
public StudentGrade(String yearTerm, Long studentId, String studentName,
String courseId, String courseName, Integer score, Double gradePoint,
Double credit, String courseClass, String studyWay, String examWay,
String gradeWay, String effectivity, String remarks) {
super();
this.yearTerm = yearTerm;
this.studentId = studentId;
@ -51,124 +66,151 @@ public class StudentGrade extends Student{
this.remarks = remarks;
}
// 重写父类的 setStudentId 方法设置学生ID
@Override
public void setStudentId(Long studentId) {
this.studentId = studentId;
}
// 重写父类的 getStudentId 方法获取学生ID
@Override
public Long getStudentId() {
return this.studentId;
}
// 重写父类的 setStudentName 方法,设置学生姓名
@Override
public void setStudentName(String studentName) {
this.studentName = studentName;
}
// 重写父类的 getStudentName 方法,获取学生姓名
@Override
public String getStudentName() {
return this.studentName;
}
// 获取学年学期的方法
public String getYearTerm() {
return yearTerm;
}
// 设置学年学期的方法
public void setYearTerm(String yearTerm) {
this.yearTerm = yearTerm;
}
// 获取课程编号的方法
public String getCourseId() {
return courseId;
}
// 设置课程编号的方法
public void setCourseId(String courseId) {
this.courseId = courseId;
}
// 获取课程名称的方法
public String getCourseName() {
return courseName;
}
// 设置课程名称的方法
public void setCourseName(String courseName) {
this.courseName = courseName;
}
// 获取分数的方法
public Integer getScore() {
return score;
}
// 设置分数的方法
public void setScore(Integer score) {
this.score = score;
}
// 获取绩点的方法
public Double getGradePoint() {
return gradePoint;
}
// 设置绩点的方法
public void setGradePoint(Double gradePoint) {
this.gradePoint = gradePoint;
}
// 获取学分的方法
public Double getCredit() {
return credit;
}
// 设置学分的方法
public void setCredit(Double credit) {
this.credit = credit;
}
// 获取课程大类的方法
public String getCourseClass() {
return courseClass;
}
// 设置课程大类的方法
public void setCourseClass(String courseClass) {
this.courseClass = courseClass;
}
// 获取修读方式的方法
public String getStudyWay() {
return studyWay;
}
// 设置修读方式的方法
public void setStudyWay(String studyWay) {
this.studyWay = studyWay;
}
// 获取考试性质的方法
public String getExamWay() {
return examWay;
}
// 设置考试性质的方法
public void setExamWay(String examWay) {
this.examWay = examWay;
}
// 获取成绩方式的方法
public String getGradeWay() {
return gradeWay;
}
// 设置成绩方式的方法
public void setGradeWay(String gradeWay) {
this.gradeWay = gradeWay;
}
// 获取成绩有效性的方法
public String getEffectivity() {
return effectivity;
}
// 设置成绩有效性的方法
public void setEffectivity(String effectivity) {
this.effectivity = effectivity;
}
// 获取备注信息的方法
public String getRemarks() {
return remarks;
}
// 设置备注信息的方法
public void setRemarks(String remarks) {
this.remarks = remarks;
}
// 重写 toString 方法,返回学生成绩信息的字符串表示
@Override
public String toString() {
return "StudentGrade [yearTerm=" + yearTerm + ", courseId=" + courseId
@ -181,6 +223,7 @@ public class StudentGrade extends Student{
+ "]";
}
// 重写 hashCode 方法,计算对象的哈希码
@Override
public int hashCode() {
final int prime = 31;
@ -212,6 +255,7 @@ public class StudentGrade extends Student{
return result;
}
// 重写 equals 方法,判断两个对象是否相等
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -230,7 +274,7 @@ public class StudentGrade extends Student{
if (other.studentName != null)
return false;
} else if (!studentName.equals(other.studentName))
return false;
return false;
if (courseClass == null) {
if (other.courseClass != null)
return false;
@ -293,11 +337,4 @@ public class StudentGrade extends Student{
return false;
return true;
}
}
}

@ -1,46 +1,57 @@
package com.hua.entity;
/**
*
* @author hua
*
*/
public class StudentOptCourse {
private String studentId; //学号
private String courseId; //已报名的课程编号
// 定义一个私有字符串变量 studentId用于存储学生的学号
private String studentId;
// 定义一个私有字符串变量 courseId用于存储学生已报名的课程编号
private String courseId;
// 带参构造函数,初始化 studentId 和 courseId
public StudentOptCourse(String studentId, String courseId) {
super();
this.studentId = studentId;
this.courseId = courseId;
}
// 无参构造函数,调用父类的无参构造函数
public StudentOptCourse() {
super();
}
// 获取学生学号的方法
public String getStudentId() {
return studentId;
}
// 设置学生学号的方法
public void setStudentId(String studentId) {
this.studentId = studentId;
}
// 获取已报名课程编号的方法
public String getCourseId() {
return courseId;
}
// 设置已报名课程编号的方法
public void setCourseId(String courseId) {
this.courseId = courseId;
}
// 重写 toString 方法,返回学生选课报名信息的字符串表示
@Override
public String toString() {
return "StudentOptCourse [studentId=" + studentId + ", courseId="
+ courseId + "]";
}
// 重写 hashCode 方法,计算对象的哈希码
@Override
public int hashCode() {
final int prime = 31;
@ -52,6 +63,7 @@ public class StudentOptCourse {
return result;
}
// 重写 equals 方法,判断两个对象是否相等
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -73,6 +85,4 @@ public class StudentOptCourse {
return false;
return true;
}
}
}

@ -1,37 +1,51 @@
package com.hua.entity;
// 定义一个名为 Teacher 的类,用于表示教师信息
public class Teacher {
private String teacherId; //教师编号
private String teacherName; //教师姓名
private String gender; //性别
private String politicstatus; //政治面貌
private String nation; //民族
private String academy; //学院
private String profession; //专业
private String nativeplace; //籍贯
private String phone; //联系电话
private String address; //家庭地址
private String email; //邮件地址
// 定义一个私有字符串变量 teacherId用于存储教师的编号
private String teacherId;
// 定义一个私有字符串变量 teacherName用于存储教师的姓名
private String teacherName;
// 定义一个私有字符串变量 gender用于存储教师的性别
private String gender;
// 定义一个私有字符串变量 politicstatus用于存储教师的政治面貌
private String politicstatus;
// 定义一个私有字符串变量 nation用于存储教师的民族
private String nation;
// 定义一个私有字符串变量 academy用于存储教师所在的学院
private String academy;
// 定义一个私有字符串变量 profession用于存储教师的所属专业
private String profession;
// 定义一个私有字符串变量 nativeplace用于存储教师的籍贯
private String nativeplace;
// 定义一个私有字符串变量 phone用于存储教师的联系电话
private String phone;
// 定义一个私有字符串变量 address用于存储教师的家庭地址
private String address;
// 定义一个私有字符串变量 email用于存储教师的电子邮件地址
private String email;
// 无参构造函数,调用父类的无参构造函数
public Teacher() {
super();
}
// 带参构造函数,初始化所有字段
public Teacher(String teacherId, String teacherName, String gender,
String politicstatus, String nation, String academy,
String profession, String nativeplace, String phone,
String address, String email) {
String politicstatus, String nation, String academy,
String profession, String nativeplace, String phone,
String address, String email) {
super();
this.teacherId = teacherId;
this.teacherName = teacherName;
@ -46,94 +60,117 @@ public class Teacher {
this.email = email;
}
// 获取教师编号的方法
public String getTeacherId() {
return teacherId;
}
// 设置教师编号的方法
public void setTeacherId(String teacherId) {
this.teacherId = teacherId;
}
// 获取教师姓名的方法
public String getTeacherName() {
return teacherName;
}
// 设置教师姓名的方法
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
// 获取教师性别的方法
public String getGender() {
return gender;
}
// 设置教师性别的方法
public void setGender(String gender) {
this.gender = gender;
}
// 获取教师政治面貌的方法
public String getPoliticstatus() {
return politicstatus;
}
// 设置教师政治面貌的方法
public void setPoliticstatus(String politicstatus) {
this.politicstatus = politicstatus;
}
// 获取教师民族的方法
public String getNation() {
return nation;
}
// 设置教师民族的方法
public void setNation(String nation) {
this.nation = nation;
}
// 获取教师所在学院的方法
public String getAcademy() {
return academy;
}
// 设置教师所在学院的方法
public void setAcademy(String academy) {
this.academy = academy;
}
// 获取教师所属专业的方法
public String getProfession() {
return profession;
}
// 设置教师所属专业的方法
public void setProfession(String profession) {
this.profession = profession;
}
// 获取教师籍贯的方法
public String getNativeplace() {
return nativeplace;
}
// 设置教师籍贯的方法
public void setNativeplace(String nativeplace) {
this.nativeplace = nativeplace;
}
// 获取教师联系电话的方法
public String getPhone() {
return phone;
}
// 设置教师联系电话的方法
public void setPhone(String phone) {
this.phone = phone;
}
// 获取教师家庭地址的方法
public String getAddress() {
return address;
}
// 设置教师家庭地址的方法
public void setAddress(String address) {
this.address = address;
}
// 获取教师电子邮件地址的方法
public String getEmail() {
return email;
}
// 设置教师电子邮件地址的方法
public void setEmail(String email) {
this.email = email;
}
// 重写 toString 方法,返回教师信息的字符串表示
@Override
public String toString() {
return "Teacher [teacherId=" + teacherId + ", teacherName="
@ -144,6 +181,7 @@ public class Teacher {
+ email + "]";
}
// 重写 hashCode 方法,计算对象的哈希码
@Override
public int hashCode() {
final int prime = 31;
@ -167,6 +205,7 @@ public class Teacher {
return result;
}
// 重写 equals 方法,判断两个对象是否相等
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -233,5 +272,4 @@ public class Teacher {
return false;
return true;
}
}
}

@ -1,22 +1,37 @@
package com.hua.entity;
// 定义一个名为 User 的类,用于表示用户信息
public class User {
private String username; //用户名
private String password; //密码
private String name; //用户姓名
private String identity; //登录身份:学生、教师、教务员、管理员
private String findMMproof; //找回密码凭据
private String password_last_changed; //上一次修改密码的时间
private String login_last_time; //最近一次登录的时间
// 定义一个私有字符串变量 username用于存储用户名
private String username;
// 定义一个私有字符串变量 password用于存储密码
private String password;
// 定义一个私有字符串变量 name用于存储用户姓名
private String name;
// 定义一个私有字符串变量 identity用于存储登录身份如学生、教师、教务员、管理员
private String identity;
// 定义一个私有字符串变量 findMMproof用于存储找回密码的凭据
private String findMMproof;
// 定义一个私有字符串变量 password_last_changed用于存储上一次修改密码的时间
private String password_last_changed;
// 定义一个私有字符串变量 login_last_time用于存储最近一次登录的时间
private String login_last_time;
// 无参构造函数,调用父类的无参构造函数
public User() {
super();
}
// 带参构造函数,初始化所有字段
public User(String username, String password, String name, String identity,
String findMMproof, String password_last_changed, String login_last_time) {
String findMMproof, String password_last_changed, String login_last_time) {
super();
this.username = username;
this.password = password;
@ -27,64 +42,90 @@ public class User {
this.login_last_time = login_last_time;
}
// 获取用户名的方法
public String getUsername() {
return username;
}
// 设置用户名的方法
public void setUsername(String username) {
this.username = username;
}
// 获取密码的方法
public String getPassword() {
return password;
}
// 设置密码的方法
public void setPassword(String password) {
this.password = password;
}
// 获取用户姓名的方法
public String getName() {
return name;
}
// 设置用户姓名的方法
public void setName(String name) {
this.name = name;
}
// 获取上一次修改密码的时间的方法
public String getPassword_last_changed() {
return password_last_changed;
}
// 获取登录身份的方法
public String getIdentity() {
return identity;
}
// 设置登录身份的方法
public void setIdentity(String identity) {
this.identity = identity;
}
// 获取找回密码凭据的方法
public String getFindMMproof() {
return findMMproof;
}
// 设置找回密码凭据的方法
public void setFindMMproof(String findMMproof) {
this.findMMproof = findMMproof;
}
// 获取最近一次登录时间的方法
public String getLogin_last_time() {
return login_last_time;
}
// 设置最近一次登录时间的方法
public void setLogin_last_time(String login_last_time) {
this.login_last_time = login_last_time;
}
// 设置上一次修改密码时间的方法
public void setPassword_last_changed(String password_last_changed) {
this.password_last_changed = password_last_changed;
}
// 重写 toString 方法,返回用户信息的字符串表示
@Override
public String toString() {
return "User [username=" + username + ", password=" + password
@ -93,6 +134,7 @@ public class User {
+ ", login_last_time=" + login_last_time + "]";
}
// 重写 hashCode 方法,计算对象的哈希码
@Override
public int hashCode() {
final int prime = 31;
@ -108,14 +150,13 @@ public class User {
result = prime
* result
+ ((password_last_changed == null) ? 0 : password_last_changed
.hashCode());
.hashCode());
result = prime * result
+ ((username == null) ? 0 : username.hashCode());
return result;
}
// 重写 equals 方法,判断两个对象是否相等
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -162,6 +203,4 @@ public class User {
return false;
return true;
}
}
}

@ -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<StudentBasicInformation> students = getStudent(request, response);
Map<StudentBasicInformation,List<LevelExam>> map = getAllLevelExamMap(students, yearTerm);
// 根据学生信息列表和学年学期获取每个学生对应的考级考试信息并封装成Map
Map<StudentBasicInformation, List<LevelExam>> map = getAllLevelExamMap(students, yearTerm);
// 将封装好的学生与考级考试信息的Map存储到会话中方便后续页面获取并展示
session.setAttribute("map", map);
// 重定向到指定的JSP页面考级报名学生展示页面用于展示查询到的数据
response.sendRedirect(request.getContextPath() + "/acdemic_dean/levelexaminationmanage/applystudents.jsp");
}
// 根据学生列表和学年学期获取每个学生对应的考级考试信息封装成Map返回
private Map<StudentBasicInformation, List<LevelExam>> getAllLevelExamMap(
List<StudentBasicInformation> students, String yearTerm) {
Map<StudentBasicInformation,List<LevelExam>> map = new HashMap<>();
// 创建一个用于存储学生与对应考级考试信息的Map
Map<StudentBasicInformation, List<LevelExam>> map = new HashMap<>();
// 创建考级考试列表数据访问对象实例,用于操作考级考试列表相关的数据
LevelExamListDAO lel = new LevelExamListDAOImpl();
// 创建考级考试数据访问对象实例,用于操作考级考试相关的数据
LevelExamDAO led = new LevelExamDAOImpl();
for(StudentBasicInformation sbi : students){
// 遍历每个学生基本信息对象
for (StudentBasicInformation sbi : students) {
// 获取该学生的所有考级考试列表信息通过学生ID查询
List<LevelExamList> levelExamLists = lel.getAll(String.valueOf(sbi.getStudentId()));
// 创建一个用于存储当前学生对应有效考级考试信息的列表
List<LevelExam> levelExams = new ArrayList<LevelExam>();
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<StudentBasicInformation> students = getStudent(request, response);
Map<StudentBasicInformation,List<OptionalCourse>> map = getAllOptionalCourseMap(students, yearTerm);
// 根据学生信息列表和学年学期获取每个学生对应的选修课程信息并封装成Map
Map<StudentBasicInformation, List<OptionalCourse>> map = getAllOptionalCourseMap(students, yearTerm);
// 将封装好的学生与选修课程信息的Map存储到会话中方便后续页面使用
session.setAttribute("map", map);
// 重定向到指定的JSP页面选修课程学生展示页面用于展示查询到的数据
response.sendRedirect(request.getContextPath() + "/acdemic_dean/acdemic/optionalcourse.jsp");
}
// 根据学生列表和学年学期获取每个学生对应的选修课程信息封装成Map返回
private Map<StudentBasicInformation, List<OptionalCourse>> getAllOptionalCourseMap(
List<StudentBasicInformation> students, String yearTerm) {
Map<StudentBasicInformation,List<OptionalCourse>> map = new HashMap<>();
// 创建一个存储学生与对应选修课程信息的Map
Map<StudentBasicInformation, List<OptionalCourse>> map = new HashMap<>();
// 创建选修课程数据访问对象实例,用于操作选修课程相关的数据
OptionalCourseDAO oc = new OptionalCourseDAOImpl();
// 创建学生选修课程数据访问对象实例,用于操作学生选修课程相关的数据
StudentOptCourseDAO soc = new StudentOptCourseDAOImpl();
for(StudentBasicInformation sbi : students){
// 遍历每个学生基本信息对象
for (StudentBasicInformation sbi : students) {
// 获取该学生的所有选修课程记录通过学生ID查询
List<StudentOptCourse> studentOptCourses = soc.getAll(String.valueOf(sbi.getStudentId()));
// 创建一个用于存储当前学生对应有效选修课程信息的列表
List<OptionalCourse> optionalCourses = new ArrayList<OptionalCourse>();
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<StudentBasicInformation> getStudent(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
String academy = request.getParameter("academy"); //学院
// 根据请求中的参数(学院、专业、班级、学号、姓名等)获取要查询的学生信息列表
private List<StudentBasicInformation> 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);
}
}
}

@ -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<CourseSchedule> courseSchedules = getCourseSchedule(user.getUsername(), yearTerm, week);
// 调用getCourseScheduleShow方法对获取到的原始课程安排数据进行处理和转换将其整理成更适合展示的格式
List<CourseScheduleShow> courseScheduleShows = getCourseScheduleShow(courseSchedules);
// 将整理好的课程表展示数据存入会话中,以便后续在页面中可以获取并展示给用户
session.setAttribute("courseScheduleShows", courseScheduleShows);
}
// 重定向到指定的JSP页面这里假设是用于展示考试安排的页面可能在该页面中也包含课程表展示部分
// 让用户能够看到最终的课程表信息,具体页面路径是基于项目的上下文路径来构建的
response.sendRedirect(request.getContextPath() + "/student/informationinquiry/examarrange.jsp");
}
/**
* CourseSchedule
* CourseScheduleShow
*
* @param courseSchedules
* @return
*/
private List<CourseScheduleShow> getCourseScheduleShow(
List<CourseSchedule> courseSchedules) {
// 创建一个用于存储整理后课程表展示数据的列表,初始化为空列表
List<CourseScheduleShow> courseScheduleShows = new ArrayList<CourseScheduleShow>();
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<CourseSchedule> getCourseSchedule(String studentId,
String yearTerm, String week) {
String yearTerm, String week) {
// 创建CourseScheduleDAO的实现类对象用于与数据库进行交互执行查询课程安排数据的操作
CourseScheduleDAO csd = new CourseScheduleDAOImpl();
// 调用其对应的方法,传入学生学号、学年学期和周数参数,获取并返回符合条件的课程安排数据列表
return csd.getAllWithYearTerm(studentId, yearTerm, week);
}
}
}

@ -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<StudentBasicInformation> students = getStudent(request, response);
//获取每一位学生与其对应的所有的成绩作为键值对存入map中
Map<StudentBasicInformation,List<StudentGrade>> map = getAllGradeMap(students, yearTerm);
//获取每一位学生的成绩统计分析结果
// 获取每一位学生与其对应的所有的成绩作为键值对存入map中根据学生信息列表和学年学期获取成绩信息
Map<StudentBasicInformation, List<StudentGrade>> map = getAllGradeMap(students, yearTerm);
// 获取每一位学生的成绩统计分析结果,调用相应方法进行成绩分析计算
Map<StudentBasicInformation, GradeAnalysisResult> results = getAnalysisResult(map);
//将每一位学生的成绩分析结果放入session中
// 将每一位学生的成绩分析结果放入session中方便后续页面获取并展示
session.setAttribute("results", results);
//重定向到jsp显示页面
// 重定向到jsp显示页面成绩分析结果展示页面用于展示查询到的成绩分析数据
response.sendRedirect(request.getContextPath() + "/acdemic_dean/acdemic/grademanagement/gradeanalysis.jsp");
}
//获取成绩分析结果,把结果放入一个数组中
// 获取成绩分析结果把结果放入一个以学生信息为键成绩分析结果为值的Map中返回
private Map<StudentBasicInformation, GradeAnalysisResult> getAnalysisResult(
Map<StudentBasicInformation, List<StudentGrade>> map) {
//List results = new ArrayList();
// 创建一个用于存储学生与对应成绩分析结果的Map
Map<StudentBasicInformation, GradeAnalysisResult> GradeMap = new HashMap<>();
for(Map.Entry<StudentBasicInformation,List<StudentGrade>> entry : map.entrySet()){
// 遍历存储学生与成绩信息的Map的每一个键值对
for (Map.Entry<StudentBasicInformation, List<StudentGrade>> entry : map.entrySet()) {
// 获取当前学生的基本信息对象
StudentBasicInformation stu = entry.getKey();
// 获取当前学生对应的所有成绩信息列表
List<StudentGrade> 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<StudentGrade> studentGrades) {
StudentGrade studentGrade = null;
double credit = 0.0,sum = 0.0;
double credit = 0.0, sum = 0.0;
// 创建一个迭代器,用于遍历学生成绩列表
Iterator<StudentGrade> 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<StudentGrade> studentGrades) {
int score = 0;
// 创建迭代器用于遍历成绩列表
Iterator<StudentGrade> 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<StudentBasicInformation> students = getStudent(request, response);
Map<StudentBasicInformation,List<StudentGrade>> map = getAllGradeMap(students, yearTerm);
// 获取每一位学生与其对应的所有的成绩作为键值对存入map中根据学生信息和学年学期获取成绩信息
Map<StudentBasicInformation, List<StudentGrade>> map = getAllGradeMap(students, yearTerm);
// 将获取到的学生成绩信息Map存储到会话中方便后续页面使用
session.setAttribute("map", map);
// 重定向到jsp显示页面教务员查询学生成绩展示页面用于展示查询到的学生成绩数据
response.sendRedirect(request.getContextPath() + "/acdemic_dean/acdemic/grademanagement/gradequery.jsp");
}
// 根据学生信息列表和学年学期获取每个学生对应的成绩信息封装成Map返回
private Map<StudentBasicInformation, List<StudentGrade>> getAllGradeMap(
List<StudentBasicInformation> students, String yearTerm) {
Map<StudentBasicInformation,List<StudentGrade>> map = new HashMap<>();
// 创建一个用于存储学生与对应成绩信息的Map
Map<StudentBasicInformation, List<StudentGrade>> map = new HashMap<>();
// 创建学生成绩数据访问对象实例,用于操作学生成绩相关的数据
StudentGradeDAO sgd = new StudentGradeDAOIpml();
for(StudentBasicInformation sbi : students){
List<StudentGrade> studentGrades = sgd.getAllWithYearTerm(sbi.getStudentId(),yearTerm);
// 遍历每个学生基本信息对象
for (StudentBasicInformation sbi : students) {
// 获取该学生的所有成绩信息通过学生ID和学年学期查询
List<StudentGrade> studentGrades = sgd.getAllWithYearTerm(sbi.getStudentId(), yearTerm);
// 将当前学生与其对应的成绩信息列表存入Map中
map.put(sbi, studentGrades);
}
return map;
}
//获取条件查询到的所有学生信息
// 根据请求中的参数(学院、专业、班级、学号、姓名等)获取要查询的所有学生信息列表
private List<StudentBasicInformation> 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<StudentGrade> studentGrades = getAllcourseGradeList(user);
// 将获取到的学生成绩信息列表存储到会话中,方便后续页面展示
session.setAttribute("studentGrades", studentGrades);
// 重定向到jsp显示页面学生成绩查询结果展示页面用于展示查询到的学生自己的成绩数据
response.sendRedirect(request.getContextPath() + "/student/informationinquiry/coursegrade.jsp");
}
// 根据用户信息获取该用户(学生)的所有课程成绩信息列表
private List<StudentGrade> getAllcourseGradeList(User user) {
// 创建学生成绩数据访问对象实例,用于操作学生成绩相关的数据
StudentGradeDAO sgd = new StudentGradeDAOIpml();
// 通过用户的学号(这里假设用户名就是学号)获取该学生的所有课程成绩信息并返回
return sgd.getAllCourseGrade(Long.parseLong(user.getUsername()));
}
}
}

@ -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();
// 重写HttpServlet的doPost方法用于处理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<ExamArrange> 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<ExamArrange> getExamArrange(String username) {
return e.getAllWithStudentId(username);
}
private List<ExamArrange> getExamArrange(String username, String yearTerm) {
/**
* ExamArrangeDAOImpl
*
*
* @param username
* @param yearTerm
* @return
*/
private List<ExamArrange> getExamArrange(String username, String yearTerm) {
return e.getAllWithYearTerm(username, yearTerm);
}
}
}

@ -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");
}
}
}

@ -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"
* UserDAOImplupdate
*
*
* @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 truefalse
* @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;
}
}
/**
* UserDAOImplget
* 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;
}
}
}

@ -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);
}
/**
*
* JwTeacherDAOImplnull
*
* @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 IOIO
*/
private JwTeacher getTeacher(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
JwTeacher teacher = null;
// 获取请求参数名称的枚举对象,通过该枚举可以遍历所有的请求参数名称,进而获取对应的参数值
Enumeration<String> en = request.getParameterNames();
// 创建一个List集合用于存储请求参数的值方便后续按照顺序获取并封装到教师对象中
List<String> 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;
}
}
}

@ -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<LevelExam, String> map = new HashMap<>();
List<LevelExam> 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<LevelExam, String> map = new HashMap<>();
// 调用LevelExamDAO实现类的方法根据学年学期获取所有的等级考试信息列表这些信息可能包含课程编号、考试时间等内容
List<LevelExam> 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");
}
}

@ -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<StudentBasicInformation> students = getStudent(request, response);
Map<StudentBasicInformation,List<LevelExamination>> map = getAllGradeMap(students, yearTerm);
// 调用getAllGradeMap方法根据获取到的学生信息列表和学年学期获取每个学生对应的等级考试成绩信息
// 并封装成以学生基本信息为键、成绩列表为值的Map结构
Map<StudentBasicInformation, List<LevelExamination>> 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<StudentBasicInformation, List<LevelExamination>> getAllGradeMap(
List<StudentBasicInformation> students, String yearTerm) {
Map<StudentBasicInformation,List<LevelExamination>> map = new HashMap<>();
// 创建一个用于存储学生与对应等级考试成绩信息的Map键为学生基本信息对象值为该学生的等级考试成绩列表
Map<StudentBasicInformation, List<LevelExamination>> map = new HashMap<>();
// 创建LevelExaminationDAO的实现类对象用于与数据库交互执行与等级考试相关的数据查询操作
LevelExaminationDAO led = new LevelExaminationDAOImpl();
for(StudentBasicInformation sbi : students){
List<LevelExamination> levelExaminations = led.getAllWithYearTerm(sbi.getStudentId().toString(),yearTerm);
// 遍历每个学生基本信息对象
for (StudentBasicInformation sbi : students) {
// 调用LevelExaminationDAO实现类的方法根据学生ID和学年学期获取该学生的所有等级考试成绩信息
// 返回的是一个等级考试成绩列表
List<LevelExamination> levelExaminations = led.getAllWithYearTerm(sbi.getStudentId().toString(), yearTerm);
// 将当前学生与其对应的等级考试成绩信息列表存入Map中建立学生与成绩的对应关系
map.put(sbi, levelExaminations);
}
return map;
}
// 根据请求中的参数(学院、专业、班级、学号、姓名等)获取要查询的学生基本信息列表,
// 这些参数从请求中获取,用于构建查询条件,从数据库中筛选出符合条件的学生信息,
// 为后续获取成绩等操作提供基础数据
private List<StudentBasicInformation> 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> 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<LevelExamination> getAllGradeList(User user) {
// 创建LevelExaminationDAO的实现类对象用于与数据库交互执行根据学号查询学生等级考试成绩的操作
LevelExaminationDAO led = new LevelExaminationDAOImpl();
// 调用其对应的方法,传入用户的用户名(假设用户名与学号有对应关系,此处用用户名作为查询条件),
// 从数据库中获取该学生的所有等级考试成绩信息列表并返回
return led.getAllLevelWithStudentId(user.getUsername());
}
}
}

@ -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;
}
}
}
/**
* UserDAOImplget
* 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;
}
}
}

@ -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");
}
}
}

@ -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");
}
/**
*
* UserDAOImplupdate
*
*
* @param user
* @param newpassword
*/
private void update(User user, String newpassword) {
// 创建UserDAOImpl对象用于与数据库进行交互执行更新用户信息此处主要是更新密码的操作
UserDAOImpl u = new UserDAOImpl();
// 将用户对象中的密码字段设置为新密码,替换原来存储的旧密码
user.setPassword(newpassword);
// 调用UserDAOImpl的update方法将更新后的用户对象信息保存到数据库中完成密码修改的实际数据库操作
// 使得数据库中该用户的密码信息得到更新
u.update(user);
}
}
}

@ -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<OptionalCourse, String> map = new HashMap<>();
// 调用OptionalCourseDAO实现类的方法根据学年学期获取所有的选修课程信息列表这些信息可能包含课程编号、课程名称、授课教师等内容。
List<OptionalCourse> 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");
}
}
}

@ -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");
}
}
}

@ -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);
}
/**
*
* StudentBasicInforDAOImplnull
*
* @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 IOIO
*/
private StudentBasicInformation getStuInformation(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
StudentBasicInformation sbi = null;
// 获取请求参数名称的枚举对象,通过该枚举可以遍历所有的请求参数名称,进而获取对应的参数值。
Enumeration<String> en = request.getParameterNames();
// 创建一个List集合用于存储请求参数的值方便后续按照顺序获取并封装到学生基本信息对象中。
List<String> 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;
}
}
}

@ -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);
}
/**
*
* TeacherDAOImplnull
*
* @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 IOIO
*/
private Teacher getTeacher(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
Teacher teacher = null;
// 获取请求参数名称的枚举对象,通过该枚举可以遍历所有的请求参数名称,进而获取对应的参数值。
Enumeration<String> en = request.getParameterNames();
// 创建一个List集合用于存储请求参数的值方便后续按照顺序获取并封装到教师对象中。
List<String> 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;
}
}
}

@ -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;
/**
*
* HttpServletHttpSessionJPEG
*
* @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();
}
}
}

@ -7,14 +7,29 @@ import org.junit.Test;
import com.hua.jdbcutil.JDBCUtils;
// 这个类主要用于对JDBCUtils工具类中的数据库连接获取及关闭相关方法进行单元测试
// 通过JUnit的@Test注解来标记测试方法验证其功能是否符合预期。
public class JDBCUtilsTest {
// 使用JUnit的@Test注解标记该方法为一个测试方法在执行单元测试时JUnit会自动运行被该注解标记的方法
// 此方法主要测试获取数据库连接以及关闭连接的功能是否正常。
@Test
public void test() throws SQLException {
// 声明一个Connection类型的变量用于存储获取到的数据库连接对象初始化为null
// 后续将通过JDBCUtils工具类的方法尝试获取数据库连接并赋值给它。
Connection conn = null;
// 调用JDBCUtils工具类的getConnection方法尝试获取一个数据库连接对象
// 该方法内部通常会配置数据库连接相关的参数如数据库URL、用户名、密码等并建立与数据库的连接
// 如果连接成功则返回一个有效的Connection对象若连接失败可能会抛出SQLException异常。
conn = JDBCUtils.getConnection();
// 输出获取到的数据库连接对象,这里主要是为了在测试过程中查看是否成功获取到了连接,
// 实际应用中可能会根据具体情况做更详细的验证比如判断连接是否为null等
System.out.println(conn);
// 调用JDBCUtils工具类的closeConnection方法传入获取到的数据库连接对象用于关闭之前打开的数据库连接
// 释放相关资源,避免资源泄露,该方法内部会执行关闭连接的操作,并处理可能出现的异常情况。
JDBCUtils.closeConnection(conn);
}
}
}

@ -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));
}
}
}

@ -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` 注解来标记不同的测试方法,每个方法对应测试一个具体的数据库操作功能,以此验证业务逻辑的正确性。
public class StudentGradeDAOIpmlTest {
// 创建 `StudentGradeDAO` 接口的实现类 `StudentGradeDAOIpml` 的实例对象,后续将通过这个对象调用其实现的各种数据库操作方法进行测试,
// 该对象负责与数据库进行交互,执行诸如查询学生成绩、插入成绩记录、更新成绩以及删除成绩记录等相关操作。
StudentGradeDAO sgd = new StudentGradeDAOIpml();
// 使用JUnit的 `@Test` 注解标记该方法为一个测试方法,此方法主要用于测试 `StudentGradeDAOIpml` 类中获取所有学生成绩信息的功能,
// 它首先创建一个空的 `List<StudentGrade>` 集合用于存储获取到的学生成绩信息,然后调用 `sgd.getAll()` 方法从数据库中获取所有学生成绩信息,
// 将返回的结果存储到集合中,接着通过迭代器遍历集合,并将每个 `StudentGrade` 对象输出打印,用于查看获取到的信息是否符合预期。
// 不过实际应用中,可能需要更严谨的断言(`assert` 语句)来验证返回结果的准确性,比如判断返回的集合是否为空、集合中元素的格式是否正确等情况。
@Test
public void testGetAll() {
List<StudentGrade> list = new ArrayList<>();
list = sgd.getAll();
Iterator<StudentGrade> iter = list.iterator();
while(iter.hasNext()){
while (iter.hasNext()) {
System.out.println(iter.next());
}
}
// 使用JUnit的 `@Test` 注解标记该方法为一个测试方法,该方法用于测试 `StudentGradeDAOIpml` 类中根据学生学号获取该学生所有课程成绩的功能,
// 通过调用 `sgd.getAllCourseGrade(3115001256l)` 方法,传入一个具体的学生学号,尝试从数据库中获取该学号对应的学生的所有课程成绩信息,
// 并将结果输出打印,以便查看是否能正确获取到指定学生的课程成绩信息,同样在实际测试中可以添加更详细的断言来验证返回结果的正确性,
// 例如判断返回的成绩数据是否完整、成绩数值是否在合理范围内等。
@Test
public void testGetLong() {
System.out.println(sgd.getAllCourseGrade(3115001256l));
}
// 使用JUnit的 `@Test` 注解标记该方法为一个测试方法,此方法理论上用于测试 `StudentGradeDAOIpml` 类中插入学生成绩信息到数据库的功能,
// 但目前方法体为空,意味着还未实现具体的测试逻辑,在实际完整的测试场景中,需要编写代码来构造合适的 `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")`,说明还未实现具体的测试逻辑,实际测试时,需要编写代码传入要删除成绩的学生学号,
// 调用 `sgd.delete(...)` 方法执行删除操作,然后通过查询数据库确认对应学号的成绩记录是否已被成功删除、查看删除方法的返回值等方式来验证删除操作是否成功。
@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");
}
}
}

@ -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");
}
}
}

@ -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` 注解来标记不同的测试方法,每个方法对应测试一个具体的数据库操作功能,以此来验证相关业务逻辑在数据库交互层面的正确性。
public class UserDAOImplTest {
// 创建 `UserDAOImpl` 类的实例对象,后续将借助这个对象调用其实现的各种数据库操作方法开展测试工作。
// `UserDAOImpl` 负责与数据库进行交互,执行像查询所有用户信息、依据用户名获取单个用户信息、插入用户信息、更新用户信息以及删除用户信息等相关操作。
UserDAOImpl udi = new UserDAOImpl();
// 使用JUnit的 `@Test` 注解标记该方法为一个测试方法,此方法的主要目的是测试 `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)` 方法,尝试把这个新创建的用户对象信息插入到数据库中。
// 但此处并没有对插入操作的结果进行深入验证,在实际的测试场景中,应当通过查询数据库查看数据是否成功插入或者检查插入方法的返回值等方式,
// 来确认插入操作是否达到预期的成功效果,例如判断插入方法返回的是否是表示成功插入的特定标识等情况。
@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")`,这表明这个测试方法还尚未被实现。在实际完整的测试场景下,需要明确具体的条件设定方式以及数量统计逻辑,
// 编写代码调用 `udi.getCountWithName(...)` 方法获取数量结果,并通过合适的断言来验证返回的数量是否符合预期,以此保障统计功能的准确性和可靠性。
@Test
public void testGetCountWithName() {
fail("Not yet implemented");
}
}
}

@ -1,38 +1,62 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各种字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<div>
<%session.setAttribute("path", request.getRequestURI()); %>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
</div>
<!-- 教务员主页面 -->
<div>
<h3>学籍管理</h3>
<a href="<%=request.getContextPath()%>/acdemic_dean/schoolroll/studentinformation.jsp">学生基本信息</a>
</div>
<div>
<h3>考级管理</h3>
<a href="<%=request.getContextPath()%>/acdemic_dean/levelexaminationmanage/applystudents.jsp">考级报名学生</a>
<br><br>
<a href="<%=request.getContextPath()%>/dean.query">考级学生成绩</a>
</div>
<div>
<h3>教务管理</h3>
<a href="<%=request.getContextPath()%>/acdemic_dean/acdemic/grademanagement.jsp">成绩管理</a>
<br><br>
<a href="<%=request.getContextPath()%>/acdemic_dean/acdemic/optionalcourse.jsp">选修报名学生</a>
</div>
<div>
<h3>个人事务</h3>
<a href="<%=request.getContextPath()%>/jwTeacherInformationServlet">个人信息</a>
</div>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
相关的用户信息会被存储在会话中,此处用于向已登录的用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 在当前会话session中设置一个名为"path"的属性其值为当前请求的URI统一资源标识符
这个属性可能在后续的页面跳转、记录用户操作路径或者其他与当前页面相关的业务逻辑中会被使用到 -->
<%session.setAttribute("path", request.getRequestURI()); %>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出完整准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet")。点击此链接后,会触发注销相关的业务逻辑,
同样是借助获取上下文路径来生成正确的链接,使得用户能够顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
</div>
<!-- 以下是教务员主页面的各个功能模块展示区域,通过不同的标题和对应的超链接,为教务员提供进入不同业务功能页面的入口 -->
<!-- 学籍管理功能模块相关内容 -->
<div>
<h3>学籍管理</h3>
<!-- 创建一个超链接链接到用于展示学生基本信息的JSP页面"/acdemic_dean/schoolroll/studentinformation.jsp"
点击该链接后,教务员可以查看学生的各项基本信息,如学号、姓名、班级等内容 -->
<a href="<%=request.getContextPath()%>/acdemic_dean/schoolroll/studentinformation.jsp">学生基本信息</a>
</div>
<!-- 考级管理功能模块相关内容 -->
<div>
<h3>考级管理</h3>
<!-- 创建一个超链接链接到用于展示考级报名学生信息的JSP页面"/acdemic_dean/levelexaminationmanage/applystudents.jsp"
方便教务员查看哪些学生报名了相应的考级项目 -->
<a href="<%=request.getContextPath()%>/acdemic_dean/levelexaminationmanage/applystudents.jsp">考级报名学生</a>
<br><br>
<!-- 创建一个超链接,链接到用于查询考级学生成绩的地址("/dean.query"),通过这个链接,教务员可以获取参与考级学生的成绩情况 -->
<a href="<%=request.getContextPath()%>/dean.query">考级学生成绩</a>
</div>
<!-- 教务管理功能模块相关内容 -->
<div>
<h3>教务管理</h3>
<!-- 创建一个超链接链接到用于成绩管理的JSP页面"/acdemic_dean/acdemic/grademanagement.jsp"
教务员可以在此页面进行成绩相关的操作,比如录入、修改、查询学生成绩等 -->
<a href="<%=request.getContextPath()%>/acdemic_dean/acdemic/grademanagement.jsp">成绩管理</a>
<br><br>
<!-- 创建一个超链接链接到用于展示选修报名学生信息的JSP页面"/acdemic_dean/acdemic/optionalcourse.jsp"
方便教务员了解哪些学生报名了选修课程等情况 -->
<a href="<%=request.getContextPath()%>/acdemic_dean/acdemic/optionalcourse.jsp">选修报名学生</a>
</div>
<!-- 个人事务功能模块相关内容 -->
<div>
<h3>个人事务</h3>
<!-- 创建一个超链接链接到用于展示和修改教务员个人信息的Servlet"/jwTeacherInformationServlet"
点击后可进入相应页面进行个人信息的查看与修改等操作 -->
<a href="<%=request.getContextPath()%>/jwTeacherInformationServlet">个人信息</a>
</div>
</body>
</html>

@ -1,56 +1,83 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能正确显示各种字符尤其是中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语,
假设在之前的业务逻辑中已经将用户对象存入了会话中,此处用于向用户表示欢迎 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 在当前会话session中设置一个名为"path"的属性其值为当前请求的URI统一资源标识符
可能后续会用于页面跳转或者记录当前页面的路径等相关操作 -->
<%session.setAttribute("path", request.getRequestURI()); %>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp"
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,确保链接的正确性 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet"),点击后将执行注销相关的业务逻辑,
同样通过获取上下文路径来构建完整的链接地址 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<!-- 创建一个超链接,链接到教务员相关的页面("/acdemic_dean/acdemic_dean.jsp"),用于返回上一步操作或者回到特定的教务员页面,
也是借助获取上下文路径来准确指向目标页面 -->
<a href="<%=request.getContextPath() %>/acdemic_dean/acdemic_dean.jsp">返回上一步</a>
</div>
<!-- 以下是教务员个人信息页面相关的展示区域 -->
<div>
<h3>个人信息</h3>
</div>
<div>
<!-- 从请求作用域requestScope中获取名为"message"的属性值,并以红色字体展示,
通常用于显示一些提示信息,比如操作成功、失败等反馈消息,方便用户知晓操作结果 -->
<font color="RED">${requestScope.message }</font>
</div>
<br>
<!-- 定义一个表单用于提交教务员信息修改的相关数据表单将以POST方式提交数据到指定的Servlet"/jwTeacherInformationServlet" -->
<form action="<%=request.getContextPath()%>/jwTeacherInformationServlet" method="post">
<div>
<%session.setAttribute("path", request.getRequestURI()); %>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<a href="<%=request.getContextPath() %>/acdemic_dean/acdemic_dean.jsp">返回上一步</a>
<!-- 创建一个文本输入框用于显示教师编号设置为只读readonly其初始值从请求作用域requestScope中名为"teacher"的对象的"teacherId"属性获取,
意味着这个字段展示的是已有的教师编号信息,用户不能直接修改 -->
教师编号:<input type="text" readonly="readonly" name="teacherId" value="${requestScope.teacher.teacherId }"/>
<!-- 创建一个文本输入框,用于显示教师姓名,同样设置为只读,其初始值从请求作用域中"teacher"对象的"teacherName"属性获取,展示已有教师姓名信息 -->
姓名:<input type="text" readonly="readonly" name="teacherName" value="${requestScope.teacher.teacherName }"/>
<!-- 创建一个文本输入框,用于显示教师性别,设置为只读,其初始值从请求作用域中"teacher"对象的"gender"属性获取,展示已有教师性别信息 -->
性别:<input type="text" readonly="readonly" name="gender" value="${requestScope.teacher.gender }"/>
</div>
<!-- 教务员个人信息页面 -->
<br><br>
<div>
<h3>个人信息</h3>
<!-- 创建一个文本输入框,用于输入教师的政治面貌信息,其初始值从请求作用域中"teacher"对象的"politicstatus"属性获取,用户可根据实际情况修改此内容 -->
政治面貌:<input type="text" name="politicstatus" value="${requestScope.teacher.politicstatus }"/>
<!-- 创建一个文本输入框,用于显示教师的民族信息,设置为只读,其初始值从请求作用域中"teacher"对象的"nation"属性获取,展示已有民族信息 -->
民族:<input type="text" readonly="readonly" name="nation" value="${requestScope.teacher.nation }"/>
<!-- 创建一个文本输入框,用于显示教师的籍贯信息,设置为只读,其初始值从请求作用域中"teacher"对象的"nativeplace"对象获取,展示已有籍贯信息 -->
籍贯:<input type="text" readonly="readonly" name="nativeplace" value="${requestScope.teacher.nativeplace }"/>
</div>
<br><br>
<div>
<font color="RED">${requestScope.message }</font>
<!-- 创建一个文本输入框,用于显示教师所在的学院信息,设置为只读,其初始值从请求作用域中"teacher"对象的"academy"属性获取,展示已有学院信息 -->
学院:<input type="text" readonly="readonly" name="academy" value="${requestScope.teacher.academy }"/>
<!-- 创建一个文本输入框用于输入教师的QQ号码信息设置了宽度为40个字符其初始值从请求作用域中"teacher"对象的"qq"属性获取用户可修改QQ号码 -->
QQ<input type="text" size="40" name="qq" value="${requestScope.teacher.qq }"/>
<!-- 创建一个文本输入框,用于输入教师的联系电话信息,其初始值从请求作用域中"teacher"对象的"phone"属性获取,用户可修改联系电话 -->
联系电话:<input type="text" name="phone" value="${requestScope.teacher.phone }"/>
</div>
<br>
<form action="<%=request.getContextPath()%>/jwTeacherInformationServlet" method="post">
<div>
教师编号:<input type="text" readonly="readonly" name="teacherId" value="${requestScope.teacher.teacherId }"/>
姓名:<input type="text" readonly="readonly" name="teacherName" value="${requestScope.teacher.teacherName }"/>
性别:<input type="text" readonly="readonly" name="gender" value="${requestScope.teacher.gender }"/>
</div>
<br><br>
<div>
政治面貌:<input type="text" name="politicstatus" value="${requestScope.teacher.politicstatus }"/>
民族:<input type="text" readonly="readonly" name="nation" value="${requestScope.teacher.nation }"/>
籍贯:<input type="text" readonly="readonly" name="nativeplace" value="${requestScope.teacher.nativeplace }"/>
</div>
<br><br>
<div>
学院:<input type="text" readonly="readonly" name="academy" value="${requestScope.teacher.academy }"/>
QQ<input type="text" size="40" name="qq" value="${requestScope.teacher.qq }"/>
联系电话:<input type="text" name="phone" value="${requestScope.teacher.phone }"/>
</div>
<br><br>
<div>
邮箱:<input type="text" size="40" name="email" value="${requestScope.teacher.email }"/>
地址:<input type="text" size="40" name="address" value="${requestScope.teacher.address }"/>
</div>
<br><br>
<div>
<input type="submit" name="submit" value="修改并保存"/>
</div>
</form>
<br><br>
<div>
<!-- 创建一个文本输入框用于输入教师的邮箱信息设置了宽度为40个字符其初始值从请求作用域中"teacher"对象的"email"属性获取,用户可修改邮箱地址 -->
邮箱:<input type="text" size="40" name="email" value="${requestScope.teacher.email }"/>
<!-- 创建一个文本输入框用于输入教师的地址信息设置了宽度为40个字符其初始值从请求作用域中"teacher"对象的"address"属性获取,用户可修改地址内容 -->
地址:<input type="text" size="40" name="address" value="${requestScope.teacher.address }"/>
</div>
<br><br>
<div>
<!-- 创建一个提交按钮,按钮的名称为"submit",按钮上显示的文字为"修改并保存",点击该按钮后将触发表单提交操作,
把表单内修改后的教师信息数据发送到指定的Servlet进行后续处理 -->
<input type="submit" name="submit" value="修改并保存"/>
</div>
</form>
</body>
</html>

@ -1,52 +1,77 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>学籍信息</title>
<!-- 设置页面的字符编码类型为UTF-8保障页面能正确显示各类字符尤其是像中文这样的非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>学籍信息</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语,
一般来说,在之前的业务逻辑处理中已经将用户相关对象存入会话了,此处用于向当前用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp"
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,以此构建正确的链接地址,方便用户点击后进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接,链接到登录页面("/login/login.jsp"),这里应该是用于实现注销功能(通常注销后会重定向到登录页面),
同样借助获取上下文路径来准确指向登录页面的地址 -->
<a href="<%=request.getContextPath()%>/login/login.jsp">注销</a>
</div>
<div>
<h3>学籍信息</h3>
</div>
<div>
<!-- 从请求作用域requestScope中获取名为"message"的属性值,并以红色字体展示,
此属性值通常用于显示一些提示性消息,例如操作成功、失败等反馈信息,便于用户直观知晓相关操作的结果情况 -->
<font color="RED">${requestScope.message }</font>
</div>
<br>
<!-- 定义一个表单用于提交学籍信息修改的相关数据表单将以POST方式把数据发送到指定的Servlet"/studentInformationServlet"
后续该Servlet会对接收到的数据进行相应的处理比如更新数据库中的学籍信息等操作 -->
<form action="<%=request.getContextPath()%>/studentInformationServlet" method="post">
<div>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/login/login.jsp">注销</a>
<!-- 创建一个文本输入框用于输入或显示学号信息其初始值从请求作用域requestScope中名为"studentBasicInformation"的对象的"studentId"属性获取,
用户可以根据实际情况修改学号内容(不过实际应用中学号一般是固定不可改的,此处可能根据具体业务需求来定) -->
学号:<input type="text" name="studentId" value="${requestScope.studentBasicInformation.studentId }"/>
<!-- 创建一个文本输入框,用于输入或显示姓名信息,其初始值从请求作用域中"studentBasicInformation"对象的"studentName"属性获取,用户可按需修改姓名 -->
姓名:<input type="text" name="studentName" value="${requestScope.studentBasicInformation.studentName }"/>
<!-- 创建一个文本输入框,用于输入或显示性别信息,其初始值从请求作用域中"studentBasicInformation"对象的"gender"属性获取,用户可修改性别内容 -->
性别:<input type="text" name="gender" value="${requestScope.studentBasicInformation.gender }"/>
</div>
<br><br>
<div>
<h3>学籍信息</h3>
<!-- 创建一个文本输入框,用于输入或显示年级信息,其初始值从请求作用域中"studentBasicInformation"对象的"grade"属性获取,用户可根据实际情况调整年级内容 -->
年级:<input type="text" name="grade" value="${requestScope.studentBasicInformation.grade }"/>
<!-- 创建一个文本输入框,用于输入或显示班级信息,其初始值从请求作用域中"studentBasicInformation"对象的"className"属性获取,用户可修改班级信息 -->
班级:<input type="text" name="className" value="${requestScope.studentBasicInformation.className }"/>
<!-- 创建一个文本输入框,用于输入或显示学院信息,其初始值从请求作用域中"studentBasicInformation"对象的"academy"属性获取,用户可更改学院相关内容 -->
学院:<input type="text" name="academy" value="${requestScope.studentBasicInformation.academy }"/>
</div>
<br><br>
<div>
<font color="RED">${requestScope.message }</font>
<!-- 创建一个文本输入框,用于输入或显示专业信息,其初始值从请求作用域中"studentBasicInformation"对象的"profession"属性获取,用户可对专业进行修改 -->
专业:<input type="text" name="profession" value="${requestScope.studentBasicInformation.profession }"/>
<!-- 创建一个文本输入框,用于输入或显示所在校区信息,其初始值从请求作用域中"studentBasicInformation"对象的"campus"属性获取,用户可调整校区相关内容 -->
所在校区:<input type="text" name="campus" value="${requestScope.studentBasicInformation.campus }"/>
<!-- 创建一个文本输入框,用于输入或显示联系电话信息,其初始值从请求作用域中"studentBasicInformation"对象的"phone"属性获取,用户可更新联系电话 -->
联系电话:<input type="text" name="phone" value="${requestScope.studentBasicInformation.phone }"/>
</div>
<br>
<form action="<%=request.getContextPath()%>/studentInformationServlet" method="post">
<div>
学号:<input type="text" name="studentId" value="${requestScope.studentBasicInformation.studentId }"/>
姓名:<input type="text" name="studentName" value="${requestScope.studentBasicInformation.studentName }"/>
性别:<input type="text" name="gender" value="${requestScope.studentBasicInformation.gender }"/>
</div>
<br><br>
<div>
年级:<input type="text" name="grade" value="${requestScope.studentBasicInformation.grade }"/>
班级:<input type="text" name="className" value="${requestScope.studentBasicInformation.className }"/>
学院:<input type="text" name="academy" value="${requestScope.studentBasicInformation.academy }"/>
</div>
<br><br>
<div>
专业:<input type="text" name="profession" value="${requestScope.studentBasicInformation.profession }"/>
所在校区:<input type="text" name="campus" value="${requestScope.studentBasicInformation.campus }"/>
联系电话:<input type="text" name="phone" value="${requestScope.studentBasicInformation.phone }"/>
</div>
<br><br>
<div>
家庭地址:<input type="text" size="40" name="homeAddress" value="${requestScope.studentBasicInformation.homeAddress }"/>
</div>
<br><br>
<div>
<input type="submit" name="submit" value="修改"/>
<a href="<%=request.getContextPath() %>/acdemic_dean/acdemic_dean.jsp">返回上一步</a>
</div>
</form>
<br><br>
<div>
<!-- 创建一个文本输入框用于输入或显示家庭地址信息设置了宽度为40个字符其初始值从请求作用域中"studentBasicInformation"对象的"homeAddress"属性获取,用户可修改家庭地址内容 -->
家庭地址:<input type="text" size="40" name="homeAddress" value="${requestScope.studentBasicInformation.homeAddress }"/>
</div>
<br><br>
<div>
<!-- 创建一个提交按钮,按钮的名称为"submit",按钮上显示的文字为"修改",点击该按钮后将触发表单提交操作,
把表单内用户修改后的学籍信息数据发送到指定的Servlet"/studentInformationServlet")进行后续处理 -->
<input type="submit" name="submit" value="修改"/>
<!-- 创建一个超链接,链接到教务员相关的页面("/acdemic_dean/acdemic_dean.jsp"),用于返回上一步操作或者回到特定的教务员页面,
通过获取上下文路径来构建准确的链接地址 -->
<a href="<%=request.getContextPath() %>/acdemic_dean/acdemic_dean.jsp">返回上一步</a>
</div>
</form>
</body>
</html>

@ -1,54 +1,72 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<!-- 设置页面的字符编码类型为UTF-8以保证页面能够正确显示各种字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 添加系统用户页面 -->
<h1>${sessionScope.user.name },您好!</h1>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 在当前会话session中设置一个名为"path"的属性其值为当前请求的URI统一资源标识符
该属性可能在后续的页面跳转、记录用户操作路径或者其他相关业务逻辑中会被用到 -->
<%session.setAttribute("path", request.getRequestURI()); %>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet")。点击此链接后,将触发注销相关的业务逻辑,
同样借助获取上下文路径来生成正确的链接,使得用户可以顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<!-- 创建一个超链接,链接到指定的地址("/query.do"),这里标注为“返回上一步”,意味着点击该链接通常会跳转到上一次操作所在的页面,
具体跳转的页面由服务器端对该请求的处理逻辑来决定 -->
<a href="<%=request.getContextPath() %>/query.do">返回上一步</a>
</div>
<h1>学生用户管理</h1>
<!-- 定义一个表单用于提交添加系统用户的相关信息表单将以POST方式把数据发送到指定的地址"/addUser.do"
服务器端对应的处理逻辑会接收并处理这些提交的数据,比如将新用户信息保存到数据库等操作 -->
<form action="<%=request.getContextPath()%>/addUser.do" method="post">
<div>
<%session.setAttribute("path", request.getRequestURI()); %>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<!-- 从请求作用域requestScope中获取名为"message"的属性值,并以红色字体展示。
这个属性值一般用于显示一些提示性信息,比如添加用户操作成功或失败的反馈消息等,方便用户知晓操作结果 -->
<font color="RED">${requestScope.message }</font>
<br><br>
<a href="<%=request.getContextPath() %>/query.do">返回上一步</a>
</div>
<h1>学生用户管理</h1>
<form action="<%=request.getContextPath()%>/addUser.do" method="post">
<div>
<font color="RED">${requestScope.message }</font>
<br><br>
</div>
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>登录密码:</td>
<td><input type="text" name="password"/></td>
</tr>
<tr>
<td>用户姓名:</td>
<td><input type="text" name="name"/></td>
</tr>
<tr>
<td>用户身份:</td>
<td><input type="text" name="identity"/></td>
</tr>
<tr>
<td>找回密码凭据:</td>
<td><input type="text" name="findMMproof"/></td>
</tr>
<tr>
<td><input type="submit" value="添加用户"/></td>
</tr>
</table>
</form>
<table>
<!-- 以下是通过表格形式来布局表单中的各个输入项,使得页面展示更加规整、清晰 -->
<tr>
<!-- 表格的一行中,左边单元格显示“用户名:”的文本提示 -->
<td>用户名:</td>
<!-- 右边单元格创建一个文本输入框,用于输入用户名信息,其名称为"username"
后续提交表单时,这个输入框中的值会以键值对的形式(键为"username",值为用户输入的内容)发送给服务器端 -->
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>登录密码:</td>
<td><input type="text" name="password"/></td>
</tr>
<tr>
<td>用户姓名:</td>
<td><input type="text" name="name"/></td>
</tr>
<tr>
<td>用户身份:</td>
<td><input type="text" name="identity"/></td>
</tr>
<tr>
<td>找回密码凭据:</td>
<td><input type="text" name="findMMproof"/></td>
</tr>
<tr>
<!-- 创建一个提交按钮,按钮上显示的文字为“添加用户”,点击该按钮后将触发表单提交操作,
把表单内用户输入的各项添加用户的信息发送到指定的服务器端地址("/addUser.do")进行处理 -->
<td><input type="submit" value="添加用户"/></td>
</tr>
</table>
</form>
</body>
</html>

@ -1,24 +1,37 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
</head>
<body>
<!-- 管理员的主页面 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<%session.setAttribute("path", request.getRequestURI()); %>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
</div>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在管理员登录成功后,
其相关用户信息会被存储在会话中,此处是向已登录的管理员表示友好的问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 在当前会话session中设置一个名为"path"的属性其值被设置为当前请求的URI统一资源标识符
这个属性可能会在后续的页面跳转逻辑、记录管理员操作路径或者其他与页面相关的业务处理中发挥作用 -->
<%session.setAttribute("path", request.getRequestURI()); %>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径进行拼接,构建出完整准确的链接地址,
方便管理员点击后进入修改密码的页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet")。点击此链接后,会触发相应的注销登录业务逻辑,
同样借助获取上下文路径来生成正确的链接,使得管理员能够顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
</div>
<br><br>
<div>
<!-- 创建一个超链接,链接到指定的地址("/query.do"),此处显示的文本为“用户管理”,意味着点击该链接后,
管理员将进入与用户管理相关的功能页面,具体展示和操作内容由服务器端对该请求的处理逻辑决定 -->
<a href="<%=request.getContextPath()%>/query.do">用户管理</a>
<br><br>
<div>
<a href="<%=request.getContextPath()%>/query.do">用户管理</a>
<br><br>
<a href="<%=request.getContextPath()%>/administrator/systemmaintain/systemmaintain.jsp">系统维护</a>
</div>
<!-- 创建一个超链接链接到用于系统维护功能的JSP页面"/administrator/systemmaintain/systemmaintain.jsp"
点击该链接后,管理员可进入系统维护相关的操作界面,进行如系统设置、数据备份、故障排查等系统维护相关的工作 -->
<a href="<%=request.getContextPath()%>/administrator/systemmaintain/systemmaintain.jsp">系统维护</a>
</div>
</body>
</html>

@ -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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符特别是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
</head>
<body>
<!-- 用户管理页面 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<%session.setAttribute("path", request.getRequestURI()); %>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<a href="<%=request.getContextPath() %>/administrator/administrator.jsp">返回上一步</a>
</div>
<h1>用户管理</h1>
<form action="query.do" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>用户姓名:</td>
<td><input type="text" name="name"/></td>
</tr>
<tr>
<td>用户身份:</td>
<td><input type="text" name="identity"/></td>
</tr>
<tr>
<td><input type="submit" value="查询"/></td>
<td><a href="<%=request.getContextPath()%>/administrator/adduser.jsp">添加用户</a></td>
</tr>
</table>
</form>
<!-- 用户管理页面 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 在当前会话session中设置一个名为"path"的属性其值为当前请求的URI统一资源标识符
该属性可能在后续的页面跳转、记录用户操作路径或者其他相关业务逻辑中发挥作用 -->
<%session.setAttribute("path", request.getRequestURI()); %>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet")。点击此链接后,将触发注销相关的业务逻辑,
同样借助获取上下文路径来生成正确的链接,使得用户可以顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<!-- 创建一个超链接,链接到指定的地址("/administrator/administrator.jsp"),这里标注为“返回上一步”,意味着点击该链接通常会跳转到上一次操作所在的页面,
具体跳转的页面由服务器端对该请求的处理逻辑来决定 -->
<a href="<%=request.getContextPath() %>/administrator/administrator.jsp">返回上一步</a>
</div>
<h1>用户管理</h1>
<!-- 定义一个表单用于提交用户查询相关的信息表单将以POST方式把数据发送到"query.do"这个地址,
服务器端对应的处理逻辑会接收并处理这些提交的数据,例如根据输入的条件在数据库中查询符合要求的用户信息等操作 -->
<form action="query.do" method="post">
<table>
<!-- 通过表格布局来展示表单中的各个输入项,使页面展示更加规整、清晰 -->
<tr>
<!-- 表格的一行中,左边单元格显示“用户名:”的文本提示 -->
<td>用户名:</td>
<!-- 右边单元格创建一个文本输入框,用于输入用户名信息,其名称为"username"
后续提交表单时,这个输入框中的值会以键值对的形式(键为"username",值为用户输入的内容)发送给服务器端 -->
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>用户姓名:</td>
<td><input type="text" name="name"/></td>
</tr>
<tr>
<td>用户身份:</td>
<td><input type="text" name="identity"/></td>
</tr>
<tr>
<td><input type="submit" value="查询"/></td>
<td>
<!-- 创建一个超链接链接到用于添加用户的JSP页面"/administrator/adduser.jsp"),点击该链接后,用户可进入添加用户的操作界面 -->
<a href="<%=request.getContextPath()%>/administrator/adduser.jsp">添加用户</a>
</td>
</tr>
</table>
</form>
<br><br>
<%
// 从请求作用域request中获取名为"users"的属性值并将其强制转换为List<User>类型,
// 这个属性值通常是由服务器端在处理相关业务逻辑(比如查询用户信息后)设置到请求作用域中的,代表查询到的用户信息列表。
List<User> users = (List<User>) request.getAttribute("users");
// 判断获取到的用户列表是否不为空且包含至少一个元素,只有在满足这个条件时,才进行后续的用户信息表格展示操作。
if (users!= null && users.size() > 0) {
%>
<hr>
<br><br>
<!-- 创建一个带有边框border="1"且单元格间距cellspacing和内边距cellpadding都为0的表格用于展示用户详细信息 -->
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<!-- 表格表头行,定义了各个列显示的标题,分别对应不同的用户信息字段 -->
<th>用户名</th>
<th>密码</th>
<th>姓名</th>
<th>身份</th>
<th>找回密码凭据</th>
<th>最近一次登录时间</th>
<th>最近一次修改密码时间</th>
<th>修改/删除</th>
</tr>
<%
List<User> users = (List<User>)request.getAttribute("users");
if(users != null && users.size() > 0){
// 循环遍历获取到的用户列表,对于每个用户对象,在表格中添加一行来展示其详细信息。
for (User user : users) {
%>
<hr>
<br><br>
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<th>用户名</th>
<th>密码</th>
<th>姓名</th>
<th>身份</th>
<th>找回密码凭据</th>
<th>最近一次登录时间</th>
<th>最近一次修改密码时间</th>
<th>修改/删除</th>
</tr>
<%
for(User user : users){
%>
<tr>
<td><%= user.getUsername() %></td>
<td><%= user.getPassword() %></td>
<td><%= user.getName() %></td>
<td><%= user.getIdentity() %></td>
<td><%= user.getFindMMproof() %></td>
<td><%= user.getLogin_last_time() %></td>
<td><%= user.getPassword_last_changed() %></td>
<td>
<a href="edit.do?username=<%= user.getUsername()%>">UPDATE</a>/
<a href="delete.do?username=<%=user.getUsername()%>" class="delete">DELETE</a>
</td>
</tr>
<%
}
%>
</table>
<tr>
<!-- 在表格的单元格中通过Java代码片段<%= %>)输出用户对象对应的各个属性值,展示用户的详细信息 -->
<td><%= user.getUsername() %></td>
<td><%= user.getPassword() %></td>
<td><%= user.getName() %></td>
<td><%= user.getIdentity() %></td>
<td><%= user.getFindMMproof() %></td>
<td><%= user.getLogin_last_time() %></td>
<td><%= user.getPassword_last_changed() %></td>
<td>
<!-- 创建两个超链接,分别用于跳转到编辑用户信息("edit.do")和删除用户信息("delete.do")的相关处理地址,
并通过URL参数?username=<%= user.getUsername()%>)传递要操作的用户名信息,方便服务器端识别具体要处理的用户 -->
<a href="edit.do?username=<%= user.getUsername()%>">UPDATE</a>/
<a href="delete.do?username=<%= user.getUsername()%>" class="delete">DELETE</a>
</td>
</tr>
<%
}
}
%>
</table>
<%
}
%>
</body>
</html>

@ -1,20 +1,34 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<div>
<%session.setAttribute("path", request.getRequestURI()); %>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<a href="<%=request.getContextPath() %>/query.do">返回上一步</a>
</div>
<h1>系统维护</h1>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
相关的用户信息会被存入会话中,此处是用于向已登录的用户表示友好的欢迎或打招呼 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 在当前会话session中设置一个名为"path"的属性其值设置为当前请求的URI统一资源标识符
这个属性有可能在后续的页面跳转逻辑、记录用户操作轨迹或者其他与当前页面相关的业务处理中发挥作用 -->
<%session.setAttribute("path", request.getRequestURI()); %>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径进行拼接,以此构建出准确完整的链接地址,
方便用户点击后能够进入修改密码的页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet")。点击此链接后,会触发相应的注销登录业务逻辑,
同样也是借助获取上下文路径来生成正确的链接,使得用户可以顺利完成注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<!-- 创建一个超链接,链接到指定的地址("/query.do"),这里功能标注为“返回上一步”,意味着点击该链接可能会跳转到上一次操作所在的页面,
具体跳转到哪里取决于服务器端对于该请求的处理逻辑 -->
<a href="<%=request.getContextPath() %>/query.do">返回上一步</a>
</div>
<h1>系统维护</h1>
<!-- 此处只是展示了一个标题为“系统维护”的一级标题,但从代码来看,并没有详细展开系统维护相关的具体功能页面链接或者内容展示等,
可能后续需要进一步完善添加如系统设置、数据备份、日志查看等具体功能相关的超链接或者操作界面元素等内容 -->
</body>
</html>

@ -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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<!-- 设置页面的字符编码类型为UTF-8以保证页面能正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 在当前会话session中设置一个名为"path"的属性其值为当前请求的URI统一资源标识符
该属性可能在后续的页面跳转、记录用户操作路径或者其他相关业务逻辑中会被用到 -->
<%session.setAttribute("path", request.getRequestURI()); %>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet")。点击此链接后,将触发注销相关的业务逻辑,
同样借助获取上下文路径来生成正确的链接,使得用户可以顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<!-- 创建一个超链接,链接到指定的地址("/query.do"),这里标注为“返回上一步”,意味着点击该链接通常会跳转到上一次操作所在的页面,
具体跳转的页面由服务器端对该请求的处理逻辑来决定 -->
<a href="<%=request.getContextPath() %>/query.do">返回上一步</a>
</div>
<h1>学生用户管理</h1>
<!-- 定义一个表单用于提交更新学生用户相关信息的内容表单将以POST方式把数据发送到指定的地址"/update.do"
服务器端对应的处理逻辑会接收并处理这些提交的数据,比如根据提交的信息更新数据库中对应的学生用户记录等操作 -->
<form action="<%=request.getContextPath()%>/update.do" method="post">
<div>
<%session.setAttribute("path", request.getRequestURI()); %>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<!-- 从请求作用域requestScope中获取名为"message"的属性值,并以红色字体展示。
这个属性值一般用于显示一些提示性信息,比如更新用户操作成功或失败的反馈消息等,方便用户知晓操作结果 -->
<font color="RED">${requestScope.message }</font>
<br><br>
<a href="<%=request.getContextPath() %>/query.do">返回上一步</a>
</div>
<h1>学生用户管理</h1>
<form action="<%=request.getContextPath()%>/update.do" method="post">
<div>
<font color="RED">${requestScope.message }</font>
<br><br>
</div>
<table>
<tr>
<td>用户名:</td>
<td><input type="hidden" name="oldUsername" value="${requestScope.user.username} "/></td>
</tr>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" value="${requestScope.user.username} "/></td>
</tr>
<tr>
<td>登录密码:</td>
<td><input type="text" name="password" value="${requestScope.user.password} "/></td>
</tr>
<tr>
<td>用户姓名:</td>
<td><input type="text" name="name" value="${requestScope.user.name} "/></td>
</tr>
<tr>
<td>用户身份:</td>
<td><input type="text" name="identity" value="${requestScope.user.identity} "/></td>
</tr>
<tr>
<td>找回密码凭据:</td>
<td><input type="text" name="findMMproof"/ value="${requestScope.user.findMMproof} "></td>
</tr>
<tr>
<td><input type="submit" value="添加用户"/></td>
</tr>
</table>
</form>
<table>
<!-- 通过表格形式来布局表单中的各个输入项,使得页面展示更加规整、清晰 -->
<tr>
<!-- 表格的一行中,左边单元格显示“用户名:”的文本提示这里设置了一个隐藏域input type="hidden")用于存放原始的用户名,
其名称为"oldUsername",值从请求作用域中获取当前用户的用户名,可能用于在后端更新操作时对比原始用户名等用途 -->
<td>用户名:</td>
<td><input type="hidden" name="oldUsername" value="${requestScope.user.username} "/></td>
</tr>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" value="${requestScope.user.username} "/></td>
</tr>
<tr>
<td>登录密码:</td>
<td><input type="text" name="password" value="${requestScope.user.password} "/></td>
</tr>
<tr>
<td>用户姓名:</td>
<td><input type="text" name="name" value="${requestScope.user.name} "/></td>
</tr>
<tr>
<td>用户身份:</td>
<td><input type="text" name="identity" value="${requestScope.user.identity} "/></td>
</tr>
<tr>
<td>找回密码凭据:</td>
<td><input type="text" name="findMMproof" value="${requestScope.user.findMMproof} "></td>
</tr>
<tr>
<!-- 创建一个提交按钮,按钮上显示的文字为“添加用户”,点击该按钮后将触发表单提交操作,
把表单内用户输入或已有的(通过设置初始值的方式)各项用户信息发送到指定的服务器端地址("/update.do")进行处理 -->
<td><input type="submit" value="添加用户"/></td>
</tr>
</table>
</form>
</body>
</html>

@ -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" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>找回密码</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>找回密码</title>
</head>
<body>
<!-- 找回密码页面 -->
<div class="findMM">
<!-- 找回密码页面 -->
<div class="findMM">
<div>
<!-- 创建一个代表当前时间戳从1970年1月1日00:00:00 UTC到当前时间的毫秒数的字符串
通过获取当前的Date对象并调用getTime()方法获取时间戳,然后转换为字符串类型,
这个时间戳值可能用于生成一个唯一的标识(比如作为找回密码流程中的临时验证令牌等) -->
<% String tokenValue = new Date().getTime() + ""; %>
<!-- 使用JSTLJavaServer Pages Standard Tag Library的<c:set>标签将上面生成的tokenValue字符串设置到会话作用域session
并命名为"token",方便在后续的页面或者服务器端逻辑中可以从会话中获取这个值,用于相关的验证等操作 -->
<c:set value="<%=tokenValue %>" var="token" scope="session"/>
</div>
<!-- 定义一个表单用于提交找回密码相关的信息表单将以POST方式把数据发送到指定的Servlet"/findPasswordServlet"
服务器端对应的处理逻辑会接收并处理这些提交的数据,例如验证账号、凭据以及验证码等信息是否正确,进而执行找回密码的相关操作 -->
<form action="<%=request.getContextPath()%>/findPasswordServlet" method="post">
<div>
<% String tokenValue = new Date().getTime() +""; %>
<c:set value="<%=tokenValue %>" var="token" scope="session"/>
</div>
<form action="<%=request.getContextPath()%>/findPasswordServlet" method="post">
<div>
<!-- 从会话作用域sessionScope中获取名为"message"的属性值并展示,
这个属性值通常用于显示一些提示性信息,比如找回密码操作过程中的错误提示、成功提示等反馈消息,方便用户知晓操作的结果情况 -->
${sessionScope.message }
</div>
<div>
<input type="hidden" name="token" value="<%=tokenValue %>"/>
</div>
<div class="form-group">
账号:<input type="text" name="username" value="${sessionScope.username }"/>
<%session.removeAttribute("message"); %>
</div>
<br>
<div class="form-group">
凭据:<input type="text" name="idCard"/>
</div>
<br>
<div class="form-group">
验证码:<input type="text" name="CHECK_CODE_PARAM_NAME"/>
<img alt="" src="<%= request.getContextPath() %>/validateColorServlet">
</div>
<br>
<div>
凭据默认是身份证或护照
</div>
<div>
<input type="submit" name="submit" value="找回密码" />
<a href="<%=request.getContextPath() %>/login/login.jsp">返回登录</a>
</div>
</form>
</div>
</div>
<div>
<!-- 创建一个隐藏域input type="hidden"),其名称为"token"值为前面生成的代表时间戳的tokenValue字符串
这个隐藏域会随着表单一起提交到服务器端,服务器端可以通过获取这个值来进行相关的验证操作,确保请求的合法性等 -->
<input type="hidden" name="token" value="<%=tokenValue %>"/>
</div>
<div class="form-group">
<!-- 显示文本“账号:”,并创建一个文本输入框,用于输入账号信息,其名称为"username"
同时设置了初始值为从会话作用域中获取的"username"属性值(如果存在的话),方便用户查看或者直接使用已有的账号信息 -->
账号:<input type="text" name="username" value="${sessionScope.username }"/>
<!-- 从会话中移除名为"message"的属性,可能是为了避免重复显示之前的提示信息,或者对消息展示进行一定的控制,
使得每次页面刷新或者重新操作时能获取到最新的提示消息 -->
<%session.removeAttribute("message"); %>
</div>
<br>
<div class="form-group">
<!-- 显示文本“凭据:”,并创建一个文本输入框,用于输入找回密码的凭据信息(备注说明了默认是身份证或护照),其名称为"idCard"
用户需要在此输入相应的有效凭据内容,以供服务器端后续验证使用 -->
凭据:<input type="text" name="idCard"/>
</div>
<br>
<div class="form-group">
<!-- 显示文本“验证码:”,并创建一个文本输入框,用于输入验证码信息,其名称为"CHECK_CODE_PARAM_NAME"
同时在旁边展示一个验证码图片图片的来源是通过向指定的Servlet"/validateColorServlet")请求生成的,
这个Servlet应该是用于生成验证码图片并返回给前端展示用户需要输入图片中显示的验证码内容用于增加找回密码操作的安全性 -->
验证码:<input type="text" name="CHECK_CODE_PARAM_NAME"/>
<img alt="" src="<%= request.getContextPath() %>/validateColorServlet">
</div>
<br>
<div>
<!-- 简单说明找回密码的凭据默认是身份证或护照,给用户一个提示信息,告知其输入凭据的类型要求 -->
凭据默认是身份证或护照
</div>
<div>
<!-- 创建一个提交按钮,按钮的名称为"submit",按钮上显示的文字为“找回密码”,点击该按钮后将触发表单提交操作,
把表单内用户输入的账号、凭据、验证码等信息发送到指定的Servlet"/findPasswordServlet")进行找回密码相关的处理 -->
<input type="submit" name="submit" value="找回密码" />
<!-- 创建一个超链接,链接到登录页面("/login/login.jsp"),标注为“返回登录”,方便用户在不想继续找回密码操作时,
可以点击此链接回到登录页面进行登录等其他操作 -->
<a href="<%=request.getContextPath() %>/login/login.jsp">返回登录</a>
</div>
</form>
</div>
</body>
</html>

@ -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" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
</head>
<body>
<!-- 登录页面 -->
<div class="page-container ms-controller">
<img src="<%=request.getContextPath() %>/img/1234.png" height="150px" width="400px">
<div class="main_box">
<div class="login_form">
<div>
<% String tokenValue = new Date().getTime() +""; %>
<c:set value="<%=tokenValue %>" var="token" scope="session"/>
</div>
<form action="<%=request.getContextPath()%>/loginChangeServlet" method="post">
<div>
<font color="RED">${sessionScope.message } </font>
<%session.removeAttribute("message"); %>
</div>
<table>
<tr>
<td>
<input type="hidden" name="token" value="<%=tokenValue %>"/>
</td>
</tr>
<tr>
<td>账号:</td>
<td>
<input type="text" name="username" value="${sessionScope.username }"/>
</td>
</tr>
<tr>
<td>密码:</td>
<td>
<input type="password" name="password" size="21"/>
</td>
</tr>
<tr>
<td>验证码:</td>
<td>
<input type="text" name="CHECK_CODE_PARAM_NAME"/>
</td>
<td>
<img alt="" src="<%= request.getContextPath() %>/validateColorServlet">
</td>
</tr>
<tr>
<td>
<input type="submit" name="submit" value="登录" />
</td>
<td>
<a href="findpassword.jsp">找回密码</a>
</td>
</tr>
</table>
</form>
<!-- 登录页面 -->
<div class="page-container ms-controller">
<!-- 展示一张图片图片的路径是通过获取当前请求的上下文路径request.getContextPath())与相对路径"/img/1234.png"拼接而成,
同时设置了图片的高度为150px宽度为400px用于页面的装饰或者展示系统相关的标识等 -->
<img src="<%=request.getContextPath() %>/img/1234.png" height="150px" width="400px">
<div class="main_box">
<div class="login_form">
<div>
<!-- 生成一个代表当前时间戳从1970年1月1日00:00:00 UTC到当前时间的毫秒数的字符串
通过创建一个Date对象并调用其getTime()方法获取时间戳,然后将其转换为字符串类型,
这个时间戳值可能在后续用于生成一个唯一标识(比如作为登录过程中的临时验证令牌等) -->
<% String tokenValue = new Date().getTime() + ""; %>
<!-- 使用JSTLJavaServer Pages Standard Tag Library的<c:set>标签将上面生成的tokenValue字符串设置到会话作用域session
并命名为"token",方便在后续的页面或者服务器端逻辑中从会话里获取该值,用于如安全验证等相关操作 -->
<c:set value="<%=tokenValue %>" var="token" scope="session"/>
</div>
<!-- 定义一个表单用于提交登录相关的信息表单将以POST方式把数据发送到指定的Servlet"/loginChangeServlet"
服务器端对应的处理逻辑会接收并处理这些提交的数据,例如验证账号、密码以及验证码是否正确,进而决定是否允许用户登录等操作 -->
<form action="<%=request.getContextPath()%>/loginChangeServlet" method="post">
<div>
<!-- 从会话作用域sessionScope中获取名为"message"的属性值,并以红色字体展示,
这个属性值通常用于显示一些提示性信息,比如登录操作失败的错误提示、成功提示等反馈消息,方便用户知晓操作结果,
然后从会话中移除这个"message"属性,可能是为了避免重复显示之前的提示信息,或者对消息展示进行一定的控制 -->
<font color="RED">${sessionScope.message } </font>
<%session.removeAttribute("message"); %>
</div>
<table>
<tr>
<td>
<!-- 创建一个隐藏域input type="hidden"),其名称为"token"值为前面生成的代表时间戳的tokenValue字符串
这个隐藏域会随着表单一起提交到服务器端,服务器端可通过获取这个值来进行相关的验证操作,确保登录请求的合法性等 -->
<input type="hidden" name="token" value="<%=tokenValue %>"/>
</td>
</tr>
<tr>
<td>账号:</td>
<td>
<!-- 显示文本“账号:”,并创建一个文本输入框,用于输入账号信息,其名称为"username"
同时设置了初始值为从会话作用域中获取的"username"属性值(如果存在的话),方便用户查看或者直接使用已有的账号信息 -->
<input type="text" name="username" value="${sessionScope.username }"/>
</td>
</tr>
<tr>
<td>密码:</td>
<td>
<!-- 显示文本“密码并创建一个密码输入框input type="password"),用于输入密码信息,其名称为"password"
同时设置了输入框的宽度为可显示21个字符大小用户输入的密码内容会以加密形式通常是黑点等形式显示展示增加安全性 -->
<input type="password" name="password" size="21"/>
</td>
</tr>
<tr>
<td>验证码:</td>
<td>
<!-- 显示文本“验证码:”,并创建一个文本输入框,用于输入验证码信息,其名称为"CHECK_CODE_PARAM_NAME"
用于输入服务器端生成并展示给用户的验证码内容,后续提交到服务器端进行验证 -->
<input type="text" name="CHECK_CODE_PARAM_NAME"/>
</td>
<td>
<!-- 展示一个验证码图片图片的来源是通过向指定的Servlet"/validateColorServlet")请求生成的,
这个Servlet应该是用于生成验证码图片并返回给前端展示用户需要输入图片中显示的验证码内容以此增加登录操作的安全性 -->
<img alt="" src="<%= request.getContextPath() %>/validateColorServlet">
</td>
</tr>
<tr>
<td>
<!-- 创建一个提交按钮,按钮的名称为"submit",按钮上显示的文字为“登录”,点击该按钮后将触发表单提交操作,
把表单内用户输入的账号、密码、验证码等信息发送到指定的Servlet"/loginChangeServlet")进行登录相关的验证与处理 -->
<input type="submit" name="submit" value="登录" />
</td>
<td>
<!-- 创建一个超链接,链接到“找回密码”页面("findpassword.jsp"),方便用户在忘记密码时点击进入找回密码的操作界面 -->
<a href="findpassword.jsp">找回密码</a>
</td>
</tr>
</table>
</form>
</div>
</div>
</div>
</body>
</html>

@ -1,64 +1,66 @@
<%@page import="java.util.Date"%>
<!-- 导入java.util.Date类用于后续获取时间相关操作 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 定义JSP页面的语言为Java设置页面内容类型为text/html字符编码为UTF-8 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 引入JSTLJavaServer Pages Standard Tag Library核心标签库前缀为c -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 设置页面的元信息,指定内容类型和字符编码 -->
<title>教务管理系统</title>
<!-- 设置页面的标题为“教务管理系统” -->
</head>
<body>
<!-- 修改密码页面 -->
<div class="modifyMM">
<div>
<!-- 首先生成一个代表当前时间戳从1970年1月1日00:00:00 UTC到当前时间的毫秒数的字符串
通过创建一个Date对象并调用其getTime()方法获取时间戳,然后将其转换为字符串类型,
这个时间戳值往往会在后续用于生成一个唯一标识(例如作为修改密码流程中的临时验证令牌等,用于安全相关的验证) -->
<% String tokenValue = new Date().getTime() + ""; %>
<!-- 创建一个String类型的变量tokenValue通过获取当前时间的毫秒数并转换为字符串来赋值
可能用于后续的令牌token相关验证等操作 -->
<!-- 使用JSTLJavaServer Pages Standard Tag Library的<c:set>标签将上面生成的tokenValue字符串设置到会话作用域session
并将其命名为"token",方便后续在页面或者服务器端逻辑里从会话中获取这个值,用于如合法性验证等相关操作 -->
<c:set value="<%=tokenValue %>" var="token" scope="session"/>
<!-- 使用JSTL的<c:set>标签将上面获取到的tokenValue的值设置到名为token的变量中
并将该变量的作用域设置为session方便在整个会话中使用 -->
</div>
<!-- 定义一个表单用于提交修改密码相关的信息表单将以POST方式把数据发送到指定的Servlet"/modifyPasswordServlet"
服务器端对应的处理逻辑会接收并处理这些提交的数据,例如验证旧密码是否正确、新密码与确认密码是否匹配等,进而执行修改密码的操作 -->
<form action="<%=request.getContextPath()%>/modifyPasswordServlet" method="post">
<!-- 创建一个表单表单的提交地址为通过表达式获取的应用上下文路径下的modifyPasswordServlet
提交方式为POST -->
<div>
<!-- 从会话作用域sessionScope中获取名为"message"的属性值并展示,
这个属性值通常用于显示一些提示性信息,比如修改密码操作成功或失败的反馈消息等,方便用户知晓操作结果,
然后从会话中移除这个"message"属性,这样做可能是为了避免重复显示之前的提示信息,或者对消息展示进行一定的控制 -->
${sessionScope.message }
<!-- 输出存储在session作用域中的名为message的属性值可能用于显示一些提示信息等 -->
<%session.removeAttribute("message"); %>
<!-- 移除session作用域中名为message的属性可能是为了避免重复显示等情况 -->
</div>
<div>
<!-- 创建一个隐藏域input type="hidden"),其名称为"token"值为前面生成的代表时间戳的tokenValue字符串
这个隐藏域会随着表单一起提交到服务器端,服务器端可以通过获取这个值来进行相关的验证操作,确保修改密码请求的合法性等 -->
<input type="hidden" name="token" value="<%=tokenValue %>"/>
<!-- 创建一个隐藏类型的输入框名为token其值为前面生成的tokenValue
用于在表单提交时传递这个令牌值,可能用于防止跨站请求伪造等安全验证 -->
</div>
<div class="form-group">
<!-- 显示文本“旧密码并创建一个密码输入框input type="password"),用于输入旧密码信息,其名称为"oldpassword"
用户需要在此输入自己原来的密码,以便服务器端验证其合法性,输入的密码内容会以加密形式(通常是黑点等形式显示)展示,保障安全性 -->
旧密码:<input type="password" name="oldpassword"/>
<!-- 创建一个密码类型的输入框用于用户输入旧密码其name属性设置为oldpassword方便后台获取该值 -->
</div>
<br>
<div class="form-group">
<!-- 显示文本“新密码并创建一个密码输入框input type="password"),用于输入新密码信息,其名称为"newpassword"
用户在此输入想要修改成的新密码内容,同样以加密形式显示 -->
新密码:<input type="password" name="newpassword"/>
<!-- 创建一个密码类型的输入框用于用户输入新密码其name属性设置为newpassword方便后台获取该值 -->
</div>
<br>
<div class="form-group">
<!-- 显示文本“确认密码并创建一个密码输入框input type="password"),用于再次输入新密码进行确认,其名称为"confirmpassword"
用户需要再次输入与上面“新密码”输入框中一致的内容,用于服务器端验证两次输入的新密码是否匹配 -->
确认密码:<input type="password" name="confirmpassword"/>
<!-- 创建一个密码类型的输入框用于用户再次输入新密码进行确认其name属性设置为confirmpassword
方便后台进行密码一致性验证等操作 -->
</div>
<br>
<div>
<!-- 创建一个提交按钮,按钮的名称为"submit",按钮上显示的文字为“确定”,点击该按钮后将触发表单提交操作,
把表单内用户输入的旧密码、新密码以及确认密码等信息发送到指定的Servlet"/modifyPasswordServlet")进行修改密码相关的处理 -->
<input type="submit" name="submit" value="确定" />
<!-- 创建一个提交按钮,显示文字为“确定”,点击后会提交表单 -->
<!-- 创建一个超链接链接的地址从会话作用域sessionScope中获取名为"path"的属性值,标注为“返回”,
意味着点击该链接会跳转到之前记录的某个页面(具体由"path"属性所记录的页面路径决定),方便用户返回上一步操作等 -->
<a href="${sessionScope.path }">返回</a>
<!-- 创建一个超链接链接地址为存储在session作用域中名为path的属性值显示文字为“返回”用于返回上一页等操作 -->
</div>
</form>
</div>

@ -1,42 +1,13 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
// 声明此JSP页面使用Java语言编写同时设定页面内容的类型为text/html即HTML格式
// 并且指定字符编码为UTF-8这样可以确保页面能正确显示各种字符避免出现乱码问题。
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
// 定义此HTML文档的文档类型声明表明该页面遵循HTML 4.01过渡型的规范,浏览器会根据此规范来解析页面内容。
<html>
// HTML文档的开始标签整个页面的内容都将包含在<html>和</html>这一对标签之内。
<head>
// HTML文档头部区域的开始标签通常用于放置页面的元信息如字符编码、页面标题等、引入外部样式表、脚本文件等。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
// 这是一个元信息标签通过http-equiv属性设置了HTTP头部的Content-Type字段明确告诉浏览器此页面内容类型是text/html
// 字符编码为UTF-8再次强调页面的编码格式辅助浏览器正确解析页面文本内容。
<title>Insert title here</title>
// 设置HTML页面在浏览器标题栏中显示的标题这里暂时设置了一个默认的占位标题“Insert title here”
// 实际应用中应该替换为更有意义的、能准确反映页面内容的标题。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
// HTML文档头部区域的结束标签表示头部相关内容结束。
<body>
// HTML文档主体区域的开始标签页面中所有用户可见的内容如文本、图片、表单等都将放置在此区域内。
<h1>对不起,不能重复提交</h1>
// 创建一个HTML的一级标题h1标签元素用于在页面上显示比较重要的文本信息这里显示的内容是“对不起不能重复提交”
// 通常用于向用户提示当前操作存在的限制或者错误情况等,让用户知晓不能进行重复提交的相关情况。
<a href="<%=request.getContextPath() %>/login/login.jsp">点击这里,返回登录页面...</a>
// 创建一个HTML超链接a标签其href属性通过表达式<%=request.getContextPath() %>获取当前应用的上下文路径,
// 然后拼接上“/login/login.jsp”这指定了点击该链接后要跳转的页面地址即返回到名为“login.jsp”的登录页面假设位于“login”目录下
// 超链接显示的文字为“点击这里,返回登录页面...”,引导用户通过点击此链接进行相应的页面跳转操作,回到登录页面重新操作等。
<h1>对不起,不能重复提交</h1>
<a href="<%=request.getContextPath() %>/login/login.jsp">点击这里,返回登录页面...</a>
</body>
// HTML文档主体区域的结束标签表示主体内容结束。
</html>
// HTML文档的结束标签标志整个HTML页面的结束。
</html>

@ -1,59 +1,81 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
相关用户信息会被存储在会话中,此处用于向已登录的用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet")。点击此链接后,将触发注销相关的业务逻辑,
同样借助获取上下文路径来生成正确的链接,使得用户可以顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<!-- 创建一个超链接,链接到指定的地址("/student/student.jsp"),这里标注为“返回上一步”,意味着点击该链接通常会跳转到上一次操作所在的页面,
具体跳转的页面由服务器端对该请求的处理逻辑来决定 -->
<a href="<%=request.getContextPath() %>/student/student.jsp">返回上一步</a>
</div>
<div>
<h3>业务办理</h3>
</div>
<!-- 定义一个表单用于提交免修申请相关的信息表单将以POST方式把数据发送到指定的Servlet"/exemptionApplyServlet"
服务器端对应的处理逻辑会接收并处理这些提交的数据,例如将免修申请信息保存到数据库,并进行相应的审核等后续操作 -->
<form action="<%=request.getContextPath()%>/exemptionApplyServlet" method="post">
<div>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<a href="<%=request.getContextPath() %>/student/student.jsp">返回上一步</a>
<!-- 从会话作用域sessionScope中获取名为"message"的属性值,并以红色字体展示,
这个属性值通常用于显示一些提示性信息,比如申请操作成功或失败的反馈消息等,方便用户知晓操作结果,
然后从会话中移除这个"message"属性,可能是为了避免重复显示之前的提示信息,或者对消息展示进行一定的控制 -->
<font color="RED">${sessionScope.message } </font>
<%session.removeAttribute("message"); %>
</div>
<div>
<h3>业务办理</h3>
</div>
<form action="<%=request.getContextPath()%>/exemptionApplyServlet" method="post">
<div>
<font color="RED">${sessionScope.message } </font>
<%session.removeAttribute("message"); %>
</div>
<table>
<tr>
<td>学年学期:</td>
<td>
<select name="yearTerm" >
<option value=""></option>
<option value="2017秋季">2017秋季</option>
<option value="2017春季">2017春季</option>
<option value="2016秋季">2016秋季</option>
<option value="2016春季">2016春季</option>
</select>
</td>
</tr>
<tr>
<td>免修课程:</td>
<td>
<input type="text" name="courseName"/>
</td>
</tr>
<tr>
<td>免修理由:</td>
<td>
<input type="text" name="applyReason" size=“100”/>
</td>
</tr>
<tr>
<td>
<input type="submit" value="提交申请"/>
</td>
</tr>
</table>
</form>
<table>
<!-- 通过表格形式来布局表单中的各个输入项,使得页面展示更加规整、清晰 -->
<tr>
<!-- 表格的一行中,左边单元格显示“学年学期:”的文本提示 -->
<td>学年学期:</td>
<td>
<!-- 创建一个下拉列表select其名称为"yearTerm",用户可以从下拉列表中选择相应的学年学期选项,
目前提供了几个预设的选项值如“2017秋季”“2017春季”“2016秋季”“2016春季”等同时还有一个空选项作为初始默认显示 -->
<select name="yearTerm" >
<option value=""></option>
<option value="2017秋季">2017秋季</option>
<option value="2017春季">2017春季</option>
<option value="2016秋季">2016秋季</option>
<option value="2016春季">2016春季</option>
</select>
</td>
</tr>
<tr>
<td>免修课程:</td>
<td>
<!-- 创建一个文本输入框,用于输入免修课程的名称信息,其名称为"courseName",用户需要在此输入想要申请免修的课程名称 -->
<input type="text" name="courseName"/>
</td>
</tr>
<tr>
<td>免修理由:</td>
<td>
<!-- 创建一个文本输入框,用于输入申请免修的理由信息,其名称为"applyReason"并设置了宽度可显示100个字符不过这里的size属性写法有误正确的是size="100"
用户需要在此详细填写申请免修该课程的具体理由 -->
<input type="text" name="applyReason" size="100"/>
</td>
</tr>
<tr>
<td>
<!-- 创建一个提交按钮,按钮上显示的文字为“提交申请”,点击该按钮后将触发表单提交操作,
把表单内用户选择或输入的学年学期、免修课程、免修理由等信息发送到指定的Servlet"/exemptionApplyServlet")进行免修申请相关的处理 -->
<input type="submit" value="提交申请"/>
</td>
</tr>
</table>
</form>
</body>
</html>

@ -1,59 +1,81 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
相关用户信息会存入会话中,此处用于向已登录用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet")。点击此链接后,将触发注销相关业务逻辑,
借助获取上下文路径生成正确链接,以便用户顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<!-- 创建一个超链接,链接到指定的地址("/student/student.jsp"),标注为“返回上一步”,意味着点击该链接通常会跳转到上一次操作所在页面,
具体跳转由服务器端对该请求的处理逻辑决定 -->
<a href="<%=request.getContextPath() %>/student/student.jsp">返回上一步</a>
</div>
<div>
<h3>业务办理</h3>
</div>
<!-- 定义一个表单用于提交缓考申请相关信息表单以POST方式把数据发送到指定的Servlet"/postponeExamapplyServlet"
服务器端对应的处理逻辑会接收并处理这些提交的数据,比如将缓考申请信息存入数据库,后续进行审核等操作 -->
<form action="<%=request.getContextPath()%>/postponeExamapplyServlet" method="post">
<div>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<a href="<%=request.getContextPath() %>/student/student.jsp">返回上一步</a>
<!-- 从会话作用域sessionScope中获取名为"message"的属性值,并以红色字体展示。
此属性值常用于显示提示性信息,像申请操作成功或失败的反馈消息等,方便用户知晓操作结果,
然后从会话中移除该属性,可能是避免重复显示之前提示信息,或是对消息展示做一定控制 -->
<font color="RED">${sessionScope.message } </font>
<%session.removeAttribute("message"); %>
</div>
<div>
<h3>业务办理</h3>
</div>
<form action="<%=request.getContextPath()%>/postponeExamapplyServlet" method="post">
<div>
<font color="RED">${sessionScope.message } </font>
<%session.removeAttribute("message"); %>
</div>
<table>
<tr>
<td>学年学期:</td>
<td>
<select name="yearTerm" >
<option value=""></option>
<option value="2017秋季">2017秋季</option>
<option value="2017春季">2017春季</option>
<option value="2016秋季">2016秋季</option>
<option value="2016春季">2016春季</option>
</select>
</td>
</tr>
<tr>
<td>申请课程:</td>
<td>
<input type="text" name="courseName"/>
</td>
</tr>
<tr>
<td>申请原因:</td>
<td>
<input type="text" name="applyReason" size=“100”/>
</td>
</tr>
<tr>
<td>
<input type="submit" value="提交申请"/>
</td>
</tr>
</table>
</form>
<table>
<!-- 利用表格形式布局表单内各输入项,使页面展示更规整、清晰 -->
<tr>
<!-- 表格一行中,左边单元格显示“学年学期:”文本提示 -->
<td>学年学期:</td>
<td>
<!-- 创建一个下拉列表select名称为"yearTerm",用户可从中选择相应学年学期选项。
目前预设了几个选项值如“2017秋季”“2017春季”“2016秋季”“2016春季”等还有一个空选项作为初始默认显示 -->
<select name="yearTerm" >
<option value=""></option>
<option value="2017秋季">2017秋季</option>
<option value="2017春季">2017春季</option>
<option value="2016秋季">2016秋季</option>
<option value="2016春季">2016春季</option>
</select>
</td>
</tr>
<tr>
<td>申请课程:</td>
<td>
<!-- 创建一个文本输入框,用于输入申请缓考的课程名称信息,名称为"courseName",用户需在此输入想申请缓考的课程名 -->
<input type="text" name="courseName"/>
</td>
</tr>
<tr>
<td>申请原因:</td>
<td>
<!-- 创建一个文本输入框,用于输入申请缓考的原因信息,名称为"applyReason"并设置宽度可显示100个字符这里size属性写法有误正确是size="100"
用户需在此详细填写申请缓考该课程的具体原因 -->
<input type="text" name="applyReason" size="100"/>
</td>
</tr>
<tr>
<td>
<!-- 创建一个提交按钮,按钮上显示文字“提交申请”,点击后触发表单提交操作,
把表单内用户选择或输入的学年学期、申请课程、申请原因等信息发送到指定Servlet"/postponeExamapplyServlet")进行缓考申请相关处理 -->
<input type="submit" value="提交申请"/>
</td>
</tr>
</table>
</form>
</body>
</html>

@ -2,94 +2,121 @@
<%@page import="com.hua.entity.OptionalCourse"%>
<%@page import="java.nio.channels.SeekableByteChannel"%>
<%@ 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" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<div>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<a href="<%=request.getContextPath() %>/student/student.jsp">返回上一步</a>
</div>
<div>
<h3>选课报名</h3>
<form action="<%=request.getContextPath()%>/queryOptionalCourse.optional" method="post">
<div>
<font color="RED">${sessionScope.message } </font>
<%session.removeAttribute("message"); %>
</div>
<table>
<tr>
<td>学年学期:</td>
<td>
<select name="yearTerm" >
<option value=""></option>
<option value="2017秋季">2017秋季</option>
<option value="2017春季">2017春季</option>
<option value="2016秋季">2016秋季</option>
<option value="2016春季">2016春季</option>
</select>
</td>
</tr>
<tr>
<td>
<input type="submit" value="查询"/>
</td>
</tr>
</table>
</form>
</div>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet")。点击此链接后,将触发注销相关的业务逻辑,
同样借助获取上下文路径来生成正确的链接,使得用户可以顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
${sessionScope.message }
<%session.removeAttribute("message"); %>
<c:if test="${sessionScope.map != null }">
<!-- 创建一个超链接,链接到指定的地址("/student/student.jsp"),这里标注为“返回上一步”,意味着点击该链接通常会跳转到上一次操作所在的页面,
具体跳转的页面由服务器端对该请求的处理逻辑来决定 -->
<a href="<%=request.getContextPath() %>/student/student.jsp">返回上一步</a>
</div>
<div>
<h3>选课报名</h3>
<!-- 定义一个表单用于提交查询可选课程相关的信息表单将以POST方式把数据发送到指定的地址"/queryOptionalCourse.optional"
服务器端对应的处理逻辑会接收并处理这些提交的数据,例如根据选择的学年学期等条件在数据库中查询符合要求的可选课程信息 -->
<form action="<%=request.getContextPath()%>/queryOptionalCourse.optional" method="post">
<div>
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<th>学年学期</th>
<th>课程编号</th>
<th>课程名称</th>
<th>学分</th>
<th>课程类型</th>
<th>任课老师</th>
<th>上课方式</th>
<th>上课时间</th>
<th>是否已报名</th>
<th></th>
</tr>
<%
Map<OptionalCourse, String> map = (Map<OptionalCourse, String>)session.getAttribute("map");
for(Map.Entry<OptionalCourse, String> entry : map.entrySet()){
%>
<tr>
<td><%= entry.getKey().getYearTerm() %></td>
<td><%= entry.getKey().getCourseId() %></td>
<td><%= entry.getKey().getCourseName() %></td>
<td><%= entry.getKey().getCredit() %></td>
<td><%= entry.getKey().getCourseType() %></td>
<td><%= entry.getKey().getTeacher() %></td>
<td><%= entry.getKey().getClassWay() %></td>
<td><%= entry.getKey().getClassTime() %></td>
<td><%= entry.getValue() %></td>
<td>
<a href="<%=request.getContextPath()%>/studentApply.optional?courseId=<%= entry.getKey().getCourseId()%>">报名</a>
</td>
</tr>
<%
}
%>
</table>
<!-- 从会话作用域sessionScope中获取名为"message"的属性值,并以红色字体展示,
这个属性值通常用于显示一些提示性信息,比如查询操作成功或失败的反馈消息等,方便用户知晓操作结果,
然后从会话中移除这个"message"属性,可能是为了避免重复显示之前的提示信息,或者对消息展示进行一定的控制 -->
<font color="RED">${sessionScope.message } </font>
<%session.removeAttribute("message"); %>
</div>
</c:if>
<table>
<!-- 通过表格形式来布局表单中的各个输入项,使得页面展示更加规整、清晰 -->
<tr>
<td>学年学期:</td>
<td>
<!-- 创建一个下拉列表select其名称为"yearTerm",用户可以从下拉列表中选择相应的学年学期选项,
目前提供了几个预设的选项值如“2017秋季”“2017春季”“2016秋季”“2016春季”等同时还有一个空选项作为初始默认显示 -->
<select name="yearTerm" >
<option value=""></option>
<option value="2017秋季">2017秋季</option>
<option value="2017春季">2017春季</option>
<option value="2016秋季">2016秋季</option>
<option value="2016春季">2016春季</option>
</select>
</td>
</tr>
<tr>
<td>
<!-- 创建一个提交按钮,按钮上显示的文字为“查询”,点击该按钮后将触发表单提交操作,
把表单内用户选择的学年学期信息发送到指定的地址("/queryOptionalCourse.optional")进行可选课程查询相关的处理 -->
<input type="submit" value="查询"/>
</td>
</tr>
</table>
</form>
</div>
<br><br>
<!-- 再次从会话作用域中获取名为"message"的属性值并展示(可能是用于展示一些额外的提示信息),然后移除该属性,同样是为了控制消息展示情况 -->
${sessionScope.message }
<%session.removeAttribute("message"); %>
<!-- 使用JSTL的<c:if>标签进行条件判断判断会话作用域sessionScope中名为"map"的属性是否不为空,
如果不为空,则执行下面包含的代码块,用于展示可选课程相关的详细信息表格 -->
<c:if test="${sessionScope.map!= null }">
<div>
<!-- 创建一个带有边框border="1"且单元格间距cellspacing和内边距cellpadding都为0的表格用于展示可选课程的详细信息 -->
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<!-- 表格表头行,定义了各个列显示的标题,分别对应不同的可选课程相关信息字段,如学年学期、课程编号、课程名称等 -->
<th>学年学期</th>
<th>课程编号</th>
<th>课程名称</th>
<th>学分</th>
<th>课程类型</th>
<th>任课老师</th>
<th>上课方式</th>
<th>上课时间</th>
<th>是否已报名</th>
<th></th>
</tr>
<%
// 从会话作用域中获取名为"map"的属性值并强制转换为Map<OptionalCourse, String>类型,
// 这个map中键为OptionalCourse类型的对象可能包含课程详细信息值为表示是否已报名的字符串信息。
Map<OptionalCourse, String> map = (Map<OptionalCourse, String>) session.getAttribute("map");
// 循环遍历这个map集合对于每一个键值对即每一门可选课程及其对应的报名状态信息在表格中添加一行来展示详细内容。
for (Map.Entry<OptionalCourse, String> entry : map.entrySet()) {
%>
<tr>
<!-- 在表格的单元格中通过Java代码片段<%= %>输出OptionalCourse对象对应的各个属性值以及报名状态字符串展示课程的详细信息 -->
<td><%= entry.getKey().getYearTerm() %></td>
<td><%= entry.getKey().getCourseId() %></td>
<td><%= entry.getKey().getCourseName() %></td>
<td><%= entry.getKey().getCredit() %></td>
<td><%= entry.getKey().getCourseType() %></td>
<td><%= entry.getKey().getTeacher() %></td>
<td><%= entry.getKey().getClassWay() %></td>
<td><%= entry.getKey().getClassTime() %></td>
<td><%= entry.getValue() %></td>
<td>
<!-- 创建一个超链接,链接到指定的地址("/studentApply.optional?courseId=<%= entry.getKey().getCourseId()%>"
并通过URL参数传递课程编号信息标注为“报名”意味着点击该链接可以进行对应课程的报名操作具体报名逻辑由服务器端处理 -->
<a href="<%=request.getContextPath()%>/studentApply.optional?courseId=<%= entry.getKey().getCourseId()%>">报名</a>
</td>
</tr>
<%
}
%>
</table>
</div>
</c:if>
</body>
</html>

@ -4,90 +4,117 @@
<%@page import="java.util.List"%>
<%@page import="java.nio.channels.SeekableByteChannel"%>
<%@ 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" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<div>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<a href="<%=request.getContextPath() %>/student/student.jsp">返回上一步</a>
</div>
<div>
<h3>考级报名</h3>
<form action="<%=request.getContextPath()%>/query.apply" method="post">
<div>
<font color="RED">${sessionScope.message } </font>
<%session.removeAttribute("message"); %>
</div>
<table>
<tr>
<td>学年学期:</td>
<td>
<select name="yearTerm" >
<option value=""></option>
<option value="2017秋季">2017秋季</option>
<option value="2017春季">2017春季</option>
<option value="2016秋季">2016秋季</option>
<option value="2016春季">2016春季</option>
</select>
</td>
</tr>
<tr>
<td>
<input type="submit" value="查询"/>
</td>
</tr>
</table>
</form>
</div>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet")。点击此链接后,将触发注销相关的业务逻辑,
同样借助获取上下文路径来生成正确的链接,使得用户可以顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
${sessionScope.message }
<%session.removeAttribute("message"); %>
<c:if test="${sessionScope.map != null }">
<!-- 创建一个超链接,链接到指定的地址("/student/student.jsp"),这里标注为“返回上一步”,意味着点击该链接通常会跳转到上一次操作所在的页面,
具体跳转的页面由服务器端对该请求的处理逻辑来决定 -->
<a href="<%=request.getContextPath() %>/student/student.jsp">返回上一步</a>
</div>
<div>
<h3>考级报名</h3>
<!-- 定义一个表单用于提交查询考级相关信息的请求表单以POST方式把数据发送到指定的地址"/query.apply"
服务器端对应的处理逻辑会接收并处理这些提交的数据,例如根据选择的学年学期等条件,在数据库中查询符合要求的考级课程信息 -->
<form action="<%=request.getContextPath()%>/query.apply" method="post">
<div>
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<th>学年学期</th>
<th>考级课程编号</th>
<th>考级课程</th>
<th>报名时间</th>
<th>考试时间</th>
<th>报名金额</th>
<th>是否已报名</th>
<th></th>
</tr>
<%
Map<LevelExam, String> map = (Map<LevelExam, String>)session.getAttribute("map");
for(Map.Entry<LevelExam, String> entry : map.entrySet()){
%>
<tr>
<td><%= entry.getKey().getYearTerm() %></td>
<td><%= entry.getKey().getCourseId() %></td>
<td><%= entry.getKey().getCourseName() %></td>
<td><%= entry.getKey().getApplyTime() %></td>
<td><%= entry.getKey().getExamTime() %></td>
<td><%= entry.getKey().getExamCost() %></td>
<td><%= entry.getValue() %></td>
<td>
<a href="<%=request.getContextPath()%>/apply.apply?courseId=<%= entry.getKey().getCourseId()%>">报名</a>
</td>
</tr>
<%
}
%>
</table>
<!-- 从会话作用域sessionScope中获取名为"message"的属性值,并以红色字体展示。
这个属性值通常用于显示一些提示性信息,比如查询操作成功或失败的反馈消息等,方便用户知晓操作结果,
然后从会话中移除这个"message"属性,可能是为了避免重复显示之前的提示信息,或者对消息展示进行一定的控制 -->
<font color="RED">${sessionScope.message } </font>
<%session.removeAttribute("message"); %>
</div>
</c:if>
<table>
<!-- 通过表格形式来布局表单中的各个输入项,使页面展示更加规整、清晰 -->
<tr>
<td>学年学期:</td>
<td>
<!-- 创建一个下拉列表select其名称为"yearTerm",用户可以从下拉列表中选择相应的学年学期选项。
目前提供了几个预设的选项值如“2017秋季”“2017春季”“2016秋季”“2016春季”等同时还有一个空选项作为初始默认显示 -->
<select name="yearTerm" >
<option value=""></option>
<option value="2017秋季">2017秋季</option>
<option value="2017春季">2017春季</option>
<option value="2016秋季">2016秋季</option>
<option value="2016春季">2016春季</option>
</select>
</td>
</tr>
<tr>
<td>
<!-- 创建一个提交按钮,按钮上显示的文字为“查询”,点击该按钮后将触发表单提交操作,
把表单内用户选择的学年学期信息发送到指定的地址("/query.apply")进行考级课程查询相关的处理 -->
<input type="submit" value="查询"/>
</td>
</tr>
</table>
</form>
</div>
<br><br>
<!-- 再次从会话作用域中获取名为"message"的属性值并展示(可能用于展示额外的提示信息),然后移除该属性,目的同样是为了控制消息展示情况 -->
${sessionScope.message }
<%session.removeAttribute("message"); %>
<!-- 使用JSTL的<c:if>标签进行条件判断检查会话作用域sessionScope中名为"map"的属性是否不为空。
若不为空,则执行下面包含的代码块,用于展示考级课程相关的详细信息表格 -->
<c:if test="${sessionScope.map!= null }">
<div>
<!-- 创建一个带有边框border="1"且单元格间距cellspacing和内边距cellpadding都为0的表格用于展示考级课程的详细信息 -->
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<!-- 表格表头行,定义了各列显示的标题,分别对应不同的考级课程相关信息字段,如学年学期、考级课程编号、考级课程名称等 -->
<th>学年学期</th>
<th>考级课程编号</th>
<th>考级课程</th>
<th>报名时间</th>
<th>考试时间</th>
<th>报名金额</th>
<th>是否已报名</th>
<th></th>
</tr>
<%
// 从会话作用域中获取名为"map"的属性值并强制转换为Map<LevelExam, String>类型。
// 其中键是LevelExam类型的对象可能包含考级课程的详细信息值是表示是否已报名的字符串信息。
Map<LevelExam, String> map = (Map<LevelExam, String>) session.getAttribute("map");
// 循环遍历这个map集合针对每一个键值对即每一门考级课程及其对应的报名状态信息在表格中添加一行来展示详细内容。
for (Map.Entry<LevelExam, String> entry : map.entrySet()) {
%>
<tr>
<!-- 在表格的单元格中通过Java代码片段<%= %>输出LevelExam对象对应的各个属性值以及报名状态字符串展示考级课程的详细信息 -->
<td><%= entry.getKey().getYearTerm() %></td>
<td><%= entry.getKey().getCourseId() %></td>
<td><%= entry.getKey().getCourseName() %></td>
<td><%= entry.getKey().getApplyTime() %></td>
<td><%= entry.getKey().getExamTime() %></td>
<td><%= entry.getKey().getExamCost() %></td>
<td><%= entry.getValue() %></td>
<td>
<!-- 创建一个超链接,链接到指定的地址("/apply.apply?courseId=<%= entry.getKey().getCourseId()%>"
并通过URL参数传递课程编号信息标注为“报名”意味着点击该链接可进行对应考级课程的报名操作具体报名逻辑由服务器端处理 -->
<a href="<%=request.getContextPath()%>/apply.apply?courseId=<%= entry.getKey().getCourseId()%>">报名</a>
</td>
</tr>
<%
}
%>
</table>
</div>
</c:if>
</body>
</html>

@ -1,68 +1,80 @@
<%@page import="java.util.List"%>
<%@page import="com.hua.entity.StudentGrade"%>
<%@ 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" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<div>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/login/login.jsp">注销</a>
</div>
<br><br>
<a href="<%=request.getContextPath() %>/student/informationinquiry/informationinquiry.jsp">返回上一步</a>
<div>
<h3>课程成绩</h3>
</div>
<table border="2" cellpadding="0" cellspacing="0">
<tr>
<th>学年学期</th>
<th>学号</th>
<th>学生姓名</th>
<th>课程编号</th>
<th>课程名称</th>
<th>成绩</th>
<th>绩点</th>
<th>学分</th>
<th>课程大类</th>
<th>修读方式</th>
<th>考试性质</th>
<th>成绩方式</th>
<th>有效</th>
<th>备注</th>
</tr>
<%
List<StudentGrade> studentGrades = (List<StudentGrade>)session.getAttribute("studentGrades");
%>
<%
for(StudentGrade student : studentGrades){
%>
<tr>
<td><%= student.getYearTerm()%></td>
<td><%= student.getStudentId()%></td>
<td><%= student.getStudentName()%></td>
<td><%= student.getCourseId()%></td>
<td><%= student.getCourseName()%></td>
<td><%= student.getScore() %></td>
<td><%= student.getGradePoint() %></td>
<td><%= student.getCredit() %></td>
<td><%= student.getCourseClass() %></td>
<td><%= student.getStudyWay() %></td>
<td><%= student.getExamWay() %></td>
<td><%= student.getGradeWay() %></td>
<td><%= student.getEffectivity() %></td>
<td><%= student.getRemarks() %></td>
</tr>
<%
}
%>
</table>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接,链接到登录页面("/login/login.jsp"),标注为“注销”,这里虽然文字表述为“注销”但从链接指向来看是跳转到登录页面,
正常情况下注销操作应该是清除用户登录状态等相关逻辑,可能此处逻辑存在不太准确的地方,不过也许后续有对应的处理使其能实现注销功能 -->
<a href="<%=request.getContextPath()%>/login/login.jsp">注销</a>
</div>
<br><br>
<!-- 创建一个超链接,链接到指定的地址("/student/informationinquiry/informationinquiry.jsp"),标注为“返回上一步”,意味着点击该链接通常会跳转到上一次操作所在的页面,
具体跳转的页面由服务器端对该请求的处理逻辑来决定 -->
<a href="<%=request.getContextPath() %>/student/informationinquiry/informationinquiry.jsp">返回上一步</a>
<div>
<h3>课程成绩</h3>
</div>
<!-- 创建一个带有边框border="2"且单元格间距cellspacing和内边距cellpadding都为0的表格用于展示学生课程成绩相关的详细信息 -->
<table border="2" cellpadding="0" cellspacing="0">
<tr>
<!-- 表格表头行,定义了各个列显示的标题,分别对应不同的课程成绩相关信息字段,如学年学期、学号、学生姓名、课程编号等众多字段 -->
<th>学年学期</th>
<th>学号</th>
<th>学生姓名</th>
<th>课程编号</th>
<th>课程名称</th>
<th>成绩</th>
<th>绩点</th>
<th>学分</th>
<th>课程大类</th>
<th>修读方式</th>
<th>考试性质</th>
<th>成绩方式</th>
<th>有效</th>
<th>备注</th>
</tr>
<%
// 从会话作用域sessionScope中获取名为"studentGrades"的属性值并强制转换为List<StudentGrade>类型,
// 这个列表应该是存储了多个学生成绩相关的对象,每个对象包含了如成绩、课程信息等各种属性,通常是由服务器端查询数据库等操作后放入会话中的。
List<StudentGrade> studentGrades = (List<StudentGrade>) session.getAttribute("studentGrades");
// 循环遍历获取到的学生成绩列表对于每个StudentGrade对象在表格中添加一行来展示其对应的各项成绩相关详细信息。
for (StudentGrade student : studentGrades) {
%>
<tr>
<!-- 在表格的单元格中通过Java代码片段<%= %>输出StudentGrade对象对应的各个属性值展示每门课程成绩的详细信息比如学年学期、具体成绩数值等 -->
<td><%= student.getYearTerm()%></td>
<td><%= student.getStudentId()%></td>
<td><%= student.getStudentName()%></td>
<td><%= student.getCourseId()%></td>
<td><%= student.getCourseName()%></td>
<td><%= student.getScore() %></td>
<td><%= student.getGradePoint() %></td>
<td><%= student.getCredit() %></td>
<td><%= student.getCourseClass() %></td>
<td><%= student.getStudyWay() %></td>
<td><%= student.getExamWay() %></td>
<td><%= student.getGradeWay() %></td>
<td><%= student.getEffectivity() %></td>
<td><%= student.getRemarks() %></td>
</tr>
<%
}
%>
</table>
</body>
</html>

@ -4,181 +4,212 @@
<%@page import="com.hua.entity.CourseSchedule"%>
<%@page import="java.util.List"%>
<%@ 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" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接,链接到登录页面("/login/login.jsp"),标注为“注销”,不过正常注销操作一般需要有清除用户登录状态等相关逻辑,
这里只是跳转到登录页面,或许后续有其他处理使其能实现真正的注销功能,目前从链接指向来看逻辑不太准确 -->
<a href="<%=request.getContextPath()%>/login/login.jsp">注销</a>
</div>
<br><br>
<!-- 创建一个超链接,链接到指定的地址("/student/informationinquiry/informationinquiry.jsp"),标注为“返回上一步”,意味着点击该链接通常会跳转到上一次操作所在的页面,
具体跳转的页面由服务器端对该请求的处理逻辑来决定 -->
<a href="<%=request.getContextPath() %>/student/informationinquiry/informationinquiry.jsp">返回上一步</a>
<div>
<h3>课表查询</h3>
</div>
<!-- 定义一个表单用于提交课表查询相关的条件信息表单将以POST方式把数据发送到指定的Servlet"/courseScheduleServlet"
服务器端对应的处理逻辑会接收并处理这些提交的数据,例如根据选择的学年学期和周次等条件,从数据库中查询相应的课程安排信息 -->
<form action="<%=request.getContextPath()%>/courseScheduleServlet" method="post">
<div>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/login/login.jsp">注销</a>
<!-- 显示文本“学年学期:”并创建一个下拉列表select用于选择学年学期其名称为"yearTerm"
提供了几个预设的选项值如“2017秋季”“2017春季”“2016秋季”“2016春季”等同时还有一个空选项作为初始默认显示 -->
学年学期:
<select name="yearTerm">
<option value=""></option>
<option value="2017秋季">2017秋季</option>
<option value="2017春季">2017春季</option>
<option value="2016秋季">2016秋季</option>
<option value="2016春季">2016春季</option>
</select>
<!-- 显示文本“周次并创建一个下拉列表select用于选择周次其名称为"week"
提供了从“第1周”到“第20周”等多个预设的选项值同时也有一个空选项作为初始默认显示 -->
周次:
<select name="week">
<option value=""></option>
<option value="第1周">第1周</option>
<option value="第2周">第2周</option>
<option value="第3周">第3周</option>
<option value="第4周">第4周</option>
<option value="第5周">第5周</option>
<option value="第6周">第6周</option>
<option value="第7周">第7周</option>
<option value="第8周">第8周</option>
<option value="第9周">第9周</option>
<option value="第10周">第10周</option>
<option value="第11周">第11周</option>
<option value="第12周">第12周</option>
<option value="第13周">第13周</option>
<option value="第14周">第14周</option>
<option value="第15周">第15周</option>
<option value="第16周">第16周</option>
<option value="第17周">第17周</option>
<option value="第18周">第18周</option>
<option value="第19周">第19周</option>
<option value="第20周">第20周</option>
</select>
<!-- 创建一个提交按钮,按钮上显示的文字为“查询”,点击该按钮后将触发表单提交操作,
把表单内用户选择的学年学期和周次信息发送到指定的Servlet"/courseScheduleServlet")进行课表查询相关的处理 -->
<input type="submit" value="查询"/>
</div>
<br><br>
<a href="<%=request.getContextPath() %>/student/informationinquiry/informationinquiry.jsp">返回上一步</a>
<div>
<h3>课表查询</h3>
</div>
<form action="<%=request.getContextPath()%>/courseScheduleServlet" method="post">
<div>
学年学期:
<select name="yearTerm">
<option value=""></option>
<option value="2017秋季">2017秋季</option>
<option value="2017春季">2017春季</option>
<option value="2016秋季">2016秋季</option>
<option value="2016春季">2016春季</option>
</select>
周次:
<select name="week">
<option value=""></option>
<option value="第1周">第1周</option>
<option value="第2周">第2周</option>
<option value="第3周">第3周</option>
<option value="第4周">第4周</option>
<option value="第5周">第5周</option>
<option value="第6周">第6周</option>
<option value="第7周">第7周</option>
<option value="第8周">第8周</option>
<option value="第9周">第9周</option>
<option value="第10周">第10周</option>
<option value="第11周">第11周</option>
<option value="第12周">第12周</option>
<option value="第13周">第13周</option>
<option value="第14周">第14周</option>
<option value="第15周">第15周</option>
<option value="第16周">第16周</option>
<option value="第17周">第17周</option>
<option value="第18周">第18周</option>
<option value="第19周">第19周</option>
<option value="第20周">第20周</option>
</select>
<input type="submit" value="查询"/>
</div>
</form>
<c:if test="${sessionScope.courseScheduleShows != null }">
<table border="2" cellpadding="0" cellspacing="0">
<tr>
<th height="50px"></th>
<th height="50px">星期一</th>
<th height="50px">星期二</th>
<th height="50px">星期三</th>
<th height="50px">星期四</th>
<th height="50px">星期五</th>
<th height="50px">星期六</th>
<th height="50px">星期日</th>
</tr>
</form>
<!-- 使用JSTL的<c:if>标签进行条件判断检查会话作用域sessionScope中名为"courseScheduleShows"的属性是否不为空,
如果不为空,则执行下面包含的代码块,用于展示课程表相关的详细信息表格 -->
<c:if test="${sessionScope.courseScheduleShows!= null }">
<!-- 创建一个带有边框border="2"且单元格间距cellspacing和内边距cellpadding都为0的表格用于展示课程表的详细安排信息 -->
<table border="2" cellpadding="0" cellspacing="0">
<tr>
<!-- 表格表头行,第一列留空(设置了一定高度),后面依次设置各列标题为从星期一到星期日,用于对应显示每天的课程安排 -->
<th height="50px"></th>
<th height="50px">星期一</th>
<th height="50px">星期二</th>
<th height="50px">星期三</th>
<th height="50px">星期四</th>
<th height="50px">星期五</th>
<th height="50px">星期六</th>
<th height="50px">星期日</th>
</tr>
<%
// 从会话作用域中获取名为"courseScheduleShows"的属性值并强制转换为List<CourseScheduleShow>类型,
// 这个列表应该是存储了多个课程安排展示相关的对象,每个对象包含了对应某天课程的详细信息,通常是由服务器端查询数据库等操作后放入会话中的。
List<CourseScheduleShow> courseScheduleShows = (List<CourseScheduleShow>) session.getAttribute("courseScheduleShows");
// 从会话中移除"courseScheduleShows"属性,可能是为了避免后续重复使用或者对其进行更新等操作时出现数据不一致等问题,
// 也有可能是释放会话空间等目的(不过具体要结合整个系统的设计来看)。
session.removeAttribute("courseScheduleShows");
// 循环遍历获取到的课程安排展示列表对于每个CourseScheduleShow对象在表格中添加一行来展示其对应的一周内每天课程安排的详细信息。
for (CourseScheduleShow courseScheduleShow : courseScheduleShows) {
%>
<tr>
<!-- 在表格的第一列单元格中居中显示CourseScheduleShow对象中某个用于关联或标识的属性值这里是"joint"属性,具体含义要看对应实体类定义),
同时设置了单元格的高度和宽度 -->
<td align="center" height="100px" width="100px"><%=courseScheduleShow.getJoint() %></td>
<td height="100px" width="150px">
<%
// 判断当前CourseScheduleShow对象中表示星期一课程安排的属性是否不为空如果不为空则展示该课程的相关信息包括课程名称、任课教师、上课地点等。
if (courseScheduleShow.getMonday()!= null) {
%>
<%=courseScheduleShow.getMonday().getCourse() %>
<br>
<%=courseScheduleShow.getMonday().getTeacher() %>
<br>
<%=courseScheduleShow.getMonday().getClassplace() %>
<%
}
%>
</td>
<td height="100px" width="150px">
<%
// 类似地,判断星期二课程安排属性是否为空,不为空则展示对应课程的课程名称、任课教师、上课地点等信息。
if (courseScheduleShow.getTuesday()!= null) {
%>
<%=courseScheduleShow.getTuesday().getCourse() %>
<br>
<%=courseScheduleShow.getTuesday().getTeacher() %>
<br>
<%=courseScheduleShow.getTuesday().getClassplace() %>
<%
}
%>
</td>
<td height="100px" width="150px">
<%
// 判断星期三课程安排属性是否为空,不为空则展示对应课程的相关信息。
if (courseScheduleShow.getWesneday()!= null) {
%>
<%=courseScheduleShow.getWesneday().getCourse() %>
<br>
<%=courseScheduleShow.getWesneday().getTeacher() %>
<br>
<%=courseScheduleShow.getWesneday().getClassplace() %>
<%
}
%>
</td>
<td height="100px" width="150px">
<%
// 判断星期四课程安排属性是否为空,不为空则展示对应课程的相关信息。
if (courseScheduleShow.getThursday()!= null) {
%>
<%=courseScheduleShow.getThursday().getCourse() %>
<br>
<%=courseScheduleShow.getThursday().getTeacher() %>
<br>
<%=courseScheduleShow.getThursday().getClassplace() %>
<%
}
%>
</td>
<td height="100px" width="150px">
<%
// 判断星期五课程安排属性是否为空,不为空则展示对应课程的相关信息。
if (courseScheduleShow.getFriday()!= null) {
%>
<%=courseScheduleShow.getFriday().getCourse() %>
<br>
<%=courseScheduleShow.getFriday().getTeacher() %>
<br>
<%=courseScheduleShow.getFriday().getClassplace() %>
<%
}
%>
</td>
<td height="100px" width="150px">
<%
// 判断星期六课程安排属性是否为空,不为空则展示对应课程的相关信息。
if (courseScheduleShow.getSaturday()!= null) {
%>
<%=courseScheduleShow.getSaturday().getCourse() %>
<br>
<%=courseScheduleShow.getSaturday().getTeacher() %>
<br>
<%=courseScheduleShow.getSaturday().getClassplace() %>
<%
}
%>
</td>
<td height="100px" width="150px">
<%
// 判断星期日课程安排属性是否为空,不为空则展示对应课程的相关信息。
if (courseScheduleShow.getSunday()!= null) {
%>
<%=courseScheduleShow.getSunday().getCourse() %>
<br>
<%=courseScheduleShow.getSunday().getTeacher() %>
<br>
<%=courseScheduleShow.getSunday().getClassplace() %>
<%
List<CourseScheduleShow> courseScheduleShows = (List<CourseScheduleShow>)session.getAttribute("courseScheduleShows");
session.removeAttribute("courseScheduleShows");
for(CourseScheduleShow courseScheduleShow : courseScheduleShows){
%>
<tr>
<td align="center" height="100px" width="100px"><%=courseScheduleShow.getJoint() %></td>
<td height="100px" width="150px">
<%
if(courseScheduleShow.getMonday() != null){
%>
<%=courseScheduleShow.getMonday().getCourse() %>
<br>
<%=courseScheduleShow.getMonday().getTeacher() %>
<br>
<%=courseScheduleShow.getMonday().getClassplace() %>
<%
}
%>
</td>
<td height="100px" width="150px">
<%
if(courseScheduleShow.getTuesday() != null){
%>
<%=courseScheduleShow.getTuesday().getCourse() %>
<br>
<%=courseScheduleShow.getTuesday().getTeacher() %>
<br>
<%=courseScheduleShow.getTuesday().getClassplace() %>
<%
}
%>
</td>
<td height="100px" width="150px">
<%
if(courseScheduleShow.getWesneday() != null){
%>
<%=courseScheduleShow.getWesneday().getCourse() %>
<br>
<%=courseScheduleShow.getWesneday().getTeacher() %>
<br>
<%=courseScheduleShow.getWesneday().getClassplace() %>
<%
}
%>
</td>
<td height="100px" width="150px">
<%
if(courseScheduleShow.getThursday() != null){
%>
<%=courseScheduleShow.getThursday().getCourse() %>
<br>
<%=courseScheduleShow.getThursday().getTeacher() %>
<br>
<%=courseScheduleShow.getThursday().getClassplace() %>
<%
}
%>
</td>
<td height="100px" width="150px">
<%
if(courseScheduleShow.getFriday() != null){
%>
<%=courseScheduleShow.getFriday().getCourse() %>
<br>
<%=courseScheduleShow.getFriday().getTeacher() %>
<br>
<%=courseScheduleShow.getFriday().getClassplace() %>
<%
}
%>
</td>
<td height="100px" width="150px">
<%
if(courseScheduleShow.getSaturday() != null){
%>
<%=courseScheduleShow.getSaturday().getCourse() %>
<br>
<%=courseScheduleShow.getSaturday().getTeacher() %>
<br>
<%=courseScheduleShow.getSaturday().getClassplace() %>
<%
}
%>
</td>
<td height="100px" width="150px">
<%
if(courseScheduleShow.getSunday() != null){
%>
<%=courseScheduleShow.getSunday().getCourse() %>
<br>
<%=courseScheduleShow.getSunday().getTeacher() %>
<br>
<%=courseScheduleShow.getSunday().getClassplace() %>
<%
}
%>
</td>
</tr>
<%
}
%>
</table>
</c:if>
</td>
</tr>
<%
}
%>
</table>
</c:if>
</body>
</html>

@ -1,79 +1,100 @@
<%@page import="com.hua.entity.ExamArrange"%>
<%@page import="java.util.List"%>
<%@ 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" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接,链接到登录页面("/login/login.jsp"),标注为“注销”,不过正常情况下注销操作一般需要有清除用户登录状态等相关逻辑,
这里只是跳转到登录页面,可能后续有其他处理使其能实现真正的注销功能,目前从链接指向来看逻辑不太准确 -->
<a href="<%=request.getContextPath()%>/login/login.jsp">注销</a>
</div>
<br><br>
<!-- 创建一个超链接,链接到指定的地址("/student/informationinquiry/informationinquiry.jsp"),标注为“返回上一步”,意味着点击该链接通常会跳转到上一次操作所在的页面,
具体跳转的页面由服务器端对该请求的处理逻辑来决定 -->
<a href="<%=request.getContextPath() %>/student/informationinquiry/informationinquiry.jsp">返回上一步</a>
<div>
<h3>考试安排</h3>
</div>
<!-- 定义一个表单用于提交考试安排查询相关的条件信息表单将以POST方式把数据发送到指定的Servlet"/examArrangeServlet"
服务器端对应的处理逻辑会接收并处理这些提交的数据,例如根据选择的学年学期条件,从数据库中查询相应的考试安排信息 -->
<form action="<%=request.getContextPath()%>/examArrangeServlet" method="post">
<div>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/login/login.jsp">注销</a>
<!-- 显示文本“学年学期:”并创建一个下拉列表select用于选择学年学期其名称为"yearTerm"
提供了几个预设的选项值如“2017秋季”“2017春季”“2016秋季”“2016春季”等同时还有一个空选项作为初始默认显示 -->
学年学期:
<select name="yearTerm">
<option value=""></option>
<option value="2017秋季">2017秋季</option>
<option value="2017春季">2017春季</option>
<option value="2016秋季">2016秋季</option>
<option value="2016春季">2016春季</option>
</select>
<!-- 创建一个提交按钮,按钮上显示的文字为“查询”,点击该按钮后将触发表单提交操作,
把表单内用户选择的学年学期信息发送到指定的Servlet"/examArrangeServlet")进行考试安排查询相关的处理 -->
<input type="submit" value="查询"/>
</div>
<br><br>
<a href="<%=request.getContextPath() %>/student/informationinquiry/informationinquiry.jsp">返回上一步</a>
<div>
<h3>考试安排</h3>
</div>
<form action="<%=request.getContextPath()%>/examArrangeServlet" method="post">
<div>
学年学期:
<select name="yearTerm">
<option value=""></option>
<option value="2017秋季">2017秋季</option>
<option value="2017春季">2017春季</option>
<option value="2016秋季">2016秋季</option>
<option value="2016春季">2016春季</option>
</select>
<input type="submit" value="查询"/>
</div>
</form>
<c:if test="${sessionScope.examArranges != null }">
</form>
<!-- 使用JSTL的<c:if>标签进行条件判断检查会话作用域sessionScope中名为"examArranges"的属性是否不为空,
如果不为空,则执行下面包含的代码块,用于展示考试安排相关的详细信息表格 -->
<c:if test="${sessionScope.examArranges!= null }">
<!-- 创建一个带有边框border="2"且单元格间距cellspacing和内边距cellpadding都为0的表格用于展示考试安排的详细信息 -->
<table border="2" cellpadding="0" cellspacing="0">
<tr>
<th>学年学期</th>
<th>学号</th>
<th>学生姓名</th>
<th>考试课程</th>
<th>考试形式</th>
<th>考试日期</th>
<th>考试时间</th>
<th>考试周次</th>
<th>考试校区</th>
<th>考试地点</th>
<th>考试座位号</th>
</tr>
<%
List<ExamArrange> examArranges = (List<ExamArrange>)session.getAttribute("examArranges");
session.removeAttribute("examArranges");
%>
<%
for(ExamArrange examArrange : examArranges){
%>
<tr>
<td><%= examArrange.getYearTerm()%></td>
<td><%= examArrange.getStudentId()%></td>
<td><%= examArrange.getStudentName()%></td>
<td><%= examArrange.getExamCourse()%></td>
<td><%= examArrange.getExamWay()%></td>
<td><%= examArrange.getExamDate() %></td>
<td><%= examArrange.getExamTime() %></td>
<td><%= examArrange.getExamWeek() %></td>
<td><%= examArrange.getExamCampus() %></td>
<td><%= examArrange.getExamplace() %></td>
<td><%= examArrange.getExamSeatNum() %></td>
</tr>
<%
}
%>
</table>
</c:if>
<tr>
<!-- 表格表头行,定义了各个列显示的标题,分别对应不同的考试安排相关信息字段,如学年学期、学号、学生姓名、考试课程等众多字段 -->
<th>学年学期</th>
<th>学号</th>
<th>学生姓名</th>
<th>考试课程</th>
<th>考试形式</th>
<th>考试日期</th>
<th>考试时间</th>
<th>考试周次</th>
<th>考试校区</th>
<th>考试地点</th>
<th>考试座位号</th>
</tr>
<%
// 从会话作用域中获取名为"examArranges"的属性值并强制转换为List<ExamArrange>类型,
// 这个列表应该是存储了多个考试安排相关的对象,每个对象包含了如考试课程、考试时间等各种属性,通常是由服务器端查询数据库等操作后放入会话中的。
List<ExamArrange> examArranges = (List<ExamArrange>) session.getAttribute("examArranges");
// 从会话中移除"examArranges"属性,可能是为了避免后续重复使用或者对其进行更新等操作时出现数据不一致等问题,
// 也有可能是释放会话空间等目的(不过具体要结合整个系统的设计来看)。
session.removeAttribute("examArranges");
// 循环遍历获取到的考试安排列表对于每个ExamArrange对象在表格中添加一行来展示其对应的各项考试安排详细信息。
for (ExamArrange examArrange : examArranges) {
%>
<tr>
<!-- 在表格的单元格中通过Java代码片段<%= %>输出ExamArrange对象对应的各个属性值展示每项考试安排的详细信息比如学年学期、具体考试日期等 -->
<td><%= examArrange.getYearTerm()%></td>
<td><%= examArrange.getStudentId()%></td>
<td><%= examArrange.getStudentName()%></td>
<td><%= examArrange.getExamCourse()%></td>
<td><%= examArrange.getExamWay()%></td>
<td><%= examArrange.getExamDate() %></td>
<td><%= examArrange.getExamTime() %></td>
<td><%= examArrange.getExamWeek() %></td>
<td><%= examArrange.getExamCampus() %></td>
<td><%= examArrange.getExamplace() %></td>
<td><%= examArrange.getExamSeatNum() %></td>
</tr>
<%
}
%>
</table>
</c:if>
</body>
</html>

@ -1,30 +1,49 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>信息查询</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>信息查询</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<div>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<a href="<%=request.getContextPath() %>/student/student.jsp">返回上一步</a>
</div>
<div>
<h3>信息查询</h3>
<a href="<%=request.getContextPath()%>/studentInformationServlet">学籍信息</a>
<br><br>
<a href="<%=request.getContextPath()%>/student/informationinquiry/courseschedule.jsp">课表查询</a>
<br><br>
<a href="<%=request.getContextPath()%>/studentquery.query">考级成绩</a>
<br><br>
<a href="<%=request.getContextPath()%>/studentQuery.grade">课程成绩</a>
<br><br>
<a href="<%=request.getContextPath()%>/student/informationinquiry/examarrange.jsp">考试安排</a>
</div>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet"),点击此链接后,将触发注销相关的业务逻辑,
借助获取上下文路径来生成正确的链接,使得用户可以顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<!-- 创建一个超链接,链接到指定的地址("/student/student.jsp"),标注为“返回上一步”,意味着点击该链接通常会跳转到上一次操作所在的页面,
具体跳转的页面由服务器端对该请求的处理逻辑来决定 -->
<a href="<%=request.getContextPath() %>/student/student.jsp">返回上一步</a>
</div>
<div>
<h3>信息查询</h3>
<!-- 创建一个超链接链接到用于查询学籍信息的Servlet"/studentInformationServlet"),点击该链接后,
服务器端对应的处理逻辑会去获取并返回用户的学籍信息,比如学号、专业、入学时间等相关内容,展示给用户查看 -->
<a href="<%=request.getContextPath()%>/studentInformationServlet">学籍信息</a>
<br><br>
<!-- 创建一个超链接链接到用于课表查询的JSP页面"/student/informationinquiry/courseschedule.jsp"),点击该链接后,
会跳转到相应页面,用户可以在此页面进行课表相关的查询操作,比如按学期、周次等条件查看课程安排情况 -->
<a href="<%=request.getContextPath()%>/student/informationinquiry/courseschedule.jsp">课表查询</a>
<br><br>
<!-- 创建一个超链接,链接到用于查询考级成绩的地址("/studentquery.query"),点击该链接后,服务器端会依据相应的业务逻辑,
去查询并返回用户的考级成绩信息,展示给用户知晓自己在各类等级考试中的成绩情况 -->
<a href="<%=request.getContextPath()%>/studentquery.query">考级成绩</a>
<br><br>
<!-- 创建一个超链接,链接到用于查询课程成绩的地址("/studentQuery.grade"),点击此链接后,服务器端会查找并返回用户的课程成绩相关数据,
例如每门课程的具体分数、绩点等信息,方便用户查看自己在各个课程上的学习成果 -->
<a href="<%=request.getContextPath()%>/studentQuery.grade">课程成绩</a>
<br><br>
<!-- 创建一个超链接链接到用于查询考试安排的JSP页面"/student/informationinquiry/examarrange.jsp"),点击该链接后,
会进入相应页面,用户可以在那里查看自己即将参加的考试的相关安排,像考试时间、地点、考试科目等具体信息 -->
<a href="<%=request.getContextPath()%>/student/informationinquiry/examarrange.jsp">考试安排</a>
</div>
</body>
</html>

@ -2,68 +2,83 @@
<%@page import="com.hua.entity.LevelExamination"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<div>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/login/login.jsp">注销</a>
</div>
<br><br>
<a href="<%=request.getContextPath() %>/student/informationinquiry/informationinquiry.jsp">返回上一步</a>
<div>
<h3>考级成绩</h3>
</div>
<table border="2" cellpadding="0" cellspacing="0">
<tr>
<th>学年学期</th>
<th>学号</th>
<th>学生姓名</th>
<th>考级课程</th>
<th>考级时间</th>
<th>总成绩</th>
<th>学生院系</th>
<th>班级名称</th>
<th>专业</th>
<th>准考证号</th>
<th>听力成绩</th>
<th>阅读成绩</th>
<th>写作成绩</th>
<th>口语成绩</th>
</tr>
<%
StudentBasicInformation student = (StudentBasicInformation)session.getAttribute("student");
List<LevelExamination> levelExamination = (List<LevelExamination>)session.getAttribute("levelExamination");
%>
<%
for(LevelExamination stu : levelExamination){
%>
<tr>
<td><%= stu.getYearTerm()%></td>
<td><%= stu.getStudentId()%></td>
<td><%= student.getStudentName()%></td>
<td><%= stu.getLevelEaxmCourse()%></td>
<td><%= stu.getEaxmTime()%></td>
<td><%= stu.getGrade() %></td>
<td><%= student.getAcademy() %></td>
<td><%= student.getClassName() %></td>
<td><%= student.getProfession() %></td>
<td><%= stu.getExamId() %></td>
<td><%= stu.getListenGrade() %></td>
<td><%= stu.getReadingGrade() %></td>
<td><%= stu.getWritingGrade() %></td>
<td><%= stu.getSpokenGrade() %></td>
</tr>
<%
}
%>
</table>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接,链接到登录页面("/login/login.jsp"),标注为“注销”,不过正常注销操作一般需要有清除用户登录状态等相关逻辑,
这里只是跳转到登录页面,可能后续有其他处理使其能实现真正的注销功能,目前从链接指向来看逻辑不太准确 -->
<a href="<%=request.getContextPath()%>/login/login.jsp">注销</a>
</div>
<br><br>
<!-- 创建一个超链接,链接到指定的地址("/student/informationinquiry/informationinquiry.jsp"),标注为“返回上一步”,意味着点击该链接通常会跳转到上一次操作所在的页面,
具体跳转的页面由服务器端对该请求的处理逻辑来决定 -->
<a href="<%=request.getContextPath() %>/student/informationinquiry/informationinquiry.jsp">返回上一步</a>
<div>
<h3>考级成绩</h3>
</div>
<!-- 创建一个带有边框border="2"且单元格间距cellspacing和内边距cellpadding都为0的表格用于展示考级成绩相关的详细信息 -->
<table border="2" cellpadding="0" cellspacing="0">
<tr>
<!-- 表格表头行,定义了各个列显示的标题,分别对应不同的考级成绩相关信息字段,如学年学期、学号、学生姓名、考级课程等众多字段 -->
<th>学年学期</th>
<th>学号</th>
<th>学生姓名</th>
<th>考级课程</th>
<th>考级时间</th>
<th>总成绩</th>
<th>学生院系</th>
<th>班级名称</th>
<th>专业</th>
<th>准考证号</th>
<th>听力成绩</th>
<th>阅读成绩</th>
<th>写作成绩</th>
<th>口语成绩</th>
</tr>
<%
// 从会话作用域中获取名为"student"的属性值并强制转换为StudentBasicInformation类型
// 这个对象应该是存储了学生的基础信息,例如姓名、所在院系、班级等信息,通常是由服务器端查询数据库等操作后放入会话中的。
StudentBasicInformation student = (StudentBasicInformation) session.getAttribute("student");
// 从会话作用域中获取名为"levelExamination"的属性值并强制转换为List<LevelExamination>类型,
// 这个列表应该是存储了多个考级考试相关的对象,每个对象包含了如考级课程、各科目成绩等各种属性,同样也是由服务器端查询数据库等操作后放入会话中的。
List<LevelExamination> levelExamination = (List<LevelExamination>) session.getAttribute("levelExamination");
// 循环遍历获取到的考级考试列表对于每个LevelExamination对象在表格中添加一行来展示其对应的各项考级成绩详细信息。
for (LevelExamination stu : levelExamination) {
%>
<tr>
<!-- 在表格的单元格中通过Java代码片段<%= %>输出LevelExamination对象对应的各个属性值以及从StudentBasicInformation对象中获取相关基础信息
展示每项考级成绩的详细信息,比如学年学期、具体的总成绩数值、学生所在院系等 -->
<td><%= stu.getYearTerm()%></td>
<td><%= stu.getStudentId()%></td>
<td><%= student.getStudentName()%></td>
<td><%= stu.getLevelEaxmCourse()%></td>
<td><%= stu.getEaxmTime()%></td>
<td><%= stu.getGrade() %></td>
<td><%= student.getAcademy() %></td>
<td><%= student.getClassName() %></td>
<td><%= student.getProfession() %></td>
<td><%= stu.getExamId() %></td>
<td><%= stu.getListenGrade() %></td>
<td><%= stu.getReadingGrade() %></td>
<td><%= stu.getWritingGrade() %></td>
<td><%= stu.getSpokenGrade() %></td>
</tr>
<%
}
%>
</table>
</body>
</html>

@ -1,52 +1,78 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>学籍信息</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>学籍信息</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接,链接到登录页面("/login/login.jsp"),标注为“注销”,不过正常情况下注销操作一般需要有清除用户登录状态等相关逻辑,
这里只是跳转到登录页面,可能后续有其他处理使其能实现真正的注销功能,目前从链接指向来看逻辑不太准确 -->
<a href="<%=request.getContextPath()%>/login/login.jsp">注销</a>
</div>
<div>
<h3>学籍信息</h3>
</div>
<div>
<!-- 从请求作用域requestScope中获取名为"message"的属性值,并以红色字体展示,
这个属性值通常用于显示一些提示性信息,比如操作成功或失败的反馈消息等,方便用户知晓操作结果 -->
<font color="RED">${requestScope.message }</font>
</div>
<br>
<!-- 定义一个表单用于提交学籍信息修改相关的数据表单将以POST方式把数据发送到指定的Servlet"/studentInformationServlet"
服务器端对应的处理逻辑会接收并处理这些提交的数据,例如验证修改后的数据是否合法,然后更新数据库中的学籍信息等 -->
<form action="<%=request.getContextPath()%>/studentInformationServlet" method="post">
<div>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/login/login.jsp">注销</a>
<!-- 创建一个文本输入框用于显示学号信息设置为只读readonly="readonly"),其名称为"studentId"
并通过表达式(${requestScope.studentBasicInformation.studentId })从请求作用域中获取对应的学号值进行展示,用户不能直接修改该输入框中的内容 -->
学号:<input type="text" readonly="readonly" name="studentId" value="${requestScope.studentBasicInformation.studentId }"/>
<!-- 创建一个文本输入框,用于显示姓名信息,同样设置为只读,名称为"studentName",从请求作用域获取对应姓名值展示,用户不可直接修改 -->
姓名:<input type="text" readonly="readonly" name="studentName" value="${requestScope.studentBasicInformation.studentName }"/>
<!-- 创建一个文本输入框,用于显示性别信息,设置为只读,名称为"gender",从请求作用域获取对应性别值展示,用户不能修改 -->
性别:<input type="text" readonly="readonly" name="gender" value="${requestScope.studentBasicInformation.gender }"/>
</div>
<br><br>
<div>
<h3>学籍信息</h3>
<!-- 创建一个文本输入框,用于显示年级信息,设置为只读,名称为"grade",从请求作用域获取对应年级值展示,用户不可修改 -->
年级:<input type="text" readonly="readonly" name="grade" value="${requestScope.studentBasicInformation.grade }"/>
<!-- 创建一个文本输入框,用于显示班级信息,设置为只读,名称为"className",从请求作用域获取对应班级值展示,用户不能修改 -->
班级:<input type="text" readonly="readonly" name="className" value="${requestScope.studentBasicInformation.className }"/>
<!-- 创建一个文本输入框,用于显示学院信息,设置为只读,名称为"academy",从请求作用域获取对应学院值展示,用户不可修改 -->
学院:<input type="text" readonly="readonly" name="academy" value="${requestScope.studentBasicInformation.academy }"/>
</div>
<br><br>
<div>
<font color="RED">${requestScope.message }</font>
<!-- 创建一个文本输入框,用于显示专业信息,设置为只读,名称为"profession",从请求作用域获取对应专业值展示,用户不能修改 -->
专业:<input type="text" readonly="readonly" name="profession" value="${requestScope.studentBasicInformation.profession }"/>
<!-- 创建一个文本输入框,用于显示所在校区信息,设置为只读,名称为"campus",从请求作用域获取对应校区值展示,用户不可修改 -->
所在校区:<input type="text" readonly="readonly" name="campus" value="${requestScope.studentBasicInformation.campus }"/>
<!-- 创建一个文本输入框,用于显示联系电话信息,名称为"phone",从请求作用域获取对应电话值展示,不过这里用户可以对其内容进行修改,以便更新联系电话信息 -->
联系电话:<input type="text" name="phone" value="${requestScope.studentBasicInformation.phone }"/>
</div>
<br>
<form action="<%=request.getContextPath()%>/studentInformationServlet" method="post">
<div>
学号:<input type="text" readonly="readonly" name="studentId" value="${requestScope.studentBasicInformation.studentId }"/>
姓名:<input type="text" readonly="readonly" name="studentName" value="${requestScope.studentBasicInformation.studentName }"/>
性别:<input type="text" readonly="readonly" name="gender" value="${requestScope.studentBasicInformation.gender }"/>
</div>
<br><br>
<div>
年级:<input type="text" readonly="readonly" name="grade" value="${requestScope.studentBasicInformation.grade }"/>
班级:<input type="text" readonly="readonly" name="className" value="${requestScope.studentBasicInformation.className }"/>
学院:<input type="text" readonly="readonly" name="academy" value="${requestScope.studentBasicInformation.academy }"/>
</div>
<br><br>
<div>
专业:<input type="text" readonly="readonly" name="profession" value="${requestScope.studentBasicInformation.profession }"/>
所在校区:<input type="text" readonly="readonly" name="campus" value="${requestScope.studentBasicInformation.campus }"/>
联系电话:<input type="text" name="phone" value="${requestScope.studentBasicInformation.phone }"/>
</div>
<br><br>
<div>
家庭地址:<input type="text" size="40" name="homeAddress" value="${requestScope.studentBasicInformation.homeAddress }"/>
</div>
<br><br>
<div>
<input type="submit" name="submit" value="修改"/>
<a href="<%=request.getContextPath() %>/student/informationinquiry/informationinquiry.jsp">返回上一步</a>
</div>
</form>
<br><br>
<div>
<!-- 创建一个文本输入框用于显示家庭地址信息设置了宽度可显示40个字符size="40"),名称为"homeAddress",从请求作用域获取对应家庭地址值展示,
用户可以对其中内容进行修改,用于更新家庭地址信息 -->
家庭地址:<input type="text" size="40" name="homeAddress" value="${requestScope.studentBasicInformation.homeAddress }"/>
</div>
<br><br>
<div>
<!-- 创建一个提交按钮,按钮上显示的文字为“修改”,点击该按钮后将触发表单提交操作,
把表单内用户修改后的如联系电话、家庭地址等可修改字段信息发送到指定的Servlet"/studentInformationServlet")进行学籍信息修改相关的处理 -->
<input type="submit" name="submit" value="修改"/>
<!-- 创建一个超链接,链接到指定的地址("/student/informationinquiry/informationinquiry.jsp"),标注为“返回上一步”,意味着点击该链接通常会跳转到上一次操作所在的页面,
具体跳转的页面由服务器端对该请求的处理逻辑来决定 -->
<a href="<%=request.getContextPath() %>/student/informationinquiry/informationinquiry.jsp">返回上一步</a>
</div>
</form>
</body>
</html>

@ -1,34 +1,54 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
</head>
<body>
<!-- 学生的主页面 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<%session.setAttribute("path", request.getRequestURI()); %>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
</div>
<div>
<h3>选课报名</h3>
<a href="<%=request.getContextPath()%>/student/courseselect/courseselect.jsp">选修课报名</a>
<br><br>
<a href="<%=request.getContextPath()%>/student/courseselect/levelexamapply.jsp">考级报名</a>
</div>
<div>
<h3>业务办理</h3>
<a href="<%=request.getContextPath()%>/student/businessmanagement/postponeExamapply.jsp">缓考申请</a>
<br><br>
<a href="<%=request.getContextPath()%>/student/businessmanagement/exemptionapply.jsp">免修申请</a>
</div>
<div>
<h3>信息查询</h3>
<a href="<%=request.getContextPath()%>/student/informationinquiry/informationinquiry.jsp">信息查询</a>
</div>
<!-- 这是一段HTML注释用于说明该页面的大致用途这里表示是学生的主页面 -->
<!-- 学生的主页面 -->
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的学生用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 在会话session中设置一个名为"path"的属性其值为当前请求的URIUniform Resource Identifier统一资源标识符
这个操作可能是为了后续在其他地方方便获取当前页面的访问路径相关信息,比如用于记录用户的操作轨迹或者进行页面导航相关的逻辑处理等 -->
<%session.setAttribute("path", request.getRequestURI()); %>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便学生用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet"),点击此链接后,将触发注销相关的业务逻辑,
借助获取上下文路径来生成正确的链接,使得学生用户可以顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
</div>
<div>
<h3>选课报名</h3>
<!-- 创建一个超链接链接到用于选修课报名的JSP页面"/student/courseselect/courseselect.jsp"),点击该链接后,
学生用户可以进入相应页面进行选修课的报名操作具体报名流程和界面交互会在对应的JSP页面及其相关的后端逻辑中实现 -->
<a href="<%=request.getContextPath()%>/student/courseselect/courseselect.jsp">选修课报名</a>
<br><br>
<!-- 创建一个超链接链接到用于考级报名的JSP页面"/student/courseselect/levelexamapply.jsp"),点击此链接后,
学生可以进入该页面进行各类等级考试(比如英语四六级、计算机等级考试等)的报名操作,相应的报名功能逻辑由该页面及后端代码共同处理 -->
<a href="<%=request.getContextPath()%>/student/courseselect/levelexamapply.jsp">考级报名</a>
</div>
<div>
<h3>业务办理</h3>
<!-- 创建一个超链接链接到用于缓考申请的JSP页面"/student/businessmanagement/postponeExamapply.jsp"),点击该链接后,
学生能够进入对应页面填写缓考相关信息并提交缓考申请,后续会由服务器端相关逻辑来处理该申请的审核等操作 -->
<a href="<%=request.getContextPath()%>/student/businessmanagement/postponeExamapply.jsp">缓考申请</a>
<br><br>
<!-- 创建一个超链接链接到用于免修申请的JSP页面"/student/businessmanagement/exemptionapply.jsp"),点击此链接后,
学生可进入相应页面填写免修课程等相关信息并提交免修申请,服务器端会根据既定规则对该申请进行处理,比如审核学生是否符合免修条件等 -->
<a href="<%=request.getContextPath()%>/student/businessmanagement/exemptionapply.jsp">免修申请</a>
</div>
<div>
<h3>信息查询</h3>
<!-- 创建一个超链接链接到用于综合信息查询的JSP页面"/student/informationinquiry/informationinquiry.jsp"),点击该链接后,
学生可以进入该页面进行各种信息的查询操作,比如学籍信息、课程成绩、考试安排等,具体能查询哪些信息取决于该页面及其关联的后端查询逻辑实现 -->
<a href="<%=request.getContextPath()%>/student/informationinquiry/informationinquiry.jsp">信息查询</a>
</div>
</body>
</html>

@ -1,19 +1,29 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<div>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
</div>
<div>
<h3>学籍变动</h3>
</div>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet"),点击此链接后,将触发注销相关的业务逻辑,
借助获取上下文路径来生成正确的链接,使得用户可以顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
</div>
<div>
<h3>学籍变动</h3>
<!-- 这里只是简单地展示了一个标题为“学籍变动”的板块,但目前页面内并没有具体实现学籍变动相关的功能内容展示,
比如可能后续需要添加一些表单用于提交学籍变动申请(如转专业、休学、复学等相关申请内容),或者展示过往学籍变动记录等相关信息,
不过从现有代码来看,仅作为一个功能模块的占位,提示此处是用于处理学籍变动相关业务的区域 -->
</div>
</body>
</html>

@ -1,21 +1,36 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>录入成绩</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>录入成绩</title>
</head>
<body>
<!-- 教师录入成绩页面 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<%session.setAttribute("path", request.getRequestURI()); %>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<a href="<%=request.getContextPath() %>/teacher/teacher.jsp">返回上一步</a>
</div>
<h3>录入成绩</h3>
<!-- 这是一段HTML注释用于说明该页面的大致用途这里表明是教师录入成绩的页面 -->
<!-- 教师录入成绩页面 -->
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的教师用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 在会话session中设置一个名为"path"的属性其值为当前请求的URIUniform Resource Identifier统一资源标识符
这个操作可能是为了后续在其他地方方便获取当前页面的访问路径相关信息,比如用于记录教师用户的操作轨迹或者进行页面导航相关的逻辑处理等 -->
<%session.setAttribute("path", request.getRequestURI()); %>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便教师用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet"),点击此链接后,将触发注销相关的业务逻辑,
借助获取上下文路径来生成正确的链接,使得教师用户可以顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<!-- 创建一个超链接,链接到指定的地址("/teacher/teacher.jsp"),标注为“返回上一步”,意味着点击该链接通常会跳转到上一次操作所在的页面,
具体跳转的页面由服务器端对该请求的处理逻辑来决定 -->
<a href="<%=request.getContextPath() %>/teacher/teacher.jsp">返回上一步</a>
</div>
<h3>录入成绩</h3>
<!-- 这里只是简单地展示了一个标题为“录入成绩”的板块,但目前页面内并没有具体实现成绩录入相关的功能内容展示,
比如可能后续需要添加一些表单用于教师输入学生成绩、选择对应的课程及学期等相关信息,然后通过提交按钮将成绩数据发送到服务器端进行保存等操作,
不过从现有代码来看,仅作为一个功能模块的占位,提示此处是用于教师录入成绩这一业务的区域 -->
</body>
</html>

@ -1,20 +1,35 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<div>
<%session.setAttribute("path", request.getRequestURI()); %>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<a href="<%=request.getContextPath() %>/teacher/teacher.jsp">返回上一步</a>
</div>
<h3>修改成绩</h3>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 在会话session中设置一个名为"path"的属性其值为当前请求的URIUniform Resource Identifier统一资源标识符
这么做可能是为了后续便于获取当前页面访问路径相关信息,例如可用于记录用户操作轨迹、辅助页面导航或者在其他业务逻辑中判断当前页面情况等 -->
<%session.setAttribute("path", request.getRequestURI()); %>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet"),点击该链接后,会触发注销相关的业务逻辑,
借助获取上下文路径来生成正确的链接,从而让用户可以顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<!-- 创建一个超链接,链接到指定的地址("/teacher/teacher.jsp"),标注为“返回上一步”,意味着点击此链接通常会跳转到上一次操作所在的页面,
具体跳转的页面由服务器端对该请求的处理逻辑来决定 -->
<a href="<%=request.getContextPath() %>/teacher/teacher.jsp">返回上一步</a>
</div>
<h3>修改成绩</h3>
<!-- 此处仅展示了一个标题为“修改成绩”的板块,不过当前页面并没有具体实现成绩修改相关的功能内容展示。
正常来讲,后续可能需要添加例如查询成绩的表单(方便教师查找出要修改的成绩对应的学生、课程等信息)、
用于输入新成绩的输入框以及提交按钮等元素,通过表单将修改后的成绩数据发送到服务器端,再由服务器端相关逻辑去验证并更新数据库中的成绩记录等操作,
就目前代码来看,只是作为一个功能模块的占位,提示这里是用于处理成绩修改业务的区域 -->
</body>
</html>

@ -1,22 +1,36 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<div>
<%session.setAttribute("path", request.getRequestURI()); %>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<a href="<%=request.getContextPath() %>/teacher/teacher.jsp">返回上一步</a>
</div>
<div>
<h3>班级信息</h3>
</div>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 在会话session中设置一个名为"path"的属性其值为当前请求的URIUniform Resource Identifier统一资源标识符
这么做可能是出于后续功能拓展的需要,比如用于记录用户在系统中的操作轨迹,或者在进行页面跳转、导航等逻辑处理时,方便获取当前页面的访问路径信息等 -->
<%session.setAttribute("path", request.getRequestURI()); %>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet"),点击该链接后,将触发注销相关的业务逻辑,
借助获取上下文路径来生成正确的链接,使得用户可以顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<!-- 创建一个超链接,链接到指定的地址("/teacher/teacher.jsp"),标注为“返回上一步”,意味着点击该链接通常会跳转到上一次操作所在的页面,
具体跳转的页面由服务器端对该请求的处理逻辑来决定 -->
<a href="<%=request.getContextPath() %>/teacher/teacher.jsp">返回上一步</a>
</div>
<div>
<h3>班级信息</h3>
<!-- 这里只是简单地展示了一个标题为“班级信息”的板块,但目前页面内并没有具体实现班级信息相关的功能内容展示,
比如后续可能需要添加一些内容来展示班级的基本情况(如班级名称、人数、所属专业等),或者提供操作链接用于查询、修改班级相关信息(如添加学生、修改班级名称等),
不过从现有代码来看,仅作为一个功能模块的占位,提示此处是用于处理班级信息相关业务的区域 -->
</div>
</body>
</html>

@ -1,22 +1,36 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>${sessionScope.user.name },您好!</h1>
<div>
<%session.setAttribute("path", request.getRequestURI()); %>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<a href="<%=request.getContextPath() %>/teacher/teacher.jsp">返回上一步</a>
</div>
<div>
<h3>课程信息</h3>
</div>
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 在会话session中设置一个名为"path"的属性其值为当前请求的URIUniform Resource Identifier统一资源标识符
这样做大概率是为了后续便于追踪用户在系统中的操作路径,或者在涉及页面导航、相关业务逻辑判断时,能够获取当前页面被访问的具体路径信息等用途 -->
<%session.setAttribute("path", request.getRequestURI()); %>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet"),点击此链接后,将触发注销相关的业务逻辑,
借助获取上下文路径来生成正确的链接,使得用户可以顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<!-- 创建一个超链接,链接到指定的地址("/teacher/teacher.jsp"),标注为“返回上一步”,意味着点击该链接通常会跳转到上一次操作所在的页面,
具体跳转的页面由服务器端对该请求的处理逻辑来决定 -->
<a href="<%=request.getContextPath() %>/teacher/teacher.jsp">返回上一步</a>
</div>
<div>
<h3>课程信息</h3>
<!-- 这里只是简单地展示了一个标题为“课程信息”的板块,但就当前页面来看,并没有实际呈现出课程信息相关的具体内容,比如课程名称、课程编号、授课教师、课程学分等详细信息展示。
后续可能需要进一步扩展,例如添加表格来罗列各课程的详细情况,或者设置查询表单方便按照不同条件查找课程,又或是添加编辑链接用于对课程信息进行修改、删除等操作,
从现有代码而言,它仅仅是作为一个功能模块的占位,提示此处是用于展示或处理课程信息相关业务的区域 -->
</div>
</body>
</html>

@ -1,56 +1,87 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教务管理系统</title>
</head>
<body>
<!-- 教师个人信息页面 -->
<h1>${sessionScope.user.name },您好!</h1>
<!-- 这是一段HTML注释用于说明该页面的大致用途这里表明是教师个人信息页面 -->
<!-- 教师个人信息页面 -->
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的教师用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 在会话session中设置一个名为"path"的属性其值为当前请求的URIUniform Resource Identifier统一资源标识符
这么做一般是为了后续方便获取当前页面的访问路径相关信息,例如可用于记录教师用户的操作轨迹,或者在进行页面导航、相关业务逻辑处理时作为参考依据等 -->
<%session.setAttribute("path", request.getRequestURI()); %>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便教师用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet"),点击此链接后,将触发注销相关的业务逻辑,
借助获取上下文路径来生成正确的链接,使得教师用户可以顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<!-- 创建一个超链接,链接到指定的地址("/teacher/teacher.jsp"),标注为“返回上一步”,意味着点击该链接通常会跳转到上一次操作所在的页面,
具体跳转的页面由服务器端对该请求的处理逻辑来决定 -->
<a href="<%=request.getContextPath() %>/teacher/teacher.jsp">返回上一步</a>
</div>
<div>
<h3>个人信息</h3>
<!-- 这里划分出了“个人信息”板块,后续将在这个板块内展示和处理教师个人信息相关的内容 -->
</div>
<div>
<!-- 从请求作用域requestScope中获取名为"message"的属性值,并以红色字体展示。
这个属性值通常用于显示一些提示性信息,比如在进行信息修改操作后,服务器端返回操作成功或失败的反馈消息等,方便教师用户知晓操作结果 -->
<font color="RED">${requestScope.message }</font>
</div>
<br>
<!-- 定义一个表单用于提交教师个人信息修改相关的数据表单将以POST方式把数据发送到指定的Servlet"/teacherInformationServlet"
服务器端对应的处理逻辑会接收并处理这些提交的数据,例如验证修改后的数据是否合法,然后更新数据库中的教师个人信息等 -->
<form action="<%=request.getContextPath()%>/teacherInformationServlet" method="post">
<div>
<%session.setAttribute("path", request.getRequestURI()); %>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
<br><br>
<a href="<%=request.getContextPath() %>/teacher/teacher.jsp">返回上一步</a>
<!-- 创建一个文本输入框用于显示教师编号信息设置为只读readonly="readonly"),其名称为"teacherId"
并通过表达式(${requestScope.teacher.teacherId })从请求作用域中获取对应的教师编号值进行展示,用户不能直接修改该输入框中的内容 -->
教师编号:<input type="text" readonly="readonly" name="teacherId" value="${requestScope.teacher.teacherId }"/>
<!-- 创建一个文本输入框,用于显示教师姓名信息,同样设置为只读,名称为"teacherName",从请求作用域获取对应教师姓名值展示,用户不可直接修改 -->
姓名:<input type="text" readonly="readonly" name="teacherName" value="${requestScope.teacher.teacherName }"/>
<!-- 创建一个文本输入框,用于显示教师性别信息,设置为只读,名称为"gender",从请求作用域获取对应教师性别值展示,用户不能修改 -->
性别:<input type="text" readonly="readonly" name="gender" value="${requestScope.teacher.gender }"/>
</div>
<br><br>
<div>
<h3>个人信息</h3>
<!-- 创建一个文本输入框,用于显示教师政治面貌信息,名称为"politicstatus",从请求作用域获取对应政治面貌值展示,不过这里用户可以对其内容进行修改,以便更新政治面貌信息 -->
政治面貌:<input type="text" name="politicstatus" value="${requestScope.teacher.politicstatus }"/>
<!-- 创建一个文本输入框,用于显示教师民族信息,设置为只读,名称为"nation",从请求作用域获取对应民族值展示,用户不可修改 -->
民族:<input type="text" readonly="readonly" name="nation" value="${requestScope.teacher.nation }"/>
<!-- 创建一个文本输入框,用于显示教师籍贯信息,设置为只读,名称为"nativeplace",从请求作用域获取对应籍贯值展示,用户不能修改 -->
籍贯:<input type="text" readonly="readonly" name="nativeplace" value="${requestScope.teacher.nativeplace }"/>
</div>
<br><br>
<div>
<font color="RED">${requestScope.message }</font>
<!-- 创建一个文本输入框,用于显示教师所在学院信息,设置为只读,名称为"academy",从请求作用域获取对应学院值展示,用户不可修改 -->
学院:<input type="text" readonly="readonly" name="academy" value="${requestScope.teacher.academy }"/>
<!-- 创建一个文本输入框,用于显示教师专业信息,设置为只读,名称为"profession",从请求作用域获取对应专业值展示,用户不能修改 -->
专业:<input type="text" readonly="readonly" name="profession" value="${requestScope.teacher.profession }"/>
<!-- 创建一个文本输入框,用于显示教师联系电话信息,名称为"phone",从请求作用域获取对应联系电话值展示,用户可以对其内容进行修改,用于更新联系电话信息 -->
联系电话:<input type="text" name="phone" value="${requestScope.teacher.phone }"/>
</div>
<br>
<form action="<%=request.getContextPath()%>/teacherInformationServlet" method="post">
<div>
教师编号:<input type="text" readonly="readonly" name="teacherId" value="${requestScope.teacher.teacherId }"/>
姓名:<input type="text" readonly="readonly" name="teacherName" value="${requestScope.teacher.teacherName }"/>
性别:<input type="text" readonly="readonly" name="gender" value="${requestScope.teacher.gender }"/>
</div>
<br><br>
<div>
政治面貌:<input type="text" name="politicstatus" value="${requestScope.teacher.politicstatus }"/>
民族:<input type="text" readonly="readonly" name="nation" value="${requestScope.teacher.nation }"/>
籍贯:<input type="text" readonly="readonly" name="nativeplace" value="${requestScope.teacher.nativeplace }"/>
</div>
<br><br>
<div>
学院:<input type="text" readonly="readonly" name="academy" value="${requestScope.teacher.academy }"/>
专业:<input type="text" readonly="readonly" name="profession" value="${requestScope.teacher.profession }"/>
联系电话:<input type="text" name="phone" value="${requestScope.teacher.phone }"/>
</div>
<br><br>
<div>
邮箱:<input type="text" size="40" name="email" value="${requestScope.teacher.email }"/>
地址:<input type="text" size="40" name="address" value="${requestScope.teacher.address }"/>
</div>
<br><br>
<div>
<input type="submit" name="submit" value="修改并保存"/>
</div>
</form>
<br><br>
<div>
<!-- 创建一个文本输入框用于显示教师邮箱信息设置了宽度可显示40个字符size="40"),名称为"email",从请求作用域获取对应邮箱值展示,
用户可以对其中内容进行修改,用于更新邮箱信息 -->
邮箱:<input type="text" size="40" name="email" value="${requestScope.teacher.email }"/>
<!-- 创建一个文本输入框用于显示教师地址信息同样设置了宽度可显示40个字符名称为"address",从请求作用域获取对应地址值展示,用户可以对其内容进行修改,用于更新地址信息 -->
地址:<input type="text" size="40" name="address" value="${requestScope.teacher.address }"/>
</div>
<br><br>
<div>
<!-- 创建一个提交按钮,按钮上显示的文字为“修改并保存”,点击该按钮后将触发表单提交操作,
把表单内用户修改后的如政治面貌、联系电话、邮箱、地址等可修改字段信息发送到指定的Servlet"/teacherInformationServlet")进行教师个人信息修改相关的处理 -->
<input type="submit" name="submit" value="修改并保存"/>
</div>
</form>
</body>
</html>

@ -1,32 +1,54 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<!-- 设置页面的字符编码类型为UTF-8确保页面能够正确显示各类字符尤其是像中文等非ASCII字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 老师的主页面 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<%session.setAttribute("path", request.getRequestURI()); %>
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
</div>
<div>
<h3>信息查询</h3>
<a href="<%=request.getContextPath()%>/teacherInformationServlet">个人信息</a>
<br><br>
<a href="<%=request.getContextPath()%>/teacher/inquirynews/classinformation.jsp">班级信息</a>
<br><br>
<a href="<%=request.getContextPath()%>/teacher/inquirynews/courseinformation.jsp">课程信息</a>
</div>
<div>
<h3>成绩管理</h3>
<a href="<%=request.getContextPath()%>/teacher/grademanagement/insertgrade.jsp">录入成绩</a>
<br><br>
<a href="<%=request.getContextPath()%>/teacher/grademanagement/modifygrade.jsp">修改成绩</a>
</div>
<!-- 这是一段HTML注释用于说明该页面的大致用途这里表明是老师的主页面 -->
<!-- 老师的主页面 -->
<!-- 从会话作用域sessionScope中获取名为"user"的对象的"name"属性值,并展示问候语。通常在用户登录成功后,
用户相关信息会被存储在会话中,此处用于向已登录的教师用户表示友好问候 -->
<h1>${sessionScope.user.name },您好!</h1>
<div>
<!-- 在会话session中设置一个名为"path"的属性其值为当前请求的URIUniform Resource Identifier统一资源标识符
这么做可能是为了后续便于追踪教师用户在系统中的操作路径,比如用于记录操作历史,或者在涉及页面导航、相关业务逻辑判断时能获取当前页面的访问路径信息等 -->
<%session.setAttribute("path", request.getRequestURI()); %>
<!-- 创建一个超链接链接到用于修改密码的JSP页面"/modify/modifypassword.jsp")。
通过获取当前请求的上下文路径request.getContextPath())与具体页面路径拼接,构建出准确的链接地址,方便教师用户点击进入修改密码页面 -->
<a href="<%=request.getContextPath()%>/modify/modifypassword.jsp">修改密码</a>
<!-- 创建一个超链接链接到用于注销登录的Servlet"/logoutServlet"),点击此链接后,将触发注销相关的业务逻辑,
借助获取上下文路径来生成正确的链接,使得教师用户可以顺利执行注销操作 -->
<a href="<%=request.getContextPath()%>/logoutServlet">注销</a>
</div>
<div>
<h3>信息查询</h3>
<!-- 划分出“信息查询”功能板块,下面罗列了多个不同信息查询功能对应的超链接 -->
<!-- 创建一个超链接链接到用于查询教师个人信息的Servlet"/teacherInformationServlet"),点击该链接后,
服务器端对应的处理逻辑会去获取并返回教师的个人信息,比如教师编号、姓名、所在学院等相关内容,展示给教师用户查看 -->
<a href="<%=request.getContextPath()%>/teacherInformationServlet">个人信息</a>
<br><br>
<!-- 创建一个超链接链接到用于查询班级信息的JSP页面"/teacher/inquirynews/classinformation.jsp"),点击该链接后,
教师可以进入相应页面查看班级相关的详细信息,例如班级名称、学生人数、所属专业等内容 -->
<a href="<%=request.getContextPath()%>/teacher/inquirynews/classinformation.jsp">班级信息</a>
<br><br>
<!-- 创建一个超链接链接到用于查询课程信息的JSP页面"/teacher/inquirynews/courseinformation.jsp"),点击此链接后,
教师能够进入对应页面查看课程相关的各种信息,像课程名称、课程编号、授课教师、课程学分等情况 -->
<a href="<%=request.getContextPath()%>/teacher/inquirynews/courseinformation.jsp">课程信息</a>
</div>
<div>
<h3>成绩管理</h3>
<!-- 划分出“成绩管理”功能板块,以下是与成绩管理相关操作对应的超链接 -->
<!-- 创建一个超链接链接到用于录入成绩的JSP页面"/teacher/grademanagement/insertgrade.jsp"),点击该链接后,
教师可进入相应页面进行学生成绩的录入操作,比如输入学生的考试成绩、平时成绩等信息,然后提交保存到数据库等相关处理 -->
<a href="<%=request.getContextPath()%>/teacher/grademanagement/insertgrade.jsp">录入成绩</a>
<br><br>
<!-- 创建一个超链接链接到用于修改成绩的JSP页面"/teacher/grademanagement/modifygrade.jsp"),点击此链接后,
教师可以进入该页面进行成绩修改操作,通常可能需要先查询出要修改的成绩对应的学生、课程等信息,再对成绩数值进行修改并提交更新到数据库 -->
<a href="<%=request.getContextPath()%>/teacher/grademanagement/modifygrade.jsp">修改成绩</a>
</div>
</body>
</html>
Loading…
Cancel
Save