Compare commits

..

No commits in common. 'main' and 'zzx_branch1' have entirely different histories.

@ -1,43 +1,18 @@
```java
package service;
import domain.Admin;
/**
*
*
*/
public interface AdminService {
/**
*
* Admin
* Adminnull
*
* @param admin Admin
* @return Admin
*
*/
Admin login(Admin admin);
/**
*
* adminidnewpassword
*
*
* @param adminid
* @param newpassword
*/
void updatePassword(String adminid, String newpassword);
/**
* IDAdmin
* Adminnull
*
* @param admin Admin
* @return Admin
*/
Admin findAdminById(Admin admin);
}
```
使

@ -1,47 +1,20 @@
package service;
import domain.Admin;
import domain.CDC;
import java.util.List;
/**
*
* 便
*
*/
public interface CDCService {
/**
*
* CDCCDC
*
*
* @return CDC
*/
List<CDC> findAllCollege();
/**
*
* CDCCDC
*
*
* @return CDC
*/
List<CDC> findAllDepartment();
/**
*
* CDCCDC
*
*
* @return CDC
*/
List<CDC> findAllClass();
/**
*
* CDC
*
*
* @return CDC
*/
List<CDC> findAll();
}

@ -1,28 +1,14 @@
package service;
import domain.Complaint;
import java.util.List;
/**
*
* 便
*
*/
public interface ComplaintService {
/**
*
* Complaint
*
*
* @return Complaint
*/
List<Complaint> findAll();
/**
*
* Complaint
*
*
* @param complaint Complaint
*/
void addComplaint(Complaint complaint);
}
}

@ -2,36 +2,10 @@ package service;
import domain.Course;
/**
*
*
*/
public interface CourseService {
/**
*
* CourseCourse
*
*
* @param course Course
*/
void addOptionalCourse(Course course);
/**
*
* cid
* Coursenull
*
* @param cid
* @return Course
*/
Course findSelectCourseByCourseId(String cid);
/**
*
* cid
*
*
* @param cid
*/
void deleteServiceById(String cid);
}
}

@ -1,47 +1,23 @@
package service;
import domain.Notify;
import java.util.List;
/**
*
* 便
*
*/
public interface NotifyService {
/**
*
* Notify
*
*
* @param notify Notify
*
*/
void addNotify(Notify notify);
/**
*
*
* Notify
*
* @return Notify
*/
List<Notify> find();
/**
*
* Notify
*
*
* @return Notify
*/
List<Notify> findAll();
/**
*
* notifyid
*
*
* @param notifyid
*/
void deleteNotifyById(String notifyid);
}
}

@ -2,36 +2,10 @@ package service;
import domain.Photo;
/**
*
* 便
*/
public interface PhotoService {
/**
*
* PhotoPhotoPhoto
*
*
* @param photo Photo
*/
void addPhoto(Photo photo);
/**
*
* id
* Photonull
*
* @param id
* @return Photo
*/
Photo findPhotoByPhotoId(String id);
/**
*
* Photo
* Photo
*
* @param photo Photo
*/
void updatePhoto(Photo photo);
}
}

@ -1,44 +1,13 @@
package service;
import domain.SelectCourse;
import java.util.List;
/**
*
*
*/
public interface SelectCourseService {
/**
*
* cid
* SelectCourseSelectCourse退
*
*
* @param cid
* @return SelectCourse
*/
List<SelectCourse> findStudentSelectedCourseByCourseId(String cid);
/**
*
* cidsid
* SelectCoursenull
*
* @param cid
* @param sid
* @return SelectCourse
*/
SelectCourse findScoreByCourseIdAndStudentId(String cid, String sid);
SelectCourse findScoreByCourseIdAndStudentId(String cid,String sid);
/**
*
* cidsidsScore
*
*
*
* @param cid
* @param sid
* @param sScore
*/
void upDateScoreByCidAndSid(String cid, String sid, String sScore);
}
}

@ -8,146 +8,44 @@ import java.util.List;
import java.util.Map;
/**
*
*
* 便
*
*/
public interface StudentService {
/**
*
* currentPagerowsconditionMap
* PageBean
*
* @param currentPage
* @param rows
* @param condition Map
* @return PageBean<Student>
*
* @param currentPage
* @param rows
* @param condition
* @return
*/
PageBean<Student> findStudentByPage(String currentPage, String rows, Map<String, String[]> condition);
/**
*
*
* List<Student>Student
*
*
* @return List<Student>
*
*/
List<Student> findAll();
/**
*
* Student
* Student
* null
*
* @param student Student
* @return Student
*/
Student login(Student student);
/**
* Student
* Studentnull
*
* @param student Student
* @return Student
*/
Student findStudentById(Student student);
/**
*
* Student
*
*
* @param student Student
*/
void register(Student student);
/**
*
* Student
* Student
*
* @param student Student
*/
void updateInfo(Student student);
/**
*
* studentidnewpassword
*
*
* @param studentid
* @param newpassword
*/
void updatePassword(String studentid, String newpassword);
/**
*
* studentid
* List<SelectCourse>SelectCourse
*
*
* @param studentid
* @return List<SelectCourse>
*/
List<SelectCourse> findAllSelectCourse(String studentid);
/**
*
*
* List<Course>Course
*
*
* @return List<Course>
*/
List<Course> findAllOptionalCourse();
/**
*
* studentidcourseid
*
*
* @param studentid
* @param courseid
*/
void addSelectCourse(String studentid, String courseid);
/**
*
* studentid
*
*
* @param studentid
*/
void deleteStudentById(String studentid);
/**
*
* sids
*
*
* @param sids
*/
void deleteSelectStudent(String[] sids);
/**
*
* Student
*
*
* @param updateStudent Student
*/
void addStudentAllInfo(Student updateStudent);
/**
*
*
* List<SelectCourse>SelectCourse
*
*
* @return List<SelectCourse>
*/
List<SelectCourse> findSelectCourseAllStudent();
}
}

@ -2,107 +2,35 @@ package service;
import domain.Course;
import domain.Teacher;
import java.util.List;
/**
*
*
* 便
*
*/
public interface TeacherService {
/**
*
* Teacher
* Teacher
* null
*
* @param teacher Teacher
* @return Teacher
*
*/
Teacher login(Teacher teacher);
/**
*
*
* List<Teacher>Teacher
*
*
* @return List<Teacher>
*/
List<Teacher> findAll();
/**
*
* T_id
* List<Course>Course
*
*
* @param T_id
* @return List<Course>
*/
List<Course> findMySelfOptionalCourse(String T_id);
/**
*
* cid
* Coursenull
*
* @param cid
* @return Course
*/
Course findOptionalCourseByCourseId(String cid);
/**
*
* Course
* Course
*
* @param updateCourse Course
*/
void updateCourseInfo(Course updateCourse);
/**
*
* cid
*
*
* @param cid
*/
void deleteCourseById(String cid);
void updatePassword(String teacherid, String newpassword);
/**
* Teacher
* Teachernull
*
* @param teacher Teacher
* @return Teacher
*/
Teacher findTeacherById(Teacher teacher);
/**
*
* Teacher
*
*
* @param updateTeacher Teacher
*/
void addTeacherAllInfo(Teacher updateTeacher);
/**
*
* teacherid
*
*
* @param teacherid
*/
void deleteTeacherById(String teacherid);
/**
*
* Teacher
* Teacher
*
* @param updateTeacher Teacher
*/
void updateInfo(Teacher updateTeacher);
}

@ -1,6 +1,7 @@
package utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
@ -9,22 +10,17 @@ import java.sql.Statement;
import java.util.Properties;
/**
* Druid便dao
*
* Druid,dao
*/
public class JDBCUtils {
// 定义成员变量DataSource用于存储通过Druid连接池工厂创建的数据源对象后续通过该数据源获取数据库连接
private static DataSource dataSource;
private static DataSource dataSource; //定义成员变量DataSource
static {
try {
// 加载配置文件,此处通过类加载器获取类路径下名为"druid.properties"的配置文件并将其加载到Properties对象中
// 配置文件中通常包含了连接数据库所需的各种参数,如数据库驱动、连接地址、用户名、密码等信息。
//加载配置文件
Properties properties = new Properties();
properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
// 获取DataSource利用Druid提供的DruidDataSourceFactory工厂类根据加载的配置文件属性创建数据源对象
// 如果创建过程出现异常(如配置文件格式错误、缺少关键配置项等),则会打印异常堆栈信息。
//获取DataSource
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
@ -32,38 +28,21 @@ public class JDBCUtils {
}
/**
*
* SQLException
*
* @return Connection
* @throws SQLException
*
*/
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
/**
* StatementConnection
* closenullResultSetStatementConnection
*
* @param statement SQLSQL使
* @param connection 使
*
*/
public static void close(Statement statement, Connection connection) {
close(null, statement, connection);
public static void close(Statement statement,Connection connection) {
close(null,statement,connection);
}
/**
* ResultSetStatementConnection
* ResultSetStatementConnection
* SQLException
*
* @param resultSet 使null
* @param statement SQLclose
* @param connection close
*/
public static void close(ResultSet resultSet, Statement statement, Connection connection) {
if (resultSet!= null) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
@ -71,7 +50,7 @@ public class JDBCUtils {
}
}
if (statement!= null) {
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
@ -79,25 +58,19 @@ public class JDBCUtils {
}
}
if (connection!= null) {
if (connection != null) {
try {
connection.close();// 归还连接,将使用完的数据库连接归还给连接池,以便后续其他操作可以继续复用该连接
} catch (SQLException e) {
connection.close();//归还连接
}catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
*
* DataSource
*
* @return DataSource
*
*/
public static DataSource getDataSource() {
return dataSource;
}
}
//whdiwfb
//
///

@ -3,6 +3,7 @@ package web.servlet.admin;
import domain.Student;
import service.StudentService;
import service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@ -11,40 +12,20 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
/**
* AddStudentInfoServletHttpServlet
*
* Servlet"/addStudentInfoServlet"POSTGET
*/
@WebServlet("/addStudentInfoServlet")
public class AddStudentInfoServlet extends HttpServlet {
/**
* POST
* 1. "utf-8"
* 2. StudentService
* 3. student-idStudent
* 4. addStudentServlet
* 5.
* 6. Student
* 7. addStudentServlet
*
* @param request HttpServletRequest
* @param response HttpServletResponse
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
StudentService service = new StudentServiceImpl();
StudentService service= new StudentServiceImpl();
//先进行判断是否已存在该学生
String sid = request.getParameter("student-id");
Student s = new Student();
s.setS_id(sid);
Student newStudent = service.findStudentById(s);
if (newStudent!= null) {
request.setAttribute("update_msg", "已存在该学生,请重新添加!" + String.format("%tT", new Date()));
if (newStudent != null) {
request.setAttribute("update_msg","已存在该学生,请重新添加!"+String.format("%tT",new Date()));
request.getRequestDispatcher("addStudentServlet").forward(request, response);
} else {
}else {
String name = request.getParameter("student-name");
String sex = request.getParameter("student-sex");
String age = request.getParameter("student-age");
@ -78,24 +59,13 @@ public class AddStudentInfoServlet extends HttpServlet {
updateStudent.setS_class(cclass);
service.addStudentAllInfo(updateStudent);
request.setAttribute("update_msg", "添加成功!" + String.format("%tT", new Date()));
request.setAttribute("update_msg","添加成功!"+String.format("%tT",new Date()));
request.getRequestDispatcher("addStudentServlet").forward(request, response);
}
}
/**
* GETdoPost使ServletGETPOST
* POSTGET
*
* @param request HttpServletRequestdoPost
* @param response HttpServletResponsedoPost
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
//mmm
//mmm

@ -6,6 +6,7 @@ import service.CDCService;
import service.StudentService;
import service.impl.CDCServiceImpl;
import service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@ -15,28 +16,8 @@ import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
/**
* AddStudentServletHttpServlet
* HttpSession
* JSP/WEB-INF/admin/addStudent.jsp便
* Servlet"/addStudentServlet"GETPOSTGETPOST
*/
@WebServlet("/addStudentServlet")
public class AddStudentServlet extends HttpServlet {
/**
* POST
* 1. "utf-8"
* 2. HttpSessionHttpSessionJSP
* 3. CDCServiceCDCServiceImpl
* 4. service2findAllCollege()findAllDepartment()findAllClass()CDC
* 5. HttpSession使"collegeLists""departmentLists""classLists"便JSP
* 6. "/WEB-INF/admin/addStudent.jsp"HttpSession便
*
* @param request HttpServletRequestHttpSession
* @param response HttpServletResponseJSP
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
HttpSession session = request.getSession();
@ -46,23 +27,14 @@ public class AddStudentServlet extends HttpServlet {
List<CDC> departmentList = service2.findAllDepartment();
List<CDC> classList = service2.findAllClass();
session.setAttribute("collegeLists", collegeList);
session.setAttribute("departmentLists", departmentList);
session.setAttribute("classLists", classList);
session.setAttribute("collegeLists",collegeList);
session.setAttribute("departmentLists",departmentList);
session.setAttribute("classLists",classList);
request.getRequestDispatcher("/WEB-INF/admin/addStudent.jsp").forward(request, response);
request.getRequestDispatcher("/WEB-INF/admin/addStudent.jsp").forward(request,response);
}
/**
* GETdoPostGETPOST
* GETPOSTSessionJSP
*
* @param request HttpServletRequestdoPost
* @param response HttpServletResponsedoPost
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -7,40 +7,13 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* AdminPasswordIndexServletHttpServlet
* JSP/WEB-INF/admin/adminUpdatePassword.jsp
* GETPOSTGETPOSTJSP
* Servlet"/adminPasswordIndexServlet"便
*/
@WebServlet("/adminPasswordIndexServlet")
public class AdminPasswordIndexServlet extends HttpServlet {
/**
* POST
* 使requestgetRequestDispatcher"/WEB-INF/admin/adminUpdatePassword.jsp"
* JSP
* forward使JSP便
*
* @param request HttpServletRequest
* @param response HttpServletResponseJSP使
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/admin/adminUpdatePassword.jsp").forward(request, response);
request.getRequestDispatcher("/WEB-INF/admin/adminUpdatePassword.jsp").forward(request,response);
}
/**
* GETdoPostGETPOST
* GETPOSTJSP
* 便
*
* @param request HttpServletRequestdoPost
* @param response HttpServletResponsedoPost
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -6,6 +6,7 @@ import service.AdminService;
import service.StudentService;
import service.impl.AdminServiceImpl;
import service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@ -15,39 +16,12 @@ import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Date;
/**
* AdminPasswordUpdateServletHttpServlet
*
* JSP/WEB-INF/admin/adminUpdatePassword.jsp
* Servlet"/adminPasswordUpdateServlet"GETPOSTGETPOST
*/
@WebServlet("/adminPasswordUpdateServlet")
public class AdminPasswordUpdateServlet extends HttpServlet {
/**
* POST
* 1. "utf-8"
* 2. HttpSession便
* 3. a_idadmin-newpasswordadmin-ennewpassword
* 4. regex312线"^[\\w]{3,12}$"
* 使matches
* "/WEB-INF/admin/adminUpdatePassword.jsp"
* 5.
* JSP
* 6. AdminServiceAdminServiceImpl
* 7. updatePassword
* 8. findAdminById
* HttpSession
* 9. "/WEB-INF/admin/adminUpdatePassword.jsp"
*
* @param request HttpServletRequest
* @param response HttpServletResponse
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
HttpSession session = request.getSession();
Admin admin = (Admin) session.getAttribute("admin");
Admin admin= (Admin) session.getAttribute("admin");
String adminid = admin.getA_id();
String newpassword = request.getParameter("admin-newpassword");
@ -55,19 +29,19 @@ public class AdminPasswordUpdateServlet extends HttpServlet {
String regex = "^[\\w]{3,12}$";
boolean flag = newpassword.matches(regex);
if (!flag) {
request.setAttribute("update_msg", "密码格式错误,重新提交!" + String.format("%tT", new Date()));
request.setAttribute("update_msg", "密码格式错误,重新提交!"+String.format("%tT",new Date()));
request.getRequestDispatcher("/WEB-INF/admin/adminUpdatePassword.jsp").forward(request, response);
} else if (!newpassword.equals(ennewpassword)) {
request.setAttribute("update_msg", "密码确认错误,请重新提交!" + String.format("%tT", new Date()));
request.getRequestDispatcher("/WEB-INF/admin/adminUpdatePassword.jsp").forward(request, response);
} else {
AdminService service = new AdminServiceImpl();
service.updatePassword(adminid, newpassword);
AdminService service= new AdminServiceImpl();
service.updatePassword(adminid,newpassword);
Admin newAdmin = service.findAdminById(admin);
admin = newAdmin;
session.setAttribute("admin", admin);
session.setAttribute("admin",admin);
request.setAttribute("update_msg", "修改成功!" + String.format("%tT", new Date()));
request.getRequestDispatcher("/WEB-INF/admin/adminUpdatePassword.jsp").forward(request, response);
@ -75,17 +49,7 @@ public class AdminPasswordUpdateServlet extends HttpServlet {
}
/**
* GETdoPostGETPOST
* GETPOST
* 便
*
* @param request HttpServletRequestdoPost
* @param response HttpServletResponsedoPost
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -5,6 +5,7 @@ import service.CourseService;
import service.StudentService;
import service.impl.CourseServiceImpl;
import service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@ -13,49 +14,18 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* DoDeleteSelectCourseServletHttpServlet
* Servlet
* ServletGETPOSTGETPOST"/doDeleteSelectCourseServlet"
*/
@WebServlet("/doDeleteSelectCourseServlet")
public class DoDeleteSelectCourseServlet extends HttpServlet {
/**
* POST
* 1. "utf-8"
* 2. HttpSession使
* 3. cid
* 4. CourseServiceCourseServiceImpl
* 5. servicedeleteServiceByIdcid
*
* 6. 使requestgetRequestDispatcher"/studentOptionalCourseServlet"
* ServletServlet使
*
* @param request HttpServletRequestcid
* @param response HttpServletResponseServlet使
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
HttpSession session = request.getSession();
String cid = request.getParameter("cid");
CourseService service = new CourseServiceImpl();
service.deleteServiceById(cid);
request.getRequestDispatcher("/studentOptionalCourseServlet").forward(request, response);
request.getRequestDispatcher("/studentOptionalCourseServlet").forward(request,response);
}
/**
* GETdoPostGETPOST
* GETPOST
* 便
*
* @param request HttpServletRequestdoPost
* @param response HttpServletResponsedoPost
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -1,11 +1,14 @@
package web.servlet.admin;
import domain.CDC;
import domain.Student;
import service.CDCService;
import service.StudentService;
import service.impl.CDCServiceImpl;
import service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@ -17,50 +20,21 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
* UpdateStudentInfoServletHttpServlet
*
* updateStudentServletsid
* ServletGETPOSTGETPOST"/updateStudentInfoServlet"
*/
@WebServlet("/updateStudentInfoServlet")
public class UpdateStudentInfoServlet extends HttpServlet {
/**
* POST
* 1. "utf-8"使使
* 2. HttpSessionHttpSession
* 3. student-id便System.out.println
* 4. student-namestudent-sexstudent-agestudent-phonestudent-emailstudent-addressselectCollegeselectDepartmentselectClass
* 便
* 5. StudentupdateStudent
* 6. 41124242
* <
* updateStudentServletsid
* 7. setupdateStudent使
* 8. StudentServiceStudentServiceImpl
* 9. serviceupdateInfoupdateStudent
*
* 10. updateStudentServletsid使
*
*
* @param request HttpServletRequest
* @param response HttpServletResponse使
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
// HttpSession session = request.getSession();
String sid = request.getParameter("student-id");
System.out.println("sid:" + sid);
System.out.println("sid:"+sid);
//保存输入内容
String name = request.getParameter("student-name");
System.out.println("sname:" + name);
System.out.println("sname:"+name);
String sex = request.getParameter("student-sex");
System.out.println("ssex:" + sex);
System.out.println("ssex:"+sex);
String age = request.getParameter("student-age");
String phone = request.getParameter("student-phone");
String email = request.getParameter("student-email");
@ -73,10 +47,10 @@ public class UpdateStudentInfoServlet extends HttpServlet {
Student updateStudent = new Student();
//判断输入位数是否大于数据库位数
if (name.length() > 4 || phone.length() > 11 || email.length() > 24 || address.length() > 24 || age.length() > 2 || name.contains("<") || phone.contains("<") || email.contains("<") || address.contains("<") || age.contains("<")) {
request.setAttribute("update_msg", "格式错误,请重新提交!" + String.format("%tT", new Date()));
request.getRequestDispatcher("updateStudentServlet?sid=" + sid).forward(request, response);
} else {
if (name.length() > 4 || phone.length() > 11 || email.length()>24 || address.length() > 24 || age.length()>2 || name.contains("<") || phone.contains("<") || email.contains("<") || address.contains("<") || age.contains("<")) {
request.setAttribute("update_msg","格式错误,请重新提交!"+String.format("%tT",new Date()));
request.getRequestDispatcher("updateStudentServlet?sid="+sid).forward(request, response);
}else {
//封装学生对象
updateStudent.setS_id(sid);
updateStudent.setS_name(name);
@ -90,26 +64,16 @@ public class UpdateStudentInfoServlet extends HttpServlet {
updateStudent.setS_class(cclass);
//调用studentUpdata服务
StudentService service = new StudentServiceImpl();
StudentService service= new StudentServiceImpl();
service.updateInfo(updateStudent);
//成功则返回并给提示
request.setAttribute("update_msg", "修改成功!" + String.format("%tT", new Date()));
request.getRequestDispatcher("updateStudentServlet?sid=" + sid).forward(request, response);
request.setAttribute("update_msg", "修改成功!"+String.format("%tT",new Date()));
request.getRequestDispatcher("updateStudentServlet?sid="+sid).forward(request, response);
}
}
/**
* GETdoPostGETPOST
* GETPOST
* 便
*
* @param request HttpServletRequestdoPost
* @param response HttpServletResponsedoPost
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -6,6 +6,7 @@ import service.CDCService;
import service.StudentService;
import service.impl.CDCServiceImpl;
import service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@ -15,36 +16,8 @@ import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
/**
* UpdateStudentServletHttpServlet
* HttpSession
* JSP/WEB-INF/admin/updateStudent.jsp便
* ServletGETPOSTGETPOST"/updateStudentServlet"
*/
@WebServlet("/updateStudentServlet")
public class UpdateStudentServlet extends HttpServlet {
/**
* POST
* 1. "utf-8"使使
* 2. HttpSessionHttpSessionJSP
* 3. sid
* 4. StudentS_idstudentid
* 5. StudentServiceStudentServiceImpl
* 6. servicefindStudentByIdstudent
* Student"student"便JSP便
* 7. CDCServiceCDCServiceImpl
* 8. service2findAllCollege()findAllDepartment()findAllClass()CDC
* JSP
* 9. HttpSession使"collegeLists""departmentLists""classLists"便JSP
* 便
* 10. 使requestgetRequestDispatcher"/WEB-INF/admin/updateStudent.jsp"
* JSPHttpSession便
*
* @param request HttpServletRequestsid
* @param response HttpServletResponseJSP使
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
HttpSession session = request.getSession();
@ -55,31 +28,21 @@ public class UpdateStudentServlet extends HttpServlet {
student.setS_id(studentid);
StudentService service = new StudentServiceImpl();
Student newStudent = service.findStudentById(student);
request.setAttribute("student", newStudent);
request.setAttribute("student",newStudent);
CDCService service2 = new CDCServiceImpl();
List<CDC> collegeList = service2.findAllCollege();
List<CDC> departmentList = service2.findAllDepartment();
List<CDC> classList = service2.findAllClass();
session.setAttribute("collegeLists", collegeList);
session.setAttribute("departmentLists", departmentList);
session.setAttribute("classLists", classList);
session.setAttribute("collegeLists",collegeList);
session.setAttribute("departmentLists",departmentList);
session.setAttribute("classLists",classList);
request.getRequestDispatcher("/WEB-INF/admin/updateStudent.jsp").forward(request, response);
request.getRequestDispatcher("/WEB-INF/admin/updateStudent.jsp").forward(request,response);
}
/**
* GETdoPostGETPOST
* GETPOST
* 便
*
* @param request HttpServletRequestdoPost
* @param response HttpServletResponsedoPost
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -8,6 +8,7 @@ import service.CDCService;
import service.StudentService;
import service.impl.CDCServiceImpl;
import service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@ -17,69 +18,33 @@ import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
/**
* CDCListServletHttpServletCDC
* CDCJSPServletGETPOSTGETPOST"/cdcListServlet"
*/
@WebServlet("/cdcListServlet")
public class CDCListServlet extends HttpServlet {
/**
* POST
* 1. "utf-8"使
* 2. CDCServiceCDCServiceImplCDCCDC
* 3. servicefindAllCDCCDC
* List<CDC>CDC
* 4. CDC"cdcs"JSPCDC便
* 5. HttpSessionHttpSession
* 6. HttpSessionStudentAdminTeacher
* 7. 使"/WEB-INF/student/sCDCList.jsp"
* CDC
* 8. "/WEB-INF/admin/aCDCList.jsp"
* CDC使
* 9. "/WEB-INF/teacher/tCDCList.jsp"
* CDCCDC使
* 10. "error.jsp"
*
* @param request HttpServletRequest使CDC
* @param response HttpServletResponseJSP使CDC
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//调用StudentService完成查询
CDCService service = new CDCServiceImpl();
List<CDC> cdcs = service.findAll();
//将list存入request域
request.setAttribute("cdcs", cdcs);
request.setAttribute("cdcs",cdcs);
HttpSession session = request.getSession();
Student student = (Student) session.getAttribute("student");
Admin admin = (Admin) session.getAttribute("admin");
Teacher teacher = (Teacher) session.getAttribute("teacher");
Student student= (Student)session.getAttribute("student");
Admin admin= (Admin)session.getAttribute("admin");
Teacher teacher= (Teacher)session.getAttribute("teacher");
if (student!= null && admin == null && teacher == null) {
if (student != null && admin == null && teacher == null) {
request.getRequestDispatcher("/WEB-INF/student/sCDCList.jsp").forward(request, response);
} else if (admin!= null && student == null && teacher == null) {
} else if (admin != null && student == null && teacher == null) {
request.getRequestDispatcher("/WEB-INF/admin/aCDCList.jsp").forward(request, response);
} else if (teacher!= null && admin == null && student == null) {
} else if (teacher != null && admin == null && student == null) {
request.getRequestDispatcher("/WEB-INF/teacher/tCDCList.jsp").forward(request, response);
} else {
request.getRequestDispatcher("error.jsp").forward(request, response);
}
}
/**
* GETdoPostGETPOST
* GETPOSTCDC
* 便CDC
*
* @param request HttpServletRequestdoPost
* @param response HttpServletResponsedoPost
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
this.doPost(request,response);
}
}
}

@ -4,6 +4,7 @@ import domain.Complaint;
import service.ComplaintService;
import service.NotifyService;
import service.impl.ComplaintServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@ -13,35 +14,8 @@ import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* AddComplaintsServletHttpServlet
*
* Servlet
* ServletGETPOSTGETPOST"/addComplaintsServlet"
*/
@WebServlet("/addComplaintsServlet")
public class AddComplaintsServlet extends HttpServlet {
/**
* POST
* 1. "utf-8"使使
* 2. Complaint便
* 3. "complaint"textObjectString
* 4. "script""/script"JavaScript
*
* 5. complaintcontent
* 6. DateSimpleDateFormat"yyyy-MM-dd HH:mm:ss"
* complaintcdate
* 7. ComplaintServiceComplaintServiceImpl
* 8. serviceaddComplaintcomplaint
*
* 9. "/complaintListServlet"response.sendRedirect("complaintServlet")使"complaintServlet"
* 使
*
* @param request HttpServletRequest
* @param response HttpServletResponsesendRedirect使
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
@ -51,8 +25,8 @@ public class AddComplaintsServlet extends HttpServlet {
String text = (String) request.getParameter("complaint");
if (text.contains("script") && text.contains("/script")) {
text = text.replace("script", "");
text = text.replace("/script", "");
text = text.replace("script","");
text = text.replace("/script","");
}
if (!text.equals("")) {
@ -68,17 +42,7 @@ public class AddComplaintsServlet extends HttpServlet {
// request.getRequestDispatcher("/complaintListServlet").forward(request,response);
}
/**
* GETdoPostGETPOST
* GETPOST
* 便
*
* @param request HttpServletRequestdoPost
* @param response HttpServletResponsedoPost
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -3,6 +3,7 @@ package web.servlet.complaints;
import domain.Complaint;
import service.ComplaintService;
import service.impl.ComplaintServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@ -11,47 +12,16 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
* ComplaintListServletHttpServlet
* JSP/WEB-INF/complaint/complaintsList.jsp
* ServletGETPOSTGETPOST"/complaintListServlet"
*/
@WebServlet("/complaintListServlet")
public class ComplaintListServlet extends HttpServlet {
/**
* POST
* 1. "utf-8"使
* 2. ComplaintServiceComplaintServiceImpl
* 3. servicefindAll
* List<Complaint>Complaint
* 4. "complaints"JSP便
* 5. 使requestgetRequestDispatcher"/WEB-INF/complaint/complaintsList.jsp"
* JSP
*
* @param request HttpServletRequest使
* @param response HttpServletResponseJSP使
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
ComplaintService service = new ComplaintServiceImpl();
List<Complaint> complaints = service.findAll();
request.setAttribute("complaints", complaints);
request.getRequestDispatcher("/WEB-INF/complaint/complaintsList.jsp").forward(request, response);
request.setAttribute("complaints",complaints);
request.getRequestDispatcher("/WEB-INF/complaint/complaintsList.jsp").forward(request,response);
}
/**
* GETdoPostGETPOST
* GETPOST
* 便
*
* @param request HttpServletRequestdoPost
* @param response HttpServletResponsedoPost
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -3,6 +3,7 @@ package web.servlet.complaints;
import domain.Complaint;
import service.ComplaintService;
import service.impl.ComplaintServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@ -11,47 +12,17 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
* ComplaintServletHttpServlet
* JSP/WEB-INF/complaint/complaintsList.jsp
* GETPOSTGETPOST"/complaintServlet"
*/
@WebServlet("/complaintServlet")
public class ComplaintServlet extends HttpServlet {
/**
* POST
* 1. "utf-8"
* 2. ComplaintServiceComplaintServiceImpl
* 3. servicefindAll
* List<Complaint>Complaint
* 4. "complaints"JSP便
* 5. 使requestgetRequestDispatcher"/WEB-INF/complaint/complaintsList.jsp"
* JSP使
*
* @param request HttpServletRequest
* @param response HttpServletResponseJSP使
* @throws ServletException ServletServlet
* @throws IOException
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
ComplaintService service = new ComplaintServiceImpl();
List<Complaint> complaints = service.findAll();
request.setAttribute("complaints", complaints);
request.getRequestDispatcher("/WEB-INF/complaint/complaintsList.jsp").forward(request, response);
request.setAttribute("complaints",complaints);
request.getRequestDispatcher("/WEB-INF/complaint/complaintsList.jsp").forward(request,response);
}
/**
* GETdoPostGETPOST
* GETPOST
* 便
*
* @param request HttpServletRequestPOST
* @param response HttpServletResponsePOST使
* @throws ServletException POSTGETServlet
* @throws IOException
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -8,28 +8,19 @@ import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
// 使用WebServlet注解将该类映射到指定的URL路径"/deleteFileServlet"表明这是一个Servlet类用于处理对应的网络请求
@WebServlet("/deleteFileServlet")
public class DeleteFileServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求的字符编码为"utf-8",确保能正确解析包含中文等多字节字符的请求参数
request.setCharacterEncoding("utf-8");
// 从请求中获取名为"filename"的参数值,这个参数应该是要删除文件的文件名
String fileName = request.getParameter("filename");
// 根据Servlet上下文获取"upload"目录的真实路径并与文件名拼接起来构造出要删除文件的完整路径创建对应的File对象
File file = new File(this.getServletContext().getRealPath("upload") + File.separator + fileName);
// 判断文件是否存在,如果存在则执行删除操作
File file = new File(this.getServletContext().getRealPath("upload")+File.separator+fileName);
if (file.exists()) {
file.delete();
}
// 将请求转发到"/fileListServlet"对应的Servlet应该是用于展示文件列表之类的功能以更新文件列表等相关显示内容
request.getRequestDispatcher("/fileListServlet").forward(request, response);
request.getRequestDispatcher("/fileListServlet").forward(request,response);
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -15,79 +15,48 @@ import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
// 使用WebServlet注解将该类映射到"/downloadServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 从请求中获取名为"filename"的参数,该参数代表要下载的文件的文件名
String filename = request.getParameter("filename");
// 判断文件名是否为"../"或者"/",如果是则表示可能存在非法的访问路径,将请求转发到"error.jsp"页面进行错误提示
if (filename.equalsIgnoreCase("../") || filename.equalsIgnoreCase("/")) {
request.getRequestDispatcher("error.jsp").forward(request, response);
}
// 设置响应头的Content-Type为"application/octet-stream",表示这是一个二进制流数据,通常用于文件下载
response.addHeader("content-Type", "application/octet-stream");
// 获取请求头中的User-Agent信息用于判断客户端浏览器类型不同浏览器对文件名编码处理可能有所不同
String agent = request.getHeader("User-Agent");
// 判断User-Agent中是否包含"chrome"转换为小写后判断如果是Chrome浏览器
if (agent.toLowerCase().indexOf("chrome") > 0) {
// 对文件名进行编码转换先将UTF-8编码的字节数组转换为ISO8859-1编码的字符串用于设置Content-Disposition响应头中的文件名部分
// 这样Chrome浏览器能正确识别并显示下载文件名处理文件名中的中文等特殊字符情况
response.addHeader("content-Disposition", "attachment;filename=" + new String(filename.getBytes("UTF-8"), "ISO8859-1"));
} else {
// 如果不是Chrome浏览器使用URLEncoder将文件名按照UTF-8编码进行URL编码同样用于设置Content-Disposition响应头中的文件名部分
// 以保证在其他浏览器中能正确显示下载文件名
response.addHeader("content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
}
// 通过Servlet上下文获取指定文件位于"/upload/"目录下文件名由前面获取的filename决定的输入流用于读取文件内容
InputStream in = getServletContext().getResourceAsStream("/upload/" + filename);
// 获取ServletResponse的输出流用于将文件内容写回到客户端实现文件下载功能
ServletOutputStream out = response.getOutputStream();
// 创建一个大小为1024字节的字节数组用于缓存从文件读取的数据
byte[] bs = new byte[1024];
int len = -1;
// 通过循环从输入流读取数据到字节数组每次读取的数据长度存放在len变量中当读取到文件末尾时len为-1循环结束
while ((len = in.read(bs))!= -1) {
// 将读取到的字节数据长度为len从字节数组bs中写入到输出流out实现将文件内容发送给客户端
while ((len = in.read(bs)) != -1) {
out.write(bs, 0, len);
}
// 关闭输出流,释放相关资源
out.close();
// 关闭输入流,释放相关资源
in.close();
// 获取当前请求的HttpSession对象用于获取会话中存储的用户相关信息
HttpSession session = request.getSession();
// 从会话中尝试获取Student类型的用户对象如果存在表示当前登录用户是学生角色
Student student = (Student) session.getAttribute("student");
// 从会话中尝试获取Admin类型的用户对象如果存在表示当前登录用户是管理员角色
Admin admin = (Admin) session.getAttribute("admin");
// 从会话中尝试获取Teacher类型的用户对象如果存在表示当前登录用户是教师角色
Teacher teacher = (Teacher) session.getAttribute("teacher");
// 判断如果当前登录用户是学生角色,且不是管理员和教师角色,那么请求转发到学生角色对应的文件列表页面("/WEB-INF/student/sFindFileList.jsp"
if (student!= null && admin == null && teacher == null) {
Student student= (Student)session.getAttribute("student");
Admin admin= (Admin)session.getAttribute("admin");
Teacher teacher= (Teacher)session.getAttribute("teacher");
if (student != null && admin == null && teacher == null) {
request.getRequestDispatcher("/WEB-INF/student/sFindFileList.jsp").forward(request, response);
} else if (admin!= null && student == null && teacher == null) { // 如果是管理员角色,且不是学生和教师角色,转发到管理员对应的文件列表页面
} else if (admin != null && student == null && teacher == null) {
request.getRequestDispatcher("/WEB-INF/admin/aFindFileList.jsp").forward(request, response);
} else if (teacher!= null && admin == null && student == null) { // 如果是教师角色,且不是管理员和学生角色,转发到教师对应的文件列表页面
} else if (teacher != null && admin == null && student == null) {
request.getRequestDispatcher("/WEB-INF/teacher/tFindFileList.jsp").forward(request, response);
} else {
// 如果不符合以上任何一种角色情况,可能存在异常情况,将请求转发到"error.jsp"页面进行错误提示
request.getRequestDispatcher("error.jsp").forward(request, response);
}
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
}

@ -18,104 +18,71 @@ import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
// 使用WebServlet注解将该类映射到"/fileListServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
@WebServlet("/fileListServlet")
public class FileListServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求的字符编码为"utf-8",确保能正确解析包含中文等多字节字符的请求参数
request.setCharacterEncoding("utf-8");
// 根据Servlet上下文获取"upload"目录的真实路径并创建对应的File对象用于后续操作该目录下的文件
File dir = new File(this.getServletContext().getRealPath("upload"));
// 判断该目录是否不存在,并且不是一个目录(可能不存在或者是个文件等不符合预期的情况)
if (!dir.exists() &&!dir.isDirectory()) {
// 在控制台打印提示信息,说明"upload"目录不存在,需要创建
if (!dir.exists() && !dir.isDirectory()) {
System.out.println(this.getServletContext().getRealPath("upload") + "目录不存在,需要创建");
// 创建"upload"目录
// 创建目录
dir.mkdir();
}
// 获取"upload"目录下的所有文件和子目录返回一个File数组方便后续遍历操作这些文件
File[] arrs = dir.listFiles();
// 创建一个FileClass类型的列表用于存储文件相关信息后续会将"upload"目录下每个文件的信息封装到FileClass对象中并添加到这个列表里
List<FileClass> fileLists = new ArrayList<FileClass>();
// 遍历"upload"目录下的所有文件通过增强for循环遍历File数组
for (File f : arrs) {
// 获取文件的字节长度,即文件大小(单位为字节)
for(File f:arrs){
long l = f.length();
// 调用getPrintSize方法将文件大小的字节数转换为合适的带单位的字符串表示形式如KB、MB、GB等
String fileSize = getPrintSize(l);
// 创建一个FileClass对象用于封装单个文件的相关信息
FileClass file = new FileClass();
// 设置文件名通过调用File对象的getName方法获取文件名
file.setFileName(f.getName());
// 设置文件的绝对路径通过调用File对象的getAbsolutePath方法获取
file.setFilePath(f.getAbsolutePath());
// 设置文件大小,使用前面转换好的带单位的文件大小字符串
file.setFileSize(fileSize);
// 将封装好文件信息的FileClass对象添加到fileLists列表中
fileLists.add(file);
}
request.setAttribute("fileLists",fileLists);
// 将包含所有文件信息的fileLists列表存放到请求的属性中属性名为"fileLists",方便在后续转发的页面中获取并展示文件列表信息
request.setAttribute("fileLists", fileLists);
// 获取当前请求的HttpSession对象用于获取会话中存储的用户相关信息
HttpSession session = request.getSession();
// 从会话中尝试获取Student类型的用户对象如果存在表示当前登录用户是学生角色
Student student = (Student) session.getAttribute("student");
// 从会话中尝试获取Admin类型的用户对象如果存在表示当前登录用户是管理员角色
Admin admin = (Admin) session.getAttribute("admin");
// 从会话中尝试获取Teacher类型的用户对象如果存在表示当前登录用户是教师角色
Teacher teacher = (Teacher) session.getAttribute("teacher");
Student student= (Student)session.getAttribute("student");
// 判断如果当前登录用户是学生角色,且不是管理员和教师角色,那么请求转发到学生角色对应的文件列表页面("/WEB-INF/student/sFindFileList.jsp"
if (student!= null && admin == null && teacher == null) {
Admin admin= (Admin)session.getAttribute("admin");
Teacher teacher= (Teacher)session.getAttribute("teacher");
if (student != null && admin == null && teacher == null) {
request.getRequestDispatcher("/WEB-INF/student/sFindFileList.jsp").forward(request, response);
} else if (admin!= null && student == null && teacher == null) { // 如果是管理员角色,且不是学生和教师角色,转发到管理员对应的文件列表页面
} else if (admin != null && student == null && teacher == null) {
request.getRequestDispatcher("/WEB-INF/admin/aFindFileList.jsp").forward(request, response);
} else if (teacher!= null && admin == null && student == null) { // 如果是教师角色,且不是管理员和学生角色,转发到教师对应的文件列表页面
} else if (teacher != null && admin == null && student == null) {
request.getRequestDispatcher("/WEB-INF/teacher/tFindFileList.jsp").forward(request, response);
} else {
// 如果不符合以上任何一种角色情况,可能存在异常情况,将请求转发到"error.jsp"页面进行错误提示
request.getRequestDispatcher("error.jsp").forward(request, response);
}
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
// 静态方法,用于将文件大小的字节数转换为合适的带单位的字符串表示形式,方便展示给用户直观了解文件大小
public static String getPrintSize(long size) {
// 将传入的文件大小字节数转换为double类型方便后续进行数值计算和比较
// 如果字节数少于1024则直接以B为单位否则先除于1024后3位因太少无意义
double value = (double) size;
// 如果字节数少于1024说明文件较小直接以B字节为单位返回将数值转换为字符串并拼接上单位"B"
if (value < 1024) {
return String.valueOf(value) + "B";
} else {
// 如果字节数大于等于1024先将字节数除以1024得到以KB为单位的数值暂时还未处理小数位数等情况
// 使用BigDecimal进行数值处理设置小数位数为2位舍入模式为向下取整ROUND_DOWN再获取处理后的double类型数值
value = new BigDecimal(value / 1024).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
}
// 如果原字节数除于1024之后少于1024则可以直接以KB作为单位将数值转换为字符串并拼接上单位"KB"
// 如果原字节数除于1024之后少于1024则可以直接以KB作为单位
// 因为还没有到达要使用另一个单位的时候
// 接下去以此类推
if (value < 1024) {
return String.valueOf(value) + "KB";
} else {
// 如果数值大于等于1024KB再将其除以1024得到以MB为单位的数值同样先进行数值处理设置小数位数和舍入模式
value = new BigDecimal(value / 1024).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
}
if (value < 1024) {
return String.valueOf(value) + "MB";
} else {
// 否则如果要以GB为单位的先除于1024再作同样的处理得到以GB为单位的数值将其转换为字符串并拼接上单位"GB"后返回
// 否则如果要以GB为单位的先除于1024再作同样的处理
value = new BigDecimal(value / 1024).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
return String.valueOf(value) + "GB";
}
}
}
}

@ -7,21 +7,13 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// 使用WebServlet注解将该类映射到"/fileServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
@WebServlet("/fileServlet")
public class FileServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 将当前请求转发到"/WEB-INF/admin/uploadFile.jsp"页面。
// 通常这样做可能是引导用户进入文件上传的相关页面,
// 比如后续在该JSP页面中会提供文件上传的表单等操作界面供用户进行文件上传操作。
request.getRequestDispatcher("/WEB-INF/admin/uploadFile.jsp").forward(request, response);
request.getRequestDispatcher("/WEB-INF/admin/uploadFile.jsp").forward(request,response);
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
// 也就是当接收到GET请求时同样会将请求转发到"/WEB-INF/admin/uploadFile.jsp"页面。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -20,123 +20,80 @@ import java.awt.image.BufferedImage;
import java.io.*;
import java.net.ServerSocket;
// 使用WebServlet注解将该类映射到"/showPhotoServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
@WebServlet("/showPhotoServlet")
public class ShowPhotoServlet extends HttpServlet {
// 定义表示GIF图片的MIME类型及字符编码用于设置响应头中Content-Type字段表明输出的内容类型为GIF图片格式
private static final String GIF = "image/gif;charset=GB2312";
// 定义表示JPEG图片的MIME类型及字符编码用于设置响应头中Content-Type字段表明输出的内容类型为JPEG图片格式
private static final String GIF = "image/gif;charset=GB2312";// 设定输出的类型
private static final String JPG = "image/jpeg;charset=GB2312";
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 从请求中获取名为"spec"的参数,该参数用于标识要输出图片的类型(可能是用于区分不同格式图片之类的标识)
String spec = request.getParameter("spec");
String spec = request.getParameter("spec");// 输出图片的类型的标志
// 设置请求的字符编码为"utf-8",确保能正确解析包含中文等多字节字符的请求参数
request.setCharacterEncoding("utf-8");
// 获取当前请求对应的HttpSession对象用于获取会话中存储的用户相关信息
HttpSession session = request.getSession();
// 从会话中尝试获取Student类型的用户对象如果存在表示当前登录用户是学生角色
Student student = (Student) session.getAttribute("student");
// 从会话中尝试获取Teacher类型的用户对象如果存在表示当前登录用户是教师角色
Teacher teacher = (Teacher) session.getAttribute("teacher");
// 定义一个Photo对象用于存储要展示的照片相关信息后续根据登录用户角色来获取对应的照片信息
Photo p;
// 如果当前登录用户是学生角色
if (student!= null) {
// 创建PhotoService的实现类实例用于调用业务逻辑层方法来获取学生对应的照片信息
if (student != null) {
PhotoService service = new PhotoServiceImpl();
// 通过业务逻辑层方法根据学生的IDstudent.getS_id()查找对应的照片信息并赋值给p对象
p = service.findPhotoByPhotoId(student.getS_id());
} else {
// 如果不是学生角色即当前登录用户是教师角色同样创建PhotoService的实现类实例
}else{
PhotoService service = new PhotoServiceImpl();
// 通过业务逻辑层方法根据教师的IDteacher.getT_id()查找对应的照片信息并赋值给p对象
p = service.findPhotoByPhotoId(teacher.getT_id());
}
// 初始化要展示照片的文件路径字符串,后续根据实际情况确定具体路径
String imagePath = "";
// 如果通过前面查找没有获取到对应的照片信息p为null
if (p == null) {
// 则使用默认的照片路径构造出默认照片0.jpg在服务器端的真实路径通常用于当没有用户对应照片时展示默认图片
imagePath = this.getServletContext().getRealPath("/photos/") + "0.jpg";
System.out.println(imagePath);
} else {
// 如果获取到了对应的照片信息,获取照片的名称(文件名)
String photoName = p.getPhotoName();
// 根据照片名称构造出该照片在服务器端("/photos/"目录下)的真实路径
imagePath = this.getServletContext().getRealPath("/photos/") + photoName;
System.out.println(imagePath);
}
// 重置响应对象,清除之前可能设置的一些响应头和状态码等信息,确保后续设置是准确有效的
response.reset();
// 获取ServletResponse的输出流用于向客户端输出图片数据实现图片展示功能
OutputStream output = response.getOutputStream();
response.reset();
// 判断图片文件路径是否以".jpg"结尾即判断是否为JPEG格式图片若是则进行以下JPEG图片处理逻辑
if (imagePath.toLowerCase().endsWith(".jpg")) {
// 设置响应头的Content-Type为JPEG图片对应的MIME类型告知客户端返回的是JPEG格式的图片数据
response.setContentType(JPG);
OutputStream output = response.getOutputStream();// 得到输出流
if (imagePath.toLowerCase().endsWith(".jpg"))// 使用编码处理文件流的情况:
{
response.setContentType(JPG);// 设定输出的类型
// 得到图片的真实路径
// 根据图片的真实路径创建FileInputStream对象用于读取图片文件的原始数据
// 得到图片的文件流
InputStream imageIn = new FileInputStream(new File(imagePath));
// 通过JPEGCodec创建JPEGImageDecoder对象用于对读取到的JPEG格式文件流进行解码操作将其转换为BufferedImage对象便于后续处理
// 得到输入的编码器将文件流进行jpg格式编码
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(imageIn);
// 使用解码器对图片文件流进行解码得到BufferedImage类型的图片对象该对象包含了图片的像素等信息
// 得到编码后的图片对象
BufferedImage image = decoder.decodeAsBufferedImage();
// 通过JPEGCodec创建JPEGImageEncoder对象用于对处理后的图片进行编码以便输出到客户端
// 得到输出的编码器
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
// 使用编码器将BufferedImage类型的图片对象进行编码并通过输出流输出到客户端实现JPEG图片的展示
encoder.encode(image);
// 关闭用于读取图片文件的输入流,释放相关资源
imageIn.close();
encoder.encode(image);// 对图片进行输出编码
imageIn.close();// 关闭文件流
}
// 判断图片文件路径是否以".gif"结尾即判断是否为GIF格式图片若是则进行以下GIF图片处理逻辑
if (imagePath.toLowerCase().endsWith(".gif")) {
// 设置响应头的Content-Type为GIF图片对应的MIME类型告知客户端返回的是GIF格式的图片数据
if (imagePath.toLowerCase().endsWith(".gif"))// 不使用编码处理文件流的情况:
{
response.setContentType(GIF);
// 获取Servlet上下文对象可用于获取服务器端相关资源
ServletContext context = getServletContext();
// 通过Servlet上下文对象根据图片文件路径获取对应的输入流用于读取GIF图片文件的数据
InputStream imageIn = context.getResourceAsStream(imagePath);
// 使用BufferedInputStream对读取GIF图片文件的输入流进行缓冲包装提高读取效率
BufferedInputStream bis = new BufferedInputStream(imageIn);
// 使用BufferedOutputStream对向客户端输出的输出流进行缓冲包装提高输出效率
BufferedOutputStream bos = new BufferedOutputStream(output);
// 创建一个大小为4096字节的字节数组用于缓存从文件读取和向客户端输出的数据
byte data[] = new byte[4096];
ServletContext context = getServletContext();// 得到背景对象
InputStream imageIn = context.getResourceAsStream(imagePath);// 文件流
BufferedInputStream bis = new BufferedInputStream(imageIn);// 输入缓冲流
BufferedOutputStream bos = new BufferedOutputStream(output);// 输出缓冲流
byte data[] = new byte[4096];// 缓冲字节数
int size = 0;
// 从缓冲输入流中读取数据到字节数组每次读取的数据长度存放在size变量中当读取到文件末尾时size为-1
size = bis.read(data);
// 通过循环不断读取数据并输出到客户端直到读取完整个文件size为-1时结束循环
while (size!= -1) {
while (size != -1) {
bos.write(data, 0, size);
size = bis.read(data);
}
// 关闭缓冲输入流,释放相关资源
bis.close();
// 刷新输出缓冲流,确保所有数据都被及时发送到客户端
bos.flush();
// 关闭输出缓冲流,释放相关资源
bos.flush();// 清空输出缓冲流
bos.close();
}
// 关闭用于向客户端输出的输出流,释放相关资源
output.close();
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -24,137 +24,83 @@ import java.io.InputStream;
import java.util.Date;
import java.util.List;
// 使用WebServlet注解将该类映射到"/uploadImageServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
@WebServlet("/uploadImageServlet")
public class UploadImageServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取当前请求对应的HttpSession对象用于获取会话中存储的用户相关信息
HttpSession session = request.getSession();
// 从会话中尝试获取Student类型的用户对象如果存在表示当前登录用户是学生角色
Student student = (Student) session.getAttribute("student");
// 从会话中尝试获取Teacher类型的用户对象如果存在表示当前登录用户是教师角色
Teacher teacher = (Teacher) session.getAttribute("teacher");
// 从会话中尝试获取Admin类型的用户对象如果存在表示当前登录用户是管理员角色
Admin admin = (Admin) session.getAttribute("admin");
// 初始化一个字符串变量id用于存储后续根据登录用户角色确定的唯一标识如学生的学号、教师的教师编号等先初始化为空字符串
String id = "";
// 如果当前登录用户是学生角色则将学生的学号赋值给id变量作为后续处理图片相关操作的关联标识
if (student!= null) {
if (student != null) {
id = student.getS_id();
}
// 在请求属性中设置"message"属性为空字符串,可能用于后续传递一些提示信息(目前此处暂未看到实际使用场景)
request.setAttribute("message", "");
// 在请求属性中设置"path"属性为空字符串,可能用于后续传递图片的保存路径等相关信息(目前此处暂未看到实际使用场景)
request.setAttribute("path", "");
// 初始化用于存储原始文件名的变量初始化为null
String filename = null;
// 初始化用于存储处理后的新文件名的变量初始化为null
String newFileName = null;
// 获取服务器上用于保存上传图片的目录路径通过Servlet上下文获取"/photos"目录的真实路径
// 设置上传图片的保存路径
String savePath = this.getServletContext().getRealPath("/photos");
// 根据保存路径创建对应的File对象用于后续判断目录是否存在等操作
File file = new File(savePath);
// 判断上传图片的保存目录是否存在,如果不存在并且不是一个目录(可能不存在或者是个文件等不符合预期的情况)
if (!file.exists() &&!file.isDirectory()) {
// 在控制台打印提示信息,说明该目录不存在,需要创建
// 判断上传文件的保存目录是否存在
if (!file.exists() && !file.isDirectory()) {
System.out.println(savePath + "目录不存在,需要创建");
// 创建目录
// 创建目录
file.mkdir();
}
// 1、创建一个DiskFileItemFactory对象它是Apache Commons FileUpload组件中用于创建文件项的工厂类
// 可以配置一些与文件上传相关的底层参数(如临时文件存储等,此处使用默认配置)
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2、创建一个ServletFileUpload对象它是用于解析上传文件的核心类通过传入前面创建的工厂对象来进行初始化
// 后续可以使用它来解析HTTP请求中的文件上传相关内容
// 2、创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置请求头的编码为"UTF-8",确保能正确解析包含中文等多字节字符的文件名等信息
upload.setHeaderEncoding("UTF-8");
// 3、判断提交上来的数据是否是符合文件上传表单的数据格式通过请求的Content-Type等相关信息判断
// 如果不是则说明不是文件上传请求,按照传统方式获取数据(此处直接返回,意味着不处理这种情况)
// 3、判断提交上来的数据是否是上传表单的数据
if (!ServletFileUpload.isMultipartContent(request)) {
// 按照传统方式获取数据
return;
}
try {
// 使用ServletFileUpload对象解析HTTP请求获取所有的文件项FileItem列表每个FileItem对应一个表单中的文件上传字段或普通表单字段
List<FileItem> list = upload.parseRequest(request);
// 打印文件项列表信息(此处可能是用于调试,查看获取到的文件相关信息情况),实际应用中可根据需求决定是否保留
System.out.println(list.toString());
// 遍历文件项列表,对每个文件项进行处理
System.out.println(list.toString());// 文件的路径 以及保存的路径
for (FileItem item : list) {
// 获取文件项对应的文件名,这里获取到的文件名包含完整路径(例如在客户端本地的完整路径)
filename = item.getName();
filename = item.getName();// 获得一个项的文件名称
try {
// 根据登录用户的标识(如学生学号等)和原始文件名的后缀(通过截取文件名中最后一个点后面的部分)构建新的文件名,
// 目的可能是保证文件名的唯一性以及与用户关联等,例如将学号和原文件名后缀拼接起来
newFileName = id + filename.substring(filename.lastIndexOf("."));
// 同时也对原始文件名做同样的处理,用于后续保存文件等操作(这里可能存在重复代码,可以考虑优化)
filename = id + filename.substring(filename.lastIndexOf("."));
} catch (Exception e) {
e.printStackTrace();
}
// 如果文件名是空的(可能是获取文件名出现问题或者该项不是文件上传项等情况),则跳过当前循环,继续处理下一个文件项
if (filename == null || filename.trim().equals("")) {
if (filename == null || filename.trim().equals("")) {// 如果為空則跳過
continue;
}
// 報錯 需要過濾文件名稱 java.io.FileNotFoundException:
// G:\测试02\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\FaceUp\WEB-INF\images\C:\Users\Ray\Pictures\2.jpeg
// (文件名、目录名或卷标语法不正确。)
// 对文件名进行处理,截取文件名中最后一个反斜杠(\)后面的部分,去除路径信息,只保留文件名部分,
// 这样在保存文件到服务器指定目录时使用的文件名更符合要求(避免包含客户端本地的完整路径导致保存出错)
filename = filename.substring(filename.lastIndexOf("\\") + 1);
// System.out.print(filename);
if (filename.substring(filename.lastIndexOf(".") + 1).equals("JPG")
|| filename.substring(filename.lastIndexOf(".") + 1).equals("JPEG")
|| filename.substring(filename.lastIndexOf(".") + 1).equals("gif")
|| filename.substring(filename.lastIndexOf(".") + 1).equals("GIF")
|| filename.substring(filename.lastIndexOf(".") + 1).equals("jpg")
|| filename.substring(filename.lastIndexOf(".") + 1).equals("jpeg")) {
InputStream in = item.getInputStream();// 獲得上傳的輸入流
FileOutputStream out = new FileOutputStream(savePath + "\\" + filename);// 指定web-inf目錄下的images文件
request.setAttribute("path", "photos"+"\\" + filename);
// 判断文件名的后缀通过截取文件名中最后一个点后面的部分并转换为大写后进行比较是否是允许上传的图片格式JPG、JPEG、GIF等
// 如果是则进行文件上传相关操作
if (filename.substring(filename.lastIndexOf(".") + 1).equalsIgnoreCase("JPG")
|| filename.substring(filename.lastIndexOf(".") + 1).equalsIgnoreCase("JPEG")
|| filename.substring(filename.lastIndexOf(".") + 1).equalsIgnoreCase("GIF")
|| filename.substring(filename.lastIndexOf(".") + 1).equalsIgnoreCase("jpg")
|| filename.substring(filename.lastIndexOf(".") + 1).equalsIgnoreCase("jpeg")) {
// 获取文件项对应的输入流,通过该输入流可以读取客户端上传的文件内容
InputStream in = item.getInputStream();
// 创建一个FileOutputStream对象用于将读取到的文件内容写入到服务器指定的保存目录下
// 构造的文件路径是在之前确定的保存路径savePath基础上加上处理后的文件名通过"\\"拼接路径和文件名)
FileOutputStream out = new FileOutputStream(savePath + "\\" + filename);
// 在请求属性中设置"path"属性,记录图片在服务器端保存后的相对路径(这里记录的路径格式可能需要根据实际前端使用情况进行调整),
// 方便后续页面展示等操作可以获取到图片的位置信息
request.setAttribute("path", "photos" + "\\" + filename);
// 创建一个大小为1024字节的字节数组用于缓存从输入流读取的数据提高读写效率
byte buffer[] = new byte[1024];
int len = 0;
// 通过循环不断从输入流读取数据到字节数组每次读取的数据长度存放在len变量中只要读取到的数据长度大于0就继续循环
// 并将读取到的数据通过输出流写入到服务器端的文件中,实现文件上传保存的功能
while ((len = in.read(buffer)) > 0) {
byte buffer[] = new byte[1024];
while ((len = in.read(buffer)) > 0)// 每次讀取
{
out.write(buffer, 0, len);
}
// 关闭用于读取文件的输入流,释放相关资源
in.close();
// 关闭用于写入文件的输出流,释放相关资源
out.close();
// 删除临时文件如果有根据Apache Commons FileUpload的机制在一些情况下会生成临时文件此处删除它
item.delete();
} else {
// 如果文件名后缀不是允许上传的图片格式,则表示上传的文件不符合要求,
// 在请求属性中设置"update_msg"属性,添加提示信息,说明上传失败以及失败原因(只能上传指定类型的图片文件),
// 并带上当前的时间信息通过String.format("%tT", new Date())格式化时间)
request.setAttribute("update_msg", "上传失败只能上传类型为jpg或GIF的图像文件" + String.format("%tT", new Date()));
// 将请求转发到"/WEB-INF/student/studentAddPhoto.jsp"页面,可能该页面用于显示上传结果等相关信息给用户
} else { //必须是图片才能上传否则失败
request.setAttribute("update_msg", "上传失败只能上传类型为jpg或GIF的图像文件"+String.format("%tT",new Date()));
// request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
request.getRequestDispatcher("/WEB-INF/student/studentAddPhoto.jsp").forward(request, response);
return;
}
@ -163,34 +109,24 @@ public class UploadImageServlet extends HttpServlet {
e.printStackTrace();
}
// 创建一个Photo对象用于封装要保存或更新到数据库中的照片相关信息先设置照片的唯一标识如学生学号等
Photo photo = new Photo();
photo.setPhotoId(id);
// 设置照片的名称,使用前面处理后得到的新文件名
photo.setPhotoName(newFileName);
// 创建PhotoService的实现类实例用于调用业务逻辑层方法来处理照片数据在数据库中的保存或更新操作
PhotoService service = new PhotoServiceImpl();
// 通过业务逻辑层方法根据照片的唯一标识id查找数据库中是否已经存在对应的照片记录
Photo photo1 = service.findPhotoByPhotoId(id);
// 如果查找结果为null表示数据库中不存在该照片记录则调用业务逻辑层的添加照片方法将新的照片信息保存到数据库中
if (photo1 == null) {
Photo photo1= service.findPhotoByPhotoId(id);
if (photo1==null) {
service.addPhoto(photo);
} else {
// 如果数据库中已经存在对应的照片记录,则调用业务逻辑层的更新照片方法,使用新的照片信息更新数据库中的记录
}else {
service.updatePhoto(photo);
}
// 在请求属性中设置"update_msg"属性添加提示信息说明上传成功并带上当前的时间信息通过String.format("%tT", new Date())格式化时间)
request.setAttribute("update_msg", "上传成功!" + String.format("%tT", new Date()));
// 将请求转发到"/WEB-INF/student/studentAddPhoto.jsp"页面,可能该页面用于显示上传结果等相关信息给用户
request.setAttribute("update_msg", "上传成功!"+String.format("%tT",new Date()));
// request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
request.getRequestDispatcher("/WEB-INF/student/studentAddPhoto.jsp").forward(request, response);
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
// 即当接收到GET请求时同样会将请求转发到"/WEB-INF/student/studentAddPhoto.jsp"页面
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/student/studentAddPhoto.jsp").forward(request, response);
}
}
}

@ -16,37 +16,20 @@ import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
// 使用WebServlet注解将该类映射到"/uploadServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
@WebServlet("/uploadServlet")
public class UploadServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求的字符编码为"utf-8",确保能正确解析包含中文等多字节字符的请求参数
request.setCharacterEncoding("utf-8");
// 设置响应的字符编码为"utf-8",确保响应内容中的中文等字符能正确显示
response.setCharacterEncoding("utf-8");
// 设置响应的Content-Type为"text/html; charset=utf-8"表明响应内容是HTML格式且字符编码为utf-8
response.setContentType("text/html; charset=utf-8");
// 判断提交上来的数据是否是符合文件上传表单的数据格式通过请求的Content-Type等相关信息判断
// 如果是则返回true表示是文件上传请求
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
boolean isMultipart=ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
// 1、创建一个DiskFileItemFactory对象它是Apache Commons FileUpload组件中用于创建文件项的工厂类
// 可以配置一些与文件上传相关的底层参数(如临时文件存储等,此处使用默认配置)
FileItemFactory factory = new DiskFileItemFactory();
// 2、创建一个ServletFileUpload对象它是用于解析上传文件的核心类通过传入前面创建的工厂对象来进行初始化
// 后续可以使用它来解析HTTP请求中的文件上传相关内容
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置请求头的编码为"utf-8",确保能正确解析包含中文等多字节字符的文件名等信息
upload.setHeaderEncoding("utf-8");
// 以下代码被注释掉了,原本是用于设置文件上传进度监听器的功能。
// 当文件上传过程中,会根据读取的字节数、总字节数以及已处理的文件项数量等信息更新进度相关数据,
// 并将这些数据存放在一个自定义的ProcessInfo对象中然后设置到请求的属性hs此处未定义应该是个错误可能是想使用HttpSession可根据实际情况修改
// 方便前端页面获取并展示文件上传进度情况。
// upload.setProgressListener(new ProgressListener(){
// public void update(long pBytesRead, long pContentLength, int pItems) {
// ProcessInfo pri = new ProcessInfo();
@ -60,71 +43,47 @@ public class UploadServlet extends HttpServlet {
// });
try {
// 使用ServletFileUpload对象解析HTTP请求获取所有的文件项FileItem列表每个FileItem对应一个表单中的文件上传字段或普通表单字段
List<FileItem> items = upload.parseRequest(request);
// 获取文件项列表的迭代器,用于遍历列表中的每个文件项
Iterator<FileItem> it = items.iterator();
while (it.hasNext()) {
// 获取下一个文件项对象
FileItem item = it.next();
// 获取文件项对应的表单字段名称
String itemname = item.getFieldName();
// 初始化一个表示学号的变量,初始值设为 -1用于后续根据表单字段判断并赋值
int sno = -1;
// 初始化一个表示学生姓名的变量初始值设为null用于后续根据表单字段判断并赋值
String sname = null;
// 判断该文件项是否是普通表单字段(非文件上传字段)
if (item.isFormField()) {
// 如果表单字段名称为"sno"则尝试将该字段的值解析为整数并赋值给sno变量解析时指定字符编码为"utf-8"
if (itemname.equals("sno")) {
sno = Integer.parseInt(item.getString("utf-8"));
} else if (itemname.equals("sname")) {
// 如果表单字段名称为"sname",先获取该字段的值(字符编码为"utf-8"并赋值给sname变量
// 然后又将文件名这里可能存在逻辑错误本意可能不是这样应该是不需要再次赋值文件名可根据实际需求确认赋值给sname变量
sname = item.getString("utf-8");
sname = item.getName();
} else {
// 如果是其他未处理的普通表单字段,则在控制台打印提示信息
System.out.println("其他字段");
}
} else {
// 如果该文件项是文件上传字段,则获取文件名(包含完整路径,例如在客户端本地的完整路径)
String filename = item.getName();
// 获取服务器上用于保存上传文件的目录路径通过Servlet上下文获取"upload"目录的真实路径
// 此处注释掉的代码是通过请求的会话获取Servlet上下文再获取路径可根据实际情况选择合适的方式当前使用的是直接通过Servlet获取上下文的方式
// String path=request.getSession().getServletContext().getRealPath("upload");
//String path=request.getSession().getServletContext().getRealPath("upload");
String path = this.getServletContext().getRealPath("upload");
// 判断文件名的后缀通过截取文件名中最后一个点后面的部分并转换为小写后进行比较是否是特定的网页文件格式JSP、HTML、HTM等
// 如果是则表示不允许上传这类文件,将请求转发到"error.jsp"页面进行错误提示
if (filename.substring(filename.lastIndexOf(".") + 1).equals("jsp")
|| filename.substring(filename.lastIndexOf(".") + 1).equals("htm")
|| filename.substring(filename.lastIndexOf(".") + 1).equals("html")) {
request.getRequestDispatcher("error.jsp").forward(request, response);
} else {
// 打印文件保存目录的路径(可能用于调试,查看路径是否正确)
System.out.println(path);
// 根据保存路径创建对应的File对象用于后续判断目录是否存在等操作
File file = new File(path);
// 判断该目录是否不存在并且不是一个目录(可能不存在或者是个文件等不符合预期的情况),如果是则创建该目录
if (!file.exists() &&!file.isDirectory()) {
if (!file.exists() && !file.isDirectory()) {
file.mkdir();
}
// 将上传的文件写入到服务器指定的目录下构造的文件对象是在前面确定的保存目录path基础上加上文件名filename
item.write(new File(path, filename));
// 在请求属性中设置"news"属性,添加提示信息,说明文件上传成功,并带上文件名
request.setAttribute("news", filename + " 上传成功!");
// 将请求转发到"/WEB-INF/admin/uploadFile.jsp"页面,可能该页面用于显示上传结果等相关信息给用户
request.getRequestDispatcher("/WEB-INF/admin/uploadFile.jsp").forward(request, response);
// 以下代码被注释掉了原本是用于重定向到另一个Servlet可能用于跳转到文件上传后的其他操作页面等
// 重定向和转发的区别在于重定向会重新发起一个请求,而转发是在服务器内部直接跳转,可根据实际需求选择使用哪种方式。
// response.sendRedirect("fileUploadIndexServlet");
// 在控制台打印文件上传成功的提示信息,带上文件名(可能用于调试,查看上传情况)
System.out.println(filename + "上传成功!!!");
return;
}
return;
}
}
} catch (FileUploadException e) {
e.printStackTrace();
@ -134,9 +93,7 @@ public class UploadServlet extends HttpServlet {
}
}
// 定义一个内部类ProcessInfo用于封装文件上传进度相关的信息
// 包括总文件大小、已读取的文件大小、显示的进度字符串、已处理的文件项数量以及进度百分比等属性
class ProcessInfo {
class ProcessInfo{
public long totalSize = 1;
public long readSize = 0;
public String show = "";
@ -144,8 +101,7 @@ public class UploadServlet extends HttpServlet {
public int rate = 0;
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
}

@ -7,22 +7,12 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// 使用WebServlet注解将该类映射到"/adminIndexServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
// 这里可能主要是针对管理员相关的页面索引请求进行处理的Servlet。
@WebServlet("/adminIndexServlet")
public class AdminIndexServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 将当前请求转发到"/WEB-INF/admin/aIndex.jsp"页面。
// 通常这个JSP页面可能是管理员功能模块对应的首页或者是一个主要的展示页面
// 通过转发请求服务器会去查找并渲染这个JSP页面然后将生成的页面内容返回给客户端展示给用户。
request.getRequestDispatcher("/WEB-INF/admin/aIndex.jsp").forward(request, response);
request.getRequestDispatcher("/WEB-INF/admin/aIndex.jsp").forward(request,response);
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
// 也就是当接收到GET请求时同样会将请求转发到"/WEB-INF/admin/aIndex.jsp"页面。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -7,22 +7,12 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// 使用WebServlet注解将该类映射到"/studentIndexServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
// 大概率是针对学生相关页面索引请求进行处理的Servlet。
@WebServlet("/studentIndexServlet")
public class StudentIndexServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 将当前请求转发到"/WEB-INF/student/sIndex.jsp"页面。
// 一般来说这个JSP页面是学生功能模块对应的首页或者核心展示页面
// 通过转发请求服务器会查找并渲染该JSP页面之后把生成的页面内容返回给客户端展示给学生用户查看。
request.getRequestDispatcher("/WEB-INF/student/sIndex.jsp").forward(request, response);
request.getRequestDispatcher("/WEB-INF/student/sIndex.jsp").forward(request,response);
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
// 即当接收到GET请求时同样会把请求转发到"/WEB-INF/student/sIndex.jsp"页面。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -7,22 +7,12 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// 使用WebServlet注解将此类映射到"/teacherIndexServlet"这个URL路径意味着该Servlet类是用来处理与之对应的网络请求的
// 通常是针对教师相关页面的访问请求进行相应处理的类。
@WebServlet("/teacherIndexServlet")
public class TeacherIndexServlet extends HttpServlet {
// 重写doPost方法该方法用于处理HTTP POST请求。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 将当前接收到的请求转发到"/WEB-INF/teacher/tIndex.jsp"页面。
// 一般来讲这个JSP页面是教师功能模块对应的首页或者是主要展示页面
// 服务器接收到转发请求后会去查找并渲染这个JSP页面随后将渲染好的页面内容返回给客户端以便展示给教师用户查看。
request.getRequestDispatcher("/WEB-INF/teacher/tIndex.jsp").forward(request, response);
request.getRequestDispatcher("/WEB-INF/teacher/tIndex.jsp").forward(request,response);
}
// 重写doGet方法在此类中该方法直接调用doPost方法来处理GET请求这表明GET请求和POST请求在本Servlet中的处理逻辑是完全一致的
// 也就是当接收到GET请求时同样会把请求转发到"/WEB-INF/teacher/tIndex.jsp"页面。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -14,65 +14,35 @@ import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
// 使用WebServlet注解将该类映射到"/findStudentServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
// 从类名推测,可能主要用于查找学生相关信息的功能。
@WebServlet("/findStudentServlet")
public class FindStudentServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应的Content-Type为"application/json;charset=utf-8"表明响应内容将以JSON格式返回并且字符编码为utf-8
// 这样客户端如前端页面中的JavaScript代码等就能正确解析接收到的JSON数据。
response.setContentType("application/json;charset=utf-8");
// 从请求中获取名为"studentid"的参数值该参数应该是用于查找学生信息的学生ID通常由前端页面传递过来。
String studentId = request.getParameter("studentid");
// 创建两个Student对象student对象用于设置要查找的学生ID条件findStudent对象用于存储后续通过业务逻辑层查找得到的学生信息。
Student student = new Student();
Student findStudent = new Student();
// 将获取到的学生ID设置到student对象中作为查找条件传递给业务逻辑层。
student.setS_id(studentId);
// 创建StudentService的实现类实例用于调用业务逻辑层方法来处理与学生相关的业务操作
// 这里是通过学生ID查找对应的学生信息。
StudentService service = new StudentServiceImpl();
// 调用业务逻辑层的findStudentById方法传入设置好ID的student对象将查找到的学生信息赋值给findStudent对象。
findStudent = service.findStudentById(student);
// 创建一个HashMap对象用于存储要返回给客户端的相关信息以键值对的形式进行存储方便后续转换为JSON格式数据。
Map<String, Object> map = new HashMap<String, Object>();
Map<String,Object>map = new HashMap<String,Object>();
try {
// 判断获取到的学生IDstudentId与查找到的学生对象findStudent中的ID是否相等以此来判断该学生ID是否已存在对应的学生记录。
if (studentId.equals(findStudent.getS_id())) {
// 如果相等表示该学生ID已存在在map中添加键值对"studentExsit"键对应的值设为true表示学生存在
// 同时添加"msg"键,对应的值为提示信息"ID已存在",这些信息将作为响应内容返回给客户端,方便客户端根据此信息进行相应处理(如提示用户等)。
map.put("studentExsit", true);
map.put("msg", "ID已存在");
} else {
// 如果不相等表示该学生ID不存在对应的学生记录即用户名这里以学生ID作为类似用户名的概念可用
// 在map中添加相应键值对"studentExsit"键对应的值设为false"msg"键对应的值设为"用户名可用"。
map.put("studentExsit", false);
map.put("msg", "用户名可用");
}
// 创建一个ObjectMapper对象它是Jackson库中用于将Java对象转换为JSON格式数据的核心类
// 这里将使用它把map对象转换为JSON格式并写入到响应的输出流中以便发送给客户端。
//map转为json传给客户端
ObjectMapper mapper = new ObjectMapper();
// 通过ObjectMapper的writeValue方法将map对象转换为JSON格式的数据并写入到HttpServletResponse的输出流中
// 这样客户端就能接收到对应的JSON数据并进行解析和相应处理了。
mapper.writeValue(response.getWriter(), map);
mapper.writeValue(response.getWriter(),map);
} catch (Exception e) {
// 如果在上述处理过程中出现异常如JSON转换出错等情况则打印异常堆栈信息方便排查问题
// 在实际应用中,可能还需要更完善的异常处理逻辑,比如返回特定的错误信息给客户端等。
e.printStackTrace();
}
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
// 即当接收到GET请求时同样会执行上述doPost方法中的逻辑进行学生信息查找并返回相应的JSON格式结果给客户端。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -25,169 +25,109 @@ import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Map;
// 使用WebServlet注解将该类映射到"/loginServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
// 从类名可以看出,主要负责处理用户登录相关的业务逻辑。
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 初始化用于存储登录成功后的学生对象初始值设为null后续根据登录验证结果进行赋值
Student loginStudent = null;
// 初始化用于存储登录成功后的教师对象初始值设为null后续根据登录验证结果进行赋值
Teacher loginTeacher = null;
// 初始化用于存储登录成功后的管理员对象初始值设为null后续根据登录验证结果进行赋值
Admin loginAdmin = null;
// 设置请求的字符编码为"utf-8",确保能正确解析包含中文等多字节字符的请求参数
//设置编码
request.setCharacterEncoding("utf-8");
// 从请求中获取名为"verifycode"的参数值,该参数通常是用户在登录页面输入的验证码,用于后续验证码校验
//获取数据
String verifycode = request.getParameter("verifycode");
// 从请求中获取名为"id"的参数值,该参数一般代表用户输入的登录账号(如学生学号、教师工号、管理员账号等),具体含义根据角色而定
String loginid = request.getParameter("id");
// 从请求中获取名为"password"的参数值,该参数是用户输入的登录密码
String loginpassword = request.getParameter("password");
// 验证码校验相关逻辑
// 获取当前请求对应的HttpSession对象用于获取会话中存储的验证码信息之前生成并存储在会话中的验证码
//验证码校验
HttpSession session = request.getSession();
// 从会话中获取名为"CHECKCODE_SERVER"的属性值该值就是服务器端生成并存储的验证码类型转换为String
String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
// 移除会话中的"CHECKCODE_SERVER"属性,确保验证码只能使用一次,防止重复利用
session.removeAttribute("CHECKCODE_SERVER");
// 判断服务器端存储的验证码是否为null可能出现异常情况未生成验证码等或者与用户输入的验证码不相等不区分大小写进行比较
// 如果满足此条件,则表示验证码不正确
if (checkcode_server == null ||!checkcode_server.equalsIgnoreCase(verifycode)) {
// 在请求属性中设置"login_msg"属性,添加提示信息,说明验证码错误,用于后续在页面上展示给用户
request.setAttribute("login_msg", "验证码错误");
// 在请求属性中设置"loginid"属性,将用户输入的登录账号再次存入请求属性,方便在返回登录页面时可以回显给用户
request.setAttribute("loginid", loginid);
// 在请求属性中设置"loginpassword"属性,将用户输入的登录密码再次存入请求属性,方便在返回登录页面时可以回显给用户
request.setAttribute("loginpassword", loginpassword);
// 将请求转发到"/login.jsp"页面,通常这个页面就是登录页面,返回给用户并展示验证码错误的提示信息以及回显账号密码等内容
request.getRequestDispatcher("/login.jsp").forward(request, response);
session.removeAttribute("CHECKCODE_SERVER");//确保验证一次性
if (checkcode_server == null || !checkcode_server.equalsIgnoreCase(verifycode)) {
//验证码不正确
request.setAttribute("login_msg","验证码错误");
//跳转页面
request.setAttribute("loginid",loginid);
request.setAttribute("loginpassword",loginpassword);
request.getRequestDispatcher("/login.jsp").forward(request,response);
return;
}
// 封装对象相关逻辑
// 再次从请求中获取名为"id"的参数值此处代码可能存在重复获取的情况前面已经获取过loginid可根据实际情况优化该值用于构建用户对象的标识属性
//封装对象
String id = request.getParameter("id");
// 再次从请求中获取名为"password"的参数值此处代码可能存在重复获取的情况前面已经获取过loginpassword可根据实际情况优化该值用于构建用户对象的密码属性
String password = request.getParameter("password");
// 从请求中获取名为"roles"的参数值,该参数用于区分用户的角色(如"student"表示学生、"teacher"表示教师、"admin"表示管理员),以便后续进行不同角色的登录验证逻辑
String roles = request.getParameter("roles");
// 公告加载相关逻辑
// 创建NotifyService的实现类实例用于调用业务逻辑层方法来获取公告相关信息这里应该是获取所有的公告列表
NotifyService notifyService = new NotifyServiceImpl();
// 调用业务逻辑层的find方法获取公告列表数据返回的是Notify类型的列表
//公告加载
NotifyService notifyService= new NotifyServiceImpl();
List<Notify> notifys = notifyService.find();
// 将获取到的公告列表存放到HttpSession中属性名为"notifys",方便在后续页面中(不同角色登录后的页面)可以获取并展示公告信息
session.setAttribute("notifys", notifys);
session.setAttribute("notifys",notifys);
// 根据不同角色进行登录验证、对象封装、会话保存以及页面跳转等逻辑处理
//判断roles封装对象、保存session、调用不同Service查询
if ("student".equals(roles)) {
// 创建一个Student对象用于封装学生登录相关的信息作为传递给业务逻辑层进行登录验证的数据对象
Student student = new Student();
// 设置学生对象的学号属性使用前面获取到的id值
student.setS_id(id);
// 设置学生对象的密码属性使用前面获取到的password值
student.setS_password(password);
// 创建StudentService的实现类实例用于调用业务逻辑层中与学生登录相关的方法
StudentService service = new StudentServiceImpl();
// 调用业务逻辑层的login方法传入封装好的学生对象进行登录验证将验证通过后返回的学生对象赋值给loginStudent变量如果验证失败则为null
StudentService service= new StudentServiceImpl();
loginStudent = service.login(student);
// 判断登录验证是否成功即loginStudent不为null表示找到了对应的学生记录登录成功
if (loginStudent!= null) {
// 将登录成功的学生对象存放到HttpSession中属性名为"student",方便后续在其他页面判断用户是否登录以及获取学生相关信息
if (loginStudent != null) {
session.setAttribute("student", loginStudent);
// 在会话中设置"html_title"属性,值为"学生端",可能用于在页面上显示不同的标题栏等内容,标识当前处于学生端页面
session.setAttribute("html_title", "学生端");
// 重定向到"studentIndexServlet"通常这个Servlet会将请求转发到学生端对应的首页如"/WEB-INF/student/sIndex.jsp"等页面),实现登录成功后跳转到学生端首页的功能
// (此处注释掉了直接转发的代码,选择使用重定向方式,重定向会重新发起一个请求,而转发是在服务器内部直接跳转,两者有不同的应用场景和效果)
// request.getRequestDispatcher("/WEB-INF/student/sIndex.jsp").forward(request, response);
// request.getRequestDispatcher("/WEB-INF/student/sIndex.jsp").forward(request,response);
response.sendRedirect("studentIndexServlet");
} else {
// 如果登录验证失败即loginStudent为null表示用户名或密码错误等情况
// 在请求属性中设置"login_msg"属性,添加提示信息,说明用户名或密码错误,用于后续在登录页面展示给用户
}else {
//登录失败 提示信息
request.setAttribute("login_msg", "用户名或密码错误!");
// 在请求属性中设置"loginid"属性,将用户输入的登录账号再次存入请求属性,方便在返回登录页面时可以回显给用户
request.setAttribute("loginid", loginid);
// 在请求属性中设置"loginpassword"属性,将用户输入的登录密码再次存入请求属性,方便在返回登录页面时可以回显给用户
request.setAttribute("loginpassword", loginpassword);
// 将请求转发到"/login.jsp"页面,返回登录页面并展示错误提示信息以及回显账号密码等内容
request.setAttribute("loginid",loginid);
request.setAttribute("loginpassword",loginpassword);
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
} else if ("teacher".equals(roles)) {
// 创建一个Teacher对象用于封装教师登录相关的信息作为传递给业务逻辑层进行登录验证的数据对象
}else if ("teacher".equals(roles)) {
Teacher teacher = new Teacher();
// 设置教师对象的教师编号属性使用前面获取到的id值
teacher.setT_id(id);
// 设置教师对象的密码属性使用前面获取到的password值
teacher.setT_password(password);
// 创建TeacherService的实现类实例用于调用业务逻辑层中与教师登录相关的方法
TeacherService service = new TeacherServiceImpl();
// 调用业务逻辑层的login方法传入封装好的教师对象进行登录验证将验证通过后返回的教师对象赋值给loginTeacher变量如果验证失败则为null
loginTeacher = service.login(teacher);
// 判断登录验证是否成功即loginTeacher不为null表示找到了对应的教师记录登录成功
if (loginTeacher!= null) {
// 将登录成功的教师对象存放到HttpSession中属性名为"teacher",方便后续在其他页面判断用户是否登录以及获取教师相关信息
if (loginTeacher != null) {
session.setAttribute("teacher", loginTeacher);
// 在会话中设置"html_title"属性,值为"教师端",可能用于在页面上显示不同的标题栏等内容,标识当前处于教师端页面
session.setAttribute("html_title", "教师端");
// 重定向到"teacherIndexServlet"通常这个Servlet会将请求转发到教师端对应的首页如"/WEB-INF/teacher/tIndex.jsp"等页面),实现登录成功后跳转到教师端首页的功能
// (此处注释掉了直接转发的代码,选择使用重定向方式)
// request.getRequestDispatcher("/WEB-INF/teacher/tIndex.jsp").forward(request, response);
response.sendRedirect("teacherIndexServlet");
} else {
// 如果登录验证失败即loginTeacher为null表示用户名或密码错误等情况
// 在请求属性中设置"login_msg"属性,添加提示信息,说明用户名或密码错误,用于后续在登录页面展示给用户
}else {
//登录失败 提示信息
request.setAttribute("login_msg", "用户名或密码错误!");
// 将请求转发到"/login.jsp"页面,返回登录页面并展示错误提示信息
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
} else {
// 创建一个Admin对象用于封装管理员登录相关的信息作为传递给业务逻辑层进行登录验证的数据对象
}else {
Admin admin = new Admin();
// 设置管理员对象的管理员编号属性使用前面获取到的id值
admin.setA_id(id);
// 设置管理员对象的密码属性使用前面获取到的password值
admin.setA_password(password);
// 创建AdminService的实现类实例用于调用业务逻辑层中与管理员登录相关的方法
AdminService service = new AdminServiceImpl();
// 调用业务逻辑层的login方法传入封装好的管理员对象进行登录验证将验证通过后返回的管理员对象赋值给loginAdmin变量如果验证失败则为null
loginAdmin = service.login(admin);
// 判断登录验证是否成功即loginAdmin不为null表示找到了对应的管理员记录登录成功
if (loginAdmin!= null) {
// 将登录成功的管理员对象存放到HttpSession中属性名为"admin",方便后续在其他页面判断用户是否登录以及获取管理员相关信息
if (loginAdmin != null) {
session.setAttribute("admin", loginAdmin);
// 在会话中设置"html_title"属性,值为"管理员",可能用于在页面上显示不同的标题栏等内容,标识当前处于管理员页面
session.setAttribute("html_title", "管理员");
// 重定向到"adminIndexServlet"通常这个Servlet会将请求转发到管理员端对应的首页如"/WEB-INF/admin/aIndex.jsp"等页面),实现登录成功后跳转到管理员端首页的功能
// (此处注释掉了直接转发的代码,选择使用重定向方式)
// request.getRequestDispatcher("/WEB-INF/admin/aIndex.jsp").forward(request, response);
// request.getRequestDispatcher("/WEB-INF/admin/aIndex.jsp").forward(request,response);
response.sendRedirect("adminIndexServlet");
} else {
// 如果登录验证失败即loginAdmin为null表示用户名或密码错误等情况
// 在请求属性中设置"login_msg"属性,添加提示信息,说明用户名或密码错误,用于后续在登录页面展示给用户
}else {
//登录失败 提示信息
request.setAttribute("login_msg", "用户名或密码错误!");
// 将请求转发到"/login.jsp"页面,返回登录页面并展示错误提示信息
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
// 即当接收到GET请求时同样会执行上述doPost方法中的登录验证等相关逻辑
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -8,44 +8,19 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
// 使用WebServlet注解将该类映射到"/logoutServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
// 从类名可以推断出其主要功能是处理用户注销相关的业务逻辑。
@WebServlet("/logoutServlet")
public class LogoutServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求的字符编码为"UTF-8",确保能正确解析包含中文等多字节字符的请求参数(虽然此处可能没有特别涉及中文相关参数,但保持良好的编码设置习惯是必要的)。
request.setCharacterEncoding("UTF-8");
// 获取当前请求对应的HttpSession对象HttpSession用于在多个请求之间保存用户相关的会话信息
// 在这里主要是为了操作会话中存储的用户登录相关的属性信息,以便实现注销功能。
HttpSession session = request.getSession();
// 从会话中移除名为"student"的属性,该属性通常在用户(学生角色)登录成功后被设置,用于标识当前登录的学生用户信息,
// 移除它意味着清除该用户(学生角色)在会话中的相关登录状态信息。
session.removeAttribute("student");
// 从会话中移除名为"teacher"的属性,同理,该属性是在教师角色用户登录成功后设置的,用于保存教师用户的相关信息,
// 移除操作清除教师角色用户在会话中的登录状态相关数据。
session.removeAttribute("teacher");
// 从会话中移除名为"admin"的属性,这是针对管理员角色用户登录成功后在会话中保存的相关信息,
// 通过移除该属性,消除管理员角色用户的会话登录状态记录。
session.removeAttribute("admin");
// 使当前会话失效,这一步操作会清除整个会话中的所有属性信息,并且后续该会话相关的请求将无法再获取到之前存储的任何数据,
// 相当于彻底结束了当前用户的会话,实现完整的注销效果。
session.invalidate();
// 重定向到"index.jsp"页面,通常这个页面是网站的首页或者是一个未登录状态下展示的通用页面,
// 在用户注销后将其引导到这个页面,让用户回到初始状态或者未登录时可访问的页面。
response.sendRedirect("index.jsp");
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
// 即当接收到GET请求时同样会执行上述doPost方法中的操作完成用户注销并跳转到相应页面的功能。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -6,87 +6,45 @@ import service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.*;
import java.io.IOException;
// 使用WebServlet注解将该类映射到"/registerServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
// 从类名可推测其主要功能是处理学生用户注册相关的业务逻辑。
@WebServlet("/registerServlet")
public class RegisterServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取当前请求对应的HttpSession对象HttpSession用于在多个请求之间保存用户相关的会话信息
// 在这里主要用于获取之前存储在会话中的验证码信息以及后续可能的其他与注册相关的会话操作。
HttpSession session = request.getSession();
// 从请求中获取名为"studentid"的参数值,该参数通常代表学生注册时输入的学号,作为学生的唯一标识信息。
String studentid = request.getParameter("studentid");
// 从请求中获取名为"password"的参数值,此参数为学生注册时输入的密码。
String password = request.getParameter("password");
// 从请求中获取名为"repassword"的参数值,一般是用于让学生再次输入密码进行确认,确保两次输入的密码一致。
String repassword = request.getParameter("repassword");
// 从请求中获取名为"verifycode"的参数值,该参数是学生在注册页面输入的验证码,用于后续的验证码校验环节。
String vcode = request.getParameter("verifycode");
// 从会话中获取名为"CHECKCODE_SERVER"的属性值该值就是服务器端生成并存储的验证码类型转换为String类型
// 用于和用户输入的验证码vcode进行对比验证。
String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
// 移除会话中的"CHECKCODE_SERVER"属性,确保验证码只能使用一次,防止用户重复利用验证码进行多次注册等异常操作,
// 保证验证码验证的一次性原则。
session.removeAttribute("CHECKCODE_SERVER");
// 判断用户输入的验证码vcode与服务器端存储的验证码checkcode_server是否不相等不区分大小写进行比较
// 如果不相等,则表示验证码错误。
if (!vcode.equalsIgnoreCase(checkcode_server)) {
// 在请求属性中设置"msg"属性,添加提示信息"验证码错误",用于后续在注册页面上展示给用户,提示验证码输入有误。
request.setAttribute("msg", "验证码错误");
// 在请求属性中设置"studentid"属性,将用户输入的学号再次存入请求属性,方便在返回注册页面时可以回显给用户,
// 让用户无需重新输入学号,提升用户体验。
request.setAttribute("studentid", studentid);
// 在请求属性中设置"password"属性,将用户输入的密码再次存入请求属性,同样方便在返回注册页面时回显密码内容给用户。
request.setAttribute("password", password);
// 在请求属性中设置"repassword"属性,把用户再次输入用于确认的密码也存入请求属性,回显在注册页面上。
request.setAttribute("repassword", repassword);
// 将请求转发到"register.jsp"页面,通常这个页面就是学生注册页面,返回给用户并展示验证码错误的提示信息以及回显之前输入的相关内容。
request.getRequestDispatcher("register.jsp").forward(request, response);
session.removeAttribute("CHECKCODE_SERVER");//确保验证一次性
if (!vcode.equalsIgnoreCase(checkcode_server)){
request.setAttribute("msg","验证码错误");
request.setAttribute("studentid",studentid);
request.setAttribute("password",password);
request.setAttribute("repassword",repassword);
request.getRequestDispatcher("register.jsp").forward(request,response);
return;
} else {
// 如果验证码验证通过则创建一个Student对象用于封装要注册的学生相关信息准备传递给业务逻辑层进行注册操作。
}else {
Student student = new Student();
// 设置学生对象的学号属性使用前面获取到的studentid值。
student.setS_id(studentid);
// 设置学生对象的密码属性使用前面获取到的password值。
student.setS_password(password);
// 打印学号信息(可能用于调试,查看获取到的学号是否正确等情况),在实际应用中可根据需求决定是否保留此打印语句。
System.out.println(studentid);
// 打印密码信息(同样可能用于调试目的),查看密码获取情况,可按需决定是否保留。
System.out.println(password);
// 创建StudentService的实现类实例用于调用业务逻辑层中与学生注册相关的方法将学生注册信息保存到数据库等相关操作。
StudentService service = new StudentServiceImpl();
// 调用业务逻辑层的register方法传入封装好的学生对象执行学生注册操作。
StudentService service= new StudentServiceImpl();
service.register(student);
request.setAttribute("msg","注册成功");
request.setAttribute("studentid","");
request.setAttribute("password","");
request.setAttribute("repassword","");
request.getRequestDispatcher("register.jsp").forward(request,response);
// 在请求属性中设置"msg"属性,添加提示信息"注册成功",用于后续在注册页面展示给用户,告知注册操作已成功完成。
request.setAttribute("msg", "注册成功");
// 在请求属性中设置"studentid"属性为空字符串,清空之前存储的学号信息,可能用于在注册页面上显示相应的提示效果(比如清空输入框等)。
request.setAttribute("studentid", "");
// 在请求属性中设置"password"属性为空字符串,同样清空之前存储的密码信息,用于页面显示相关的处理。
request.setAttribute("password", "");
// 在请求属性中设置"repassword"属性为空字符串,清空再次输入确认密码的内容,配合页面显示需求进行处理。
request.setAttribute("repassword", "");
// 将请求转发到"register.jsp"页面,返回注册页面并展示注册成功的提示信息以及清空相关输入框等操作,方便用户进行后续操作(比如登录等)。
request.getRequestDispatcher("register.jsp").forward(request, response);
}
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
// 即当接收到GET请求时同样会执行上述doPost方法中的注册相关逻辑操作。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -17,49 +17,23 @@ import java.util.Date;
import java.util.List;
import java.util.Map;
// 使用WebServlet注解将该类映射到"/addNotifyServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
// 从类名推测其主要功能是处理添加通知相关的业务逻辑。
@WebServlet("/addNotifyServlet")
public class AddNotifyServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求的字符编码为"utf-8",确保能正确解析包含中文等多字节字符的请求参数,
// 这样在获取请求中的通知内容等信息时可以避免出现乱码等问题。
request.setCharacterEncoding("utf-8");
// 获取参数相关逻辑
// 创建一个Notify对象用于封装要添加的通知相关信息后续会将其传递给业务逻辑层进行保存到数据库等操作。
//获取参数
Notify notify = new Notify();
// 从请求中获取名为"notifyInfo"的参数值该参数应该是通知的具体内容信息将其设置到Notify对象的相应属性中。
notify.setNotifyInfo((String) request.getParameter("notifyInfo"));
// 设置通知的发布时间先获取当前的系统时间通过创建一个Date对象来表示当前时刻。
Date d = new Date();
// 创建一个SimpleDateFormat对象用于对日期进行格式化指定的格式为"yyyy-MM-dd HH:mm:ss"
// 这样可以将日期按照指定的格式转换为字符串,方便存储和展示。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 使用格式化对象将获取到的当前日期Date类型格式化为指定格式的字符串并设置到Notify对象的发布时间属性notifyDate
// 表示该通知的发布时间为当前系统时间。
notify.setNotifyDate(sdf.format(d));
// 创建NotifyService的实现类实例用于调用业务逻辑层中与添加通知相关的方法
// 这里的实现类会负责将封装好的通知对象保存到数据库等具体操作。
NotifyService service = new NotifyServiceImpl();
// 调用业务逻辑层的addNotify方法传入封装好的Notify对象执行添加通知的操作将通知信息保存到数据库中。
service.addNotify(notify);
// 以下代码被注释掉了,原本是使用重定向的方式跳转到"/notifyListServlet"重定向会重新发起一个请求客户端会向新的URL发起请求。
// response.sendRedirect("/notifyListServlet");
// 采用请求转发的方式将当前请求转发到"/notifyListServlet",请求转发是在服务器内部进行跳转,相对重定向来说更高效,
// 转发到的"/notifyListServlet"通常可能是用于展示通知列表的Servlet这样在添加通知成功后可以直接展示最新的通知列表情况。
request.getRequestDispatcher("/notifyListServlet").forward(request, response);
// response.sendRedirect("/notifyListServlet");
request.getRequestDispatcher("/notifyListServlet").forward(request,response);
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
// 即当接收到GET请求时同样会执行上述doPost方法中的添加通知相关逻辑操作。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -1,4 +1,4 @@
package web.servlet.notify;
package web.servlet.notify;
import domain.Student;
import service.NotifyService;
@ -12,39 +12,18 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
// 使用WebServlet注解将该类映射到"/deleteNotifyServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
// 从类名可以推断出其主要功能是处理删除通知相关的业务逻辑。
@WebServlet("/deleteNotifyServlet")
public class DeleteNotifyServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求的字符编码为"utf-8",确保能正确解析包含中文等多字节字符的请求参数,
// 虽然此处不一定涉及中文参数,但保持良好的编码设置习惯有助于避免潜在的乱码问题。
request.setCharacterEncoding("utf-8");
// 获取当前请求对应的HttpSession对象HttpSession用于在多个请求之间保存用户相关的会话信息
// 不过在这段代码中暂时未看到对会话信息有进一步的操作,可根据实际业务需求后续考虑是否添加相关逻辑。
HttpSession session = request.getSession();
// 从请求中获取名为"id"的参数值该参数应该是用于标识要删除的通知的唯一ID
// 通常在前端页面如通知列表页面点击删除操作时会将对应通知的ID传递过来。
String notifyid = request.getParameter("id");
// 创建NotifyService的实现类实例用于调用业务逻辑层中与删除通知相关的方法
// 这个实现类会负责根据传入的通知ID在数据库等存储介质中执行删除对应通知记录的操作。
NotifyService service = new NotifyServiceImpl();
// 调用业务逻辑层的deleteNotifyById方法传入获取到的通知IDnotifyid执行删除通知的操作将对应的通知记录从数据库中移除。
service.deleteNotifyById(notifyid);
// 将当前请求转发到"/notifyListServlet"通常这个Servlet是用于展示通知列表的
// 这样在删除通知成功后,可以直接跳转到通知列表页面,展示最新的通知列表情况(已删除指定通知后的列表)。
request.getRequestDispatcher("/notifyListServlet").forward(request, response);
request.getRequestDispatcher("/notifyListServlet").forward(request,response);
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
// 即当接收到GET请求时同样会执行上述doPost方法中的删除通知相关逻辑操作。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -12,36 +12,16 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
// 使用WebServlet注解将该类映射到"/notifyListServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
// 从类名可以推测出其主要功能是获取通知列表信息,并将其展示到对应的页面上,用于处理通知列表相关的业务逻辑。
@WebServlet("/notifyListServlet")
public class NotifyListServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求的字符编码为"utf-8",确保能正确解析包含中文等多字节字符的请求参数,
// 例如通知内容等可能包含中文信息,设置编码可以避免出现乱码情况,使后续操作能正常进行。
request.setCharacterEncoding("utf-8");
// 创建NotifyService的实现类实例用于调用业务逻辑层中与获取通知列表相关的方法
// 该实现类具体会去数据库或者其他存储介质中查询并获取所有的通知信息。
NotifyService service = new NotifyServiceImpl();
// 调用业务逻辑层的findAll方法获取所有通知的列表信息返回的是一个Notify类型的列表
// 其中每个Notify对象代表一条通知记录包含通知的各项属性如通知内容、发布时间等
List<Notify> notifys = service.findAll();
// 将获取到的通知列表信息存放到请求的属性中,属性名为"notifys"这样在后续转发到的JSP页面中
// 就可以通过相应的方式如EL表达式、JSTL标签等获取该属性值进而展示通知列表的具体内容。
request.setAttribute("notifys", notifys);
// 将当前请求转发到"/WEB-INF/notify/notifyList.jsp"页面通常这个JSP页面就是用于展示通知列表的页面
// 服务器会查找并渲染该JSP页面然后把生成的页面内容返回给客户端进行展示用户就能看到通知列表了。
request.getRequestDispatcher("/WEB-INF/notify/notifyList.jsp").forward(request, response);
request.setAttribute("notifys",notifys);
request.getRequestDispatcher("/WEB-INF/notify/notifyList.jsp").forward(request,response);
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
// 即当接收到GET请求时同样会执行上述doPost方法中的获取通知列表并展示到对应页面的相关逻辑操作。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -16,57 +16,28 @@ import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
// 使用WebServlet注解将该类映射到"/notifyListToServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
// 从类名推测其主要功能可能是根据不同用户角色来展示相应的通知列表,处理与通知列表展示定向相关的业务逻辑。
@WebServlet("/notifyListToServlet")
public class NotifyListToServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求的字符编码为"utf-8",确保能正确解析包含中文等多字节字符的请求参数,
// 例如通知的具体内容等可能存在中文信息,设置合适编码可避免出现乱码问题,保障后续操作顺利进行。
request.setCharacterEncoding("utf-8");
// 创建NotifyService的实现类实例用于调用业务逻辑层中与获取通知列表相关的方法
// 该实现类内部通常会去数据库或者其他存储位置查询并获取所有的通知信息记录。
NotifyService service = new NotifyServiceImpl();
// 调用业务逻辑层的findAll方法获取全部通知的列表数据返回的是一个Notify类型的列表
// 其中每个Notify对象都包含了一条通知的各项详细信息比如通知内容、发布时间等。
List<Notify> notifys = service.findAll();
// 将获取到的通知列表信息存放在请求的属性中,属性名为"notifys",这样在后续转发请求到相应页面时,
// 目标页面如JSP页面就可以通过相应的方式例如EL表达式、JSTL标签等获取到这个属性值进而展示具体的通知列表内容。
request.setAttribute("notifys", notifys);
request.setAttribute("notifys",notifys);
// 获取当前请求对应的HttpSession对象HttpSession用于在多个请求之间保存用户相关的会话信息
// 这里主要是为了获取会话中存储的用户登录相关信息,以便判断当前登录用户的角色,进而决定通知列表展示的具体页面。
HttpSession session = request.getSession();
// 尝试从会话中获取Student类型的用户对象如果获取到了表示当前登录用户是学生角色否则返回null
Student student = (Student) session.getAttribute("student");
// 尝试从会话中获取Teacher类型的用户对象如果获取到了表示当前登录用户是教师角色否则返回null
Teacher teacher = (Teacher) session.getAttribute("teacher");
// 根据获取到的学生和教师对象情况(即判断用户角色)来决定转发请求到不同的页面展示通知列表。
if (student!= null && teacher == null) {
// 如果学生对象不为null且教师对象为null说明当前登录用户是学生角色
// 则将请求转发到"/WEB-INF/notify/notifyListToStudent.jsp"页面,通常这个页面是专门为学生定制的通知列表展示页面,
// 会根据学生的相关特点和需求展示通知内容等信息。
request.getRequestDispatcher("/WEB-INF/notify/notifyListToStudent.jsp").forward(request, response);
} else if (teacher!= null && student == null) {
// 如果教师对象不为null且学生对象为null意味着当前登录用户是教师角色
// 此时将请求转发到"/WEB-INF/notify/notifyListToTeacher.jsp"页面,该页面应该是针对教师设计的通知列表展示页面,
// 会以适合教师查看的方式呈现通知信息。
request.getRequestDispatcher("/WEB-INF/notify/notifyListToTeacher.jsp").forward(request, response);
Student student= (Student)session.getAttribute("student");
Teacher teacher= (Teacher)session.getAttribute("teacher");
if (student != null && teacher == null) {
request.getRequestDispatcher("/WEB-INF/notify/notifyListToStudent.jsp").forward(request,response);
} else if (teacher != null && student == null) {
request.getRequestDispatcher("/WEB-INF/notify/notifyListToTeacher.jsp").forward(request,response);
} else {
// 如果既不是学生角色也不是教师角色(比如可能是管理员角色或者未登录等其他情况),
// 则将请求转发到"error.jsp"页面,这个页面一般用于展示错误提示信息,告知用户出现了不符合预期的情况(此处可能是角色不明确无法正确展示通知列表)。
request.getRequestDispatcher("error.jsp").forward(request, response);
}
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
// 即当接收到GET请求时同样会执行上述doPost方法中的根据用户角色来决定通知列表展示页面的相关逻辑操作。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -7,22 +7,13 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// 使用WebServlet注解将该类映射到"/notifyServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
// 从类名及代码逻辑来看,大概率是用于引导用户进入通知相关操作页面的功能,比如添加通知等页面。
@WebServlet("/notifyServlet")
public class NotifyServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 将当前请求转发到"/WEB-INF/notify/addNotify.jsp"页面。
// 通常这个JSP页面是用于展示添加通知的表单界面用户可以在该页面上填写通知的具体内容等相关信息
// 然后通过后续的操作(比如提交表单)来触发添加通知的实际业务逻辑。
request.getRequestDispatcher("/WEB-INF/notify/addNotify.jsp").forward(request, response);
request.getRequestDispatcher("/WEB-INF/notify/addNotify.jsp").forward(request,response);
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
// 也就是当接收到GET请求时同样会将请求转发到"/WEB-INF/notify/addNotify.jsp"页面。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -16,101 +16,46 @@ import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Map;
// 使用WebServlet注解将该类映射到"/findStudentByPageServlet"这个URL路径表明这是一个用于处理对应网络请求的Servlet类
// 从类名推测其主要功能是实现按照分页的方式查找学生信息,并根据不同用户角色将查询结果展示到相应页面的业务逻辑。
@WebServlet("/findStudentByPageServlet")
public class FindStudentByPageServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求的字符编码为"utf-8",确保能正确解析包含中文等多字节字符的请求参数,
// 例如学生相关信息中可能存在中文内容(姓名等),设置编码可避免出现乱码问题,使后续操作能正常进行。
request.setCharacterEncoding("utf-8");
String currentPage = request.getParameter("currentPage");//当前页码
String rows = request.getParameter("rows");//每页显示条数
// 从请求中获取名为"currentPage"的参数值,该参数代表当前页码,用于确定要获取哪一页的数据,
// 通常由前端页面(如分页导航栏等)传递过来,告知后端当前用户请求查看的是第几页的学生信息。
String currentPage = request.getParameter("currentPage");
// 从请求中获取名为"rows"的参数值,该参数表示每页显示的记录条数,即每页展示多少条学生信息,
// 同样是由前端页面根据用户设置如每页显示10条、20条等选择传递给后端的参数。
String rows = request.getParameter("rows");
// 判断当前页码参数是否为null或者是空字符串如果是则说明前端没有传递或者传递的值不符合要求
// 此时默认将当前页码设置为"1",表示展示第一页的数据。
if (currentPage == null || "".equals(currentPage)) {
currentPage = "1";
}
// 类似地判断每页显示条数参数是否为null或者是空字符串若满足此情况
// 则默认将每页显示条数设置为"5"即每页展示5条学生信息。
if (rows == null || "".equals(rows)) {
rows = "5";
}
// 获取条件查询参数相关逻辑
// 通过调用request.getParameterMap()方法获取请求中所有的参数以Map的形式返回
// 其中键为参数名,值为对应参数名的所有值(以字符串数组形式存储,因为一个参数名可能对应多个值情况),
// 这些参数可用于构建更复杂的条件查询(比如根据学生姓名、学号范围等条件进行筛选查找学生信息)。
Map<String, String[]> condition = request.getParameterMap();
//获取条件查询参数
Map<String,String[]> condition = request.getParameterMap();
// 创建StudentService的实现类实例用于调用业务逻辑层中与按页查找学生信息相关的方法
// 该实现类会根据传入的当前页码、每页显示条数以及查询条件等参数,从数据库等存储介质中获取相应的学生信息数据。
StudentService service = new StudentServiceImpl();
PageBean<Student> pb = service.findStudentByPage(currentPage,rows,condition);
// 调用业务逻辑层的findStudentByPage方法传入当前页码、每页显示条数以及查询条件参数
// 执行分页查找学生信息的操作返回的是一个PageBean类型的对象其中封装了查询到的学生信息列表、总记录数、总页数等分页相关的数据。
PageBean<Student> pb = service.findStudentByPage(currentPage, rows, condition);
// 将获取到的包含学生信息分页数据的PageBean对象存放到请求的属性中属性名为"pb"
// 这样在后续转发到的相应页面如JSP页面就可以通过相应方式如EL表达式、JSTL标签等获取该属性值进而展示分页的学生信息列表等内容。
request.setAttribute("pb", pb);
// 将获取到的查询条件参数Map也存放到请求的属性中属性名为"condition"
// 方便在页面上可以根据之前设置的查询条件进行展示(比如回显用户之前输入的筛选条件等),或者用于后续再次发起查询等操作。
request.setAttribute("condition", condition);
// 再次设置请求的字符编码为"utf-8",此处可能存在重复设置编码的情况,可根据实际情况确认是否需要保留(一般设置一次即可保证编码正确)。
request.setAttribute("pb",pb);
request.setAttribute("condition",condition);//存入查询条件
request.setCharacterEncoding("utf-8");
// 获取当前请求对应的HttpSession对象HttpSession用于在多个请求之间保存用户相关的会话信息
// 这里主要是为了获取会话中存储的用户登录相关信息,以便判断当前登录用户的角色,进而决定将查询结果展示到哪个对应的页面。
HttpSession session = request.getSession();
Student student= (Student)session.getAttribute("student");
// 尝试从会话中获取Student类型的用户对象如果获取到了表示当前登录用户是学生角色否则返回null
Student student = (Student) session.getAttribute("student");
// 尝试从会话中获取Admin类型的用户对象如果获取到了表示当前登录用户是管理员角色否则返回null
Admin admin = (Admin) session.getAttribute("admin");
// 尝试从会话中获取Teacher类型的用户对象如果获取到了表示当前登录用户是教师角色否则返回null
Teacher teacher = (Teacher) session.getAttribute("teacher");
// 根据获取到的不同用户角色对象情况来决定转发请求到不同的页面展示学生信息分页列表。
if (student!= null && admin == null && teacher == null) {
// 如果学生对象不为null且管理员对象和教师对象都为null说明当前登录用户是学生角色
// 则将请求转发到"/WEB-INF/student/sFindStudentList.jsp"页面,通常这个页面是专门为学生定制的查看学生信息分页列表的页面,
// 会根据学生的相关特点和需求展示学生信息内容等。
Admin admin= (Admin)session.getAttribute("admin");
Teacher teacher= (Teacher)session.getAttribute("teacher");
if (student != null && admin == null && teacher == null) {
request.getRequestDispatcher("/WEB-INF/student/sFindStudentList.jsp").forward(request, response);
} else if (admin!= null && student == null && teacher == null) {
// 如果管理员对象不为null且学生对象和教师对象都为null意味着当前登录用户是管理员角色
// 此时将请求转发到"/WEB-INF/admin/aFindStudentList.jsp"页面,该页面应该是针对管理员设计的查看学生信息分页列表的页面,
// 会以适合管理员查看的方式呈现学生信息(比如可能包含更多操作按钮等管理功能)。
} else if (admin != null && student == null && teacher == null) {
request.getRequestDispatcher("/WEB-INF/admin/aFindStudentList.jsp").forward(request, response);
} else if (teacher!= null && admin == null && student == null) {
// 如果教师对象不为null且管理员对象和学生对象都为null表明当前登录用户是教师角色
// 则将请求转发到"/WEB-INF/teacher/tFindStudentList.jsp"页面,这个页面是为教师定制的查看学生信息分页列表的页面,
// 可能会展示与教师教学相关的学生信息等内容。
} else if (teacher != null && admin == null && student == null) {
request.getRequestDispatcher("/WEB-INF/teacher/tFindStudentList.jsp").forward(request, response);
} else {
// 如果不符合上述任何一种角色明确的情况(比如可能是未登录或者角色信息异常等其他情况),
// 则将请求转发到"error.jsp"页面,该页面一般用于展示错误提示信息,告知用户出现了不符合预期的情况(此处可能是无法正确展示学生信息分页列表)。
request.getRequestDispatcher("error.jsp").forward(request, response);
}
}
// 重写doGet方法在这个类中直接调用doPost方法来处理GET请求意味着GET请求和POST请求在本Servlet中的处理逻辑是一样的
// 即当接收到GET请求时同样会执行上述doPost方法中的按照分页查找学生信息并根据用户角色展示到对应页面的相关逻辑操作。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
doPost(request,response);
}
}
}

@ -1,62 +1,25 @@
package web.servlet.student;
// 包声明表明该类所属的包名用于组织和管理Java类这里表示该Servlet类位于web.servlet.student包下
import service.StudentService;
// 导入StudentService接口用于后续调用该接口定义的相关业务方法通常是和学生相关的业务逻辑操作
import service.impl.StudentServiceImpl;
// 导入StudentServiceImpl类它是StudentService接口的具体实现类用来提供实际的业务逻辑实现
import javax.servlet.ServletException;
// 导入Servlet异常类用于捕获和处理Servlet执行过程中出现的异常情况
import javax.servlet.annotation.WebServlet;
// 导入WebServlet注解通过该注解可以方便地将一个普通的Java类声明为一个Servlet并配置其访问路径等相关信息
import javax.servlet.http.HttpServlet;
// 导入HttpServlet类它是所有基于HTTP协议的Servlet的基类自定义的Servlet类通常需要继承它来实现相应功能
import javax.servlet.http.HttpServletRequest;
// 导入HttpServletRequest类用于获取HTTP请求中的各种信息比如请求参数、请求头信息等
import javax.servlet.http.HttpServletResponse;
// 导入HttpServletResponse类用于向客户端发送HTTP响应例如设置响应状态码、响应头以及输出响应内容等
import java.io.IOException;
// 导入IOException类用于处理输入输出相关的异常情况比如读写文件、网络通信等出现的异常
@WebServlet("/deleteSelectStudentServlet")
// 使用WebServlet注解声明该类是一个Servlet并指定其访问路径为 /deleteSelectStudentServlet
// 意味着客户端可以通过该路径来访问这个Servlet提供的服务
public class DeleteSelectStudentServlet extends HttpServlet {
// 定义一个类DeleteSelectStudentServlet它继承自HttpServlet类表明它是一个处理HTTP请求的Servlet类
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法该方法会在客户端以POST方式发起请求时被调用
// request参数用于获取此次HTTP请求的相关信息
// response参数用于向客户端返回HTTP响应
String[] sids = request.getParameterValues("sid");
// 从HTTP请求中获取名为"sid"的参数值由于该参数可能有多个值比如批量删除操作时会选择多个学生的id
// 所以返回的是一个字符串数组如果没有对应的参数则返回null
StudentService service = new StudentServiceImpl();
// 创建一个StudentServiceImpl类的实例该实例实现了StudentService接口通过这个实例可以调用具体的业务方法
// 这里就是为了调用和学生删除相关的业务逻辑方法
service.deleteSelectStudent(sids);
// 调用StudentService接口中定义的deleteSelectStudent方法由StudentServiceImpl具体实现
// 传入获取到的学生id数组来执行批量删除选中学生的业务操作
response.sendRedirect(request.getContextPath()+"/findStudentByPageServlet");
// 执行完删除操作后,使用重定向的方式将客户端请求重定向到 /findStudentByPageServlet 路径,
// 通常是为了让页面刷新显示删除后的学生列表等相关信息request.getContextPath() 一般获取的是当前Web应用的上下文路径
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法该方法会在客户端以GET方式发起请求时被调用
// 这里的实现是直接调用doPost方法意味着不管是GET请求还是POST请求都会执行同样的业务逻辑处理
doPost(request,response);
}
<<<<<<< HEAD
}
//yuo
//tu
//rre
//s
=======
}
>>>>>>> develop1

@ -1,70 +1,31 @@
package web.servlet.student;
// 定义该类所属的包名表明这个Servlet类位于web.servlet.student包下方便在项目中对类进行组织和管理
import service.NotifyService;
// 导入NotifyService接口通常该接口定义了与通知相关的业务方法不过从当前类来看可能暂时未直接使用到相关方法
import service.StudentService;
// 导入StudentService接口用于后续调用和学生相关的业务逻辑操作的方法是与学生业务处理的抽象定义
import service.impl.NotifyServiceImpl;
// 导入NotifyServiceImpl类它是NotifyService接口的具体实现类虽然在当前展示的逻辑中可能未实际调用其功能
import service.impl.StudentServiceImpl;
// 导入StudentServiceImpl类它是StudentService接口的具体实现类用于提供具体的学生业务逻辑实现比如删除学生等操作
import javax.servlet.ServletException;
// 导入ServletException类用于捕获和处理在Servlet执行过程中出现的异常情况保障程序的健壮性
import javax.servlet.annotation.WebServlet;
// 导入WebServlet注解通过这个注解可以便捷地将一个普通Java类声明为Servlet并配置其对外访问的路径等信息
import javax.servlet.http.HttpServlet;
// 导入HttpServlet类它是所有基于HTTP协议的Servlet的基础类自定义的Servlet类一般需要继承它来实现具体功能
import javax.servlet.http.HttpServletRequest;
// 导入HttpServletRequest类用于获取HTTP请求中的各类信息像请求参数、请求头以及请求相关的其他属性等
import javax.servlet.http.HttpServletResponse;
// 导入HttpServletResponse类用于向客户端发送HTTP响应比如设置响应状态码、响应头以及响应内容等操作
import javax.servlet.http.HttpSession;
// 导入HttpSession类用于在服务器端管理用户的会话信息能够实现跨多个请求之间的数据共享等功能
import java.io.IOException;
// 导入IOException类用于处理输入输出相关的异常常见于读写文件、网络通信等场景中出现的异常情况
@WebServlet("/deleteStudentServlet")
// 使用WebServlet注解声明该类是一个Servlet并指定其访问路径为 "/deleteStudentServlet"
// 意味着客户端可以通过这个路径来访问该Servlet提供的服务
public class DeleteStudentServlet extends HttpServlet {
// 定义DeleteStudentServlet类它继承自HttpServlet类表明其是一个处理HTTP请求的Servlet类
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法此方法会在客户端以POST方式发起请求时被调用
// request参数用于接收此次HTTP请求相关的所有信息
// response参数用于向客户端返回HTTP响应相关的内容比如页面、数据等
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8",确保能够正确解析包含中文等特殊字符的请求参数,避免出现乱码问题
HttpSession session = request.getSession();
// 获取当前请求对应的HttpSession对象如果不存在则会创建一个新的会话通过会话可以在多个请求间传递数据等
String studentid = request.getParameter("s_id");
// 从HTTP请求中获取名为"s_id"的参数值该值通常代表要删除的学生的唯一标识如学生ID并将其赋值给studentid变量
// 如果请求中不存在该参数则返回null
StudentService service = new StudentServiceImpl();
// 创建一个StudentServiceImpl类的实例它实现了StudentService接口通过这个实例可以调用具体的和学生相关的业务方法
service.deleteStudentById(studentid);
// 调用StudentService接口中定义的deleteStudentById方法由StudentServiceImpl类具体实现
// 传入获取到的学生IDstudentid来执行删除对应学生的业务操作
// request.getRequestDispatcher("/findStudentByPageServlet").forward(request,response);
// 这行代码被注释掉了,原本它的作用是通过请求转发的方式,将请求转发到"/findStudentByPageServlet"对应的资源一般是另一个Servlet或JSP页面等
// 在转发过程中,请求对象和响应对象会被保留,地址栏不会改变
response.sendRedirect("findStudentByPageServlet");
// 使用重定向的方式将客户端的请求重定向到"findStudentByPageServlet"对应的资源,
// 重定向后客户端会发起一个新的请求,地址栏会显示新的请求路径,常用于页面跳转等操作,不过这里使用相对路径时,要确保路径解析正确
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法该方法会在客户端以GET方式发起请求时被调用
// 此处的实现是直接调用doPost方法意味着不管客户端是通过GET方式还是POST方式发起请求都会执行同样的业务逻辑处理
doPost(request,response);
}
}
}

@ -1,126 +1,63 @@
package web.servlet.student;
// 声明该类所属的包名说明这个Servlet类位于web.servlet.student包下便于在项目中对代码进行分类管理和组织
import domain.Course;
// 导入Course类通常表示课程相关的领域模型类可能包含课程的各种属性信息如课程名称、课程编号等不过在此处代码中暂时未体现对其具体操作
import domain.SelectCourse;
// 导入SelectCourse类可能代表学生选课相关的领域模型类用于描述学生选择课程的相关记录比如包含学生ID、课程ID以及成绩等属性信息
import domain.Student;
// 导入Student类代表学生相关的领域模型类包含学生的各种属性信息如学生ID、姓名等在这里会用于获取当前操作的学生相关信息
import service.StudentService;
// 导入StudentService接口该接口定义了与学生相关业务操作的方法声明是对学生业务逻辑的抽象描述
import service.impl.StudentServiceImpl;
// 导入StudentServiceImpl类它是StudentService接口的具体实现类用于提供具体的学生业务逻辑实现比如查询学生选课情况、添加选课记录等操作
import javax.servlet.ServletException;
// 导入ServletException类用于捕获和处理在Servlet执行过程中出现的异常情况确保程序在出现异常时能合理应对增强程序的健壮性
import javax.servlet.annotation.WebServlet;
// 导入WebServlet注解通过这个注解可以方便地将一个普通Java类声明为Servlet并配置其对外访问的路径等相关信息
import javax.servlet.http.HttpServlet;
// 导入HttpServlet类它是所有基于HTTP协议的Servlet的基类自定义的Servlet类通常需要继承它来实现相应的功能以处理HTTP请求和响应
import javax.servlet.http.HttpServletRequest;
// 导入HttpServletRequest类用于获取HTTP请求中的各种信息例如请求参数、请求头以及客户端相关的其他信息等
import javax.servlet.http.HttpServletResponse;
// 导入HttpServletResponse类用于向客户端发送HTTP响应像设置响应状态码、响应头以及响应内容如页面、数据等
import javax.servlet.http.HttpSession;
// 导入HttpSession类用于在服务器端管理用户的会话信息能够实现跨多个请求之间的数据共享在这里用于获取登录学生的相关信息
import java.io.IOException;
// 导入IOException类用于处理输入输出相关的异常情况常见于读写文件、网络通信等操作出现异常时进行捕获和处理
import java.util.Date;
// 导入Date类用于获取当前的日期和时间信息在这里用于生成提示信息中的时间戳部分
import java.util.List;
// 导入List接口用于处理和操作有序的元素集合在这里用于存储学生选课的相关记录列表
@WebServlet("/doSelectCourseServlet")
// 使用WebServlet注解声明该类是一个Servlet并指定其访问路径为"/doSelectCourseServlet"
// 这意味着客户端可以通过这个路径来访问该Servlet所提供的服务
public class DoSelectCourseServlet extends HttpServlet {
// 定义DoSelectCourseServlet类它继承自HttpServlet类表明它是一个用于处理HTTP请求的Servlet类
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法该方法会在客户端以POST方式发起请求时被调用
// request参数用于接收此次HTTP请求相关的所有信息
// response参数用于向客户端返回对应的HTTP响应信息
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8",目的是确保能够正确解析包含中文等特殊字符的请求参数,避免出现参数解析乱码的问题
HttpSession session = request.getSession();
// 获取当前请求对应的HttpSession对象如果不存在则会创建一个新的会话。通过会话对象可以获取之前存储在会话中的用户相关信息
// 比如在这里用于获取登录的学生信息
Student student = (Student) session.getAttribute("student");
// 从HttpSession对象中获取名为"student"的属性值并将其强制转换为Student类型这个属性值通常是在用户登录等操作时存储进去的
// 代表当前登录的学生对象,通过它可以获取学生的相关标识信息等
Student student= (Student)session.getAttribute("student");
String courseid = request.getParameter("id");
// 从HTTP请求中获取名为"id"的参数值该参数通常代表要选择的课程的唯一标识比如课程编号并将其赋值给courseid变量
// 如果请求中不存在该参数则返回null
// 存不存在已选该课
//存不存在已选该课
boolean flag = false;
// 定义一个布尔类型的变量flag用于标记当前学生是否已经选择了指定的课程初始值设为false表示默认还未选该课程
// 判断是否已选
//判断是否已选
StudentService studentService = new StudentServiceImpl();
// 创建一个StudentServiceImpl类的实例它实现了StudentService接口通过这个实例可以调用具体的与学生相关的业务方法
// 在这里主要用于查询学生已选课程的情况
List<SelectCourse> selectcourses = studentService.findAllSelectCourse(student.getS_id());
// 调用StudentService接口中定义的findAllSelectCourse方法由StudentServiceImpl具体实现传入当前学生的ID通过student.getS_id()获取),
// 获取该学生已经选择的所有课程记录列表并将其赋值给selectcourses变量
for (SelectCourse s : selectcourses) {
// 遍历学生已选课程记录列表selectcourses对每一条选课记录进行检查
for (SelectCourse s:selectcourses) {
if (s.getC_id().equals(courseid)) {
// 如果某条选课记录中的课程ID通过s.getC_id()获取与要选择的课程IDcourseid相等说明已经选过该课程了
flag = true;
// 将flag标记设为true表示已选该课程
break;
// 一旦发现已选该课程,就跳出循环,不需要再继续遍历列表了
}
}
if (flag == true) {
// 如果flag为true说明当前学生已经选择了指定的课程
request.setAttribute("select_msg", "你已选了该课程!" + String.format("%tT", new Date()));
// 在请求对象中设置一个名为"select_msg"的属性属性值为提示信息字符串包含已选课程的提示以及当前的时间戳通过String.format("%tT", new Date())生成时间格式为HH:MM:SS的字符串
request.getRequestDispatcher("studentOptionalCourseServlet").forward(request, response);
// 使用请求转发的方式将请求转发到"studentOptionalCourseServlet"对应的资源一般是另一个Servlet或JSP页面等
// 在转发过程中,请求对象和响应对象会被保留,客户端地址栏显示的地址不会改变,常用于在服务器内部进行页面跳转且希望保留请求相关信息的场景
// response.sendRedirect("studentOptionalCourseServlet");
// 这行代码被注释掉了,它的作用是使用重定向的方式将客户端请求重定向到"studentOptionalCourseServlet"对应的资源。
// 重定向会让客户端发起一个新的请求,地址栏会显示新的请求路径,和请求转发有所不同,在这里当前未采用这种方式
} else {
// 如果flag为false说明当前学生还没有选择指定的课程
// 获取到当前学生id
//获取到当前学生id
String studentid = student.getS_id();
// 通过之前获取到的学生对象student调用其getS_id()方法获取学生的ID并赋值给studentid变量用于后续添加选课记录的操作
// 获取当前行的课程id courseid
// 这里的courseid在前面已经从请求参数中获取到了它代表要选择的课程的ID会用于添加选课记录的操作
//获取当前行的课程id courseid
// 调用学生添加选课服务s_id c_id score select_course添加
//调用学生添加选课服务s_id c_id score select_course添加
StudentService Service = new StudentServiceImpl();
// 再次创建一个StudentServiceImpl类的实例用于调用添加选课的业务方法虽然可以复用前面创建的studentService实例但这里重新创建了一个
Service.addSelectCourse(studentid, courseid);
// 调用StudentService接口中定义的addSelectCourse方法由StudentServiceImpl具体实现传入学生IDstudentid和课程IDcourseid
// 执行添加选课记录的业务操作,一般会在数据库等存储介质中插入一条新的选课记录
Service.addSelectCourse(studentid,courseid);
// 完成后给提示跳转
//完成后给提示跳转
request.setAttribute("select_msg", "选课成功!" + String.format("%tT", new Date()));
// 在请求对象中设置一个名为"select_msg"的属性属性值为选课成功的提示信息字符串同样包含当前的时间戳通过String.format("%tT", new Date())生成时间格式为HH:MM:SS的字符串
request.getRequestDispatcher("studentOptionalCourseServlet").forward(request, response);
// 使用请求转发的方式将请求转发到"studentOptionalCourseServlet"对应的资源一般是另一个Servlet或JSP页面等
// 目的是在选课成功后跳转到相应页面展示相关信息,同时保留请求相关的属性信息(如这里设置的"select_msg"提示信息)
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法该方法会在客户端以GET方式发起请求时被调用
// 此处的实现是直接调用doPost方法意味着不管客户端是通过GET方式还是POST方式发起请求都会执行同样的业务逻辑处理
doPost(request, response);
doPost(request,response);
}
}
}

@ -1,68 +1,29 @@
package web.servlet.student;
// 定义该类所属的包名表明这个Servlet类位于web.servlet.student包下方便在项目中对类进行组织和管理
import domain.Student;
// 导入Student类它代表学生相关的领域模型类包含学生的各种属性信息如姓名、学号等可能会在后续业务逻辑中用于获取、更新或展示学生信息
import service.StudentService;
// 导入StudentService接口该接口定义了与学生相关业务操作的方法例如根据学号查找学生、更新学生信息等是对学生业务逻辑的抽象描述
import service.impl.StudentServiceImpl;
// 导入StudentServiceImpl类它是StudentService接口的具体实现类用于提供具体的学生业务逻辑实现比如具体的查找学生信息等操作
import javax.servlet.ServletException;
// 导入ServletException类用于捕获和处理在Servlet执行过程中出现的异常情况保障程序在出现异常时能合理应对增强程序的健壮性
import javax.servlet.annotation.WebServlet;
// 导入WebServlet注解通过这个注解可以方便地将一个普通Java类声明为Servlet并配置其对外访问的路径等相关信息
import javax.servlet.http.HttpServlet;
// 导入HttpServlet类它是所有基于HTTP协议的Servlet的基类自定义的Servlet类通常需要继承它来实现相应的功能以处理HTTP请求和响应
import javax.servlet.http.HttpServletRequest;
// 导入HttpServletRequest类用于获取HTTP请求中的各种信息例如请求参数、请求头以及客户端相关的其他信息等
import javax.servlet.http.HttpServletResponse;
// 导入HttpServletResponse类用于向客户端发送HTTP响应像设置响应状态码、响应头以及响应内容如页面、数据等
import javax.servlet.http.HttpSession;
// 导入HttpSession类用于在服务器端管理用户的会话信息能够实现跨多个请求之间的数据共享在这里原本可能用于获取或更新存储在会话中的学生信息
import java.io.IOException;
// 导入IOException类用于处理输入输出相关的异常情况常见于读写文件、网络通信等操作出现异常时进行捕获和处理
@WebServlet("/studentInfomationServlet")
// 使用WebServlet注解声明该类是一个Servlet并指定其访问路径为"/studentInfomationServlet"
// 意味着客户端可以通过这个路径来访问该Servlet所提供的服务
public class StudentInfomationServlet extends HttpServlet {
// 定义StudentInfomationServlet类它继承自HttpServlet类表明它是一个用于处理HTTP请求的Servlet类
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法该方法会在客户端以POST方式发起请求时被调用
// request参数用于接收此次HTTP请求相关的所有信息
// response参数用于向客户端返回对应的HTTP响应信息
// HttpSession session = request.getSession();
// 这行代码被注释掉了它原本的作用是获取当前请求对应的HttpSession对象如果不存在则会创建一个新的会话。
// 通过会话对象可以获取之前存储在会话中的用户相关信息(比如登录的学生信息等),在这里可能是打算获取学生信息,但目前未启用该功能
// Student s = (Student) session.getAttribute("student");
// 这行代码也被注释掉了它原本是想从HttpSession对象中获取名为"student"的属性值并将其强制转换为Student类型
// 这个属性值通常是在用户登录等操作时存储进去的,代表当前登录的学生对象,通过它可以获取学生的相关标识信息等,不过目前未执行此操作
// StudentService service = new StudentServiceImpl();
// 同样被注释掉的代码它的作用是创建一个StudentServiceImpl类的实例该实例实现了StudentService接口
// 通过这个实例可以调用具体的与学生相关的业务方法比如根据学生ID查找学生信息等在这里可能是打算用来查询学生最新信息但未实际使用
// Student newStudent = service.findStudentById(s);
// 这行注释掉的代码是想调用StudentService接口中定义的findStudentById方法由StudentServiceImpl具体实现
// 传入前面获取到的学生对象虽然目前未获取到实际的学生对象目的可能是根据学生的某个标识去查找最新的学生信息然后将查询结果赋值给newStudent变量
// session.setAttribute("student", newStudent);
// 此注释掉的代码是打算将前面查询到的最新学生信息newStudent重新设置到HttpSession对象中
// 以更新会话中存储的学生信息,不过目前这一系列操作都没有生效
request.getRequestDispatcher("/WEB-INF/student/sInformation.jsp").forward(request, response);
// 使用请求转发的方式将请求转发到"/WEB-INF/student/sInformation.jsp"对应的资源一般是一个JSP页面
// 在转发过程中,请求对象和响应对象会被保留,客户端地址栏显示的地址不会改变,常用于在服务器内部进行页面跳转且希望保留请求相关信息的场景,
// 在这里的目的可能是跳转到展示学生信息的JSP页面
// session.setAttribute("student",newStudent);
request.getRequestDispatcher("/WEB-INF/student/sInformation.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法该方法会在客户端以GET方式发起请求时被调用
// 此处的实现是直接调用doPost方法意味着不管客户端是通过GET方式还是POST方式发起请求都会执行同样的业务逻辑处理
doPost(request, response);
doPost(request,response);
}
}
}

@ -1,139 +1,76 @@
package web.servlet.student;
// 声明该类所属的包名表明这个Servlet类位于web.servlet.student包下便于在项目中对代码进行分类管理和组织
import domain.Student;
// 导入Student类它代表学生相关的领域模型类包含学生的各种属性信息如学号、姓名、性别等用于创建学生对象以及传递学生相关数据
import service.StudentService;
// 导入StudentService接口该接口定义了与学生相关业务操作的方法例如更新学生信息、根据学号查找学生等是对学生业务逻辑的抽象描述
import service.impl.StudentServiceImpl;
// 导入StudentServiceImpl类它是StudentService接口的具体实现类用于提供具体的学生业务逻辑实现比如具体执行更新学生信息、查找学生等操作
import javax.servlet.ServletException;
// 导入ServletException类用于捕获和处理在Servlet执行过程中出现的异常情况确保程序在出现异常时能合理应对增强程序的健壮性
import javax.servlet.annotation.WebServlet;
// 导入WebServlet注解通过这个注解可以方便地将一个普通Java类声明为Servlet并配置其对外访问的路径等相关信息
import javax.servlet.http.HttpServlet;
// 导入HttpServlet类它是所有基于HTTP协议的Servlet的基类自定义的Servlet类通常需要继承它来实现相应的功能以处理HTTP请求和响应
import javax.servlet.http.HttpServletRequest;
// 导入HttpServletRequest类用于获取HTTP请求中的各种信息例如请求参数、请求头以及客户端相关的其他信息等
import javax.servlet.http.HttpServletResponse;
// 导入HttpServletResponse类用于向客户端发送HTTP响应像设置响应状态码、响应头以及响应内容如页面、数据等
import javax.servlet.http.HttpSession;
// 导入HttpSession类用于在服务器端管理用户的会话信息能够实现跨多个请求之间的数据共享在这里用于获取、更新存储在会话中的学生信息
import java.io.IOException;
// 导入IOException类用于处理输入输出相关的异常情况常见于读写文件、网络通信等操作出现异常时进行捕获和处理
import java.text.SimpleDateFormat;
// 导入SimpleDateFormat类用于格式化日期时间的显示格式在这里用于将日期时间按照特定格式转换为字符串便于生成提示信息中的时间戳部分
import java.util.Date;
// 导入Date类用于获取当前的日期和时间信息配合SimpleDateFormat类来生成格式化后的时间字符串
@WebServlet("/studentInfomationUpdateServlet")
// 使用WebServlet注解声明该类是一个Servlet并指定其访问路径为"/studentInfomationUpdateServlet"
// 意味着客户端可以通过这个路径来访问该Servlet所提供的服务
public class StudentInfomationUpdateServlet extends HttpServlet {
// 定义StudentInfomationUpdateServlet类它继承自HttpServlet类表明它是一个用于处理HTTP请求的Servlet类
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法该方法会在客户端以POST方式发起请求时被调用
// request参数用于接收此次HTTP请求相关的所有信息
// response参数用于向客户端返回对应的HTTP响应信息
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8",目的是确保能够正确解析包含中文等特殊字符的请求参数,避免出现参数解析乱码的问题
// 保存输入内容
//保存输入内容
String sid = request.getParameter("student-id");
// 从HTTP请求中获取名为"student-id"的参数值通常该参数代表学生的学号并将其赋值给sid变量若请求中不存在该参数则返回null
String name = request.getParameter("student-name");
// 获取名为"student-name"的参数值一般对应学生的姓名赋值给name变量
String sex = request.getParameter("student-sex");
// 获取名为"student-sex"的参数值对应学生的性别信息赋值给sex变量
String age = request.getParameter("student-age");
// 获取名为"student-age"的参数值代表学生的年龄信息赋值给age变量
String phone = request.getParameter("student-phone");
// 获取名为"student-phone"的参数值即学生的电话号码信息赋值给phone变量
String email = request.getParameter("student-email");
// 获取名为"student-email"的参数值为学生的电子邮箱地址信息赋值给email变量
String address = request.getParameter("student-address");
// 获取名为"student-address"的参数值代表学生的家庭住址等地址信息赋值给address变量
String college = request.getParameter("selectCollege");
// 获取名为"selectCollege"的参数值可能是学生所在学院的相关信息赋值给college变量
String department = request.getParameter("selectDepartment");
// 获取名为"selectDepartment"的参数值大概是学生所在系部的信息赋值给department变量
String cclass = request.getParameter("selectClass");
// 获取名为"selectClass"的参数值应该是学生所在班级的相关信息赋值给cclass变量
Student updateStudent = new Student();
// 创建一个新的Student对象用于封装要更新的学生信息后续会将从请求中获取到的各个参数值设置到这个对象的相应属性中
// 判断输入位数是否大于数据库位数
if (name.length() > 4 || phone.length() > 11 || email.length() > 24 || address.length() > 24 || age.length() > 2 || name.contains("<") || phone.contains("<") || email.contains("<") || address.contains("<") || age.contains("<")) {
// 检查从请求中获取到的学生信息相关参数的合法性例如姓名长度是否超过数据库规定的4位、电话号码是否超过11位、邮箱地址是否超过24位等
// 或者是否包含不合法的字符(这里以"<"为例进行简单判断),如果有不符合要求的情况
request.setAttribute("update_msg", "格式错误,请重新提交!" + String.format("%tT", new Date()));
// 在请求对象中设置一个名为"update_msg"的属性属性值为提示信息字符串包含格式错误的提示以及当前的时间戳通过String.format("%tT", new Date())生成时间格式为HH:MM:SS的字符串
//判断输入位数是否大于数据库位数
if (name.length() > 4 || phone.length() > 11 || email.length()>24 || address.length() > 24 || age.length()>2 || name.contains("<") || phone.contains("<") || email.contains("<") || address.contains("<") || age.contains("<")) {
request.setAttribute("update_msg","格式错误,请重新提交!"+String.format("%tT",new Date()));
request.getRequestDispatcher("/WEB-INF/student/sInformation.jsp").forward(request, response);
// 使用请求转发的方式将请求转发到"/WEB-INF/student/sInformation.jsp"对应的资源一般是一个JSP页面
// 在转发过程中,请求对象和响应对象会被保留,客户端地址栏显示的地址不会改变,常用于在服务器内部进行页面跳转且希望保留请求相关信息的场景,
// 这里是当格式错误时跳转到相应页面提示用户重新提交
// response.sendRedirect("studentInfomationServlet");
// 这行代码被注释掉了,它的作用是使用重定向的方式将客户端请求重定向到"studentInfomationServlet"对应的资源。
// 重定向会让客户端发起一个新的请求,地址栏会显示新的请求路径,和请求转发有所不同,在这里当前未采用这种方式
} else {
// 封装学生对象
}else {
//封装学生对象
updateStudent.setS_id(sid);
// 将从请求中获取到的学号sid设置到updateStudent对象的S_id属性中完成学生学号信息的封装
updateStudent.setS_name(name);
// 设置学生姓名属性
updateStudent.setS_sex(sex);
// 设置学生性别属性
updateStudent.setS_age(age);
// 设置学生年龄属性
updateStudent.setS_phone(phone);
// 设置学生电话号码属性
updateStudent.setS_email(email);
// 设置学生电子邮箱属性
updateStudent.setS_address(address);
// 设置学生地址属性
updateStudent.setS_college(college);
// 设置学生所在学院属性
updateStudent.setS_department(department);
// 设置学生所在系部属性
updateStudent.setS_class(cclass);
// 设置学生所在班级属性,至此完成了对要更新的学生对象的所有属性封装
// 调用studentUpdata服务
StudentService service = new StudentServiceImpl();
// 创建一个StudentServiceImpl类的实例它实现了StudentService接口通过这个实例可以调用具体的与学生相关的业务方法
//调用studentUpdata服务
StudentService service= new StudentServiceImpl();
service.updateInfo(updateStudent);
// 调用StudentService接口中定义的updateInfo方法由StudentServiceImpl具体实现传入封装好的要更新信息的学生对象updateStudent
// 执行更新学生信息的业务操作,一般会将更新后的数据保存到数据库等存储介质中
HttpSession session = request.getSession();
// 获取当前请求对应的HttpSession对象如果不存在则会创建一个新的会话通过会话可以获取、更新存储在其中的学生信息等
Student s = service.findStudentById(updateStudent);
// 调用StudentService接口中定义的findStudentById方法由StudentServiceImpl具体实现传入刚刚更新信息的学生对象updateStudent
// 目的是从数据库等存储介质中重新获取更新后的学生完整信息并将其赋值给s变量
session.setAttribute("student",s);
session.setAttribute("student", s);
// 将重新获取到的更新后的学生信息s设置到HttpSession对象中以更新会话中存储的学生信息方便后续其他操作能获取到最新的学生数据
// 成功则返回并给提示
request.setAttribute("update_msg", "修改成功!" + String.format("%tT", new Date()));
// 在请求对象中设置一个名为"update_msg"的属性属性值为修改成功的提示信息字符串同样包含当前的时间戳通过String.format("%tT", new Date())生成时间格式为HH:MM:SS的字符串
request.setAttribute("student", updateStudent);
// 再次将更新后的学生对象updateStudent设置到请求对象中可能在转发后的页面中会用到该对象展示更新后的详细信息
//成功则返回并给提示
request.setAttribute("update_msg", "修改成功!"+String.format("%tT",new Date()));
request.setAttribute("student",updateStudent);
request.getRequestDispatcher("/WEB-INF/student/sInformation.jsp").forward(request, response);
// 使用请求转发的方式将请求转发到"/WEB-INF/student/sInformation.jsp"对应的资源一般是一个JSP页面
// 目的是在修改成功后跳转到相应页面展示相关提示信息以及可能的学生详细信息
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法该方法会在客户端以GET方式发起请求时被调用
// 此处的实现是直接调用doPost方法意味着不管客户端是通过GET方式还是POST方式发起请求都会执行同样的业务逻辑处理
doPost(request, response);
doPost(request,response);
}
}
}

@ -1,100 +1,47 @@
package web.servlet.student;
// 声明该类所属的包名表明这个Servlet类位于web.servlet.student包下便于在项目中对代码进行分类管理和组织
import domain.Admin;
// 导入Admin类代表管理员相关的领域模型类包含管理员的各种属性信息在这里用于判断当前登录用户是否为管理员角色
import domain.Student;
// 导入Student类代表学生相关的领域模型类包含学生的各种属性信息既用于查询学生信息列表也用于判断当前登录用户是否为学生角色
import domain.Teacher;
// 导入Teacher类代表教师相关的领域模型类包含教师的各种属性信息用于判断当前登录用户是否为教师角色
import service.StudentService;
// 导入StudentService接口该接口定义了与学生相关业务操作的方法例如查询所有学生信息等是对学生业务逻辑的抽象描述
import service.impl.StudentServiceImpl;
// 导入StudentServiceImpl类它是StudentService接口的具体实现类用于提供具体的学生业务逻辑实现比如具体执行查询所有学生信息的操作
import javax.servlet.ServletException;
// 导入ServletException类用于捕获和处理在Servlet执行过程中出现的异常情况确保程序在出现异常时能合理应对增强程序的健壮性
import javax.servlet.annotation.WebServlet;
// 导入WebServlet注解通过这个注解可以方便地将一个普通Java类声明为Servlet并配置其对外访问的路径等相关信息
import javax.servlet.http.HttpServlet;
// 导入HttpServlet类它是所有基于HTTP协议的Servlet的基类自定义的Servlet类通常需要继承它来实现相应的功能以处理HTTP请求和响应
import javax.servlet.http.HttpServletRequest;
// 导入HttpServletRequest类用于获取HTTP请求中的各种信息例如请求参数、请求头以及客户端相关的其他信息等
import javax.servlet.http.HttpServletResponse;
// 导入HttpServletResponse类用于向客户端发送HTTP响应像设置响应状态码、响应头以及响应内容如页面、数据等
import javax.servlet.http.HttpSession;
// 导入HttpSession类用于在服务器端管理用户的会话信息能够实现跨多个请求之间的数据共享在这里用于获取当前登录用户的角色信息学生、管理员、教师
import java.io.IOException;
// 导入IOException类用于处理输入输出相关的异常情况常见于读写文件、网络通信等操作出现异常时进行捕获和处理
import java.util.List;
// 导入List接口用于处理和操作有序的元素集合在这里用于存储查询到的所有学生信息列表
@WebServlet("/studentListServlet")
// 使用WebServlet注解声明该类是一个Servlet并指定其访问路径为"/studentListServlet"
// 意味着客户端可以通过这个路径来访问该Servlet所提供的服务
public class StudentListServlet extends HttpServlet {
// 定义StudentListServlet类它继承自HttpServlet类表明它是一个用于处理HTTP请求的Servlet类
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法该方法会在客户端以POST方式发起请求时被调用
// request参数用于接收此次HTTP请求相关的所有信息
// response参数用于向客户端返回对应的HTTP响应信息
// 调用StudentService完成查询
//调用StudentService完成查询
StudentService studentService = new StudentServiceImpl();
// 创建一个StudentServiceImpl类的实例它实现了StudentService接口通过这个实例可以调用具体的与学生相关的业务方法
List<Student> students = studentService.findAll();
// 调用StudentService接口中定义的findAll方法由StudentServiceImpl具体实现查询所有学生的信息
// 将查询结果以List<Student>类型返回即得到一个包含所有学生对象的列表并赋值给students变量
// 将list存入request域
request.setAttribute("students", students);
// 将查询到的学生信息列表students设置到请求对象request的属性中属性名为"students"
// 这样在后续转发到的页面如JSP页面中就可以通过该属性名获取到学生信息列表进行展示等操作
//将list存入request域
request.setAttribute("students",students);
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8",目的是确保能够正确解析包含中文等特殊字符的请求参数,避免出现参数解析乱码的问题
HttpSession session = request.getSession();
// 获取当前请求对应的HttpSession对象如果不存在则会创建一个新的会话通过会话对象可以获取之前存储在会话中的用户相关信息
// 在这里主要用于获取当前登录用户的角色信息(学生、管理员、教师)
Student student = (Student) session.getAttribute("student");
// 从HttpSession对象中获取名为"student"的属性值并将其强制转换为Student类型这个属性值如果存在代表当前登录用户是学生角色
// 若不存在则返回null通过它来判断当前登录用户是否为学生
Admin admin = (Admin) session.getAttribute("admin");
// 同理,从会话中获取名为"admin"的属性值并转换为Admin类型用于判断当前登录用户是否为管理员角色不存在则返回null
Teacher teacher = (Teacher) session.getAttribute("teacher");
// 从会话中获取名为"teacher"的属性值并转换为Teacher类型用于判断当前登录用户是否为教师角色不存在则返回null
if (student!= null && admin == null && teacher == null) {
// 如果从会话中获取到的学生对象不为空,且管理员对象和教师对象都为空,说明当前登录用户是学生角色
Student student= (Student)session.getAttribute("student");
Admin admin= (Admin)session.getAttribute("admin");
Teacher teacher= (Teacher)session.getAttribute("teacher");
if (student != null && admin == null && teacher == null) {
request.getRequestDispatcher("/WEB-INF/student/studentList.jsp").forward(request, response);
// 使用请求转发的方式将请求转发到"/WEB-INF/student/studentList.jsp"对应的资源一般是一个JSP页面
// 在转发过程中,请求对象和响应对象会被保留,客户端地址栏显示的地址不会改变,常用于在服务器内部进行页面跳转且希望保留请求相关信息的场景,
// 这里是将学生角色的用户请求转发到展示学生列表信息的JSP页面
} else if (admin!= null && student == null && teacher == null) {
// 如果管理员对象不为空,学生对象和教师对象都为空,说明当前登录用户是管理员角色
} else if (admin != null && student == null && teacher == null) {
request.getRequestDispatcher("/WEB-INF/admin/aFindStudentList.jsp").forward(request, response);
// 使用请求转发的方式将请求转发到"/WEB-INF/admin/aFindStudentList.jsp"对应的资源一般是一个JSP页面
// 是将管理员角色的用户请求转发到适合管理员查看学生列表信息的JSP页面
} else if (teacher!= null && admin == null && student == null) {
// 如果教师对象不为空,管理员对象和学生对象都为空,说明当前登录用户是教师角色
} else if (teacher != null && admin == null && student == null) {
request.getRequestDispatcher("/WEB-INF/teacher/tFindStudentList.jsp").forward(request, response);
// 使用请求转发的方式将请求转发到"/WEB-INF/teacher/tFindStudentList.jsp"对应的资源一般是一个JSP页面
// 把教师角色的用户请求转发到适合教师查看学生列表信息的JSP页面
} else {
request.getRequestDispatcher("error.jsp").forward(request, response);
// 如果以上角色判断都不符合,说明可能出现了异常情况或者未预期的登录状态,
// 则使用请求转发的方式将请求转发到"error.jsp"对应的资源一般是一个显示错误信息的JSP页面
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法该方法会在客户端以GET方式发起请求时被调用
// 此处的实现是直接调用doPost方法意味着不管客户端是通过GET方式还是POST方式发起请求都会执行同样的业务逻辑处理
this.doPost(request, response);
this.doPost(request,response);
}
}
}

@ -1,97 +1,47 @@
package web.servlet.student;
// 声明该类所属的包名表明这个Servlet类位于web.servlet.student包下便于在项目中对代码进行分类管理和组织
import domain.Admin;
// 导入Admin类代表管理员相关的领域模型类包含管理员的各种属性信息在这里用于判断当前登录用户的角色是否为管理员
import domain.Course;
// 导入Course类代表课程相关的领域模型类包含课程的各种属性信息如课程名称、课程编号等用于存储查询到的可选课程信息
import domain.SelectCourse;
// 导入SelectCourse类通常表示学生选课相关的领域模型类不过在当前代码展示的主要逻辑中暂未直接使用它进行核心操作
import domain.Student;
// 导入Student类代表学生相关的领域模型类包含学生的各种属性信息用于判断当前登录用户是否为学生角色以及获取学生相关信息
import service.StudentService;
// 导入StudentService接口该接口定义了与学生相关业务操作的方法例如查询所有可选课程等是对学生业务逻辑的抽象描述
import service.impl.StudentServiceImpl;
// 导入StudentServiceImpl类它是StudentService接口的具体实现类用于提供具体的学生业务逻辑实现比如具体执行查询所有可选课程的操作
import javax.servlet.ServletException;
// 导入ServletException类用于捕获和处理在Servlet执行过程中出现的异常情况确保程序在出现异常时能合理应对增强程序的健壮性
import javax.servlet.annotation.WebServlet;
// 导入WebServlet注解通过这个注解可以方便地将一个普通Java类声明为Servlet并配置其对外访问的路径等相关信息
import javax.servlet.http.HttpServlet;
// 导入HttpServlet类它是所有基于HTTP协议的Servlet的基类自定义的Servlet类通常需要继承它来实现相应的功能以处理HTTP请求和响应
import javax.servlet.http.HttpServletRequest;
// 导入HttpServletRequest类用于获取HTTP请求中的各种信息例如请求参数、请求头以及客户端相关的其他信息等
import javax.servlet.http.HttpServletResponse;
// 导入HttpServletResponse类用于向客户端发送HTTP响应像设置响应状态码、响应头以及响应内容如页面、数据等
import javax.servlet.http.HttpSession;
// 导入HttpSession类用于在服务器端管理用户的会话信息能够实现跨多个请求之间的数据共享在这里用于获取当前登录用户的角色信息学生或管理员
import java.io.IOException;
// 导入IOException类用于处理输入输出相关的异常情况常见于读写文件、网络通信等操作出现异常时进行捕获和处理
import java.util.List;
// 导入List接口用于处理和操作有序的元素集合在这里用于存储查询到的所有可选课程信息列表
@WebServlet("/studentOptionalCourseServlet")
// 使用WebServlet注解声明该类是一个Servlet并指定其访问路径为"/studentOptionalCourseServlet"
// 意味着客户端可以通过这个路径来访问该Servlet所提供的服务
public class StudentOptionalCourseServlet extends HttpServlet {
// 定义StudentOptionalCourseServlet类它继承自HttpServlet类表明它是一个用于处理HTTP请求的Servlet类
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法该方法会在客户端以POST方式发起请求时被调用
// request参数用于接收此次HTTP请求相关的所有信息
// response参数用于向客户端返回对应的HTTP响应信息
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8",目的是确保能够正确解析包含中文等特殊字符的请求参数,避免出现参数解析乱码的问题
HttpSession session = request.getSession();
// 获取当前请求对应的HttpSession对象如果不存在则会创建一个新的会话通过会话对象可以获取之前存储在会话中的用户相关信息
// 在这里主要用于获取当前登录用户的角色信息(学生或管理员)
Student student = (Student) session.getAttribute("student");
// 从HttpSession对象中获取名为"student"的属性值并将其强制转换为Student类型这个属性值如果存在代表当前登录用户是学生角色
// 若不存在则返回null通过它来判断当前登录用户是否为学生
Student student= (Student)session.getAttribute("student");
Admin admin =(Admin)session.getAttribute("admin");
Admin admin = (Admin) session.getAttribute("admin");
// 同理,从会话中获取名为"admin"的属性值并转换为Admin类型用于判断当前登录用户是否为管理员角色不存在则返回null
// 调用StudentService完成查询
//调用StudentService完成查询
StudentService studentService = new StudentServiceImpl();
// 创建一个StudentServiceImpl类的实例它实现了StudentService接口通过这个实例可以调用具体的与学生相关的业务方法
List<Course> optionalcourses = studentService.findAllOptionalCourse();
// 调用StudentService接口中定义的findAllOptionalCourse方法由StudentServiceImpl具体实现查询所有可选课程的信息
// 将查询结果以List<Course>类型返回即得到一个包含所有可选课程对象的列表并赋值给optionalcourses变量
// 将list存入request域
request.setAttribute("optionalcourses", optionalcourses);
// 将查询到的可选课程信息列表optionalcourses设置到请求对象request的属性中属性名为"optionalcourses"
// 这样在后续转发到的页面如JSP页面中就可以通过该属性名获取到可选课程列表进行展示等操作
//将list存入request域
request.setAttribute("optionalcourses",optionalcourses);
//转发到list.jsp
// 转发到list.jsp
if (student!= null && admin == null) {
// 如果从会话中获取到的学生对象不为空,且管理员对象为空,说明当前登录用户是学生角色
request.getRequestDispatcher("/WEB-INF/student/studentOptionalCourse.jsp").forward(request, response);
// 使用请求转发的方式将请求转发到"/WEB-INF/student/studentOptionalCourse.jsp"对应的资源一般是一个JSP页面
// 在转发过程中,请求对象和响应对象会被保留,客户端地址栏显示的地址不会改变,常用于在服务器内部进行页面跳转且希望保留请求相关信息的场景,
// 这里是将学生角色的用户请求转发到展示学生可选课程信息的JSP页面
} else if (admin!= null && student == null) {
// 如果管理员对象不为空,学生对象为空,说明当前登录用户是管理员角色
if (student != null && admin == null) {
request.getRequestDispatcher("/WEB-INF/student/studentOptionalCourse.jsp").forward(request,response);
} else if (admin != null && student == null) {
request.getRequestDispatcher("/WEB-INF/admin/allStudentOptionalCourse.jsp").forward(request, response);
// 使用请求转发的方式将请求转发到"/WEB-INF/admin/allStudentOptionalCourse.jsp"对应的资源一般是一个JSP页面
// 是将管理员角色的用户请求转发到适合管理员查看所有学生可选课程信息的JSP页面
} else {
request.getRequestDispatcher("error.jsp").forward(request, response);
// 如果以上角色判断都不符合,说明可能出现了异常情况或者未预期的登录状态,
// 则使用请求转发的方式将请求转发到"error.jsp"对应的资源一般是一个显示错误信息的JSP页面
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法该方法会在客户端以GET方式发起请求时被调用
// 此处的实现是直接调用doPost方法意味着不管客户端是通过GET方式还是POST方式发起请求都会执行同样的业务逻辑处理
this.doPost(request, response);
this.doPost(request,response);
}
}
}

@ -1,39 +1,19 @@
package web.servlet.student;
// 声明该类所属的包名表明这个Servlet类位于web.servlet.student包下便于在项目中对代码进行分类管理和组织
import javax.servlet.ServletException;
// 导入ServletException类用于捕获和处理在Servlet执行过程中出现的异常情况确保程序在出现异常时能合理应对增强程序的健壮性
import javax.servlet.annotation.WebServlet;
// 导入WebServlet注解通过这个注解可以方便地将一个普通Java类声明为Servlet并配置其对外访问的路径等相关信息
import javax.servlet.http.HttpServlet;
// 导入HttpServlet类它是所有基于HTTP协议的Servlet的基类自定义的Servlet类通常需要继承它来实现相应的功能以处理HTTP请求和响应
import javax.servlet.http.HttpServletRequest;
// 导入HttpServletRequest类用于获取HTTP请求中的各种信息例如请求参数、请求头以及客户端相关的其他信息等
import javax.servlet.http.HttpServletResponse;
// 导入HttpServletResponse类用于向客户端发送HTTP响应像设置响应状态码、响应头以及响应内容如页面、数据等
import java.io.IOException;
// 导入IOException类用于处理输入输出相关的异常情况常见于读写文件、网络通信等操作出现异常时进行捕获和处理
@WebServlet("/studentPasswordIndexServlet")
// 使用WebServlet注解声明该类是一个Servlet并指定其访问路径为"/studentPasswordIndexServlet"
// 意味着客户端可以通过这个路径来访问该Servlet所提供的服务
public class StudentPasswordIndexServlet extends HttpServlet {
// 定义StudentPasswordIndexServlet类它继承自HttpServlet类表明它是一个用于处理HTTP请求的Servlet类
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法该方法会在客户端以POST方式发起请求时被调用
// request参数用于接收此次HTTP请求相关的所有信息
// response参数用于向客户端返回对应的HTTP响应信息
request.getRequestDispatcher("/WEB-INF/student/studentUpdatePassword.jsp").forward(request, response);
// 使用请求转发的方式将请求转发到"/WEB-INF/student/studentUpdatePassword.jsp"对应的资源一般是一个JSP页面
// 在转发过程中,请求对象和响应对象会被保留,客户端地址栏显示的地址不会改变,常用于在服务器内部进行页面跳转且希望保留请求相关信息的场景,
// 在这里的作用是当客户端以POST方式访问该Servlet时将请求转发到用于学生更新密码的JSP页面
request.getRequestDispatcher("/WEB-INF/student/studentUpdatePassword.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法该方法会在客户端以GET方式发起请求时被调用
// 此处的实现是直接调用doPost方法意味着不管客户端是通过GET方式还是POST方式发起请求都会执行同样的业务逻辑处理
doPost(request, response);
doPost(request,response);
}
}
}

@ -1,116 +1,52 @@
package web.servlet.student;
// 声明该类所属的包名表明这个Servlet类位于web.servlet.student包下便于在项目中对代码进行分类管理和组织
import domain.Student;
// 导入Student类它代表学生相关的领域模型类包含学生的各种属性信息如学号、姓名等在这里用于获取学生对象以及更新学生密码相关操作
import service.StudentService;
// 导入StudentService接口该接口定义了与学生相关业务操作的方法例如更新学生密码、根据学号查找学生等是对学生业务逻辑的抽象描述
import service.impl.StudentServiceImpl;
// 导入StudentServiceImpl类它是StudentService接口的具体实现类用于提供具体的学生业务逻辑实现比如具体执行更新学生密码、查找学生的操作
import javax.servlet.ServletException;
// 导入ServletException类用于捕获和处理在Servlet执行过程中出现的异常情况确保程序在出现异常时能合理应对增强程序的健壮性
import javax.servlet.annotation.WebServlet;
// 导入WebServlet注解通过这个注解可以方便地将一个普通Java类声明为Servlet并配置其对外访问的路径等相关信息
import javax.servlet.http.HttpServlet;
// 导入HttpServlet类它是所有基于HTTP协议的Servlet的基类自定义的Servlet类通常需要继承它来实现相应的功能以处理HTTP请求和响应
import javax.servlet.http.HttpServletRequest;
// 导入HttpServletRequest类用于获取HTTP请求中的各种信息例如请求参数、请求头以及客户端相关的其他信息等
import javax.servlet.http.HttpServletResponse;
// 导入HttpServletResponse类用于向客户端发送HTTP响应像设置响应状态码、响应头以及响应内容如页面、数据等
import javax.servlet.http.HttpSession;
// 导入HttpSession类用于在服务器端管理用户的会话信息能够实现跨多个请求之间的数据共享在这里用于获取当前登录学生的信息以及更新会话中存储的学生信息
import java.io.IOException;
// 导入IOException类用于处理输入输出相关的异常情况常见于读写文件、网络通信等操作出现异常时进行捕获和处理
import java.util.Date;
// 导入Date类用于获取当前的日期和时间信息配合格式化字符串用于生成包含时间戳的提示信息
@WebServlet("/studentPasswordUpdateServlet")
// 使用WebServlet注解声明该类是一个Servlet并指定其访问路径为"/studentPasswordUpdateServlet"
// 意味着客户端可以通过这个路径来访问该Servlet所提供的服务
public class StudentPasswordUpdateServlet extends HttpServlet {
// 定义StudentPasswordUpdateServlet类它继承自HttpServlet类表明它是一个用于处理HTTP请求的Servlet类
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法该方法会在客户端以POST方式发起请求时被调用
// request参数用于接收此次HTTP请求相关的所有信息
// response参数用于向客户端返回对应的HTTP响应信息
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8",目的是确保能够正确解析包含中文等特殊字符的请求参数,避免出现参数解析乱码的问题
HttpSession session = request.getSession();
// 获取当前请求对应的HttpSession对象如果不存在则会创建一个新的会话通过会话对象可以获取之前存储在会话中的用户相关信息
// 在这里主要是获取当前登录的学生信息
Student student = (Student) session.getAttribute("student");
// 从HttpSession对象中获取名为"student"的属性值并将其强制转换为Student类型这个属性值代表当前登录的学生对象
// 若不存在则返回null通过它来获取学生的相关属性等信息
Student student= (Student)session.getAttribute("student");
String studentid = student.getS_id();
// 通过获取到的学生对象student调用其getS_id()方法获取学生的学号并赋值给studentid变量
// 后续会用该学号来标识要更新密码的学生,用于调用服务层方法更新密码
String newpassword = request.getParameter("student-newpassword");
// 从HTTP请求中获取名为"student-newpassword"的参数值该参数代表用户输入的新密码并将其赋值给newpassword变量
// 如果请求中不存在该参数则返回null
String ennewpassword = request.getParameter("student-ennewpassword");
// 从请求中获取名为"student-ennewpassword"的参数值通常用于确认新密码输入是否一致将其赋值给ennewpassword变量
String regex = "^[\\w]{3,12}$";
// 定义一个正则表达式字符串regex用于验证密码格式。这里的正则表达式表示密码必须由3到12位的单词字符字母、数字、下划线组成
boolean flag = newpassword.matches(regex);
// 使用matches方法让用户输入的新密码newpassword去匹配前面定义的正则表达式regex
// 如果匹配成功则返回true表示密码格式正确否则返回false
if (!flag) {
// 如果flag为false即密码格式不符合要求
request.setAttribute("update_msg", "密码格式错误,重新提交!" + String.format("%tT", new Date()));
// 在请求对象中设置一个名为"update_msg"的属性属性值为提示信息字符串包含密码格式错误的提示以及当前的时间戳通过String.format("%tT", new Date())生成时间格式为HH:MM:SS的字符串
request.setAttribute("update_msg", "密码格式错误,重新提交!"+String.format("%tT",new Date()));
request.getRequestDispatcher("/WEB-INF/student/studentUpdatePassword.jsp").forward(request, response);
// 使用请求转发的方式将请求转发到"/WEB-INF/student/studentUpdatePassword.jsp"对应的资源一般是一个JSP页面
// 在转发过程中,请求对象和响应对象会被保留,客户端地址栏显示的地址不会改变,常用于在服务器内部进行页面跳转且希望保留请求相关信息的场景,
// 这里是当密码格式错误时跳转到密码更新页面提示用户重新提交
} else if (!newpassword.equals(ennewpassword)) {
// 如果密码格式正确,但新密码和确认密码不一致
request.setAttribute("update_msg", "密码确认错误,请重新提交!" + String.format("%tT", new Date()));
// 设置提示信息属性,提示密码确认有误以及当前时间戳
request.getRequestDispatcher("/WEB-INF/student/studentUpdatePassword.jsp").forward(request, response);
// 同样转发到密码更新页面,让用户重新提交
} else {
// 如果密码格式正确且新密码和确认密码一致
StudentService service = new StudentServiceImpl();
// 创建一个StudentServiceImpl类的实例它实现了StudentService接口通过这个实例可以调用具体的与学生相关的业务方法
service.updatePassword(studentid, newpassword);
// 调用StudentService接口中定义的updatePassword方法由StudentServiceImpl具体实现传入学生学号studentid和新密码newpassword
// 执行更新学生密码的业务操作,一般会将更新后的密码保存到数据库等存储介质中
StudentService service= new StudentServiceImpl();
service.updatePassword(studentid,newpassword);
Student newStudent = service.findStudentById(student);
// 调用StudentService接口中定义的findStudentById方法由StudentServiceImpl具体实现传入当前学生对象student
// 目的是从数据库等存储介质中重新获取更新密码后的学生完整信息并将其赋值给newStudent变量
student = newStudent;
// 将更新后的学生对象赋值给原来的student变量以便后续更新会话中的学生信息
session.setAttribute("student", student);
// 将更新后的学生信息student重新设置到HttpSession对象中以更新会话中存储的学生信息方便后续其他操作能获取到最新的学生数据
session.setAttribute("student",student);
request.setAttribute("update_msg", "修改成功!" + String.format("%tT", new Date()));
// 设置提示信息属性,提示密码修改成功以及当前时间戳
request.getRequestDispatcher("/WEB-INF/student/studentUpdatePassword.jsp").forward(request, response);
// 转发到密码更新页面,展示修改成功的提示信息给用户
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法该方法会在客户端以GET方式发起请求时被调用
// 此处的实现是直接调用doPost方法意味着不管客户端是通过GET方式还是POST方式发起请求都会执行同样的业务逻辑处理
doPost(request, response);
doPost(request,response);
}
}
}

@ -1,107 +1,50 @@
package web.servlet.student;
// 声明该类所属的包名表明这个Servlet类位于web.servlet.student包下便于在项目中对代码进行分类管理和组织
import domain.Admin;
// 导入Admin类代表管理员相关的领域模型类包含管理员的各种属性信息用于判断当前登录用户是否为管理员角色
import domain.SelectCourse;
// 导入SelectCourse类通常表示学生选课相关的领域模型类包含学生选课的相关属性信息如学生ID、课程ID、成绩等用于存储查询到的选课信息
import domain.Student;
// 导入Student类代表学生相关的领域模型类包含学生的各种属性信息用于判断当前登录用户是否为学生角色以及获取学生相关信息来查询选课情况
import domain.Teacher;
// 导入Teacher类代表教师相关的领域模型类虽然在当前代码逻辑中暂未直接涉及教师相关判断操作但属于领域模型类的引入
import service.StudentService;
// 导入StudentService接口该接口定义了与学生相关业务操作的方法例如查询学生选课信息等是对学生业务逻辑的抽象描述
import service.impl.StudentServiceImpl;
// 导入StudentServiceImpl类它是StudentService接口的具体实现类用于提供具体的学生业务逻辑实现比如具体执行查询不同条件下学生选课信息的操作
import javax.servlet.ServletException;
// 导入ServletException类用于捕获和处理在Servlet执行过程中出现的异常情况确保程序在出现异常时能合理应对增强程序的健壮性
import javax.servlet.annotation.WebServlet;
// 导入WebServlet注解通过这个注解可以方便地将一个普通Java类声明为Servlet并配置其对外访问的路径等相关信息
import javax.servlet.http.HttpServlet;
// 导入HttpServlet类它是所有基于HTTP协议的Servlet的基类自定义的Servlet类通常需要继承它来实现相应的功能以处理HTTP请求和响应
import javax.servlet.http.HttpServletRequest;
// 导入HttpServletRequest类用于获取HTTP请求中的各种信息例如请求参数、请求头以及客户端相关的其他信息等
import javax.servlet.http.HttpServletResponse;
// 导入HttpServletResponse类用于向客户端发送HTTP响应像设置响应状态码、响应头以及响应内容如页面、数据等
import javax.servlet.http.HttpSession;
// 导入HttpSession类用于在服务器端管理用户的会话信息能够实现跨多个请求之间的数据共享在这里用于获取当前登录用户的角色信息学生或管理员
import java.io.IOException;
// 导入IOException类用于处理输入输出相关的异常情况常见于读写文件、网络通信等操作出现异常时进行捕获和处理
import java.util.List;
// 导入List接口用于处理和操作有序的元素集合在这里用于存储查询到的学生选课信息列表
@WebServlet("/studentSelectCourseListServlet")
// 使用WebServlet注解声明该类是一个Servlet并指定其访问路径为"/studentSelectCourseListServlet"
// 意味着客户端可以通过这个路径来访问该Servlet所提供的服务
public class StudentSelectCourseListServlet extends HttpServlet {
// 定义StudentSelectCourseListServlet类它继承自HttpServlet类表明它是一个用于处理HTTP请求的Servlet类
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法该方法会在客户端以POST方式发起请求时被调用
// request参数用于接收此次HTTP请求相关的所有信息
// response参数用于向客户端返回对应的HTTP响应信息
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8",目的是确保能够正确解析包含中文等特殊字符的请求参数,避免出现参数解析乱码的问题
HttpSession session = request.getSession();
// 获取当前请求对应的HttpSession对象如果不存在则会创建一个新的会话通过会话对象可以获取之前存储在会话中的用户相关信息
// 在这里主要用于获取当前登录用户的角色信息(学生或管理员)
Student student = (Student) session.getAttribute("student");
// 从HttpSession对象中获取名为"student"的属性值并将其强制转换为Student类型这个属性值如果存在代表当前登录用户是学生角色
// 若不存在则返回null通过它来判断当前登录用户是否为学生
Student student= (Student)session.getAttribute("student");
Admin admin =(Admin)session.getAttribute("admin");
Admin admin = (Admin) session.getAttribute("admin");
// 同理,从会话中获取名为"admin"的属性值并转换为Admin类型用于判断当前登录用户是否为管理员角色不存在则返回null
// 调用StudentService完成查询
//调用StudentService完成查询
StudentService studentService = new StudentServiceImpl();
// 创建一个StudentServiceImpl类的实例它实现了StudentService接口通过这个实例可以调用具体的与学生相关的业务方法
if (student!= null && admin == null) {
// 如果从会话中获取到的学生对象不为空,且管理员对象为空,说明当前登录用户是学生角色
if (student != null && admin == null) {
List<SelectCourse> selectcourses = studentService.findAllSelectCourse(student.getS_id());
// 调用StudentService接口中定义的findAllSelectCourse方法由StudentServiceImpl具体实现传入当前学生的ID通过student.getS_id()获取),
// 查询该学生已选的所有课程信息将查询结果以List<SelectCourse>类型返回即得到一个包含该学生所有选课记录对象的列表并赋值给selectcourses变量
// 将list存入request域
request.setAttribute("selectcourses", selectcourses);
// 将查询到的学生选课信息列表selectcourses设置到请求对象request的属性中属性名为"selectcourses"
// 这样在后续转发到的页面如JSP页面中就可以通过该属性名获取到选课列表进行展示等操作
// 转发到list.jsp
request.getRequestDispatcher("/WEB-INF/student/studentSelectCourseList.jsp").forward(request, response);
// 使用请求转发的方式将请求转发到"/WEB-INF/student/studentSelectCourseList.jsp"对应的资源一般是一个JSP页面
// 在转发过程中,请求对象和响应对象会被保留,客户端地址栏显示的地址不会改变,常用于在服务器内部进行页面跳转且希望保留请求相关信息的场景,
// 这里是将学生角色的用户请求转发到展示该学生自己选课列表信息的JSP页面
} else if (admin!= null && student == null) {
// 如果管理员对象不为空,学生对象为空,说明当前登录用户是管理员角色
//将list存入request域
request.setAttribute("selectcourses",selectcourses);
//转发到list.jsp
request.getRequestDispatcher("/WEB-INF/student/studentSelectCourseList.jsp").forward(request,response);
} else if (admin != null && student == null) {
List<SelectCourse> selectcourses = studentService.findSelectCourseAllStudent();
// 调用StudentService接口中定义的findSelectCourseAllStudent方法由StudentServiceImpl具体实现
// 查询所有学生的选课信息将查询结果以List<SelectCourse>类型返回得到一个包含所有学生选课记录对象的列表并赋值给selectcourses变量
request.setAttribute("selectcourses", selectcourses);
// 将查询到的所有学生选课信息列表selectcourses设置到请求对象request的属性中
request.getRequestDispatcher("/WEB-INF/admin/allStudentSelectCourseList.jsp").forward(request, response);
// 使用请求转发的方式将请求转发到"/WEB-INF/admin/allStudentSelectCourseList.jsp"对应的资源一般是一个JSP页面
// 是将管理员角色的用户请求转发到适合管理员查看所有学生选课列表信息的JSP页面
} else {
request.getRequestDispatcher("error.jsp").forward(request, response);
// 如果以上角色判断都不符合,说明可能出现了异常情况或者未预期的登录状态,
// 则使用请求转发的方式将请求转发到"error.jsp"对应的资源一般是一个显示错误信息的JSP页面
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法该方法会在客户端以GET方式发起请求时被调用
// 此处的实现是直接调用doPost方法意味着不管客户端是通过GET方式还是POST方式发起请求都会执行同样的业务逻辑处理
this.doPost(request, response);
this.doPost(request,response);
}
}
}

@ -1,39 +1,19 @@
package web.servlet.student;
// 声明该类所属的包名表明这个Servlet类位于web.servlet.student包下便于在项目中对代码进行分类管理和组织
import javax.servlet.ServletException;
// 导入ServletException类用于捕获和处理在Servlet执行过程中出现的异常情况确保程序在出现异常时能合理应对增强程序的健壮性
import javax.servlet.annotation.WebServlet;
// 导入WebServlet注解通过这个注解可以方便地将一个普通Java类声明为Servlet并配置其对外访问的路径等相关信息
import javax.servlet.http.HttpServlet;
// 导入HttpServlet类它是所有基于HTTP协议的Servlet的基类自定义的Servlet类通常需要继承它来实现相应的功能以处理HTTP请求和响应
import javax.servlet.http.HttpServletRequest;
// 导入HttpServletRequest类用于获取HTTP请求中的各种信息例如请求参数、请求头以及客户端相关的其他信息等
import javax.servlet.http.HttpServletResponse;
// 导入HttpServletResponse类用于向客户端发送HTTP响应像设置响应状态码、响应头以及响应内容如页面、数据等
import java.io.IOException;
// 导入IOException类用于处理输入输出相关的异常情况常见于读写文件、网络通信等操作出现异常时进行捕获和处理
@WebServlet("/studentServlet")
// 使用WebServlet注解声明该类是一个Servlet并指定其访问路径为"/studentServlet"
// 意味着客户端可以通过这个路径来访问该Servlet所提供的服务
public class StudentServlet extends HttpServlet {
// 定义StudentServlet类它继承自HttpServlet类表明它是一个用于处理HTTP请求的Servlet类
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法该方法会在客户端以POST方式发起请求时被调用
// request参数用于接收此次HTTP请求相关的所有信息
// response参数用于向客户端返回对应的HTTP响应信息
request.getRequestDispatcher("/WEB-INF/student/sIndex.jsp").forward(request, response);
// 使用请求转发的方式将请求转发到"/WEB-INF/student/sIndex.jsp"对应的资源一般是一个JSP页面
// 在转发过程中,请求对象和响应对象会被保留,客户端地址栏显示的地址不会改变,常用于在服务器内部进行页面跳转且希望保留请求相关信息的场景,
// 在这里的作用是当客户端以POST方式访问该Servlet时将请求转发到对应的学生首页通常是sIndex.jsp这个JSP页面
request.getRequestDispatcher("/WEB-INF/student/sIndex.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法该方法会在客户端以GET方式发起请求时被调用
// 此处的实现是直接调用doPost方法意味着不管客户端是通过GET方式还是POST方式发起请求都会执行同样的业务逻辑处理
doPost(request, response);
doPost(request,response);
}
}
}

@ -1,85 +1,51 @@
// 包声明表明该Servlet类所属的包名用于组织和管理Java类
package web.servlet.teacher;
package web.servlet.teacher;
import domain.Course;
import domain.Teacher;
// 导入课程相关的业务逻辑接口,用于后续调用相关业务方法
import service.CourseService;
// 导入课程业务逻辑接口的具体实现类,用于创建具体的业务对象来处理课程相关操作
import service.impl.CourseServiceImpl;
import service.CourseService;
import service.impl.CourseServiceImpl;
import javax.servlet.ServletException;
// 用于标注该类是一个Servlet并配置其访问的URL路径
import javax.servlet.annotation.WebServlet;
// 继承自HttpServlet是Java Web中处理HTTP请求的基础类
import javax.servlet.http.HttpServlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 用于表示HTTP会话可在其中存储和获取用户相关的会话信息
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Date;
// 使用@WebServlet注解配置该Servlet的访问路径为 "/addOptionalCourseServlet"
// 意味着当客户端通过此路径发起请求时会由该Servlet进行处理
@WebServlet("/addOptionalCourseServlet")
@WebServlet("/addOptionalCourseServlet")
public class AddOptionalCourseServlet extends HttpServlet {
// 重写doPost方法用于处理HTTP POST请求
// 参数request表示客户端发来的请求对象包含请求的各种信息
// 参数response表示要返回给客户端的响应对象用于设置响应内容等
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求的字符编码为"utf-8",确保能正确解析包含中文等多字节字符的请求参数
request.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
// 获取当前请求对应的会话对象,如果不存在则创建一个新的会话
HttpSession session = request.getSession();
// 从会话中获取名为"teacher"的属性值并转换为Teacher类型
// 通常这里存储的是当前登录教师的相关信息
Teacher teacher = (Teacher) session.getAttribute("teacher");
HttpSession session = request.getSession();
Teacher teacher = (Teacher) session.getAttribute("teacher");
// 从请求参数中获取课程ID对应HTML表单中名为"cid"的输入项
String cid = request.getParameter("cid");
// 从请求参数中获取课程名称对应HTML表单中名为"course-name"的输入项
String cname = request.getParameter("course-name");
// 从请求参数中获取课程详细信息对应HTML表单中名为"course-info"的输入项
String cinfo = request.getParameter("course-info");
String cid = request.getParameter("cid");
String cname = request.getParameter("course-name");
String cinfo = request.getParameter("course-info");
// 创建课程业务逻辑层的具体实现类对象,用于调用具体的课程相关业务方法
CourseService service = new CourseServiceImpl();
// 通过业务层方法根据课程ID查找对应的课程对象查看是否已存在该课程
Course course = service.findSelectCourseByCourseId(cid);
if (course!= null) {
// 如果课程已存在(即查找结果不为空),则向请求对象中设置一个属性"update_msg"
// 提示课程ID冲突并附带当前时间信息然后将请求转发到指定的JSP页面进行展示
request.setAttribute("update_msg","课程ID冲突请重新添加" + String.format("%tT",new Date()));
CourseService service = new CourseServiceImpl();
Course course = service.findSelectCourseByCourseId(cid);
if (course != null) {
request.setAttribute("update_msg","课程ID冲突请重新添加"+String.format("%tT",new Date()));
request.getRequestDispatcher("/WEB-INF/teacher/addOptionalCourse.jsp").forward(request,response);
} else {
// 如果课程不存在则创建一个新的Course对象用于封装要添加的课程信息
Course newCourse = new Course();
// 设置新课程的ID
newCourse.setC_id(cid);
// 设置新课程的名称
newCourse.setC_name(cname);
// 设置新课程的详细信息
newCourse.setC_info(cinfo);
// 设置新课程所属教师的ID从之前从会话中获取的教师对象中获取教师ID
newCourse.setT_id(teacher.getT_id());
// 设置新课程所属教师的姓名,从之前从会话中获取的教师对象中获取教师姓名
newCourse.setT_name(teacher.getT_name());
// 通过业务层对象调用添加可选课程的方法,将新创建的课程信息保存到数据库等存储介质中
service.addOptionalCourse(newCourse);
// 向请求对象中设置一个属性"update_msg",提示课程添加成功,并附带当前时间信息
request.setAttribute("update_msg","课程添加成功!" + String.format("%tT",new Date()));
// 将请求转发到指定的JSP页面通常用于展示添加课程后的相关提示信息等
}else {
Course newCourse = new Course();
newCourse.setC_id(cid);
newCourse.setC_name(cname);
newCourse.setC_info(cinfo);
newCourse.setT_id(teacher.getT_id());
newCourse.setT_name(teacher.getT_name());
service.addOptionalCourse(newCourse);
request.setAttribute("update_msg","课程添加成功!"+String.format("%tT",new Date()));
request.getRequestDispatcher("/WEB-INF/teacher/addOptionalCourse.jsp").forward(request,response);
}
}
// 重写doGet方法在该Servlet中直接调用doPost方法来处理GET请求
// 意味着GET请求的处理逻辑和POST请求一样实际应用中可根据需求单独定制处理逻辑
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
}

@ -1,5 +1,4 @@
package web.servlet.teacher;
// 定义该类所属的包名表明这个Servlet类位于web.servlet.teacher包下用于对类进行合理的组织和管理方便在项目中区分不同功能模块的类。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -7,35 +6,15 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// 导入必要的Java EE相关的类库。
// ServletException用于处理Servlet执行过程中出现的异常情况。
// WebServlet注解用于将一个普通的Java类标注为Servlet方便容器识别并进行相关配置和管理。
// HttpServlet是所有基于HTTP协议的Servlet的基类提供了处理HTTP请求的基础结构和方法。
// HttpServletRequest用于获取来自客户端的HTTP请求信息例如请求参数、请求头信息等。
// HttpServletResponse用于向客户端发送HTTP响应例如设置响应状态码、响应头以及返回响应内容等。
// IOException用于处理输入输出相关的异常比如读写文件、网络传输等出现问题时抛出。
@WebServlet("/addSelectCourseServlet")
// 使用@WebServlet注解将当前类标记为一个Servlet并指定该Servlet对应的访问路径为"/addSelectCourseServlet"。当客户端通过这个路径发起HTTP请求时容器就会找到并调用这个Servlet来处理请求。
public class AddSelectCourseServlet extends HttpServlet {
// 定义一个名为AddSelectCourseServlet的类它继承自HttpServlet类表明这个类是一个用于处理HTTP请求的Servlet继承HttpServlet可以方便地重写相关方法来处理不同类型的HTTP请求如GET、POST等
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet中的doPost方法用于处理HTTP POST请求。当客户端通过POST方式访问此Servlet对应的路径时容器会调用这个方法来处理请求。
// 参数request包含了客户端发送过来的请求信息response用于向客户端返回响应信息。
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8"确保从客户端接收到的请求参数等数据能够正确地按照UTF-8编码进行解析避免中文等特殊字符出现乱码问题。
request.getRequestDispatcher("/WEB-INF/teacher/addOptionalCourse.jsp").forward(request, response);
// 获取一个请求转发器,指定转发的目标页面为"/WEB-INF/teacher/addOptionalCourse.jsp"。
// 然后使用forward方法将当前请求转发到指定的JSP页面这样在处理完Servlet中的业务逻辑后可以让服务器端渲染并返回对应的JSP页面内容给客户端整个过程对客户端来说是一次请求响应的过程地址栏中的URL不会发生变化。
request.getRequestDispatcher("/WEB-INF/teacher/addOptionalCourse.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet中的doGet方法用于处理HTTP GET请求。当客户端通过GET方式访问此Servlet对应的路径时容器会调用这个方法来处理请求。
doPost(request, response);
// 在doGet方法中直接调用了doPost方法意味着对于GET请求的处理逻辑和POST请求的处理逻辑是一样的即都会将请求转发到"/WEB-INF/teacher/addOptionalCourse.jsp"这个JSP页面进行后续处理。
doPost(request,response);
}
}
}

@ -1,11 +1,8 @@
package web.servlet.teacher;
// 定义该类所属的包名表明这个Servlet类位于web.servlet.teacher包下按照功能模块对类进行分类管理方便在项目结构中组织代码。
import domain.Teacher;
import service.TeacherService;
import service.impl.TeacherServiceImpl;
// 导入与教师相关的领域模型类Teacher教师业务逻辑的服务接口TeacherService以及该接口的具体实现类TeacherServiceImpl
// Teacher类通常用于封装教师相关的属性和业务逻辑TeacherService定义了教师业务操作的抽象方法TeacherServiceImpl则是这些方法的具体实现类。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -14,63 +11,25 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
// 导入Java EE中Servlet相关的基础类和接口用于处理Servlet相关的操作和异常。
// ServletException用于处理Servlet执行过程中出现的异常情况。
// WebServlet注解用于将一个普通的Java类标注为Servlet并配置其相关的访问路径等属性。
// HttpServlet是所有基于HTTP协议的Servlet的基类提供了处理HTTP请求的基础结构和方法。
// HttpServletRequest用于获取客户端发送过来的HTTP请求中的各种信息如请求参数等。
// HttpServletResponse用于向客户端发送HTTP响应比如设置响应状态码、响应头以及返回响应内容等。
// IOException用于处理输入输出相关的异常例如读写文件或者网络传输等出现问题时抛出。
// Date类用于获取当前的日期和时间信息在这里可能用于记录操作的时间等用途。
@WebServlet("/addTeacherInfoServlet")
// 使用@WebServlet注解将当前类标记为一个Servlet并指定其对应的访问路径为"/addTeacherInfoServlet"。当客户端通过这个URL路径发起HTTP请求时Web容器就会找到并调用这个Servlet来处理请求。
public class AddTeacherInfoServlet extends HttpServlet {
// 定义一个名为AddTeacherInfoServlet的类它继承自HttpServlet类意味着这个类是一个用于处理HTTP请求的Servlet通过继承HttpServlet可以方便地重写相应方法来处理不同类型的HTTP请求如GET、POST等
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法用于处理HTTP POST请求。当客户端通过POST方式访问此Servlet对应的URL路径时容器会调用这个方法来处理请求。
// 参数request包含了客户端发送过来的所有请求信息response则用于向客户端返回响应信息。
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8"确保从客户端接收到的请求参数等数据能够按照UTF-8编码格式正确解析避免中文等特殊字符出现乱码问题保证数据的准确性。
TeacherService service = new TeacherServiceImpl();
// 创建一个TeacherServiceImpl类的实例通过多态的方式将其赋值给TeacherService接口类型的变量service。这样后续就可以调用TeacherService接口中定义的教师业务相关方法而具体的实现则由TeacherServiceImpl类来完成。
// 先进行判断是否已存在该教师
TeacherService service= new TeacherServiceImpl();
//先进行判断是否已存在该教师
String tid = request.getParameter("teacher-id");
// 从客户端发送的HTTP请求中获取名为"teacher-id"的参数值,该参数值通常代表教师的编号,用于后续判断是否已经存在具有该编号的教师记录。
Teacher t = new Teacher();
// 创建一个Teacher类的实例t用于封装教师相关的信息此处先创建一个空的教师对象后续会设置相应的属性值。
t.setT_id(tid);
// 通过调用Teacher类的setT_id方法将从请求中获取到的教师编号tid设置到教师对象t中以便后续根据这个编号进行数据库查询等操作来判断教师是否已存在。
Teacher newTeacher = service.findTeacherById(t);
// 调用service实际是TeacherServiceImpl类的实例的findTeacherById方法传入刚才设置好编号的教师对象t该方法应该是根据教师编号去数据库等存储介质中查询是否存在对应的教师记录并返回查询到的教师对象如果存在的话将查询结果赋值给newTeacher变量。
if (newTeacher!= null) {
// 判断查询到的教师对象newTeacher是否不为空即是否已经存在具有该编号的教师记录。
request.setAttribute("update_msg", "已存在该教师,请重新添加!" + String.format("%tT", new Date()));
// 如果教师已存在使用request对象的setAttribute方法设置一个名为"update_msg"的属性属性值是提示信息告知用户该教师已存在并拼接上当前的时间通过String.format结合%tT格式化Date对象得到具体的时间格式字符串以便用户了解操作的时间情况。
if (newTeacher != null) {
request.setAttribute("update_msg","已存在该教师,请重新添加!"+String.format("%tT",new Date()));
request.getRequestDispatcher("addTeacherServlet").forward(request, response);
// 获取一个请求转发器,将请求转发到名为"addTeacherServlet"的资源可能是另一个Servlet或者JSP页面等这样服务器端会接着处理转发后的请求并向客户端返回相应的响应内容整个过程对客户端来说是一次完整的请求响应过程地址栏中的URL不会发生改变。
} else {
// 如果教师不存在,则执行以下添加教师信息的逻辑。
}else {
String name = request.getParameter("teacher-name");
// 从客户端请求中获取名为"teacher-name"的参数值,该值代表教师的姓名,用于后续设置到要添加的教师对象中。
String sex = request.getParameter("teacher-sex");
// 从请求中获取名为"teacher-sex"的参数值,代表教师的性别,同样用于设置教师对象的属性。
String education = request.getParameter("teacher-education");
// 获取"teacher-education"参数值,对应教师的文化程度信息,用于后续操作。
String title = request.getParameter("teacher-title");
// 获取"teacher-title"参数值,代表教师的职称信息,准备设置到教师对象里。
// String college = request.getParameter("selectCollege");
// String department = request.getParameter("selectDepartment");
@ -84,46 +43,25 @@ public class AddTeacherInfoServlet extends HttpServlet {
// if ("".equals(cclass)) {
// cclass = "待分配";
// }
// 上述代码段被注释掉了,但原本的意图可能是从请求中获取教师所属的学院、系别、班级信息,如果获取到的值为空字符串,就将其设置为"待分配",表示该教师在这些方面暂未明确分配相应的归属。
Teacher updateTeacher = new Teacher();
// 创建一个新的Teacher类实例updateTeacher用于封装要添加的教师的完整信息后续将各项参数值设置到这个对象中。
updateTeacher.setT_id(tid);
// 将之前获取到的教师编号设置到updateTeacher对象中确保添加的教师具有正确的编号信息。
updateTeacher.setT_name(name);
// 设置教师的姓名到updateTeacher对象中。
updateTeacher.setT_sex(sex);
// 设置教师的性别信息到对象中。
updateTeacher.setT_education(education);
// 设置教师的文化程度信息到对象中。
updateTeacher.setT_title(title);
// 设置教师的职称信息到对象中。
// updateTeacher.setT_college(college);
// updateTeacher.setT_department(department);
// updateTeacher.setT_class(cclass);
// 同样上述被注释掉的代码原本是要设置教师所属的学院、系别、班级信息到updateTeacher对象中。
service.addTeacherAllInfo(updateTeacher);
// 调用serviceTeacherServiceImpl的实例的addTeacherAllInfo方法将封装好教师所有信息的updateTeacher对象传入该方法应该会将教师信息保存到数据库等存储介质中完成教师信息的添加操作。
request.setAttribute("update_msg", "添加成功!" + String.format("%tT", new Date()));
// 设置名为"update_msg"的属性,属性值为添加成功的提示信息,并拼接当前时间,方便用户知晓操作完成的时间情况。
request.getRequestDispatcher("addTeacherServlet").forward(request, response);
// 再次使用请求转发器将请求转发到"addTeacherServlet"资源进行后续的页面展示或者其他相关业务处理保持整个请求响应流程的连贯性客户端看到的URL不变。
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法用于处理HTTP GET请求。
doPost(request, response);
// 在doGet方法中直接调用了doPost方法意味着对于GET请求的处理逻辑和POST请求的处理逻辑是一样的即都会按照doPost方法中的逻辑进行处理比如判断教师是否存在、添加教师信息等操作。
doPost(request,response);
}
}
}

@ -1,13 +1,8 @@
package web.servlet.teacher;
// 定义该类所属的包名表明这个Servlet类位于web.servlet.teacher包下通过包名对类进行分类管理有助于在项目中清晰地组织代码结构方便区分不同功能模块对应的类。
import domain.CDC;
import service.CDCService;
import service.impl.CDCServiceImpl;
// 导入与CDC可能是某种机构、部门等相关的领域模型类具体含义取决于业务场景相关的类和接口。
// domain.CDC表示CDC类所在的包名和类名该类通常用于封装CDC相关的属性和业务逻辑。
// service.CDCService是定义CDC业务操作的服务接口规定了可以对CDC进行的各种业务方法比如查询、添加、删除等操作这里从名字推测可能主要涉及查询相关操作
// service.impl.CDCServiceImpl则是CDCService接口的具体实现类实现了接口中定义的方法具体完成与数据库或其他数据源交互来实现业务逻辑的功能。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -17,60 +12,26 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
// 导入Java EE中Servlet相关的基础类和接口用于处理Servlet相关的操作以及可能出现的异常情况。
// ServletException用于处理Servlet执行过程中出现的异常情况比如配置错误、业务逻辑执行出错等。
// WebServlet注解用于将一个普通的Java类标注为Servlet并配置其相关的访问路径等属性方便Web容器识别和管理。
// HttpServlet是所有基于HTTP协议的Servlet的基类提供了处理HTTP请求的基础结构和方法我们可以通过重写它的方法来实现具体的业务逻辑处理。
// HttpServletRequest用于获取客户端发送过来的HTTP请求中的各种信息例如请求参数、请求头信息等是处理请求数据的重要入口。
// HttpServletResponse用于向客户端发送HTTP响应比如设置响应状态码、响应头以及返回响应内容等用于构建返回给客户端的信息。
// HttpSession用于在服务器端管理用户会话信息通过它可以在不同的请求之间共享数据比如保存用户的登录状态、购物车信息等这里可能用于保存一些与添加教师页面相关的数据
// IOException用于处理输入输出相关的异常像读写文件、网络传输等出现问题时会抛出该异常。
// List是Java集合框架中的接口表示一个有序的、可重复元素的集合这里用于存放从数据库等数据源查询出来的CDC相关数据列表例如学院、系别、班级列表等
@WebServlet("/addTeacherServlet")
// 使用@WebServlet注解将当前类标记为一个Servlet并指定其对应的访问路径为"/addTeacherServlet"。当客户端通过这个URL路径发起HTTP请求时Web容器如Tomcat等就会找到并调用这个Servlet来处理请求。
public class AddTeacherServlet extends HttpServlet {
// 定义一个名为AddTeacherServlet的类它继承自HttpServlet类意味着这个类是一个用于处理HTTP请求的Servlet通过继承HttpServlet可以方便地重写相应方法来处理不同类型的HTTP请求如GET、POST等以实现具体的业务逻辑。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法用于处理HTTP POST请求。当客户端通过POST方式访问此Servlet对应的URL路径时容器会调用这个方法来处理请求。
// 参数request包含了客户端发送过来的所有请求信息response则用于向客户端返回响应信息。
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8"确保从客户端接收到的请求参数等数据能够按照UTF-8编码格式正确解析避免中文等特殊字符出现乱码问题保证后续获取和处理请求数据的准确性。
HttpSession session = request.getSession();
// 获取当前请求对应的HttpSession对象如果不存在则创建一个新的会话对象。HttpSession可以用于在多个请求之间保存和共享数据方便实现一些需要跨请求保持状态的功能比如登录后的用户信息保存等。在这里主要用于存放一些后续要在页面中展示的数据列表。
CDCService service = new CDCServiceImpl();
// 创建一个CDCServiceImpl类的实例通过多态的方式将其赋值给CDCService接口类型的变量service。这样后续就可以调用CDCService接口中定义的与CDC相关的业务方法而具体的实现则由CDCServiceImpl类来完成例如查询学院、系别、班级等列表信息的操作。
List<CDC> collegeList = service.findAllCollege();
// 调用service实际是CDCServiceImpl的实例的findAllCollege方法该方法应该是从数据库或者其他数据源中查询出所有学院的信息并以CDC对象的列表形式返回将查询到的学院信息列表赋值给collegeList变量。
List<CDC> departmentList = service.findAllDepartment();
// 同样地调用findAllDepartment方法从数据源中获取所有系别的信息以CDC对象列表形式返回赋值给departmentList变量用于后续在页面上展示系别相关的下拉选项等操作。
List<CDC> classList = service.findAllClass();
// 调用findAllClass方法查询并获取所有班级的信息以CDC对象列表形式返回赋值给classList变量方便在页面中展示班级相关的下拉选择内容等。
session.setAttribute("collegeLists", collegeList);
// 使用HttpSession对象的setAttribute方法将查询到的学院信息列表collegeList保存到会话中设置的属性名为"collegeLists",这样在后续的请求处理或者页面渲染过程中(只要是同一个会话内),就可以获取到这个学院列表数据进行展示或其他操作。
session.setAttribute("departmentLists", departmentList);
// 类似地将系别信息列表departmentList保存到会话中属性名为"departmentLists",以便在相关页面中使用这些系别数据,例如构建下拉菜单选项等。
session.setAttribute("collegeLists",collegeList);
session.setAttribute("departmentLists",departmentList);
session.setAttribute("classLists",classList);
session.setAttribute("classLists", classList);
// 把班级信息列表classList保存到会话中属性名为"classLists",便于后续页面展示班级相关的选择内容等操作。
request.getRequestDispatcher("/WEB-INF/admin/addTeacher.jsp").forward(request, response);
// 获取一个请求转发器,将当前请求转发到"/WEB-INF/admin/addTeacher.jsp"这个页面通常是一个JSP页面用于展示添加教师的表单等相关内容。这样服务器端会接着处理转发后的请求并向客户端返回相应的JSP页面渲染后的内容整个过程对客户端来说是一次完整的请求响应过程地址栏中的URL不会发生改变。
request.getRequestDispatcher("/WEB-INF/admin/addTeacher.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法用于处理HTTP GET请求。
doPost(request, response);
// 在doGet方法中直接调用了doPost方法意味着对于GET请求的处理逻辑和POST请求的处理逻辑是一样的即都会按照doPost方法中的逻辑进行处理比如查询相关数据列表、保存到会话中以及转发请求到添加教师的JSP页面等操作。
doPost(request,response);
}
}
}

@ -1,11 +1,7 @@
package web.servlet.teacher;
// 定义该类所属的包名表明这个Servlet类位于web.servlet.teacher包下通过包来对类进行分类管理使项目代码结构更加清晰便于区分不同功能模块对应的代码。
import service.TeacherService;
import service.impl.TeacherServiceImpl;
// 导入教师相关业务逻辑的服务接口TeacherService以及该接口的具体实现类TeacherServiceImpl
// TeacherService接口定义了一系列针对教师业务操作的抽象方法例如这里可能涉及到对课程相关操作的方法声明等。
// TeacherServiceImpl类则是对TeacherService接口的具体实现里面包含了与数据库或其他数据源交互来实际完成业务逻辑的代码比如具体的课程删除操作实现等。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -14,44 +10,18 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
// 导入Java EE中Servlet相关的基础类和接口用于处理Servlet相关的操作以及可能出现的异常情况。
// ServletException用于处理Servlet执行过程中出现的异常情况比如业务逻辑执行出错、配置错误等。
// WebServlet注解用于将一个普通的Java类标注为Servlet并配置其相关的访问路径等属性方便Web容器识别并进行管理。
// HttpServlet是所有基于HTTP协议的Servlet的基类提供了处理HTTP请求的基础结构和方法我们可以通过重写它的方法来实现具体的业务逻辑处理。
// HttpServletRequest用于获取客户端发送过来的HTTP请求中的各种信息像请求参数、请求头信息等是后续处理请求数据的重要依据。
// HttpServletResponse用于向客户端发送HTTP响应例如设置响应状态码、响应头以及返回响应内容等用于构建返回给客户端的信息。
// HttpSession用于在服务器端管理用户会话信息通过它可以在不同的请求之间共享数据不过在这段代码里暂时没有明显体现出对会话信息的复杂使用场景。
// IOException用于处理输入输出相关的异常例如读写文件、网络传输等出现问题时会抛出该异常。
@WebServlet("/deleteOptionalCourseServlet")
// 使用@WebServlet注解将当前类标记为一个Servlet并指定其对应的访问路径为"/deleteOptionalCourseServlet"。当客户端通过这个URL路径发起HTTP请求时Web容器如Tomcat等就会找到并调用这个Servlet来处理请求。
public class DeleteOptionalCourseServlet extends HttpServlet {
// 定义一个名为DeleteOptionalCourseServlet的类它继承自HttpServlet类意味着这个类是一个用于处理HTTP请求的Servlet通过继承HttpServlet可以方便地重写相应方法来处理不同类型的HTTP请求如GET、POST等以实现具体的业务逻辑这里主要是实现删除可选课程的业务逻辑。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法用于处理HTTP POST请求。当客户端通过POST方式访问此Servlet对应的URL路径时容器会调用这个方法来处理请求。
// 参数request包含了客户端发送过来的所有请求信息response则用于向客户端返回响应信息。
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8"确保从客户端接收到的请求参数等数据能够按照UTF-8编码格式正确解析避免中文等特殊字符出现乱码问题保证后续获取和处理请求数据的准确性特别是这里要获取课程编号等信息防止乱码很重要。
String cid = request.getParameter("cid");
// 从客户端发送的HTTP请求中获取名为"cid"的参数值该参数值通常代表要删除的课程的编号具体含义取决于业务逻辑中的定义将获取到的课程编号赋值给cid变量以便后续根据这个编号进行课程删除操作。
TeacherService service = new TeacherServiceImpl();
// 创建一个TeacherServiceImpl类的实例通过多态的方式将其赋值给TeacherService接口类型的变量service。这样后续就可以调用TeacherService接口中定义的业务方法而具体的删除课程操作的实现则由TeacherServiceImpl类来完成。
service.deleteCourseById(cid);
// 调用service实际是TeacherServiceImpl的实例的deleteCourseById方法传入刚才获取到的课程编号cid该方法应该是在数据库或其他存储课程信息的数据源中根据课程编号来删除对应的课程记录实现课程删除的业务逻辑操作。
request.getRequestDispatcher("/teacherOptionalCourseServlet").forward(request, response);
// 获取一个请求转发器,将当前请求转发到"/teacherOptionalCourseServlet"这个资源可能是另一个Servlet或者JSP页面等。这样服务器端会接着处理转发后的请求并向客户端返回相应的响应内容整个过程对客户端来说是一次完整的请求响应过程地址栏中的URL不会发生改变通过转发可以继续后续的页面展示或者其他相关业务处理。
request.getRequestDispatcher("/teacherOptionalCourseServlet").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法用于处理HTTP GET请求。
doPost(request, response);
// 在doGet方法中直接调用了doPost方法意味着对于GET请求的处理逻辑和POST请求的处理逻辑是一样的即都会按照doPost方法中的逻辑进行处理比如获取课程编号、删除课程以及转发请求等操作。
doPost(request,response);
}
}
}

@ -1,11 +1,7 @@
package web.servlet.teacher;
// 定义该类所属的包名表明这个Servlet类位于web.servlet.teacher包下利用包来对类进行分类组织使项目的代码结构更加清晰有条理便于区分不同功能模块对应的类。
import service.TeacherService;
import service.impl.TeacherServiceImpl;
// 导入教师业务相关的服务接口TeacherService以及该接口对应的具体实现类TeacherServiceImpl
// TeacherService接口通常会定义一系列针对教师相关业务操作的抽象方法比如删除教师、查询教师信息等操作的方法声明。
// TeacherServiceImpl类则是对TeacherService接口的具体实现其内部包含了与数据库或者其他数据源进行交互的代码以此来实际完成相应的业务逻辑例如这里涉及的根据教师编号删除教师信息的具体实现就在这个类中。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -14,44 +10,18 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
// 导入Java EE中Servlet相关的基础类和接口用于处理Servlet相关的操作以及可能出现的异常情况。
// ServletException用于处理Servlet在执行过程中出现的各种异常像业务逻辑出错、配置不正确等情况引发的异常都会通过它来处理。
// WebServlet注解用于将一个普通的Java类标注为Servlet并且可以配置这个Servlet对应的访问路径等相关属性方便Web容器例如Tomcat等服务器识别并对其进行管理和调度。
// HttpServlet是所有基于HTTP协议的Servlet的基础类它提供了处理HTTP请求的基本结构和相关方法开发人员可以通过重写它里面的方法来实现具体的业务逻辑以应对不同类型的HTTP请求如GET、POST等
// HttpServletRequest主要用于获取客户端发送过来的HTTP请求中包含的各种信息比如请求参数、请求头里的数据等它是后续在Servlet中处理请求数据的重要入口。
// HttpServletResponse用于向客户端发送HTTP响应例如设置响应的状态码、响应头的相关信息以及返回具体的响应内容等以此构建完整的返回给客户端的信息。
// HttpSession用于在服务器端管理用户的会话信息通过它能够实现在不同的请求之间共享数据不过在当前这段代码里暂时没有复杂的针对会话信息的操作体现。
// IOException用于处理输入输出相关的异常情况像读写文件过程中、网络传输数据时等出现问题就会抛出该异常。
@WebServlet("/deleteTeacherServlet")
// 使用@WebServlet注解将当前类标记为一个Servlet并指定这个Servlet对应的访问路径为"/deleteTeacherServlet"。当客户端通过这个特定的URL路径发起HTTP请求时Web容器就会找到并调用这个Servlet来处理请求。
public class DeleteTeacherServlet extends HttpServlet {
// 定义了一个名为DeleteTeacherServlet的类它继承自HttpServlet类这就表明这个类是一个专门用于处理HTTP请求的Servlet借助继承HttpServlet类的特性可以方便地重写其中的方法来实现具体的业务逻辑此处重点在于实现删除教师的相关业务逻辑。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写了HttpServlet类中的doPost方法该方法主要用于处理HTTP POST请求。当客户端通过POST方式访问此Servlet对应的"/deleteTeacherServlet"这个URL路径时Web容器会自动调用这个方法来处理相应的请求。
// 方法中的参数request包含了客户端发送过来的全部请求信息而response则是用于向客户端返回响应信息的对象。
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8"这一步操作很关键它能确保从客户端接收到的请求参数等各类数据可以按照UTF-8编码格式被准确地解析出来有效避免中文或者其他特殊字符出现乱码的问题从而保障后续获取和处理请求数据时的准确性在这里特别重要的是保证获取教师编号等关键信息不出错。
String teacherid = request.getParameter("tid");
// 从客户端发送的HTTP请求中获取名为"tid"的参数值按照业务逻辑推测这个参数值通常代表着要删除的教师的编号然后将获取到的教师编号赋值给teacherid变量方便后续依据这个编号进行删除教师的具体操作。
TeacherService service = new TeacherServiceImpl();
// 创建一个TeacherServiceImpl类的实例通过多态的方式将其赋值给TeacherService接口类型的变量service。如此一来后续就能调用TeacherService接口里定义的各种业务方法了而具体的删除教师操作的实际代码实现则是由TeacherServiceImpl类来完成的。
service.deleteTeacherById(teacherid);
// 调用service实际上就是TeacherServiceImpl的实例的deleteTeacherById方法将前面获取到的教师编号teacherid作为参数传入进去。这个方法应该是在数据库或者其他存储教师信息的数据源中依据传入的教师编号来查找并删除对应的教师记录以此实现删除教师的业务逻辑操作。
request.getRequestDispatcher("/teacherListServlet").forward(request, response);
// 获取一个请求转发器,把当前的请求转发到"/teacherListServlet"这个资源它可能是另一个Servlet或者是一个JSP页面等。通过这样的转发操作服务器端会接着去处理转发后的请求并向客户端返回相应的响应内容而且整个过程对于客户端来说就像是一次完整的请求响应过程客户端浏览器地址栏中的URL并不会发生改变转发后可以继续进行后续的页面展示或者其他相关业务处理例如重新展示教师列表等。
request.getRequestDispatcher("/teacherListServlet").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法该方法主要用于处理HTTP GET请求。
doPost(request, response);
// 在doGet方法中直接调用了doPost方法这意味着对于GET请求的处理逻辑和POST请求的处理逻辑是完全一样的也就是都会按照doPost方法里所定义的逻辑去进行相应的处理比如获取教师编号、删除教师以及转发请求等操作都会同样执行。
doPost(request,response);
}
}
}

@ -1,13 +1,8 @@
package web.servlet.teacher;
// 声明该类所属的包名表明这个Servlet类位于"web.servlet.teacher"包下,通过包结构对类进行组织管理,有助于清晰地划分项目中的不同功能模块,方便代码的维护与扩展。
import domain.SelectCourse;
import service.SelectCourseService;
import service.impl.SelectCourseServiceImpl;
// 导入相关的类和接口,用于处理选课相关的业务逻辑。
// "domain.SelectCourse":通常是一个领域模型类,用于封装与选课相关的各种属性,比如学生所选课程的具体信息(课程编号、学生编号等)以及对应的成绩等内容,代表了业务领域中的选课这一概念实体在代码中的体现。
// "service.SelectCourseService":这是定义了选课业务操作的服务接口,规定了可以在选课业务方面进行的各种操作方法,例如查询学生选课信息、更新选课记录等,是对选课业务逻辑抽象出来的统一操作入口。
// "service.impl.SelectCourseServiceImpl":是"SelectCourseService"接口的具体实现类,里面包含了实际与数据库或其他数据源进行交互的代码,以此来真正完成接口中定义的那些选课业务操作,比如按照特定条件查询数据库获取选课信息等具体实现细节就在这个类中。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -16,55 +11,26 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
// 导入Java EE中Servlet相关的基础类和接口以及处理输入输出异常、使用集合框架所需的类。
// "ServletException"用于处理Servlet在执行过程中出现的各种异常情况比如配置错误、业务逻辑执行出错、请求处理过程中遇到不符合预期的情况等都可以通过抛出这个异常来进行相应的处理。
// "WebServlet"是一个注解类用于将一个普通的Java类标注为Servlet并可以通过它配置该Servlet对应的访问路径等相关属性方便Web容器像Tomcat等应用服务器识别并对其进行管理和调度决定何时以及如何调用这个Servlet来处理客户端的请求。
// "HttpServlet"是所有基于HTTP协议的Servlet的基类它提供了处理HTTP请求的基础架构和一系列默认方法开发人员通过重写它里面的特定方法如doGet、doPost等来实现具体的业务逻辑以应对不同类型的HTTP请求。
// "HttpServletRequest"主要用于获取客户端发送过来的HTTP请求中包含的各种详细信息例如请求参数通过类似getParameter方法获取表单提交的数据等、请求头信息如浏览器相关的一些标识信息等以及其他和请求相关的内容是在Servlet中处理请求数据的关键入口。
// "HttpServletResponse"负责向客户端发送HTTP响应包括设置响应的状态码比如200表示成功、404表示未找到资源等、响应头设置如内容类型、缓存控制等相关的头部信息以及返回具体的响应内容如HTML页面、JSON数据等用于构建完整的返回给客户端的信息。
// "IOException":用于处理输入输出相关的异常情况,例如在读取或写入文件、进行网络传输(像从数据库获取数据或者向客户端发送响应数据等涉及到数据传输的操作)等过程中如果出现问题,就会抛出这个异常,方便进行相应的错误处理。
// "List"是Java集合框架中的接口表示一个有序的、可包含重复元素的集合在这里用于存放查询出来的多个选课相关信息以SelectCourse对象的形式方便后续对这些数据进行遍历、处理以及传递给其他组件如JSP页面用于展示等
@WebServlet("/findStudentCourseScoreServlet")
// 使用@WebServlet注解将当前类标记为一个Servlet并指定这个Servlet对应的访问路径为"/findStudentCourseScoreServlet"。意味着当客户端通过浏览器等工具向服务器发起的HTTP请求的URL路径为该指定路径时Web容器服务器端负责管理Servlet的环境如Tomcat就会找到并调用这个Servlet类来处理相应的请求。
public class FindStudentCourseScoreServlet extends HttpServlet {
// 定义了一个名为"FindStudentCourseScoreServlet"的类,它继承自"HttpServlet"类这表明该类是一个专门用于处理HTTP请求的Servlet借助继承"HttpServlet"类的机制可以方便地重写其中相应的方法比如doGet、doPost等来实现具体的、与业务相关的请求处理逻辑在这个类中主要是实现查询学生课程成绩相关的业务逻辑。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写了"HttpServlet"类中的"doPost"方法此方法专门用于处理HTTP POST请求。当客户端通过POST方式例如表单提交等情况常用POST方式向服务器发送数据访问此Servlet对应的"/findStudentCourseScoreServlet"这个URL路径时Web容器会自动调用这个重写后的方法来处理相应的请求。
// 方法中的两个参数"request"和"response"分别代表客户端发送过来的请求信息以及用于向客户端返回响应信息的对象,它们在整个请求处理过程中起着关键作用,通过它们可以获取请求数据、设置响应内容等。
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8"这一步非常重要因为客户端发送过来的数据可能包含各种字符特别是如果有中文等非ASCII字符时如果不设置正确的编码在获取请求参数等数据时可能会出现乱码问题无法正确解析数据内容。通过设置为"utf-8"编码格式,能确保后续从请求中获取到的参数等数据可以按照正确的编码规范进行解析,保障数据的准确性和完整性,在这里对于获取要查询成绩的课程编号等关键信息尤为重要。
String cid = request.getParameter("cid");
// 从客户端发送的HTTP请求中获取名为"cid"的参数值,按照业务逻辑推测,这个参数值通常代表要查询成绩的课程的编号,它是后续进行查询学生该课程成绩相关操作的重要依据,将获取到的课程编号赋值给"cid"变量,方便后续在代码中使用这个变量来调用相应的业务方法进行查询操作。
System.out.println(cid);
// 将获取到的课程编号cid输出打印到控制台这一般是出于调试目的方便开发人员在运行程序时查看实际接收到的课程编号是否符合预期比如检查前端页面传递过来的参数是否正确或者在排查程序出现问题例如查询不到数据等情况通过查看这个参数值来确认是否是传入参数的问题有助于快速定位和解决问题。
SelectCourseService service = new SelectCourseServiceImpl();
// 创建一个"SelectCourseServiceImpl"类的实例,通过多态的方式将其赋值给"SelectCourseService"接口类型的变量"service"。这样做的好处是,代码后续调用"SelectCourseService"接口中定义的方法时,实际上执行的是"SelectCourseServiceImpl"类中对这些方法的具体实现代码,使得代码的结构更加灵活,便于替换不同的实现方式或者进行单元测试等操作,在这里就是为了调用选课业务相关的方法来查询学生选课及成绩信息。
List<SelectCourse> scs = service.findStudentSelectedCourseByCourseId(cid);
// 调用"service"(实际上就是"SelectCourseServiceImpl"的实例)的"findStudentSelectedCourseByCourseId"方法,将前面获取到的课程编号"cid"作为参数传入进去。这个方法应该是在数据库或者其他存储选课信息的数据源中,依据传入的课程编号来查询出选修该课程的所有学生的选课信息(这些信息会被封装到"SelectCourse"对象中,可能包含学生的学号、所选课程的具体信息以及对应的成绩等内容),并以"SelectCourse"对象组成的列表形式返回,然后将查询到的学生选课信息列表赋值给"scs"变量,方便后续对这些查询结果进行进一步的处理和展示。
for (int i = 0; i < scs.size(); i++) {
System.out.println(scs.get(i));
}
// 使用循环遍历查询到的学生选课信息列表scs通过调用"scs.get(i)"方法获取列表中的每一个"SelectCourse"对象,并将其输出打印到控制台。同样,这一步大概率也是出于调试目的,方便开发人员查看查询出来的每一条选课信息是否准确完整,例如查看学生的信息、课程信息以及成绩等是否符合预期,有助于在出现数据问题时排查是查询逻辑错误还是数据源本身数据有误等情况,进一步辅助定位和解决问题。
request.setAttribute("scs", scs);
// 使用"request"对象的"setAttribute"方法将查询到的学生选课信息列表scs保存到请求对象中设置的属性名为"scs"这样在后续将请求转发到JSP页面等操作时在目标JSP页面中就可以通过这个属性名"scs"来获取到该选课信息列表进而可以在页面中进行数据展示等相关操作例如通过JSP的标签或者脚本语言将这些选课信息以表格等形式展示给用户查看。
request.setAttribute("scs",scs);
request.getRequestDispatcher("/WEB-INF/teacher/findSelectCourseListByCourseId.jsp").forward(request,response);
request.getRequestDispatcher("/WEB-INF/teacher/findSelectCourseListByCourseId.jsp").forward(request, response);
// 获取一个请求转发器,将当前请求转发到"/WEB-INF/teacher/findSelectCourseListByCourseId.jsp"这个JSP页面通常该JSP页面会用于展示查询到的学生选课及成绩信息等相关内容可能会通过循环遍历获取到的选课信息列表然后将学生的学号、课程名、成绩等信息以合适的HTML元素展示出来。这样服务器端会接着处理转发后的请求并向客户端返回相应的JSP页面经过渲染后的内容整个过程对于客户端来说就像是一次完整的请求响应过程客户端浏览器地址栏中的URL并不会发生改变通过这种转发机制可以顺利地进行后续的页面展示操作将查询到的学生课程成绩等信息呈现给用户查看。
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写了"HttpServlet"类中的"doGet"方法此方法主要用于处理HTTP GET请求例如当客户端通过在浏览器地址栏直接输入URL或者点击链接等方式通常这些情况会发起GET请求访问此Servlet对应的路径时Web容器会调用这个方法来处理相应的请求。
doPost(request, response);
// 在"doGet"方法中直接调用了"doPost"方法这意味着对于GET请求的处理逻辑和POST请求的处理逻辑是完全一样的也就是不管客户端是通过POST方式还是GET方式访问这个Servlet对应的路径都会按照"doPost"方法里所定义的逻辑去进行相应的处理比如获取课程编号、查询选课信息、输出调试信息以及转发请求到JSP页面等操作都会同样执行这样做可能是在业务逻辑上对于这两种请求方式获取和展示学生课程成绩信息的要求是一致的所以进行了这样的复用处理。
doPost(request,response);
}
}
}

@ -1,8 +1,6 @@
package web.servlet.teacher;
// 定义该类所属的包名表明这个Servlet类位于web.servlet.teacher包下利用包结构来对类进行分类组织使项目代码结构更清晰便于区分不同功能模块对应的代码。
import domain.Teacher;
// 导入领域模型类Teacher这个类通常用于封装教师相关的各种属性比如教师编号、姓名、所属院系等信息以及可能的业务逻辑方法如果有定义的话在这里虽然暂时看不出具体使用情况但可能后续会涉及到和教师信息相关的操作。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -11,32 +9,14 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
// 导入Java EE中Servlet相关的基础类和接口用于处理Servlet相关的操作以及应对可能出现的异常情况。
// ServletException用于处理Servlet执行过程中出现的异常像业务逻辑执行出错、配置错误等引发的异常都会通过它来处理。
// WebServlet注解用于将一个普通的Java类标注为Servlet并且可以配置这个Servlet对应的访问路径等属性方便Web容器如Tomcat等服务器识别并进行管理。
// HttpServlet是所有基于HTTP协议的Servlet的基类提供了处理HTTP请求的基础结构和方法开发人员可以通过重写它里面的方法来实现具体的业务逻辑以应对不同类型的HTTP请求如GET、POST等
// HttpServletRequest用于获取客户端发送过来的HTTP请求中的各种信息例如请求参数、请求头信息等是后续在Servlet中处理请求数据的重要依据。
// HttpServletResponse用于向客户端发送HTTP响应比如设置响应状态码、响应头以及返回响应内容等以此构建完整的返回给客户端的信息。
// HttpSession用于在服务器端管理用户会话信息通过它能够实现在不同请求之间共享数据不过在这段代码里暂时没有明显体现出对会话信息的使用场景。
// IOException用于处理输入输出相关的异常像读写文件、网络传输等出现问题时会抛出该异常。
@WebServlet("/teacherInfomationServlet")
// 使用@WebServlet注解将当前类标记为一个Servlet并指定其对应的访问路径为"/teacherInfomationServlet"。当客户端通过这个特定的URL路径发起HTTP请求时Web容器如Tomcat服务器就会找到并调用这个Servlet来处理请求。
public class TeacherInfomationServlet extends HttpServlet {
// 定义了一个名为TeacherInfomationServlet的类它继承自HttpServlet类这意味着这个类是一个用于处理HTTP请求的Servlet借助继承HttpServlet类的特性可以方便地重写其中的方法来实现具体的业务逻辑在这里主要用于实现和教师信息相关的某种业务逻辑从转发的JSP页面推测可能是展示教师信息之类的功能
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法该方法主要用于处理HTTP POST请求。当客户端通过POST方式比如表单提交等情况常用POST方式向服务器发送数据访问此Servlet对应的"/teacherInfomationServlet"这个URL路径时Web容器会自动调用这个方法来处理相应的请求。
// 参数request包含了客户端发送过来的所有请求信息response则是用于向客户端返回响应信息的对象。
request.getRequestDispatcher("/WEB-INF/teacher/tInformation.jsp").forward(request, response);
// 获取一个请求转发器,将当前请求转发到"/WEB-INF/teacher/tInformation.jsp"这个JSP页面。通常这个JSP页面会用于展示教师相关的信息比如教师的个人基本信息、授课情况等具体取决于页面的实现。这样服务器端会接着处理转发后的请求并向客户端返回相应的JSP页面经过渲染后的内容整个过程对客户端来说就像是一次完整的请求响应过程客户端浏览器地址栏中的URL并不会发生改变通过转发请求可以进行后续的页面展示等业务操作实现向用户展示教师信息的功能。
request.getRequestDispatcher("/WEB-INF/teacher/tInformation.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法该方法主要用于处理HTTP GET请求例如当客户端通过在浏览器地址栏直接输入URL或者点击链接等方式这些情况通常会发起GET请求访问此Servlet对应的路径时Web容器会调用这个方法来处理相应的请求。
doPost(request, response);
// 在doGet方法中直接调用了doPost方法这意味着对于GET请求的处理逻辑和POST请求的处理逻辑是一样的即不管客户端是通过POST方式还是GET方式访问这个Servlet对应的路径都会按照doPost方法里所定义的逻辑去进行相应的处理也就是都会将请求转发到"/WEB-INF/teacher/tInformation.jsp"这个JSP页面进行后续处理可能是因为在业务逻辑上对于这两种请求方式展示教师信息的操作是相同的所以进行了这样的复用处理。
doPost(request,response);
}
}
}

@ -1,5 +1,4 @@
package web.servlet.teacher;
// 定义该类所属的包名表明这个Servlet类位于web.servlet.teacher包下通过包名对类进行分类管理有助于在项目中清晰地组织代码结构方便区分不同功能模块对应的类。
import domain.Admin;
import domain.Student;
@ -8,14 +7,6 @@ import service.StudentService;
import service.TeacherService;
import service.impl.StudentServiceImpl;
import service.impl.TeacherServiceImpl;
// 导入不同领域模型类以及相关的服务接口和实现类。
// domain.Admin通常用于封装管理员相关的属性和业务逻辑代表了系统中管理员这一角色对应的实体信息。
// domain.Student用于封装学生相关的属性和业务逻辑包含学生的学号、姓名等各种信息是对学生这一业务实体在代码中的体现。
// domain.Teacher类似地用于封装教师相关的属性和业务逻辑比如教师的工号、姓名、授课信息等内容代表教师这一业务实体。
// service.StudentService定义了针对学生业务操作的服务接口规定了可以进行的各种学生相关业务方法例如查询学生信息、添加学生等操作的抽象方法声明。
// service.TeacherService是针对教师业务操作的服务接口明确了如查询教师信息、更新教师资料等相关业务操作的接口方法。
// service.impl.StudentServiceImpl是StudentService接口的具体实现类里面包含了与数据库或其他数据源交互来实际完成学生业务逻辑的代码比如具体的查询所有学生信息、根据学号查询某个学生等操作的实现就在这个类里。
// service.impl.TeacherServiceImpl同样是TeacherService接口的具体实现类负责实现教师业务相关操作的具体代码逻辑像这里要调用的查询所有教师信息的方法就在这个类中实现。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -25,73 +16,33 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
// 导入Java EE中Servlet相关的基础类和接口用于处理Servlet相关的操作以及可能出现的异常情况同时导入用于处理集合数据和会话相关操作的类。
// ServletException用于处理Servlet执行过程中出现的异常情况例如业务逻辑执行出错、配置错误等引发的异常都会通过它来处理。
// WebServlet注解用于将一个普通的Java类标注为Servlet并配置其相关的访问路径等属性方便Web容器如Tomcat等服务器识别并进行管理。
// HttpServlet是所有基于HTTP协议的Servlet的基类提供了处理HTTP请求的基础结构和方法开发人员可以通过重写它里面的方法来实现具体的业务逻辑以应对不同类型的HTTP请求如GET、POST等
// HttpServletRequest用于获取客户端发送过来的HTTP请求中的各种信息像请求参数、请求头信息等是后续处理请求数据的重要依据。
// HttpServletResponse用于向客户端发送HTTP响应例如设置响应状态码、响应头以及返回响应内容等用于构建返回给客户端的信息。
// HttpSession用于在服务器端管理用户会话信息通过它可以在不同的请求之间共享数据比如保存用户的登录状态、用户相关的一些临时数据等在这里用于判断当前登录用户的角色类型。
// IOException用于处理输入输出相关的异常像读写文件、网络传输等出现问题时会抛出该异常。
// List是Java集合框架中的接口表示一个有序的、可重复元素的集合这里用于存放查询出来的教师信息列表多个Teacher对象组成的列表
@WebServlet("/teacherListServlet")
// 使用@WebServlet注解将当前类标记为一个Servlet并指定其对应的访问路径为"/teacherListServlet"。当客户端通过这个URL路径发起HTTP请求时Web容器如Tomcat等就会找到并调用这个Servlet来处理请求。
public class TeacherListServlet extends HttpServlet {
// 定义一个名为TeacherListServlet的类它继承自HttpServlet类意味着这个类是一个用于处理HTTP请求的Servlet通过继承HttpServlet可以方便地重写相应方法来处理不同类型的HTTP请求如GET、POST等以实现具体的业务逻辑这里主要是实现查询教师列表并根据不同用户角色进行页面转发的业务逻辑。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法用于处理HTTP POST请求。当客户端通过POST方式访问此Servlet对应的URL路径时容器会调用这个方法来处理请求。
// 参数request包含了客户端发送过来的所有请求信息response则用于向客户端返回响应信息。
// 调用TeacherService完成查询
//调用TeacherService完成查询
TeacherService teacherService = new TeacherServiceImpl();
// 创建一个TeacherServiceImpl类的实例通过多态的方式将其赋值给TeacherService接口类型的变量teacherService。这样后续就可以调用TeacherService接口中定义的业务方法而具体的查询所有教师信息的操作实现则由TeacherServiceImpl类来完成。
List<Teacher> teachers = teacherService.findAll();
// 调用teacherService实际是TeacherServiceImpl的实例的findAll方法该方法应该是从数据库或其他存储教师信息的数据源中查询出所有教师的信息并以Teacher对象的列表形式返回将查询到的教师信息列表赋值给teachers变量以便后续使用这些数据进行页面展示等操作。
// 将list存入request域
request.setAttribute("teachers", teachers);
// 使用request对象的setAttribute方法将查询到的教师信息列表teachers保存到请求对象中设置的属性名为"teachers"这样在后续转发请求到JSP页面等操作时在目标页面中就可以通过这个属性名获取到该教师信息列表用于展示教师信息的相关操作比如在JSP页面中通过循环遍历列表展示每个教师的具体信息。
//将list存入request域
request.setAttribute("teachers",teachers);
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8"确保从客户端接收到的请求参数等数据能够按照UTF-8编码格式正确解析避免中文等特殊字符出现乱码问题保证后续获取和处理请求数据的准确性虽然在这里暂时没有明显体现出获取参数的操作但这是一个良好的编码习惯防止后续可能的扩展或者其他地方出现乱码情况。
HttpSession session = request.getSession();
// 获取当前请求对应的HttpSession对象如果不存在则创建一个新的会话对象。HttpSession用于在服务器端管理用户的会话信息在这里主要是为了获取会话中保存的当前登录用户的相关信息以此来判断用户的角色类型进而决定转发到哪个合适的页面进行教师列表展示。
Student student = (Student) session.getAttribute("student");
// 从HttpSession对象中尝试获取名为"student"的属性值并将其强制转换为Student类型该属性值通常是在用户登录成功后如果是学生角色登录保存到会话中的学生对象通过这样的获取操作可以判断当前登录用户是否是学生角色。
Admin admin = (Admin) session.getAttribute("admin");
// 类似地,从会话中获取名为"admin"的属性值并转换为Admin类型用于判断当前登录用户是否是管理员角色若获取到的admin对象不为null则表示当前是管理员登录状态。
Teacher teacher = (Teacher) session.getAttribute("teacher");
// 同样,从会话中获取名为"teacher"的属性值并转换为Teacher类型用于判断当前登录用户是否是教师角色若获取到的teacher对象不为null则说明当前是教师登录状态。
if (student!= null && admin == null && teacher == null) {
// 判断如果从会话中获取到的学生对象不为null同时管理员对象和教师对象都为null即当前登录用户是学生角色那么执行以下逻辑。
Student student= (Student)session.getAttribute("student");
Admin admin= (Admin)session.getAttribute("admin");
Teacher teacher= (Teacher)session.getAttribute("teacher");
if (student != null && admin == null && teacher == null) {
request.getRequestDispatcher("/WEB-INF/student/sFindTeacherList.jsp").forward(request, response);
// 获取一个请求转发器,将当前请求转发到"/WEB-INF/student/sFindTeacherList.jsp"这个JSP页面该页面应该是专门为学生角色设计的用于展示教师列表信息的页面服务器端会接着处理转发后的请求并向客户端返回相应的JSP页面经过渲染后的内容整个过程对客户端来说是一次完整的请求响应过程客户端浏览器地址栏中的URL不会发生改变。
} else if (admin!= null && student == null && teacher == null) {
// 如果管理员对象不为null而学生对象和教师对象都为null即当前登录用户是管理员角色则执行以下转发操作。
} else if (admin != null && student == null && teacher == null) {
request.getRequestDispatcher("/WEB-INF/admin/aFindTeacherList.jsp").forward(request, response);
// 将请求转发到"/WEB-INF/admin/aFindTeacherList.jsp"这个JSP页面这大概率是为管理员设计的用于展示教师列表的页面方便管理员进行相应的管理操作等查看教师信息。
} else if (teacher!= null && admin == null && student == null) {
// 若教师对象不为null管理员对象和学生对象都为null也就是当前登录用户是教师角色执行如下转发操作。
} else if (teacher != null && admin == null && student == null) {
request.getRequestDispatcher("/WEB-INF/teacher/tFindTeacherList.jsp").forward(request, response);
// 把请求转发到"/WEB-INF/teacher/tFindTeacherList.jsp"这个JSP页面此页面应该是适合教师查看教师列表信息的页面可能会展示一些与教师自身相关视角下的教师信息内容。
} else {
request.getRequestDispatcher("error.jsp").forward(request, response);
// 如果以上几种判断条件都不满足,说明可能出现了不符合预期的会话状态或者用户角色情况,此时将请求转发到"error.jsp"页面,该页面通常用于展示错误信息,提示用户出现了未知的系统状态等问题。
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法用于处理HTTP GET请求。
this.doPost(request, response);
// 在doGet方法中直接调用了doPost方法意味着对于GET请求的处理逻辑和POST请求的处理逻辑是一样的即都会按照doPost方法中的逻辑进行处理比如查询教师列表、判断用户角色以及根据角色转发请求到相应的JSP页面等操作。
this.doPost(request,response);
}
}
}

@ -1,5 +1,4 @@
package web.servlet.teacher;
// 定义该类所属的包名表明这个Servlet类位于“web.servlet.teacher”包下通过包结构对类进行分类管理使项目代码的组织结构更加清晰便于区分不同功能模块对应的代码所在位置。
import domain.Course;
import domain.Student;
@ -8,14 +7,6 @@ import service.StudentService;
import service.TeacherService;
import service.impl.StudentServiceImpl;
import service.impl.TeacherServiceImpl;
// 导入不同的领域模型类以及相关的服务接口与实现类,用于处理业务逻辑中涉及到的数据和操作。
// domain.Course通常用于封装课程相关的各种属性例如课程编号、课程名称、课程学分等信息以及可能的业务逻辑方法如果有针对课程对象自身的操作需求代表了业务领域里课程这一实体在代码中的体现。
// domain.Student用于封装学生相关的各种属性如学号、姓名、班级等以及对应的业务逻辑是对学生这个业务实体在代码层面的抽象表示不过在当前这个Servlet中从代码逻辑来看对学生相关操作体现并不明显可能只是整体项目结构中涉及到的相关领域类导入。
// domain.Teacher类似地用于封装教师相关的所有属性像教师编号、姓名、所在院系等信息和业务逻辑在这个Servlet里会用于获取当前登录教师的信息以及后续和教师相关的业务操作关联。
// service.StudentService定义了针对学生业务操作的服务接口规定了可以进行的各种学生相关业务操作的抽象方法例如查询学生信息、添加学生、修改学生资料等方法声明虽然此处不一定直接使用但可能是项目中整体服务层接口的一部分被引入进来。
// service.TeacherService是专门针对教师业务操作所定义的服务接口明确了像查询教师授课课程、更新教师信息等与教师业务相关的各种操作方法为后续调用具体业务逻辑提供统一的接口规范。
// service.impl.StudentServiceImpl是StudentService接口的具体实现类里面包含了与数据库或其他数据源进行实际交互的代码以此来真正完成StudentService接口中定义的那些学生业务逻辑操作比如具体的从数据库查询学生信息、往数据库插入新学生记录等实现细节都在这个类里不过在此Servlet中暂时未直接调用其方法。
// service.impl.TeacherServiceImpl同样它是TeacherService接口的具体实现类负责实现教师业务相关操作的具体代码逻辑例如这里要调用的根据教师编号查询该教师可选课程的方法就在这个类中进行具体实现。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -25,58 +16,25 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
// 导入Java EE中Servlet相关的基础类和接口用于处理Servlet相关的操作以及应对可能出现的异常情况同时导入用于处理集合数据类型和会话相关操作的类。
// ServletException用于处理Servlet在执行过程中出现的各种异常情况比如业务逻辑执行出错、配置错误、请求处理不符合预期等情况引发的异常都会通过这个类来处理方便进行统一的异常管理和错误提示。
// WebServlet是一个注解类通过它可以将一个普通的Java类标注为Servlet并配置该Servlet对应的访问路径等相关属性方便Web容器像Tomcat等应用服务器能够识别并对其进行合适的管理与调度决定何时以及如何调用这个Servlet来处理客户端的请求。
// HttpServlet是所有基于HTTP协议的Servlet的基类它提供了处理HTTP请求的基础架构和一系列默认的方法开发人员通过重写它里面特定的方法如doGet、doPost等来实现具体的业务逻辑以应对不同类型的HTTP请求。
// HttpServletRequest主要用于获取客户端发送过来的HTTP请求中包含的各种详细信息例如通过相关方法获取请求参数像表单提交的数据等、请求头信息如浏览器相关的一些标识、请求的一些元数据等以及其他和请求相关的内容是在Servlet中处理请求数据的关键入口。
// HttpServletResponse负责向客户端发送HTTP响应包括设置响应的状态码比如常见的200表示成功、404表示未找到资源等、响应头例如设置响应内容的类型、缓存控制相关的信息等以及返回具体的响应内容像HTML页面、JSON数据等以此构建完整的返回给客户端的信息。
// HttpSession用于在服务器端管理用户的会话信息通过它可以实现在不同的请求之间共享数据比如保存用户的登录状态、用户相关的一些临时数据等在这个Servlet里主要用于获取当前登录教师的对象信息以判断登录状态以及后续基于教师身份进行相关业务操作。
// IOException用于处理输入输出相关的异常情况例如在读取或写入文件、进行网络传输像从数据库获取数据或者向客户端发送响应数据等涉及到数据传输的操作过程中如果出现问题就会抛出这个异常方便进行相应的错误处理和恢复机制实现。
// List是Java集合框架中的接口表示一个有序的、可包含重复元素的集合在这里用于存放查询出来的课程相关信息以Course对象的形式方便后续对这些数据进行遍历、展示或者其他相关的业务处理操作。
@WebServlet("/teacherOptionalCourseServlet")
// 使用@WebServlet注解将当前类标记为一个Servlet并指定这个Servlet对应的访问路径为“/teacherOptionalCourseServlet”。这意味着当客户端通过浏览器等工具向服务器发起的HTTP请求的URL路径为该指定路径时Web容器服务器端负责管理Servlet的环境如Tomcat就会找到并调用这个Servlet类来处理相应的请求。
public class TeacherOptionalCourseServlet extends HttpServlet {
// 定义了一个名为TeacherOptionalCourseServlet的类它继承自HttpServlet类这表明该类是一个专门用于处理HTTP请求的Servlet借助继承HttpServlet类的机制可以方便地重写其中相应的方法比如doGet、doPost等来实现具体的、与业务相关的请求处理逻辑在这个类中主要是实现与教师可选课程相关的业务逻辑例如查询并展示教师能够选择教授的课程信息等。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写了HttpServlet类中的doPost方法此方法专门用于处理HTTP POST请求。当客户端通过POST方式例如表单提交等情况常用POST方式向服务器发送数据访问此Servlet对应的“/teacherOptionalCourseServlet”这个URL路径时Web容器会自动调用这个重写后的方法来处理相应的请求。
// 方法中的两个参数“request”和“response”分别代表客户端发送过来的请求信息以及用于向客户端返回响应信息的对象它们在整个请求处理过程中起着关键作用通过它们可以获取请求数据、设置响应内容等。
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为“utf-8”这是非常重要的一步操作因为客户端发送过来的数据可能包含各种字符特别是如果存在中文等非ASCII字符时若不设置正确的编码在获取请求参数等数据时可能会出现乱码问题导致无法正确解析数据内容。通过将编码格式设置为“utf-8”能确保后续从请求中获取到的参数等数据可以按照正确的编码规范进行解析保障数据的准确性和完整性在这里对于后续可能涉及到的各种参数获取以及业务操作都有重要意义。
HttpSession session = request.getSession();
// 获取当前请求对应的HttpSession对象如果不存在则创建一个新的会话对象。HttpSession在服务器端用于管理用户的会话信息在这里主要是为了从会话中获取当前登录教师的相关信息以此来确定登录状态以及进行后续基于教师身份的业务操作例如获取教师编号来查询其可选课程等。
Teacher t = (Teacher) session.getAttribute("teacher");
// 从HttpSession对象中尝试获取名为“teacher”的属性值并将其强制转换为Teacher类型。通常情况下在用户这里指教师登录成功后会将教师对象保存到会话中对应的属性名为“teacher”通过这样的获取操作可以得到当前登录教师的对象信息后续就能基于这个对象进行相关业务逻辑操作比如获取教师编号去查询该教师可教授的课程等。
if (t!= null) {
// 判断获取到的教师对象t是否不为null即判断当前是否有教师登录如果有教师登录才执行下面的业务逻辑操作若为null则可能表示没有合法登录的教师就不会进行后续的课程查询和页面展示等操作。
// 调用StudentService完成查询
if (t != null) {
//调用StudentService完成查询
TeacherService service = new TeacherServiceImpl();
// 创建一个TeacherServiceImpl类的实例通过多态的方式将其赋值给TeacherService接口类型的变量“service”。这样做的好处是代码后续调用TeacherService接口中定义的方法时实际上执行的是TeacherServiceImpl类中对这些方法的具体实现代码使得代码结构更加灵活便于替换不同的实现方式或者进行单元测试等操作在这里就是为了调用教师业务相关的方法来查询教师可选课程信息。
List<Course> optionalcourses = service.findMySelfOptionalCourse(t.getT_id());
// 调用“service”实际上就是TeacherServiceImpl的实例的“findMySelfOptionalCourse”方法将前面获取到的教师对象t的教师编号通过t.getT_id()方法获取作为参数传入进去。这个方法应该是在数据库或者其他存储课程信息的数据源中依据传入的教师编号来查询出该教师能够选择教授的所有课程信息并以Course对象组成的列表形式返回然后将查询到的可选课程信息列表赋值给“optionalcourses”变量方便后续对这些查询结果进行进一步的处理和展示操作比如在页面上展示课程列表供教师查看选择等。
// 将list存入request域
request.setAttribute("optionalcourses", optionalcourses);
// 使用“request”对象的“setAttribute”方法将查询到的可选课程信息列表optionalcourses保存到请求对象中设置的属性名为“optionalcourses”这样在后续将请求转发到JSP页面等操作时在目标JSP页面中就可以通过这个属性名“optionalcourses”来获取到该课程列表信息进而可以在页面中进行数据展示等相关操作例如通过循环遍历课程列表将每个课程的名称、编号等信息以合适的HTML元素展示出来给教师查看。
// 转发到list.jsp
request.getRequestDispatcher("/WEB-INF/teacher/teacherOptionalCourse.jsp").forward(request, response);
// 获取一个请求转发器,将当前请求转发到“/WEB-INF/teacher/teacherOptionalCourse.jsp”这个JSP页面通常该JSP页面会用于展示教师可选课程的相关信息可能会通过循环遍历获取到的课程列表然后将课程名、课程编号、课程学分等信息以合适的方式展示出来方便教师进行查看和后续操作。这样服务器端会接着处理转发后的请求并向客户端返回相应的JSP页面经过渲染后的内容整个过程对于客户端来说就像是一次完整的请求响应过程客户端浏览器地址栏中的URL并不会发生改变通过这种转发机制可以顺利地进行后续的页面展示操作将教师可选课程信息呈现给教师查看。
//将list存入request域
request.setAttribute("optionalcourses",optionalcourses);
//转发到list.jsp
request.getRequestDispatcher("/WEB-INF/teacher/teacherOptionalCourse.jsp").forward(request,response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写了HttpServlet类中的doGet方法此方法主要用于处理HTTP GET请求例如当客户端通过在浏览器地址栏直接输入URL或者点击链接等方式通常这些情况会发起GET请求访问此Servlet对应的路径时Web容器会调用这个方法来处理相应的请求。
this.doPost(request, response);
// 在“doGet”方法中直接调用了“doPost”方法这意味着对于GET请求的处理逻辑和POST请求的处理逻辑是完全一样的也就是不管客户端是通过POST方式还是GET方式访问这个Servlet对应的路径都会按照“doPost”方法里所定义的逻辑去进行相应的处理比如设置请求编码、获取教师登录信息、查询教师可选课程、将课程列表保存到请求对象以及转发请求到JSP页面等操作都会同样执行这样做可能是在业务逻辑上对于这两种请求方式获取和展示教师可选课程信息的要求是一致的所以进行了这样的复用处理。
this.doPost(request,response);
}
}
}

@ -1,15 +1,9 @@
package web.servlet.teacher;
// 定义该类所属的包名表明这个Servlet类位于web.servlet.teacher包下通过包来对类进行分类管理使项目的代码结构更加清晰便于区分不同功能模块对应的类。
import domain.Course;
import domain.Teacher;
import service.TeacherService;
import service.impl.TeacherServiceImpl;
// 导入与课程Course、教师Teacher相关的领域模型类以及教师业务逻辑对应的服务接口TeacherService和该接口的具体实现类TeacherServiceImpl
// domain.Course类通常用于封装课程相关的各种属性比如课程编号、课程名称、课程介绍等信息代表了业务领域中课程这一实体在代码中的体现方便对课程数据进行操作和传递。
// domain.Teacher类用于封装教师相关的属性和业务逻辑虽然在此处可能没有直接对教师对象进行过多复杂操作但在整个业务场景中可能与教师操作课程等相关联。
// service.TeacherService接口定义了针对教师业务操作中与课程相关此处主要涉及课程更新相关操作的抽象方法为具体业务逻辑的调用提供了统一的规范。
// service.impl.TeacherServiceImpl类则是TeacherService接口的具体实现包含了与数据库或其他数据源交互来实际完成更新课程信息等业务逻辑的代码。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -19,79 +13,41 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Date;
// 导入Java EE中Servlet相关的基础类和接口用于处理Servlet相关的操作以及可能出现的异常情况同时导入用于处理日期格式化相关的类。
// ServletException用于处理Servlet执行过程中出现的异常情况例如业务逻辑执行出错、配置错误等引发的异常都会通过它来处理。
// WebServlet注解用于将一个普通的Java类标注为Servlet并配置其相关的访问路径等属性方便Web容器如Tomcat等服务器识别并进行管理。
// HttpServlet是所有基于HTTP协议的Servlet的基类提供了处理HTTP请求的基础结构和方法开发人员可以通过重写它里面的方法来实现具体的业务逻辑以应对不同类型的HTTP请求如GET、POST等
// HttpServletRequest用于获取客户端发送过来的HTTP请求中的各种信息像请求参数、请求头信息等是后续处理请求数据的重要依据。
// HttpServletResponse用于向客户端发送HTTP响应例如设置响应状态码、响应头以及返回响应内容等用于构建返回给客户端的信息。
// HttpSession用于在服务器端管理用户会话信息通过它可以在不同的请求之间共享数据不过在这段代码里暂时没有明显体现出复杂的会话信息使用场景可能只是用于后续扩展等情况。
// IOException用于处理输入输出相关的异常像读写文件、网络传输等出现问题时会抛出该异常。
// Date类用于获取当前的日期和时间信息在这里主要是用于在给用户的提示信息中添加操作时间方便用户知晓操作完成的时间情况。
@WebServlet("/teacherOptionalCourseUpdateServlet")
// 使用@WebServlet注解将当前类标记为一个Servlet并指定其对应的访问路径为"/teacherOptionalCourseUpdateServlet"。当客户端通过这个URL路径发起HTTP请求时Web容器如Tomcat等就会找到并调用这个Servlet来处理请求。
public class TeacherOptionalCourseUpdateServlet extends HttpServlet {
// 定义一个名为TeacherOptionalCourseUpdateServlet的类它继承自HttpServlet类意味着这个类是一个用于处理HTTP请求的Servlet通过继承HttpServlet可以方便地重写相应方法来处理不同类型的HTTP请求如GET、POST等以实现具体的业务逻辑这里主要是实现更新教师可选课程信息的业务逻辑。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法用于处理HTTP POST请求。当客户端通过POST方式访问此Servlet对应的URL路径时容器会调用这个方法来处理请求。
// 参数request包含了客户端发送过来的所有请求信息response则用于向客户端返回响应信息。
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8"确保从客户端接收到的请求参数等数据能够按照UTF-8编码格式正确解析避免中文等特殊字符出现乱码问题保证后续获取和处理请求数据的准确性特别是这里要获取课程相关参数防止乱码很重要。
String cid = request.getParameter("cid");
// 从客户端发送的HTTP请求中获取名为"cid"的参数值按照业务逻辑推测这个参数值通常代表要更新的课程的编号将获取到的课程编号赋值给cid变量以便后续根据这个编号进行课程信息更新等操作。
String cid =request.getParameter("cid");
// 保存输入内容
//保存输入内容
String name = request.getParameter("course-name");
// 从请求中获取名为"course-name"的参数值该值对应要更新的课程的名称信息将其赋值给name变量用于后续封装到课程对象中以更新课程在数据库等数据源中的名称信息。
String info = request.getParameter("course-info");
// 同样,从请求中获取名为"course-info"的参数值这个值代表要更新的课程的详细介绍等相关信息赋值给info变量准备后续封装进课程对象用于更新课程的详细信息。
Course updateCourse = new Course();
// 创建一个Course类的实例updateCourse用于封装要更新的课程的相关信息后续会将从请求中获取到的课程编号、名称、详细信息等设置到这个对象中再通过业务层方法将更新后的课程对象保存到数据库等数据源中。
// 判断输入位数是否大于数据库位数
//判断输入位数是否大于数据库位数
if (cid.contains("<") || name.contains("<") || info.contains("<")) {
// 检查获取到的课程编号cid、课程名称name、课程信息info中是否包含字符"<"这里可能是基于安全或数据格式的考虑防止输入的内容不符合数据库字段存储要求或者存在潜在的安全风险比如SQL注入攻击等情况虽然简单的这种判断不能完全杜绝但能做一定程度防范如果包含则认为格式错误。
request.setAttribute("update_msg", "格式错误,请重新提交!" + String.format("%tT", new Date()));
// 使用request对象的setAttribute方法设置一个名为"update_msg"的属性属性值是提示用户格式错误的信息并拼接上当前的时间通过String.format结合%tT格式化Date对象得到具体的时间格式字符串方便用户知晓出现格式错误的时间情况以及提示重新提交。
request.getRequestDispatcher("updateTeacherOptionalCourseServlet?cid=" + cid).forward(request, response);
// 获取一个请求转发器,将当前请求转发到"updateTeacherOptionalCourseServlet"这个资源可能是另一个Servlet或者JSP页面等同时带上获取到的课程编号cid作为参数通过URL拼接的方式传递参数这样服务器端会接着处理转发后的请求并向客户端返回相应的响应内容整个过程对客户端来说是一次完整的请求响应过程地址栏中的URL会根据转发情况发生相应改变转发后可以继续后续的页面展示或者重新输入等操作。
} else {
// 封装学生对象(此处应为封装课程对象,可能是注释的小失误)
request.setAttribute("update_msg","格式错误,请重新提交!"+String.format("%tT",new Date()));
request.getRequestDispatcher("updateTeacherOptionalCourseServlet?cid="+cid).forward(request, response);
}else {
//封装学生对象
updateCourse.setC_id(cid);
// 通过调用Course类的setC_id方法将前面获取到的课程编号设置到updateCourse对象中确保更新的课程具有正确的编号信息与数据库中要更新的记录对应起来。
updateCourse.setC_name(name);
// 将获取到的课程名称设置到updateCourse对象中用于更新课程在数据库中的名称信息。
updateCourse.setC_info(info);
// 把获取到的课程详细信息设置到updateCourse对象中完成课程对象的信息封装准备进行更新操作。
// 调用studentUpdata服务此处应为调用TeacherService服务可能是注释书写错误
TeacherService service = new TeacherServiceImpl();
// 创建一个TeacherServiceImpl类的实例通过多态的方式将其赋值给TeacherService接口类型的变量service。这样后续就可以调用TeacherService接口中定义的业务方法而具体的更新课程信息的操作实现则由TeacherServiceImpl类来完成。
//调用studentUpdata服务
TeacherService service= new TeacherServiceImpl();
service.updateCourseInfo(updateCourse);
// 调用service实际是TeacherServiceImpl的实例的updateCourseInfo方法将封装好的包含更新后信息的课程对象updateCourse传入该方法应该是在数据库或其他存储课程信息的数据源中根据课程对象中的信息编号、名称、详细信息等来更新对应的课程记录实现课程信息的更新业务逻辑操作。
// 成功则返回并给提示
request.setAttribute("update_msg", "修改成功!" + String.format("%tT", new Date()));
// 设置名为"update_msg"的属性,属性值为修改成功的提示信息,并拼接当前时间,方便用户知晓操作完成且成功的时间情况。
request.getRequestDispatcher("updateTeacherOptionalCourseServlet?cid=" + cid).forward(request, response);
// 同样获取请求转发器,将请求转发到"updateTeacherOptionalCourseServlet"资源并带上课程编号cid作为参数进行后续的页面展示或者其他相关业务处理告知用户修改成功并可以进行后续查看等操作。
//成功则返回并给提示
request.setAttribute("update_msg", "修改成功!"+String.format("%tT",new Date()));
request.getRequestDispatcher("updateTeacherOptionalCourseServlet?cid="+cid).forward(request, response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法用于处理HTTP GET请求。
doPost(request, response);
// 在doGet方法中直接调用了doPost方法意味着对于GET请求的处理逻辑和POST请求的处理逻辑是一样的即都会按照doPost方法中的逻辑进行处理比如获取课程相关参数、判断格式、封装课程对象、更新课程信息以及转发请求等操作。
doPost(request,response);
}
}
}

@ -1,5 +1,4 @@
package web.servlet.teacher;
// 定义该类所属的包名表明这个Servlet类位于“web.servlet.teacher”包下通过包名对类进行分类管理有助于在项目中清晰地组织代码结构方便区分不同功能模块对应的类。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -7,31 +6,14 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// 导入Java EE中Servlet相关的基础类和接口用于处理Servlet相关的操作以及可能出现的异常情况。
// ServletException用于处理Servlet执行过程中出现的异常情况例如业务逻辑执行出错、配置错误等引发的异常都会通过它来处理。
// WebServlet注解用于将一个普通的Java类标注为Servlet并配置其相关的访问路径等属性方便Web容器如Tomcat等服务器识别并进行管理。
// HttpServlet是所有基于HTTP协议的Servlet的基类提供了处理HTTP请求的基础结构和方法开发人员可以通过重写它里面的方法来实现具体的业务逻辑以应对不同类型的HTTP请求如GET、POST等
// HttpServletRequest用于获取客户端发送过来的HTTP请求中的各种信息像请求参数、请求头信息等是后续处理请求数据的重要依据。
// HttpServletResponse用于向客户端发送HTTP响应例如设置响应状态码、响应头以及返回响应内容等用于构建返回给客户端的信息。
// IOException用于处理输入输出相关的异常像读写文件、网络传输等出现问题时会抛出该异常。
@WebServlet("/teacherPasswordIndexServlet")
// 使用@WebServlet注解将当前类标记为一个Servlet并指定其对应的访问路径为“/teacherPasswordIndexServlet”。当客户端通过这个URL路径发起HTTP请求时Web容器如Tomcat等就会找到并调用这个Servlet来处理请求。
public class TeacherPasswordIndexServlet extends HttpServlet {
// 定义一个名为TeacherPasswordIndexServlet的类它继承自HttpServlet类意味着这个类是一个用于处理HTTP请求的Servlet通过继承HttpServlet可以方便地重写相应方法来处理不同类型的HTTP请求如GET、POST等以实现具体的业务逻辑这里主要是实现与教师更新密码相关的页面跳转逻辑从转发的JSP页面推测
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法用于处理HTTP POST请求。当客户端通过POST方式比如表单提交等情况常用POST方式向服务器发送数据访问此Servlet对应的“/teacherPasswordIndexServlet”这个URL路径时Web容器会自动调用这个方法来处理相应的请求。
// 参数request包含了客户端发送过来的所有请求信息response则是用于向客户端返回响应信息的对象。
request.getRequestDispatcher("/WEB-INF/teacher/teacherUpdatePassword.jsp").forward(request, response);
// 获取一个请求转发器,将当前请求转发到“/WEB-INF/teacher/teacherUpdatePassword.jsp”这个JSP页面。通常这个JSP页面会用于展示教师更新密码的相关表单等内容例如输入旧密码、新密码的输入框等方便教师进行密码更新操作。这样服务器端会接着处理转发后的请求并向客户端返回相应的JSP页面经过渲染后的内容整个过程对客户端来说是一次完整的请求响应过程客户端浏览器地址栏中的URL并不会发生改变通过转发请求可以进行后续的页面展示等业务操作引导教师进入密码更新页面。
request.getRequestDispatcher("/WEB-INF/teacher/teacherUpdatePassword.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法该方法主要用于处理HTTP GET请求例如当客户端通过在浏览器地址栏直接输入URL或者点击链接等方式这些情况通常会发起GET请求访问此Servlet对应的路径时Web容器会调用这个方法来处理相应的请求。
doPost(request, response);
// 在doGet方法中直接调用了doPost方法这意味着对于GET请求的处理逻辑和POST请求的处理逻辑是一样的即不管客户端是通过POST方式还是GET方式访问这个Servlet对应的路径都会按照doPost方法里所定义的逻辑去进行相应的处理也就是都会将请求转发到“/WEB-INF/teacher/teacherUpdatePassword.jsp”这个JSP页面进行后续处理可能是因为在业务逻辑上对于这两种请求方式进入教师密码更新页面的操作是相同的所以进行了这样的复用处理。
doPost(request,response);
}
}
}

@ -1,19 +1,11 @@
package web.servlet.teacher;
// 定义该类所属的包名表明这个Servlet类位于web.servlet.teacher包下通过包结构对类进行分类管理使项目代码更有条理便于区分不同功能模块对应的代码。
import domain.Student;
import domain.Teacher;
// 导入领域模型类Student和TeacherStudent类通常用于封装学生相关的属性如学号、姓名、班级等和业务逻辑Teacher类用于封装教师相关的属性如教师编号、姓名、所在院系等以及业务逻辑虽然此处主要围绕教师密码更新操作但可能是整体项目结构中涉及到相关领域类的统一导入。
import service.StudentService;
import service.TeacherService;
import service.impl.StudentServiceImpl;
import service.impl.TeacherServiceImpl;
// 导入学生和教师相关业务逻辑的服务接口及对应的具体实现类。
// StudentService定义了针对学生业务操作的抽象方法例如查询学生信息、更新学生资料等相关操作的接口声明。
// TeacherService是针对教师业务操作的服务接口明确了如更新教师密码、查询教师信息等与教师业务相关的各种操作方法。
// StudentServiceImpl是StudentService接口的具体实现类包含了与数据库或其他数据源交互来实际完成学生业务逻辑的代码不过在此处主要处理教师业务逻辑该类暂时未直接使用。
// TeacherServiceImpl则是TeacherService接口的具体实现类负责实现教师业务相关操作的具体代码逻辑像更新教师密码、根据教师编号查询教师等操作的具体实现就在这个类中。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -23,91 +15,41 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Date;
// 导入Java EE中Servlet相关的基础类和接口用于处理Servlet相关的操作以及应对可能出现的异常情况同时导入用于获取当前日期时间信息的Date类用于在提示信息中添加时间戳等操作。
// ServletException用于处理Servlet执行过程中出现的异常情况像业务逻辑执行出错、配置错误等引发的异常都会通过它来处理。
// WebServlet注解用于将一个普通的Java类标注为Servlet并配置其相关的访问路径等属性方便Web容器如Tomcat等服务器识别并进行管理。
// HttpServlet是所有基于HTTP协议的Servlet的基类提供了处理HTTP请求的基础结构和方法开发人员通过重写它里面的方法来实现具体的业务逻辑以应对不同类型的HTTP请求如GET、POST等
// HttpServletRequest用于获取客户端发送过来的HTTP请求中的各种信息例如请求参数像表单提交的数据等、请求头信息等是后续处理请求数据的重要依据。
// HttpServletResponse用于向客户端发送HTTP响应比如设置响应状态码、响应头以及返回响应内容等以此构建完整的返回给客户端的信息。
// HttpSession用于在服务器端管理用户会话信息通过它可以在不同的请求之间共享数据在这里主要用于获取当前登录教师的信息以及更新登录教师信息后重新保存到会话中保持登录状态等操作。
// IOException用于处理输入输出相关的异常像读写文件、网络传输等出现问题时会抛出该异常。
// Date类用于获取当前的日期和时间方便在给用户反馈的提示信息中添加具体的操作时间让用户知晓操作完成的时间情况。
@WebServlet("/teacherPasswordUpdateServlet")
// 使用@WebServlet注解将当前类标记为一个Servlet并指定其对应的访问路径为"/teacherPasswordUpdateServlet"。当客户端通过这个URL路径发起HTTP请求时Web容器如Tomcat等就会找到并调用这个Servlet来处理请求。
public class TeacherPasswordUpdateServlet extends HttpServlet {
// 定义一个名为TeacherPasswordUpdateServlet的类它继承自HttpServlet类意味着这个类是一个用于处理HTTP请求的Servlet通过继承HttpServlet可以方便地重写相应方法来处理不同类型的HTTP请求如GET、POST等以实现具体的业务逻辑这里主要是实现教师更新密码的相关业务逻辑。
protected void doPost(HttpServletRequest request, HttpServletRequest response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法用于处理HTTP POST请求。当客户端通过POST方式例如通过表单提交密码修改相关信息等情况常用POST方式向服务器发送数据访问此Servlet对应的"/teacherPasswordUpdateServlet"这个URL路径时Web容器会自动调用这个方法来处理相应的请求。
// 方法中的两个参数request和response分别用于获取客户端发送过来的所有请求信息以及向客户端返回响应信息。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8"确保从客户端接收到的请求参数等数据能够按照UTF-8编码格式正确解析避免中文等特殊字符出现乱码问题保证后续获取和处理请求数据的准确性特别是在获取新密码等文本信息时防止乱码很关键。
HttpSession session = request.getSession();
// 获取当前请求对应的HttpSession对象如果不存在则创建一个新的会话对象。HttpSession在服务器端用于管理用户的会话信息在这里主要是为了获取当前登录教师的对象信息以便后续基于该教师信息进行密码更新等相关操作。
Teacher teacher = (Teacher) session.getAttribute("teacher");
// 从HttpSession对象中尝试获取名为"teacher"的属性值并将其强制转换为Teacher类型。通常在教师登录成功后会将教师对象保存到会话中对应的属性名为"teacher",通过这样的获取操作就能得到当前登录教师的对象实例,后续利用这个对象来获取教师编号等信息进行密码更新操作。
Teacher teacher = (Teacher)session.getAttribute("teacher");
String teacherid = teacher.getT_id();
// 通过调用Teacher类的getT_id方法从获取到的教师对象teacher中获取教师编号信息并赋值给teacherid变量该教师编号将作为后续更新密码操作时识别具体教师记录的重要依据用于准确更新对应教师的密码。
String newpassword = request.getParameter("teacher-newpassword");
// 从客户端发送的HTTP请求中获取名为"teacher-newpassword"的参数值这个参数值代表教师输入的新密码信息将其赋值给newpassword变量用于后续对新密码格式的验证以及实际的密码更新操作。
String ennewpassword = request.getParameter("teacher-ennewpassword");
// 同样,从请求中获取名为"teacher-ennewpassword"的参数值该值对应教师再次输入用于确认的新密码信息赋值给ennewpassword变量后续会将其和前面获取的新密码进行比对以确保两次输入的密码一致。
String regex = "^[\\w]{3,12}$";
// 定义一个正则表达式字符串regex用于验证密码格式是否符合要求。这里的正则表达式表示密码必须由3到12位的字母、数字或下划线组成用于限制用户输入的新密码格式在合理范围内提高安全性。
boolean flag = newpassword.matches(regex);
// 使用String类的matches方法将获取到的新密码newpassword与定义好的正则表达式regex进行匹配返回的结果true或false赋值给flag变量用于判断新密码的格式是否正确。
if (!flag) {
// 如果flag为false即新密码格式不符合定义的正则表达式要求说明密码格式错误。
request.setAttribute("update_msg", "密码格式错误,重新提交!" + String.format("%tT", new Date()));
// 使用request对象的setAttribute方法设置一个名为"update_msg"的属性属性值是提示用户密码格式错误并告知需要重新提交的信息同时通过String.format结合%tT格式化Date对象将当前的时间信息添加到提示信息中方便用户知晓出现格式错误的时间情况以及提示重新操作。
request.setAttribute("update_msg", "密码格式错误,重新提交!"+String.format("%tT",new Date()));
request.getRequestDispatcher("/WEB-INF/teacher/teacherUpdatePassword.jsp").forward(request, response);
// 获取一个请求转发器,将当前请求转发到"/WEB-INF/teacher/teacherUpdatePassword.jsp"这个JSP页面通常该页面是用于展示教师更新密码的表单界面这样服务器端会接着处理转发后的请求并向客户端返回相应的JSP页面经过渲染后的内容整个过程对客户端来说是一次完整的请求响应过程客户端浏览器地址栏中的URL并不会发生改变通过转发请求可以引导用户回到密码更新页面重新输入密码。
} else if (!newpassword.equals(ennewpassword)) {
// 如果新密码格式正确但是新密码和确认密码不一致通过equals方法进行比对则执行以下逻辑。
request.setAttribute("update_msg", "密码确认错误,请重新提交!" + String.format("%tT", new Date()));
// 同样使用request对象的setAttribute方法设置"update_msg"属性,属性值为提示用户密码确认错误并需要重新提交的信息,同时添加当前时间信息,告知用户操作时间以及重新操作的提示。
request.getRequestDispatcher("/WEB-INF/teacher/teacherUpdatePassword.jsp").forward(request, response);
// 将请求转发到"/WEB-INF/teacher/teacherUpdatePassword.jsp"页面,让用户回到密码更新页面重新进行密码输入和确认操作。
} else {
// 如果新密码格式正确且两次输入的密码一致,执行以下密码更新及后续相关操作。
TeacherService service = new TeacherServiceImpl();
// 创建一个TeacherServiceImpl类的实例通过多态的方式将其赋值给TeacherService接口类型的变量service这样后续就可以调用TeacherService接口中定义的业务方法而具体的更新教师密码的操作实现则由TeacherServiceImpl类来完成。
service.updatePassword(teacherid, newpassword);
// 调用service实际是TeacherServiceImpl的实例的updatePassword方法传入前面获取到的教师编号teacherid和新密码newpassword作为参数该方法应该是在数据库或其他存储教师信息的数据源中根据教师编号找到对应的教师记录并将密码更新为新密码实现教师密码的更新业务逻辑操作。
TeacherService service= new TeacherServiceImpl();
service.updatePassword(teacherid,newpassword);
Teacher newTeacher = service.findTeacherById(teacher);
// 调用service的findTeacherById方法传入之前获取到的原教师对象teacher该方法应该是根据教师对象中的相关标识信息可能是教师编号等去数据库等数据源中查询对应的教师记录并返回更新后的教师对象因为密码已经更新了可能数据库中返回的教师对象包含最新的信息比如更新时间等也会更新将查询到的更新后的教师对象赋值给newTeacher变量。
teacher = newTeacher;
// 将更新后的教师对象newTeacher赋值给原来的教师对象teacher这样可以保证当前代码中使用的教师对象是最新的信息比如后续如果还有基于教师对象进行的其他操作虽然这里暂时未体现更多后续操作就是基于更新后的教师信息了。
session.setAttribute("teacher", teacher);
// 使用HttpSession对象的setAttribute方法将更新后的教师对象teacher重新保存到会话中覆盖原来会话中保存的教师对象这样可以保证会话中保存的教师信息是最新的例如保持登录状态等相关信息基于最新的教师数据避免因为密码更新导致登录相关的一些验证等出现问题。
session.setAttribute("teacher",teacher);
request.setAttribute("update_msg", "修改成功!" + String.format("%tT", new Date()));
// 设置名为"update_msg"的属性,属性值为提示用户密码修改成功的信息,并通过格式化添加当前时间信息,让用户知晓操作完成且成功的时间情况。
request.getRequestDispatcher("/WEB-INF/teacher/teacherUpdatePassword.jsp").forward(request, response);
// 再次获取请求转发器,将请求转发到"/WEB-INF/teacher/teacherUpdatePassword.jsp"这个JSP页面可能是为了在页面上展示修改成功的提示信息让用户知晓密码已经成功更新或者可以继续进行其他相关操作比如可能有刷新页面重新登录等后续引导操作虽然这里代码未体现更多相关后续逻辑整个过程对客户端来说是一次完整的请求响应过程客户端浏览器地址栏中的URL不会发生改变。
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法用于处理HTTP GET请求例如当客户端通过在浏览器地址栏直接输入URL或者点击链接等方式通常这些情况会发起GET请求访问此Servlet对应的路径时Web容器会调用这个方法来处理相应的请求。
doPost(request, response);
// 在doGet方法中直接调用了doPost方法意味着对于GET请求的处理逻辑和POST请求的处理逻辑是一样的即不管客户端是通过POST方式还是GET方式访问这个Servlet对应的路径都会按照doPost方法里所定义的逻辑去进行相应的处理比如获取教师信息、验证密码格式、更新密码以及转发请求到JSP页面等操作都会同样执行这样做可能是在业务逻辑上对于这两种请求方式更新教师密码的操作要求是一致的所以进行了这样的复用处理。
doPost(request,response);
}
}
}

@ -1,29 +1,15 @@
package web.servlet.teacher;
// 定义该类所属的包名表明这个Servlet类位于web.servlet.teacher包下通过包结构对类进行分类管理使项目代码更有条理便于区分不同功能模块对应的代码。
import domain.Course;
import domain.SelectCourse;
import domain.Student;
import domain.Teacher;
// 导入不同的领域模型类,这些类通常用于封装业务相关实体的属性和业务逻辑(如果有定义)。
// domain.Course类用于封装课程相关的各种属性比如课程编号、课程名称、学分等信息代表了业务领域里课程这一实体在代码中的体现方便后续对课程相关数据进行操作和传递。
// domain.SelectCourse类大概率是用于封装学生选课相关的信息例如学生所选课程的对应关系、选课时间以及可能的成绩等信息体现了学生选课这一业务概念在代码层面的抽象。
// domain.Student类用于封装学生相关的属性像学号、姓名、班级等以及对应的业务逻辑是对学生这个业务实体在代码层面的表示会在后续涉及学生信息查询等操作中用到。
// domain.Teacher类用于封装教师相关的属性如教师编号、姓名、所在院系等以及业务逻辑虽然在此处当前的主要操作围绕课程分数修改教师相关体现不多但可能是整体项目结构中相关领域类的统一引入。
import service.CourseService;
import service.SelectCourseService;
import service.StudentService;
import service.impl.CourseServiceImpl;
import service.impl.SelectCourseServiceImpl;
import service.impl.StudentServiceImpl;
// 导入不同业务逻辑对应的服务接口以及它们的具体实现类,用于实现具体的业务操作功能。
// service.CourseService接口定义了针对课程业务操作的抽象方法例如查询课程信息、更新课程相关属性等操作的方法声明为课程相关业务逻辑调用提供统一规范。
// service.SelectCourseService接口明确了与学生选课业务相关的操作方法比如根据课程和学生信息查询选课记录、更新选课成绩等相关业务逻辑的抽象方法定义。
// service.StudentService接口规定了针对学生业务操作的各种方法像查询学生信息、更新学生资料等相关操作的接口声明便于后续调用相关学生业务功能。
// service.impl.CourseServiceImpl是CourseService接口的具体实现类里面包含了与数据库或其他数据源交互来实际完成课程业务逻辑的代码例如实现从数据库查询、更新课程信息等具体功能的代码就在这个类里。
// service.impl.SelectCourseServiceImpl是SelectCourseService接口的具体实现类负责实现学生选课业务相关操作的具体代码逻辑像根据特定条件更新选课成绩等操作就在此实现。
// service.impl.StudentServiceImpl则是StudentService接口的具体实现类包含了实现学生业务相关操作的具体代码比如按照学号等条件查询学生信息的代码逻辑就在这个类中。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -33,84 +19,36 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Date;
// 导入Java EE中Servlet相关的基础类和接口用于处理Servlet相关的操作以及应对可能出现的异常情况同时导入用于获取当前日期时间信息的Date类方便在提示信息中添加操作时间等。
// ServletException用于处理Servlet执行过程中出现的异常情况例如业务逻辑执行出错、配置错误等引发的异常都会通过它来处理。
// WebServlet注解用于将一个普通的Java类标注为Servlet并配置其相关的访问路径等属性方便Web容器如Tomcat等服务器识别并进行管理。
// HttpServlet是所有基于HTTP协议的Servlet的基类提供了处理HTTP请求的基础结构和方法开发人员通过重写它里面的方法来实现具体的业务逻辑以应对不同类型的HTTP请求如GET、POST等
// HttpServletRequest用于获取客户端发送过来的HTTP请求中的各种信息例如请求参数像表单提交的数据等、请求头信息等是后续处理请求数据的重要依据。
// HttpServletResponse用于向客户端发送HTTP响应比如设置响应状态码、响应头以及返回响应内容等以此构建完整的返回给客户端的信息。
// HttpSession用于在服务器端管理用户会话信息通过它可以在不同的请求之间共享数据不过在这段代码里暂时没有明显体现出复杂的会话信息使用场景可能只是整体项目框架下相关类的引入。
// IOException用于处理输入输出相关的异常像读写文件、网络传输等出现问题时会抛出该异常。
// Date类用于获取当前的日期和时间在这里主要是用于在给用户反馈的提示信息中添加具体的时间戳让用户知晓分数修改操作完成的时间情况。
@WebServlet("/updateOptionalCourseScoreServlet")
// 使用@WebServlet注解将当前类标记为一个Servlet并指定其对应的访问路径为"/updateOptionalCourseScoreServlet"。当客户端通过这个URL路径发起HTTP请求时Web容器如Tomcat等就会找到并调用这个Servlet来处理请求。
public class UpdateOptionalCourseScoreServlet extends HttpServlet {
// 定义一个名为UpdateOptionalCourseScoreServlet的类它继承自HttpServlet类意味着这个类是一个用于处理HTTP请求的Servlet通过继承HttpServlet可以方便地重写相应方法来处理不同类型的HTTP请求如GET、POST等以实现具体的业务逻辑这里主要是实现更新选修课程成绩的相关业务逻辑。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法用于处理HTTP POST请求。当客户端通过POST方式比如通过表单提交修改课程分数相关信息等情况常用POST方式向服务器发送数据访问此Servlet对应的"/updateOptionalCourseScoreServlet"这个URL路径时Web容器会自动调用这个方法来处理相应的请求。
// 参数request包含了客户端发送过来的所有请求信息response则是用于向客户端返回响应信息的对象。
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8"确保从客户端接收到的请求参数等数据能够按照UTF-8编码格式正确解析避免中文等特殊字符出现乱码问题保证后续获取和处理请求数据的准确性特别是在获取课程编号、学生学号、成绩等文本信息时防止乱码很关键。
String cid = request.getParameter("cid");
// 从客户端发送的HTTP请求中获取名为"cid"的参数值按照业务逻辑推测这个参数值通常代表要修改成绩的选修课程的编号将获取到的课程编号赋值给cid变量以便后续根据这个编号进行相关的课程成绩更新以及查询操作。
String sid = request.getParameter("sid");
// 同样,从请求中获取名为"sid"的参数值该值对应要修改成绩的学生的学号信息赋值给sid变量后续会基于这个学号来查找对应的学生信息以及关联的选课记录等用于准确更新该学生对应课程的成绩。
String sScore = request.getParameter("student-score");
// 从请求中获取名为"student-score"的参数值这个值就是要更新的学生在选修课程上的成绩信息赋值给sScore变量准备用于后续的成绩更新操作。
StudentService service = new StudentServiceImpl();
// 创建一个StudentServiceImpl类的实例通过多态的方式将其赋值给StudentService接口类型的变量service这样后续就可以调用StudentService接口中定义的业务方法而具体的查询学生信息等操作的实现则由StudentServiceImpl类来完成在这里是为了后续查找对应学号的学生信息做准备。
CourseService service1 = new CourseServiceImpl();
// 创建一个CourseServiceImpl类的实例赋值给CourseService接口类型的变量service1方便后续调用CourseService接口里定义的业务方法像查询课程相关信息等操作就可以通过这个变量来调用具体实现类的方法这里是为了获取对应课程信息做准备。
SelectCourseService service2 = new SelectCourseServiceImpl();
// 创建一个SelectCourseServiceImpl类的实例赋值给SelectCourseService接口类型的变量service2以便后续调用SelectCourseService接口中定义的业务方法例如根据课程编号和学生学号更新选课成绩、查询选课相关记录等操作都可以通过这个变量来调用具体实现类的方法这里先是用于更新成绩操作。
service2.upDateScoreByCidAndSid(cid, sid, sScore);
// 调用service2实际是SelectCourseServiceImpl的实例的upDateScoreByCidAndSid方法传入前面获取到的课程编号cid、学生学号sid以及要更新的成绩sScore作为参数该方法应该是在数据库或其他存储选课信息的数据源中根据课程编号和学生学号找到对应的选课记录并将成绩更新为传入的新成绩实现选修课程成绩的更新业务逻辑操作。
service2.upDateScoreByCidAndSid(cid,sid,sScore);
Student student = new Student();
// 创建一个Student类的实例student用于封装学生相关信息准备后续根据学号查询完整的学生信息虽然这里只是简单创建一个新对象后续会设置学号等关键信息去查询数据库中的对应学生记录。
student.setS_id(sid);
// 通过调用Student类的setS_id方法将前面获取到的学生学号sid设置到student对象中使得这个对象可以携带准确的学号信息去进行后续的查询操作确保查询的是对应学号的学生信息。
Student s = service.findStudentById(student);
// 调用service即StudentServiceImpl的实例的findStudentById方法传入封装了学号信息的student对象该方法会依据学生学号去数据库等数据源中查询对应的学生信息并返回完整的学生对象包含学号、姓名、班级等各种信息将查询到的学生对象赋值给s变量方便后续在页面展示或者其他相关业务操作中使用该学生的详细信息。
Course c = service1.findSelectCourseByCourseId(cid);
// 调用service1即CourseServiceImpl的实例的findSelectCourseByCourseId方法传入课程编号cid该方法会根据课程编号去查找对应的课程信息如课程名称、学分等并返回Course对象包含课程相关的各种属性信息将查询到的课程对象赋值给c变量以便后续展示课程相关详情或者其他与课程有关的业务操作使用。
SelectCourse sc = service2.findScoreByCourseIdAndStudentId(cid, sid);
// 调用service2的findScoreByCourseIdAndStudentId方法传入课程编号cid和学生学号sid该方法会依据这两个关键信息去查询对应的选课记录以及成绩等相关信息因为选课记录关联了课程和学生且成绩也是选课记录里的一部分内容返回SelectCourse对象包含选课相关的详细信息比如选课时间、成绩等将查询到的SelectCourse对象赋值给sc变量用于后续的页面展示或者其他相关处理。
request.setAttribute("s", s);
// 使用request对象的setAttribute方法将查询到的学生对象s保存到请求对象中设置的属性名为"s"这样在后续转发请求到JSP页面等操作时在目标JSP页面中就可以通过这个属性名获取到该学生对象进而可以展示学生的详细信息比如学号、姓名等内容。
SelectCourse sc = service2.findScoreByCourseIdAndStudentId(cid,sid);
request.setAttribute("c", c);
// 同样将查询到的课程对象c保存到请求对象中属性名为"c"方便在JSP页面等地方获取课程信息进行展示例如展示课程名称、学分等相关内容。
request.setAttribute("sc", sc);
// 把查询到的SelectCourse对象sc保存到请求对象中属性名为"sc",以便后续在页面中展示选课相关的详细信息,像选课时间、学生在该课程的成绩等情况。
request.setAttribute("update_msg", "修改分数成功!" + String.format("%tT", new Date()));
// 设置名为"update_msg"的属性属性值为提示用户修改分数成功的信息并通过String.format结合%tT格式化Date对象将当前的时间信息添加到提示信息中让用户知晓操作完成且成功的时间情况方便用户了解分数修改的及时性等。
request.getRequestDispatcher("/WEB-INF/teacher/updateOptionalCourseScore.jsp").forward(request, response);
// 获取一个请求转发器,将当前请求转发到"/WEB-INF/teacher/updateOptionalCourseScore.jsp"这个JSP页面通常该页面会用于展示修改课程分数后的相关信息比如学生信息、课程信息、选课记录以及修改成功的提示信息等内容这样服务器端会接着处理转发后的请求并向客户端返回相应的JSP页面经过渲染后的内容整个过程对客户端来说是一次完整的请求响应过程客户端浏览器地址栏中的URL并不会发生改变通过转发请求可以进行后续的页面展示操作将修改分数后的情况呈现给用户查看。
request.setAttribute("s",s);
request.setAttribute("c",c);
request.setAttribute("sc",sc);
request.setAttribute("update_msg","修改分数成功!"+String.format("%tT",new Date()));
request.getRequestDispatcher("/WEB-INF/teacher/updateOptionalCourseScore.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法用于处理HTTP GET请求例如当客户端通过在浏览器地址栏直接输入URL或者点击链接等方式通常这些情况会发起GET请求访问此Servlet对应的路径时Web容器会调用这个方法来处理相应的请求。
doPost(request, response);
// 在doGet方法中直接调用了doPost方法意味着对于GET请求的处理逻辑和POST请求的处理逻辑是一样的即不管客户端是通过POST方式还是GET方式访问这个Servlet对应的路径都会按照doPost方法里所定义的逻辑去进行相应的处理比如获取课程编号、学生学号、成绩信息更新成绩查询相关对象信息以及转发请求到JSP页面等操作都会同样执行这样做可能是在业务逻辑上对于这两种请求方式更新选修课程分数的操作要求是一致的所以进行了这样的复用处理。
doPost(request,response);
}
}
}

@ -1,27 +1,14 @@
package web.servlet.teacher;
// 定义该类所属的包名表明这个Servlet类位于web.servlet.teacher包下利用包结构来对类进行分类管理使项目的代码结构更加清晰便于区分不同功能模块对应的代码。
import domain.Course;
import domain.SelectCourse;
import domain.Student;
// 导入相关的领域模型类,这些类用于封装业务领域中不同实体的属性及业务逻辑(若有定义)。
// domain.Course类通常用于封装课程相关的属性比如课程编号、课程名称、课程学分等信息代表了业务领域里课程这一实体在代码中的体现方便后续对课程相关数据进行操作与传递。
// domain.SelectCourse类大概率是用来封装学生选课相关的信息例如学生所选课程的对应关系、选课时间以及对应的成绩等内容体现了学生选课这一业务概念在代码层面的抽象表示便于处理与选课相关的业务操作。
// domain.Student类用于封装学生相关的属性像学号、姓名、所在班级等信息是对学生这个业务实体在代码层面的表示后续会基于学生学号等信息进行相关的查询操作。
import service.CourseService;
import service.SelectCourseService;
import service.StudentService;
import service.impl.CourseServiceImpl;
import service.impl.SelectCourseServiceImpl;
import service.impl.StudentServiceImpl;
// 导入不同业务逻辑对应的服务接口以及它们的具体实现类,用于实现具体的业务操作功能。
// service.CourseService接口定义了针对课程业务操作的抽象方法例如查询课程详情、更新课程相关属性等操作对应的方法声明为课程相关业务逻辑的调用提供统一规范。
// service.SelectCourseService接口明确了与学生选课业务相关的操作方法比如根据课程和学生信息查询选课记录、获取选课成绩等相关业务逻辑的抽象方法定义便于后续进行选课相关的业务处理。
// service.StudentService接口规定了针对学生业务操作的各种方法像查询学生信息、更新学生资料等相关操作的接口声明方便后续调用学生业务相关的功能。
// service.impl.CourseServiceImpl是CourseService接口的具体实现类其内部包含了与数据库或其他数据源交互来实际完成课程业务逻辑的代码例如实现从数据库中查询课程信息、更新课程数据等具体功能的代码就在这个类里。
// service.impl.SelectCourseServiceImpl是SelectCourseService接口的具体实现类负责实现学生选课业务相关操作的具体代码逻辑比如根据特定条件查询选课记录及成绩等操作的具体实现就在此。
// service.impl.StudentServiceImpl则是StudentService接口的具体实现类包含了实现学生业务相关操作的具体代码比如依据学号查询学生信息等代码逻辑就在这个类中。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -29,73 +16,32 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// 导入Java EE中Servlet相关的基础类和接口用于处理Servlet相关的操作以及应对可能出现的异常情况。
// ServletException用于处理Servlet执行过程中出现的异常情况例如业务逻辑执行出错、配置错误等引发的异常都会通过它来处理。
// WebServlet注解用于将一个普通的Java类标注为Servlet并配置其相关的访问路径等属性方便Web容器如Tomcat等服务器识别并进行管理。
// HttpServlet是所有基于HTTP协议的Servlet的基类提供了处理HTTP请求的基础结构和方法开发人员通过重写它里面的方法来实现具体的业务逻辑以应对不同类型的HTTP请求如GET、POST等
// HttpServletRequest用于获取客户端发送过来的HTTP请求中的各种信息例如请求参数像表单提交的数据等、请求头信息等是后续处理请求数据的重要依据。
// HttpServletResponse用于向客户端发送HTTP响应比如设置响应状态码、响应头以及返回响应内容等以此构建完整的返回给客户端的信息。
// IOException用于处理输入输出相关的异常像读写文件、网络传输等出现问题时会抛出该异常。
@WebServlet("/updateScoreServlet")
// 使用@WebServlet注解将当前类标记为一个Servlet并指定其对应的访问路径为"/updateScoreServlet"。当客户端通过这个URL路径发起HTTP请求时Web容器如Tomcat等就会找到并调用这个Servlet来处理请求。
public class UpdateScoreServlet extends HttpServlet {
// 定义一个名为UpdateScoreServlet的类它继承自HttpServlet类意味着这个类是一个用于处理HTTP请求的Servlet通过继承HttpServlet可以方便地重写相应方法来处理不同类型的HTTP请求如GET、POST等以实现具体的业务逻辑这里主要是实现与更新成绩相关的业务逻辑从后续的操作和转发的页面推测
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法用于处理HTTP POST请求。当客户端通过POST方式比如通过表单提交更新成绩相关信息等情况常用POST方式向服务器发送数据访问此Servlet对应的"/updateScoreServlet"这个URL路径时Web容器会自动调用这个方法来处理相应的请求。
// 参数request包含了客户端发送过来的所有请求信息response则是用于向客户端返回响应信息的对象。
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为"utf-8"确保从客户端接收到的请求参数等数据能够按照UTF-8编码格式正确解析避免中文等特殊字符出现乱码问题保证后续获取和处理请求数据的准确性特别是在获取课程编号、学生学号等关键信息时防止乱码很重要因为这些信息后续要用于查询等操作。
String cid = request.getParameter("cid");
// 从客户端发送的HTTP请求中获取名为"cid"的参数值按照业务逻辑推测这个参数值通常代表要更新成绩的课程的编号将获取到的课程编号赋值给cid变量以便后续根据这个编号进行相关的课程信息查询以及成绩更新等操作。
String sid = request.getParameter("sid");
// 同样,从请求中获取名为"sid"的参数值该值对应要更新成绩的学生的学号信息赋值给sid变量后续会基于这个学号来查找对应的学生信息以及关联的选课记录等用于准确更新该学生对应课程的成绩。
StudentService service = new StudentServiceImpl();
// 创建一个StudentServiceImpl类的实例通过多态的方式将其赋值给StudentService接口类型的变量service这样后续就可以调用StudentService接口中定义的业务方法而具体的查询学生信息等操作的实现则由StudentServiceImpl类来完成在这里是为了后续查找对应学号的学生信息做准备。
Student student = new Student();
// 创建一个Student类的实例student用于封装学生相关信息准备后续根据学号查询完整的学生信息虽然这里只是简单创建一个新对象后续会设置学号等关键信息去查询数据库中的对应学生记录。
student.setS_id(sid);
// 通过调用Student类的setS_id方法将前面获取到的学生学号sid设置到student对象中使得这个对象可以携带准确的学号信息去进行后续的查询操作确保查询的是对应学号的学生信息。
Student s = service.findStudentById(student);
// 调用service即StudentServiceImpl的实例的findStudentById方法传入封装了学号信息的student对象该方法会依据学生学号去数据库等数据源中查询对应的学生信息并返回完整的学生对象包含学号、姓名、班级等各种信息将查询到的学生对象赋值给s变量方便后续在页面展示或者其他相关业务操作中使用该学生的详细信息。
CourseService service1 = new CourseServiceImpl();
// 创建一个CourseServiceImpl类的实例赋值给CourseService接口类型的变量service1方便后续调用CourseService接口里定义的业务方法像查询课程相关信息等操作就可以通过这个变量来调用具体实现类的方法这里是为了获取对应课程信息做准备。
Course c = service1.findSelectCourseByCourseId(cid);
// 调用service1即CourseServiceImpl的实例的findSelectCourseByCourseId方法传入课程编号cid该方法会根据课程编号去查找对应的课程信息如课程名称、学分等并返回Course对象包含课程相关的各种属性信息将查询到的课程对象赋值给c变量以便后续展示课程相关详情或者其他与课程有关的业务操作使用。
SelectCourseService service2 = new SelectCourseServiceImpl();
// 创建一个SelectCourseServiceImpl类的实例赋值给SelectCourseService接口类型的变量service2以便后续调用SelectCourseService接口中定义的业务方法例如根据课程编号和学生学号查询选课记录及成绩等操作都可以通过这个变量来调用具体实现类的方法这里是为了获取选课相关信息做准备。
SelectCourse sc = service2.findScoreByCourseIdAndStudentId(cid, sid);
// 调用service2的findScoreByCourseIdAndStudentId方法传入课程编号cid和学生学号sid该方法会依据这两个关键信息去查询对应的选课记录以及成绩等相关信息因为选课记录关联了课程和学生且成绩也是选课记录里的一部分内容返回SelectCourse对象包含选课相关的详细信息比如选课时间、成绩等将查询到的SelectCourse对象赋值给sc变量用于后续的页面展示或者其他相关处理。
request.setAttribute("s", s);
// 使用request对象的setAttribute方法将查询到的学生对象s保存到请求对象中设置的属性名为"s"这样在后续转发请求到JSP页面等操作时在目标JSP页面中就可以通过这个属性名获取到该学生对象进而可以展示学生的详细信息比如学号、姓名等内容。
SelectCourse sc = service2.findScoreByCourseIdAndStudentId(cid,sid);
request.setAttribute("c", c);
// 同样将查询到的课程对象c保存到请求对象中属性名为"c"方便在JSP页面等地方获取课程信息进行展示例如展示课程名称、学分等相关内容。
request.setAttribute("sc", sc);
// 把查询到的SelectCourse对象sc保存到请求对象中属性名为"sc",以便后续在页面中展示选课相关的详细信息,像选课时间、学生在该课程的成绩等情况。
request.getRequestDispatcher("/WEB-INF/teacher/updateOptionalCourseScore.jsp").forward(request, response);
// 获取一个请求转发器,将当前请求转发到"/WEB-INF/teacher/updateOptionalCourseScore.jsp"这个JSP页面通常该页面会用于展示更新成绩相关的信息比如学生信息、课程信息、选课记录等内容这样服务器端会接着处理转发后的请求并向客户端返回相应的JSP页面经过渲染后的内容整个过程对客户端来说是一次完整的请求响应过程客户端浏览器地址栏中的URL并不会发生改变通过转发请求可以进行后续的页面展示操作将与更新成绩相关的情况呈现给用户查看。
request.setAttribute("s",s);
request.setAttribute("c",c);
request.setAttribute("sc",sc);
request.getRequestDispatcher("/WEB-INF/teacher/updateOptionalCourseScore.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法用于处理HTTP GET请求例如当客户端通过在浏览器地址栏直接输入URL或者点击链接等方式通常这些情况会发起GET请求访问此Servlet对应的路径时Web容器会调用这个方法来处理相应的请求。
doPost(request, response);
// 在doGet方法中直接调用了doPost方法意味着对于GET请求的处理逻辑和POST请求的处理逻辑是一样的即不管客户端是通过POST方式还是GET方式访问这个Servlet对应的路径都会按照doPost方法里所定义的逻辑去进行相应的处理比如获取课程编号、学生学号查询学生、课程、选课记录信息设置请求属性以及转发请求到JSP页面等操作都会同样执行这样做可能是在业务逻辑上对于这两种请求方式展示更新成绩相关信息的操作要求是一致的所以进行了这样的复用处理。
doPost(request,response);
}
}
}

@ -1,18 +1,10 @@
package web.servlet.teacher;
// 定义该类所属的包名表明这个Servlet类位于“web.servlet.teacher”包下通过包结构对类进行分类管理有助于清晰地组织项目代码方便区分不同功能模块对应的代码。
import domain.Teacher;
// 导入领域模型类TeacherTeacher类通常用于封装教师相关的各种属性如教师编号、姓名、性别、学历、职称等信息以及对应的业务逻辑如果有定义在这里主要围绕教师信息的更新操作来使用这个类。
import service.StudentService;
import service.TeacherService;
import service.impl.StudentServiceImpl;
import service.impl.TeacherServiceImpl;
// 导入学生和教师相关业务逻辑的服务接口以及对应的具体实现类。
// StudentService定义了针对学生业务操作的抽象方法不过在这段代码中主要处理教师信息更新相关业务所以该接口相关操作在此处暂未直接使用但可能是项目整体服务层结构中统一引入的部分。
// TeacherService是针对教师业务操作的服务接口明确了像更新教师信息、查询教师详情等与教师业务相关的各种操作方法为后续调用教师业务逻辑提供统一的接口规范。
// StudentServiceImpl是StudentService接口的具体实现类包含了与数据库或其他数据源交互来实际完成学生业务逻辑的代码不过在当前教师信息更新的业务场景下暂时不会调用其方法只是作为项目中服务层实现类的一部分被引入。
// TeacherServiceImpl则是TeacherService接口的具体实现类负责实现教师业务相关操作的具体代码逻辑例如这里要调用的更新教师信息的方法就在这个类中进行具体实现。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -21,89 +13,42 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
// 导入Java EE中Servlet相关的基础类和接口用于处理Servlet相关的操作以及应对可能出现的异常情况同时导入用于获取当前日期时间信息的Date类方便在给用户的提示信息中添加操作时间等。
// ServletException用于处理Servlet执行过程中出现的异常情况例如业务逻辑执行出错、配置错误等引发的异常都会通过它来处理。
// WebServlet注解用于将一个普通的Java类标注为Servlet并配置其相关的访问路径等属性方便Web容器如Tomcat等服务器识别并进行管理。
// HttpServlet是所有基于HTTP协议的Servlet的基类提供了处理HTTP请求的基础结构和方法开发人员通过重写它里面的方法来实现具体的业务逻辑以应对不同类型的HTTP请求如GET、POST等
// HttpServletRequest用于获取客户端发送过来的HTTP请求中的各种信息像请求参数如表单提交的数据等、请求头信息等是后续处理请求数据的重要依据。
// HttpServletResponse用于向客户端发送HTTP响应例如设置响应状态码、响应头以及返回响应内容等以此构建完整的返回给客户端的信息。
// IOException用于处理输入输出相关的异常像读写文件、网络传输等出现问题时会抛出该异常。
// Date类用于获取当前的日期和时间在这里主要是用于在给用户反馈的提示信息中添加具体的时间戳使得用户能知晓教师信息修改操作完成的时间情况。
@WebServlet("/updateTeacherInfoServlet")
// 使用@WebServlet注解将当前类标记为一个Servlet并指定其对应的访问路径为“/updateTeacherInfoServlet”。当客户端通过这个URL路径发起HTTP请求时Web容器如Tomcat等就会找到并调用这个Servlet来处理请求。
public class UpdateTeacherInfoServlet extends HttpServlet {
// 定义一个名为UpdateTeacherInfoServlet的类它继承自HttpServlet类意味着这个类是一个用于处理HTTP请求的Servlet通过继承HttpServlet可以方便地重写相应方法来处理不同类型的HTTP请求如GET、POST等以实现具体的业务逻辑这里主要是实现更新教师信息的相关业务逻辑。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法用于处理HTTP POST请求。当客户端通过POST方式例如通过表单提交教师信息修改相关的数据等情况常用POST方式向服务器发送数据访问此Servlet对应的“/updateTeacherInfoServlet”这个URL路径时Web容器会自动调用这个方法来处理相应的请求。
// 参数request包含了客户端发送过来的所有请求信息response则是用于向客户端返回响应信息的对象。
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为“utf-8”确保从客户端接收到的请求参数等数据能够按照UTF-8编码格式正确解析避免中文等特殊字符出现乱码问题保证后续获取和处理请求数据的准确性因为要获取教师的各项信息如姓名、学历、职称等文本信息防止乱码很关键。
String tid = request.getParameter("teacher-id");
// 从客户端发送的HTTP请求中获取名为“teacher-id”的参数值按照业务逻辑推测这个参数值通常代表要更新信息的教师的编号将获取到的教师编号赋值给tid变量以便后续根据这个编号准确地更新对应的教师信息使其与数据库中相应教师记录对应起来。
String name = request.getParameter("teacher-name");
// 从请求中获取名为“teacher-name”的参数值该值对应要更新的教师的姓名信息赋值给name变量准备后续封装到教师对象中用于更新教师在数据库等数据源中的姓名信息。
String sex = request.getParameter("teacher-sex");
// 同样从请求中获取名为“teacher-sex”的参数值这个值代表教师的性别信息赋值给sex变量后续也会将其封装进教师对象用于更新教师的性别相关信息如果数据库中有相应字段存储性别信息的话
String education = request.getParameter("teacher-education");
// 从请求中获取名为“teacher-education”的参数值此值为要更新的教师的学历信息赋值给education变量将用于后续封装到教师对象里以更新教师在数据库中的学历记录。
String title = request.getParameter("teacher-title");
// 从请求中获取名为“teacher-title”的参数值该值是要更新的教师的职称信息赋值给title变量后续会把它设置到教师对象中用于更新教师的职称相关信息。
Teacher updateTeacher = new Teacher();
// 创建一个Teacher类的实例updateTeacher用于封装要更新的教师的相关信息后续会将从请求中获取到的教师编号、姓名、性别、学历、职称等信息设置到这个对象中再通过业务层方法将更新后的教师对象保存到数据库等数据源中完成教师信息的更新操作。
// 判断输入位数是否大于数据库位数
if (name.length() > 4 || education.length() > 20 || title.length() > 24 || name.contains("<") || education.contains("<") || title.contains("<")) {
// 这里进行一系列的格式验证判断检查教师姓名name的长度是否超过4个字符、学历education长度是否超过20个字符、职称title长度是否超过24个字符并且检查姓名、学历、职称中是否包含字符“<”。这些限制可能是基于数据库字段长度设计以及安全考虑比如防止潜在的SQL注入攻击等情况虽然简单这样判断不能完全杜绝但能一定程度防范如果不符合要求则认为格式错误。
request.setAttribute("update_msg", "格式错误,请重新提交!" + String.format("%tT", new Date()));
// 使用request对象的setAttribute方法设置一个名为“update_msg”的属性属性值是提示用户格式错误并告知需要重新提交的信息同时通过String.format结合%tT格式化Date对象将当前的时间信息添加到提示信息中方便用户知晓出现格式错误的时间情况以及提示重新操作。
request.getRequestDispatcher("updateTeacherServlet?tid=" + tid).forward(request, response);
// 获取一个请求转发器将当前请求转发到“updateTeacherServlet”这个资源可能是另一个Servlet或者JSP页面等同时带上获取到的教师编号tid作为参数通过URL拼接的方式传递参数这样服务器端会接着处理转发后的请求并向客户端返回相应的响应内容整个过程对客户端来说是一次完整的请求响应过程地址栏中的URL会根据转发情况发生相应改变转发后可以继续后续的页面展示或者重新输入等操作。
} else {
// 封装教师对象
//判断输入位数是否大于数据库位数
if (name.length() > 4 || education.length() > 20 || title.length()>24 || name.contains("<") || education.contains("<") || title.contains("<")) {
request.setAttribute("update_msg","格式错误,请重新提交!"+String.format("%tT",new Date()));
request.getRequestDispatcher("updateTeacherServlet?tid="+tid).forward(request, response);
}else {
//封装教师对象
updateTeacher.setT_id(tid);
// 通过调用Teacher类的setT_id方法将前面获取到的教师编号设置到updateTeacher对象中确保更新的教师信息对应正确的教师记录与数据库中要更新的教师记录通过编号关联起来。
updateTeacher.setT_name(name);
// 将获取到的教师姓名设置到updateTeacher对象中用于更新教师在数据库中的姓名信息。
updateTeacher.setT_sex(sex);
// 把获取到的教师性别信息设置到updateTeacher对象中用于更新教师的性别相关信息如果数据库中有对应字段存储性别信息的话
updateTeacher.setT_education(education);
// 将获取到的教师学历信息设置到updateTeacher对象中以更新教师在数据库中的学历记录。
updateTeacher.setT_title(title);
// 把获取到的教师职称信息设置到updateTeacher对象中用于更新教师的职称相关信息。
// 调用TeacherUpdate服务此处应为调用TeacherService服务可能是注释书写小失误
//调用TeacherUpdate服务
TeacherService service = new TeacherServiceImpl();
// 创建一个TeacherServiceImpl类的实例通过多态的方式将其赋值给TeacherService接口类型的变量service这样后续就可以调用TeacherService接口中定义的业务方法而具体的更新教师信息的操作实现则由TeacherServiceImpl类来完成。
service.updateInfo(updateTeacher);
// 调用service实际是TeacherServiceImpl的实例的updateInfo方法将封装好的包含更新后信息的教师对象updateTeacher传入该方法应该是在数据库或其他存储教师信息的数据源中根据教师对象中的信息编号、姓名、性别、学历、职称等来更新对应的教师记录实现教师信息的更新业务逻辑操作。
// 成功则返回并给提示
//成功则返回并给提示
request.setAttribute("update_msg", "修改成功!" + String.format("%tT", new Date()));
// 设置名为“update_msg”的属性属性值为提示用户教师信息修改成功的信息并通过格式化添加当前时间信息让用户知晓操作完成且成功的时间情况。
request.getRequestDispatcher("updateTeacherServlet?tid=" + tid).forward(request, response);
// 同样获取请求转发器将请求转发到“updateTeacherServlet”资源并带上教师编号tid作为参数进行后续的页面展示或者其他相关业务处理告知用户修改成功并可以进行后续查看等操作。
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法用于处理HTTP GET请求例如当客户端通过在浏览器地址栏直接输入URL或者点击链接等方式通常这些情况会发起GET请求访问此Servlet对应的路径时Web容器会调用这个方法来处理相应的请求。
doPost(request, response);
// 在doGet方法中直接调用了doPost方法意味着对于GET请求的处理逻辑和POST请求的处理逻辑是一样的即不管客户端是通过POST方式还是GET方式访问这个Servlet对应的路径都会按照doPost方法里所定义的逻辑去进行相应的处理比如获取教师相关参数、验证格式、封装教师对象、更新教师信息以及转发请求等操作都会同样执行这样做可能是在业务逻辑上对于这两种请求方式更新教师信息的操作要求是一致的所以进行了这样的复用处理。
doPost(request,response);
}
}
}

@ -1,14 +1,8 @@
package web.servlet.teacher;
// 定义该类所属的包名表明这个Servlet类位于“web.servlet.teacher”包下通过包结构对类进行分类组织有助于使项目代码结构更清晰便于区分不同功能模块对应的代码所在位置。
import domain.Course;
// 导入领域模型类CourseCourse类通常用于封装课程相关的各种属性比如课程编号、课程名称、课程详细介绍等信息以及可能的业务逻辑方法如果有针对课程对象自身的操作需求在这里主要用于表示教师可选课程相关信息方便后续操作课程数据。
import service.TeacherService;
import service.impl.TeacherServiceImpl;
// 导入教师业务逻辑对应的服务接口TeacherService以及该接口的具体实现类TeacherServiceImpl
// TeacherService接口定义了针对教师业务操作中与课程相关此处主要涉及查询可选课程等操作的抽象方法为具体业务逻辑的调用提供了统一的规范。
// TeacherServiceImpl类则是TeacherService接口的具体实现包含了与数据库或其他数据源交互来实际完成查询可选课程等业务逻辑的代码。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -18,60 +12,24 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
// 导入Java EE中Servlet相关的基础类和接口用于处理Servlet相关的操作以及可能出现的异常情况同时导入用于处理集合数据类型虽然此处暂时未体现集合操作的类以及处理会话相关操作的类。
// ServletException用于处理Servlet执行过程中出现的异常情况例如业务逻辑执行出错、配置错误等引发的异常都会通过它来处理。
// WebServlet注解用于将一个普通的Java类标注为Servlet并配置其相关的访问路径等属性方便Web容器如Tomcat等服务器识别并进行管理。
// HttpServlet是所有基于HTTP协议的Servlet的基类提供了处理HTTP请求的基础结构和方法开发人员通过重写它里面的方法来实现具体的业务逻辑以应对不同类型的HTTP请求如GET、POST等
// HttpServletRequest用于获取客户端发送过来的HTTP请求中的各种信息像请求参数例如表单提交的数据等、请求头信息等是后续处理请求数据的重要依据。
// HttpServletResponse用于向客户端发送HTTP响应例如设置响应状态码、响应头以及返回响应内容等用于构建返回给客户端的信息。
// HttpSession用于在服务器端管理用户会话信息通过它可以在不同的请求之间共享数据不过在这段代码里当前注释掉了相关使用代码原本可能是用于获取登录教师等相关会话信息现在暂未实际使用该功能也许后续会完善
// IOException用于处理输入输出相关的异常像读写文件、网络传输等出现问题时会抛出该异常。
// List是Java集合框架中的接口表示一个有序的、可包含重复元素的集合虽然在这里暂时没有直接体现出对集合的操作但在一些更复杂的业务场景中如果查询出多条课程相关记录可能就会用到List来存放并处理。
@WebServlet("/updateTeacherOptionalCourseServlet")
// 使用@WebServlet注解将当前类标记为一个Servlet并指定其对应的访问路径为“/updateTeacherOptionalCourseServlet”。当客户端通过这个URL路径发起HTTP请求时Web容器如Tomcat等服务器就会找到并调用这个Servlet来处理请求。
public class UpdateTeacherOptionalCourseServlet extends HttpServlet {
// 定义一个名为UpdateTeacherOptionalCourseServlet的类它继承自HttpServlet类意味着这个类是一个用于处理HTTP请求的Servlet通过继承HttpServlet可以方便地重写相应方法来处理不同类型的HTTP请求如GET、POST等以实现具体的业务逻辑这里主要是实现与教师更新可选课程信息相关的业务逻辑从转发的JSP页面推测
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法用于处理HTTP POST请求。当客户端通过POST方式比如通过表单提交更新课程相关信息等情况常用POST方式向服务器发送数据访问此Servlet对应的“/updateTeacherOptionalCourseServlet”这个URL路径时Web容器会自动调用这个方法来处理相应的请求。
// 参数request包含了客户端发送过来的所有请求信息response则是用于向客户端返回响应信息的对象。
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为“utf-8”确保从客户端接收到的请求参数等数据能够按照UTF-8编码格式正确解析避免中文等特殊字符出现乱码问题保证后续获取和处理请求数据的准确性特别是在获取课程相关参数等文本信息时防止乱码很关键因为后续要基于这些参数进行课程信息查询等操作。
// HttpSession session = request.getSession();
// 这行代码被注释掉了原本的意图应该是获取当前请求对应的HttpSession对象如果不存在则创建一个新的会话对象。HttpSession在服务器端用于管理用户的会话信息通常可以用来获取当前登录教师的相关信息比如教师编号等用于后续根据教师身份查询对应的可选课程等操作不过当前暂时没有启用这块功能可能后续开发中会根据实际需求决定是否启用以及如何使用会话信息。
String cid = (String) request.getParameter("cid");
// 从客户端发送的HTTP请求中获取名为“cid”的参数值并将其强制转换为String类型虽然一般情况下请求获取到的参数默认就是String类型但这里明确转换更严谨按照业务逻辑推测这个参数值通常代表要更新信息的可选课程的编号将获取到的课程编号赋值给cid变量以便后续根据这个编号进行课程相关信息的查询以及后续可能的更新操作等。
String cid = (String)request.getParameter("cid");
TeacherService service = new TeacherServiceImpl();
// 创建一个TeacherServiceImpl类的实例通过多态的方式将其赋值给TeacherService接口类型的变量service这样后续就可以调用TeacherService接口中定义的业务方法而具体的查询可选课程信息的操作实现则由TeacherServiceImpl类来完成在这里就是为了通过课程编号查询对应的课程对象信息做准备。
Course c = service.findOptionalCourseByCourseId(cid);
// 调用service实际是TeacherServiceImpl的实例的findOptionalCourseByCourseId方法传入前面获取到的课程编号cid作为参数该方法应该是在数据库或其他存储课程信息的数据源中根据课程编号去查找对应的课程信息如课程名称、课程详细介绍等并返回一个Course对象包含课程相关的各种属性信息将查询到的课程对象赋值给c变量方便后续展示课程相关详情或者进行其他与课程有关的业务操作使用。
request.setAttribute("course", c);
// 使用request对象的setAttribute方法将查询到的课程对象c保存到请求对象中设置的属性名为“course”这样在后续转发请求到JSP页面等操作时在目标JSP页面中就可以通过这个属性名获取到该课程对象进而可以展示课程的详细信息比如课程名称、课程介绍等内容方便教师查看并进行后续的课程信息更新操作如果页面上有相应的表单等元素用于更新信息的话
request.setAttribute("course",c);
System.out.println(c.getC_id());
// 通过调用Course类的getC_id方法获取课程对象c的课程编号属性并将其输出到控制台这可能是用于调试目的方便开发人员查看当前获取到的课程编号是否正确是否是预期的要操作的课程编号在实际的生产环境中可能会根据需要决定是否保留这样的输出语句一般调试完成后可以考虑移除或者根据日志配置决定是否记录
System.out.println(c.getC_name());
// 同样调用Course类的getC_name方法获取课程对象c的课程名称属性并输出到控制台也是用于调试便于确认获取到的课程名称信息是否准确符合预期的查询结果帮助开发人员排查可能出现的问题比如课程名称显示异常等情况。
System.out.println(c.getC_info());
// 调用Course类的getC_info方法获取课程对象c的课程详细介绍等信息并输出到控制台同样是出于调试目的方便开发人员查看课程详细介绍内容是否正确获取到了以此来验证查询课程信息的业务逻辑是否正确执行。
request.getRequestDispatcher("/WEB-INF/teacher/updateTeacherOptionalCourseInfo.jsp").forward(request, response);
// 获取一个请求转发器,将当前请求转发到“/WEB-INF/teacher/updateTeacherOptionalCourseInfo.jsp”这个JSP页面通常该页面会用于展示要更新的教师可选课程的相关信息比如通过获取到的课程对象展示课程名称、课程介绍等内容并且可能会提供相应的表单元素等方便教师进行课程信息的修改操作这样服务器端会接着处理转发后的请求并向客户端返回相应的JSP页面经过渲染后的内容整个过程对客户端来说是一次完整的请求响应过程客户端浏览器地址栏中的URL并不会发生改变通过转发请求可以进行后续的页面展示等业务操作引导教师进入课程信息更新页面。
request.getRequestDispatcher("/WEB-INF/teacher/updateTeacherOptionalCourseInfo.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法用于处理HTTP GET请求例如当客户端通过在浏览器地址栏直接输入URL或者点击链接等方式通常这些情况会发起GET请求访问此Servlet对应的路径时Web容器会调用这个方法来处理相应的请求。
doPost(request, response);
// 在doGet方法中直接调用了doPost方法意味着对于GET请求的处理逻辑和POST请求的处理逻辑是一样的即不管客户端是通过POST方式还是GET方式访问这个Servlet对应的路径都会按照doPost方法里所定义的逻辑去进行相应的处理比如获取课程编号、查询课程信息、设置请求属性以及转发请求到JSP页面等操作都会同样执行这样做可能是在业务逻辑上对于这两种请求方式展示教师可选课程信息并引导进入更新页面的操作要求是一致的所以进行了这样的复用处理。
doPost(request,response);
}
}
}

@ -1,30 +1,15 @@
package web.servlet.teacher;
// 定义该类所属的包名表明这个Servlet类位于“web.servlet.teacher”包下通过包结构对类进行分类管理有助于在项目中清晰地组织代码方便区分不同功能模块对应的代码。
import com.sun.org.apache.regexp.internal.RE;
// 导入了Apache的正则表达式相关的类不过这里的导入路径看起来比较旧后续可能更推荐使用java.util.regex包下的正则相关类虽然从当前代码来看可能暂时未直接体现它的使用场景但也许在更复杂的验证等逻辑中会涉及到正则表达式相关操作比如对输入数据格式进行验证等情况。
import domain.CDC;
import domain.Student;
import domain.Teacher;
// 导入不同的领域模型类,这些类通常用于封装业务领域中不同实体的属性以及相关业务逻辑(如果有定义)。
// domain.CDC类从命名推测可能是用于表示学校相关组织结构信息比如学院College、系Department、班级Class等相关信息的实体类具体包含对应这些组织结构的相关属性以及可能的业务操作方法。
// domain.Student类用于封装学生相关的属性像学号、姓名、班级等信息以及对应的业务逻辑虽然在这个Servlet中主要围绕教师相关操作但可能是整体项目结构中涉及到相关领域类的统一引入。
// domain.Teacher类用于封装教师相关的属性如教师编号、姓名、所在院系等以及业务逻辑在本类中会用于查询教师信息以及后续和教师相关的业务操作关联比如更新教师信息等操作会基于这个类的对象来进行。
import service.CDCService;
import service.StudentService;
import service.TeacherService;
import service.impl.CDCServiceImpl;
import service.impl.StudentServiceImpl;
import service.impl.TeacherServiceImpl;
// 导入不同业务逻辑对应的服务接口以及它们的具体实现类,用于实现具体的业务操作功能。
// service.CDCService接口定义了针对CDC相关业务操作的抽象方法例如查询所有学院、所有系、所有班级等操作对应的方法声明为获取学校组织结构相关信息提供统一的接口规范。
// service.StudentService接口规定了针对学生业务操作的各种方法像查询学生信息、更新学生资料等相关操作的接口声明不过在此处主要处理教师相关业务逻辑该接口相关操作暂未直接体现使用但可能是项目整体服务层的一部分引入进来。
// service.TeacherService接口明确了与教师业务相关的各种操作方法比如根据教师编号查询教师信息、更新教师相关属性等业务逻辑对应的方法定义方便后续调用教师业务相关功能。
// service.impl.CDCServiceImpl是CDCService接口的具体实现类其内部包含了与数据库或其他数据源交互来实际完成CDC相关业务逻辑的代码例如实现从数据库中查询所有学院、系、班级信息等具体功能的代码就在这个类里。
// service.impl.StudentServiceImpl是StudentService接口的具体实现类包含了实现学生业务相关操作的具体代码虽然在此场景下暂时未直接使用其功能但作为项目服务层实现类的一部分被引入。
// service.impl.TeacherServiceImpl则是TeacherService接口的具体实现类负责实现教师业务相关操作的具体代码逻辑比如根据教师编号查找教师对象等操作的具体实现就在此后续会用于查询教师信息等操作。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -34,78 +19,33 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
// 导入Java EE中Servlet相关的基础类和接口用于处理Servlet相关的操作以及应对可能出现的异常情况同时导入用于处理集合数据类型的List接口用于存放查询出来的多条相关数据比如多个学院、系、班级信息等
// ServletException用于处理Servlet执行过程中出现的异常情况例如业务逻辑执行出错、配置错误等引发的异常都会通过它来处理。
// WebServlet注解用于将一个普通的Java类标注为Servlet并配置其相关的访问路径等属性方便Web容器如Tomcat等服务器识别并进行管理。
// HttpServlet是所有基于HTTP协议的Servlet的基类提供了处理HTTP请求的基础结构和方法开发人员通过重写它里面的方法来实现具体的业务逻辑以应对不同类型的HTTP请求如GET、POST等
// HttpServletRequest用于获取客户端发送过来的HTTP请求中的各种信息例如请求参数像表单提交的数据等、请求头信息等是后续处理请求数据的重要依据。
// HttpServletResponse用于向客户端发送HTTP响应比如设置响应状态码、响应头以及返回响应内容等以此构建完整的返回给客户端的信息。
// HttpSession用于在服务器端管理用户会话信息通过它可以在不同的请求之间共享数据在这里主要用于保存查询出来的学校组织结构相关信息学院、系、班级列表等方便在后续页面展示或者其他相关操作中使用这些共享数据。
// IOException用于处理输入输出相关的异常像读写文件、网络传输等出现问题时会抛出该异常。
// List是Java集合框架中的接口表示一个有序的、可包含重复元素的集合用于存放从数据库或其他数据源查询出来的多条CDC相关对象如多个学院信息、多个系信息、多个班级信息等方便后续对这些数据进行遍历、展示等操作。
@WebServlet("/updateTeacherServlet")
// 使用@WebServlet注解将当前类标记为一个Servlet并指定其对应的访问路径为“/updateTeacherServlet”。当客户端通过这个URL路径发起HTTP请求时Web容器如Tomcat等服务器就会找到并调用这个Servlet来处理请求。
public class UpdateTeacherServlet extends HttpServlet {
// 定义一个名为UpdateTeacherServlet的类它继承自HttpServlet类意味着这个类是一个用于处理HTTP请求的Servlet通过继承HttpServlet可以方便地重写相应方法来处理不同类型的HTTP请求如GET、POST等以实现具体的业务逻辑这里主要是实现与教师信息更新相关的前期准备工作的业务逻辑从转发的JSP页面推测可能是为更新教师信息页面准备数据等操作
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doPost方法用于处理HTTP POST请求。当客户端通过POST方式例如通过表单提交教师信息相关的数据等情况常用POST方式向服务器发送数据访问此Servlet对应的“/updateTeacherServlet”这个URL路径时Web容器会自动调用这个方法来处理相应的请求。
// 参数request包含了客户端发送过来的所有请求信息response则是用于向客户端返回响应信息的对象。
request.setCharacterEncoding("utf-8");
// 设置请求的字符编码为“utf-8”确保从客户端接收到的请求参数等数据能够按照UTF-8编码格式正确解析避免中文等特殊字符出现乱码问题保证后续获取和处理请求数据的准确性因为后续要获取教师编号等文本信息防止乱码很关键这些信息会用于查询教师信息等操作。
HttpSession session = request.getSession();
// 获取当前请求对应的HttpSession对象如果不存在则创建一个新的会话对象。HttpSession在服务器端用于管理用户的会话信息在这里主要是为了保存后续查询出来的学校组织结构相关信息如学院、系、班级列表等以便在不同请求之间共享这些数据方便后续页面展示等操作使用。
String teacherid = request.getParameter("tid");
// 从客户端发送的HTTP请求中获取名为“tid”的参数值按照业务逻辑推测这个参数值通常代表要更新信息的教师的编号将获取到的教师编号赋值给teacherid变量以便后续根据这个编号准确地查询对应的教师信息使其与数据库中相应教师记录对应起来。
Teacher teacher = new Teacher();
// 创建一个Teacher类的实例teacher用于封装教师相关信息准备后续根据教师编号查询完整的教师信息虽然这里只是简单创建一个新对象后续会设置教师编号等关键信息去查询数据库中的对应教师记录。
teacher.setT_id(teacherid);
// 通过调用Teacher类的setT_id方法将前面获取到的教师编号设置到teacher对象中使得这个对象可以携带准确的教师编号信息去进行后续的查询操作确保查询的是对应编号的教师信息。
TeacherService service = new TeacherServiceImpl();
// 创建一个TeacherServiceImpl类的实例通过多态的方式将其赋值给TeacherService接口类型的变量service这样后续就可以调用TeacherService接口中定义的业务方法而具体的查询教师信息等操作的实现则由TeacherServiceImpl类来完成在这里就是为了根据教师编号查找对应的教师对象做准备。
Teacher newTeacher = service.findTeacherById(teacher);
// 调用service即TeacherServiceImpl的实例的findTeacherById方法传入封装了教师编号信息的teacher对象该方法会依据教师编号去数据库等数据源中查询对应的教师信息并返回完整的教师对象包含教师编号、姓名、所在院系等各种信息将查询到的教师对象赋值给newTeacher变量方便后续在页面展示或者其他相关业务操作中使用该教师的详细信息。
request.setAttribute("teacher", newTeacher);
// 使用request对象的setAttribute方法将查询到的教师对象newTeacher保存到请求对象中设置的属性名为“teacher”这样在后续转发请求到JSP页面等操作时在目标JSP页面中就可以通过这个属性名获取到该教师对象进而可以展示教师的详细信息比如姓名、所在院系等内容为后续教师信息更新页面推测提供要更新的教师的初始信息展示。
request.setAttribute("teacher",newTeacher);
CDCService service2 = new CDCServiceImpl();
// 创建一个CDCServiceImpl类的实例赋值给CDCService接口类型的变量service2方便后续调用CDCService接口里定义的业务方法像查询所有学院、所有系、所有班级等操作就可以通过这个变量来调用具体实现类的方法这里是为了获取学校组织结构相关信息做准备。
List<CDC> collegeList = service2.findAllCollege();
// 调用service2即CDCServiceImpl的实例的findAllCollege方法该方法会从数据库或其他存储学校组织结构信息的数据源中查询出所有学院的相关信息并以CDC对象组成的列表形式返回将查询到的学院信息列表赋值给collegeList变量方便后续对这些学院信息进行展示或者其他相关处理比如在更新教师信息页面上让用户选择教师所属学院等操作
List<CDC> departmentList = service2.findAllDepartment();
// 调用service2的findAllDepartment方法此方法会查询出所有系的相关信息并返回CDC对象组成的列表赋值给departmentList变量同样用于后续的展示或者和系相关的业务操作比如选择教师所属系等
List<CDC> classList = service2.findAllClass();
// 调用service2的findAllClass方法该方法从数据源中查询出所有班级的相关信息以CDC对象列表形式返回赋值给classList变量后续可用于班级相关的展示或者操作比如选择教师授课班级等情况具体看业务需求
session.setAttribute("collegeLists", collegeList);
// 使用HttpSession对象的setAttribute方法将查询到的学院信息列表collegeList保存到会话对象中设置的属性名为“collegeLists”这样在不同的请求之间比如后续页面刷新或者其他相关操作涉及到再次使用这些学院信息时可以通过这个属性名从会话中获取到学院信息列表方便在页面上展示所有学院供用户选择等操作。
session.setAttribute("departmentLists", departmentList);
// 同样将系信息列表departmentList保存到会话对象中属性名为“departmentLists”便于后续在页面展示系相关信息以及进行系相关的业务操作时从会话中获取对应的系信息列表。
session.setAttribute("collegeLists",collegeList);
session.setAttribute("departmentLists",departmentList);
session.setAttribute("classLists",classList);
session.setAttribute("classLists", classList);
// 把班级信息列表classList保存到会话对象中属性名为“classLists”方便后续在页面展示班级信息以及进行班级相关操作时从会话中获取班级信息列表。
request.getRequestDispatcher("/WEB-INF/admin/updateTeacher.jsp").forward(request, response);
// 获取一个请求转发器,将当前请求转发到“/WEB-INF/admin/updateTeacher.jsp”这个JSP页面通常该页面会用于展示教师信息更新相关的表单以及学校组织结构相关的下拉列表等内容比如通过从会话中获取学院、系、班级列表展示下拉框供用户选择教师所属的这些组织结构信息同时展示之前查询到的教师对象信息用于用户查看和修改这样服务器端会接着处理转发后的请求并向客户端返回相应的JSP页面经过渲染后的内容整个过程对客户端来说是一次完整的请求响应过程客户端浏览器地址栏中的URL并不会发生改变通过转发请求可以进行后续的页面展示等业务操作引导进入教师信息更新页面。
request.getRequestDispatcher("/WEB-INF/admin/updateTeacher.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重写HttpServlet类中的doGet方法用于处理HTTP GET请求例如当客户端通过在浏览器地址栏直接输入URL或者点击链接等方式通常这些情况会发起GET请求访问此Servlet对应的路径时Web容器会调用这个方法来处理相应的请求。
doPost(request, response);
// 在doGet方法中直接调用了doPost方法意味着对于GET请求的处理逻辑和POST请求的处理逻辑是一样的即不管客户端是通过POST方式还是GET方式访问这个Servlet对应的路径都会按照doPost方法里所定义的逻辑去进行相应的处理比如获取教师编号、查询教师信息、获取学校组织结构信息、设置请求和会话属性以及转发请求到JSP页面等操作都会同样执行这样做可能是在业务逻辑上对于这两种请求方式进入教师信息更新页面的操作要求是一致的所以进行了这样的复用处理。
doPost(request,response);
}
}
}

@ -1,7 +1,9 @@
package web.servlet.verifycode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.util.JSONPObject;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
@ -19,24 +21,43 @@ import javax.servlet.http.HttpServletResponse;
/**
*
* HttpSession
*
*/
@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//服务器通知浏览器不要缓存
response.setHeader("pragma","no-cache");
response.setHeader("cache-control","no-cache");
response.setHeader("expires","0");
//在内存中创建一个长80宽30的图片默认黑色背景
//参数一:长
//参数二:宽
//参数三:颜色
int width = 136;
int height = 38;
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//获取画笔
Graphics g = image.getGraphics();
//设置画笔颜色为灰色
g.setColor(Color.GRAY);
//填充图片
g.fillRect(0,0, width,height);
//产生4个随机验证码12Ey
String checkCode = getCheckCode();
//将验证码放入HttpSession中
request.getSession().setAttribute("CHECKCODE_SERVER",checkCode);
/**
* HTTP GET
*
*
* @param request HttpServletRequest
* @param response HttpServletResponse
* @throws ServletException Servlet
* @throws IOException
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置画笔颜色为黄色
g.setColor(Color.YELLOW);
//设置字体的小大
g.setFont(new Font("黑体",Font.BOLD,30));
//向图片上写入验证码
g.drawString(checkCode,36,28);
<<<<<<< HEAD
//将内存中的图片输出到浏览器
//参数一:图片对象
//参数二图片的格式如PNG,JPG,GIF
@ -65,91 +86,6 @@ public class CheckCodeServlet extends HttpServlet {
this.doGet(request,response);
}
}
//.......
=======
// 服务器通知浏览器不要缓存验证码图片相关逻辑
// 设置响应头 "pragma" 为 "no-cache",这是一种 HTTP 1.0 的缓存控制方式,告诉浏览器不要缓存页面
response.setHeader("pragma", "no-cache");
// 设置响应头 "cache-control" 为 "no-cache",这是 HTTP 1.1 中常用的缓存控制方式,明确指示浏览器不进行缓存
response.setHeader("cache-control", "no-cache");
// 设置响应头 "expires" 为 "0",指定缓存过期时间为过去的某个时间,也是一种强制浏览器不缓存的手段
response.setHeader("expires", "0");
// 在内存中创建一个指定尺寸的图片对象相关逻辑
// 定义图片的宽度,单位为像素,这里设置为 136 像素,可根据实际需求调整尺寸大小
int width = 136;
// 定义图片的高度,单位为像素,此处设置为 38 像素,同样可按需改变尺寸
int height = 38;
// 创建一个 BufferedImage 对象,用于在内存中表示图片,其参数依次为宽度、高度以及图像类型(这里使用 TYPE_INT_RGB 表示 24 位真彩色图像)
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取用于在图片上绘制内容的画笔对象
Graphics g = image.getGraphics();
// 设置画笔的颜色为灰色,用于填充图片背景,使背景呈现灰色
g.setColor(Color.GRAY);
// 使用设置好颜色的画笔填充整个图片区域,坐标 (0, 0) 表示从图片左上角开始,填充的宽度和高度分别为前面定义的图片宽度和高度
g.fillRect(0, 0, width, height);
>>>>>>> develop1
// 产生 4 个随机验证码的逻辑
// 调用 getCheckCode 方法生成一个由随机字符组成的 4 位验证码字符串,例如 "12Ey" 这种形式
String checkCode = getCheckCode();
// 将生成的验证码字符串存入 HttpSession 中,属性名为 "CHECKCODE_SERVER",方便后续在其他地方(如登录验证等环节)取出进行比对验证
request.getSession().setAttribute("CHECKCODE_SERVER", checkCode);
// 设置画笔颜色为黄色,以便后续用黄色画笔在图片上绘制验证码字符,使其更清晰可见(颜色可根据实际美观等需求调整)
g.setColor(Color.YELLOW);
// 设置绘制文字时使用的字体,这里选择 "黑体"字体样式为加粗Font.BOLD字号大小为 30 像素,可根据验证码图片整体布局和显示效果调整字体相关参数
g.setFont(new Font("黑体", Font.BOLD, 30));
// 使用设置好的字体和颜色,将验证码字符串绘制到图片上指定的位置,坐标 (36, 28) 表示从图片上距离左边 36 像素、距离上边 28 像素的位置开始绘制,
// 具体坐标值可根据验证码在图片中的排版效果进行微调
g.drawString(checkCode, 36, 28);
// 将内存中生成好的图片输出到浏览器的逻辑
// 使用 ImageIO 类的 write 方法将图片对象输出到浏览器,参数依次为:要输出的图片对象、图片的格式(这里指定为 "PNG",也可以是其他常见格式如 JPG、GIF 等)、
// 输出的目标流(这里使用 response.getOutputStream() 获取 HttpServletResponse 的输出流,将图片内容直接写入响应流,发送给浏览器)
ImageIO.write(image, "PNG", response.getOutputStream());
}
/**
* 4
* 4
*
* @return 4
*/
private String getCheckCode() {
// 定义一个包含所有可用字符的字符串,用于从中随机选取字符生成验证码,这里排除了容易混淆的数字 0、1 和字母 l、o、O 等,减少用户识别验证码时的混淆情况
String base = "23456789ABCDEFGHJKMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz";
// 获取可用字符集合的长度,用于后续生成随机索引来选取字符
int size = base.length();
// 创建一个 Random 对象,用于生成随机数,它依据系统当前时间作为随机数生成器的种子,产生伪随机数序列
Random r = new Random();
// 创建一个 StringBuffer 对象,用于高效地拼接字符,最终组成验证码字符串
StringBuffer sb = new StringBuffer();
// 通过循环 4 次,每次生成一个随机字符并添加到 StringBuffer 中,最终组成 4 位的验证码字符串
for (int i = 1; i <= 4; i++) {
// 生成一个介于 0包含到 size - 1包含之间的随机整数索引用于从 base 字符串中选取字符
int index = r.nextInt(size);
// 根据生成的随机索引,从 base 字符串中获取对应的字符
char c = base.charAt(index);
// 将获取到的字符添加到 StringBuffer 中,逐步构建验证码字符串
sb.append(c);
}
// 将 StringBuffer 转换为字符串并返回,得到最终的 4 位验证码字符串
return sb.toString();
}
/**
* HTTP POST
* doGet POST GET POST Servlet
* POST
*
* @param request HttpServletRequest
* @param response HttpServletResponse
* @throws ServletException Servlet
* @throws IOException
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}

@ -1,97 +1,64 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 以上两行是JSP页面的指令声明部分
第一行用于设置该JSP页面输出的内容类型为HTML格式text/html并指定字符编码为UTF-8同时表明此页面使用Java语言来编写相应的逻辑代码
第二行引入了JSTLJavaServer Pages Standard Tag Library的核心标签库通过定义前缀“c”后续可以方便地使用该标签库所提供的各种标签进行诸如数据遍历、条件判断等操作 -->
<html>
<head>
<!-- 设置页面标题为“学院专业查询”,此标题会显示在浏览器的标题栏位置,让用户直观知晓当前页面的主要功能 -->
<title>学院专业查询</title>
<!-- 引入layui的样式文件layui.css中包含了众多预先定义好的样式规则用于实现页面的布局、组件样式等方面的美化效果能帮助快速搭建出具有一定风格的页面 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入自定义的样式文件style.css文件可以由开发者根据本页面的特定需求来编写样式规则用于对layui框架默认样式进行补充或者覆盖以实现更符合业务需求的页面外观展示 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入layui的JavaScript文件layui.js包含了丰富的代码逻辑实现了诸多交互组件如表单、表格、菜单等以及相应的交互功能是页面实现动态效果的重要依赖 -->
<script src="./layui.js"></script>
<!-- 引入jQuery库的.min压缩版本jQuery是一个广受欢迎的JavaScript库它提供了简洁易用的方法来操作DOM元素例如查找、修改、删除页面元素等、处理页面事件如点击、鼠标移动等事件以及实现动画效果等极大地方便了前端开发工作 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 设置页面主体的类名为“layui-layout-body”同时指定背景颜色为#F2F2F2一种淡灰色这通常是依据layui框架的布局样式规范来设定的使得页面呈现出相应的视觉风格 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 通过JSP的include指令引入“filterLogin.jsp”页面该页面一般用于执行用户登录验证相关的逻辑操作只有当用户成功登录后才允许访问当前页面展示的内容起到安全控制的作用 -->
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<!-- 引入“/WEB-INF/admin/aHeader.jsp”页面通常这个页面用于构建管理员端页面的头部区域比如展示系统名称、管理员相关的功能菜单、用户信息等通用元素 -->
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<!-- 引入“/WEB-INF/admin/adminNav.jsp”页面其主要功能是生成管理员端的导航栏通过该导航栏可以方便管理员在不同的功能模块、业务页面之间进行切换操作 -->
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 这是layui框架中定义的用于承载页面主要内容的部分也就是所谓的内容主体区域各类核心业务数据展示以及相关操作功能都会放置在此处 -->
<div style="padding: 15px;">
<!-- 使用layui的面包屑组件通过面包屑可以清晰地向用户展示当前页面在整个系统层级结构中的位置方便用户了解自己所在的页面路径以及页面之间的关联关系 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<!-- 面包屑的一级导航此处设置了一个超链接href属性虽为空但可能根据实际情况绑定相应的点击事件或指向根路径相关功能显示文本为“管理员”代表当前用户所处的角色层级 -->
<a href="">管理员</a>
<!-- 面包屑的二级导航,同样设置了超链接(可能有对应指向学院专业管理相关页面的功能),显示文本为“学院专业管理”,进一步细化用户所在的业务模块层级 -->
<a href="">学院专业管理</a>
<!-- 面包屑的三级导航,这里没有设置超链接,直接通过<cite>标签显示当前页面的具体名称“学院专业查询”,明确当前所处的具体页面 -->
<a><cite>学院专业查询</cite></a>
</span>
<!-- 使用layui的表格组件来展示学院专业相关的数据layui-table是layui框架中预定义好样式和交互功能的表格样式类lay-filter属性通常用于为表格绑定一些特定的筛选、排序等交互功能此处定义为“test”后续可能需要相应的JavaScript代码来实现具体交互 -->
<table class="layui-table" lay-filter="test">
<thead>
<table class="layui-table" lay-filter="test">
<thead>
<tr>
<th>ID</th>
<th>学院</th>
<th>专业</th>
<th>班级</th>
<th>操作</th>
</tr>
</thead>
<c:forEach items="${cdcs}" var="cdc" varStatus="c">
<tr>
<!-- 定义表格表头的第一列标题为“ID”用于展示每条学院专业相关记录的唯一标识符 -->
<th>ID</th>
<!-- 定义表格表头的第二列标题为“学院”,用于展示对应的学院名称信息 -->
<th>学院</th>
<!-- 定义表格表头的第三列标题为“专业”,用于展示所属的专业名称信息 -->
<th>专业</th>
<!-- 定义表格表头的第四列标题为“班级”,用于展示具体的班级名称信息 -->
<th>班级</th>
<!-- 定义表格表头的第五列标题为“操作”,这一列通常用于放置对表格中每一条数据记录进行操作的按钮等交互元素,比如删除、编辑等操作按钮 -->
<th>操作</th>
<td>${c.count}</td>
<td>${cdc.college}</td>
<td>${cdc.department}</td>
<td>${cdc.cclass}</td>
<td><a class="layui-btn layui-btn-danger" href="javascript:deleteCDC();">删除</a></td>
</tr>
</thead>
<!-- 使用JSTL的forEach标签对名为“cdcs”的集合进行循环遍历这个集合通常是由后端程序传递过来的、包含学院专业相关数据的集合每一个元素代表一条具体的学院专业记录 -->
<c:forEach items="${cdcs}" var="cdc" varStatus="c">
<tr>
<!-- 在表格行的第一列单元格中显示当前循环的序号通过varStatus对象的count属性来实现计数功能序号从1开始方便用户查看数据的顺序 -->
<td>${c.count}</td>
<!-- 在表格行的第二列单元格中显示当前循环对象cdc中的学院名称属性值该属性值应该是从后端传递过来的数据对象中提取出来的用于展示具体的学院名称信息 -->
<td>${cdc.college}</td>
<!-- 在表格行的第三列单元格中显示当前循环对象cdc中的专业名称属性值同样是从后端数据对象中获取对应属性值来展示具体的专业名称 -->
<td>${cdc.department}</td>
<!-- 在表格行的第四列单元格中显示当前循环对象cdc中的班级名称属性值用于展示具体的班级名称情况 -->
<td>${cdc.cclass}</td>
<!-- 在表格行的第五列操作列单元格中添加一个删除按钮按钮应用了layui的危险按钮样式layui-btn-danger使其在视觉上更醒目地提示用户操作的危险性
点击该按钮时会调用JavaScript中的deleteCDC函数目前函数未定义完整后续需要补充具体的删除逻辑比如向服务器发送删除请求等相关操作 -->
<td><a class="layui-btn layui-btn-danger" href="javascript:deleteCDC();">删除</a></td>
</tr>
</c:forEach>
</table>
<!-- 引入“/footer.jsp”页面通常这个页面用于展示页面底部的相关信息例如版权声明、联系方式、网站相关的友情链接等通用的底部元素 -->
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<!-- 使用jQuery选择器通过特定的选择表达式选择导航栏中特定的DOM元素此处是第4个li元素下的第一个dl元素下的第一个dd元素并为其添加类名“layui-this”
一般来说添加这个类名是为了通过CSS样式来改变该元素的外观使其呈现出与其他导航项不同的样式效果用于标识当前选中的导航项或者处于特定状态的导航项具体样式效果取决于对应的CSS定义 -->
<script type="text/javascript">
$("#nav li:nth-child(4) dl dd:nth-child(1)").addClass("layui-this");
$("#nav li:nth-child(4)").addClass("layui-nav-itemed");
</script>
<!-- 使用layui框架提供的use方法来加载“element”模块在加载完成后的回调函数里获取该模块的实例将其赋值给变量“element”然后调用实例的“init”方法进行初始化操作。
“element”模块在layui框架中主要负责处理页面元素相关的交互逻辑例如菜单的展开与收起、选项卡的切换等功能的初始化工作确保这些交互元素能正常展示和使用 -->
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
<script type="text/javascript">
$("#nav li:nth-child(4) dl dd:nth-child(1)").addClass("layui-this");
$("#nav li:nth-child(4)").addClass("layui-nav-itemed");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
</body>
</html>
</html>

@ -2,96 +2,62 @@
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<!-- 设置页面的内容类型为HTML格式字符编码为UTF-8指定页面使用的编程语言为Java -->
<title>文件列表</title>
<!-- 引入layui框架的样式文件用于设置页面的整体样式风格使页面呈现出layui框架定义的外观效果 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入自定义的样式文件可能用于覆盖或补充layui样式实现针对本页面特定的样式需求 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入layui框架的JavaScript文件这是使用layui框架各种功能组件如表单验证、元素操作等的基础 -->
<script src="./layui.js"></script>
<!-- 引入jQuery库的压缩版本jQuery是一个广泛使用的JavaScript库方便进行DOM操作、事件处理以及与页面元素交互等操作 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 包含名为“filterLogin.jsp”的JSP页面通常用于进行登录状态的过滤判断比如验证用户是否已登录等相关逻辑处理 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 包含名为“WEB-INF/admin/aHeader.jsp”的JSP页面一般用于引入页面的头部部分可能包含页面的通用头部元素如页面标题、导航栏等 -->
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<!-- 包含名为“WEB-INF/admin/adminNav.jsp”的JSP页面主要用于引入管理员导航栏部分展示管理员相关操作的导航菜单选项 -->
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 页面的内容主体区域,在这里放置页面主要展示和交互的内容 -->
<div style="padding: 15px;">
<!-- 使用layui的面包屑组件来展示当前页面在整个系统中的层级路径方便用户了解所处位置 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<!-- 面包屑的第一项代表顶层分类点击可跳转到管理员相关的根页面此处具体跳转功能取决于href属性对应的实际路径设置当前为空 -->
<a href="">管理员</a>
<!-- 面包屑的第二项代表系统设置分类点击可跳转到系统设置相关页面同样具体跳转依赖href属性实际设置当前为空 -->
<a href="">系统设置</a>
<!-- 面包屑的第三项,显示当前页面具体名称为“文件列表” -->
<a><cite>文件列表</cite></a>
</span>
<!-- 使用layui的表格组件创建一个表格设置了lay-filter属性为“test”方便后续通过layui框架对表格进行交互操作 -->
<table class="layui-table" lay-filter="test">
<thead>
<table class="layui-table" lay-filter="test">
<thead>
<tr>
<th>ID</th>
<th>文件名</th>
<th>文件路径</th>
<th>文件大小</th>
<th>操作</th>
</tr>
</thead>
<c:forEach items="${fileLists}" var="filelist" varStatus="f">
<tr>
<!-- 定义表格表头的第一列标题显示为“ID”用于展示文件相关记录的序号或唯一标识等 -->
<th>ID</th>
<!-- 定义表格表头的第二列,标题显示为“文件名”,用于展示文件的名称信息 -->
<th>文件名</th>
<!-- 定义表格表头的第三列,标题显示为“文件路径”,用于展示文件在服务器或存储系统中的具体存放路径 -->
<th>文件路径</th>
<!-- 定义表格表头的第四列,标题显示为“文件大小”,用于展示文件所占的存储空间大小 -->
<th>文件大小</th>
<!-- 定义表格表头的第五列,标题显示为“操作”,通常用于放置针对文件进行相关操作的按钮等元素 -->
<th>操作</th>
<td>${f.count}</td>
<td>${filelist.fileName}</td>
<td>${filelist.filePath}</td>
<td>${filelist.fileSize}</td>
<td><a class="layui-btn layui-btn-normal" href="${pageContext.request.contextPath}/downloadServlet?filename=${filelist.fileName}">下载</a><a class="layui-btn layui-btn-danger" href="${pageContext.request.contextPath}/deleteFileServlet?filename=${filelist.fileName}">删除</a></td>
</tr>
</thead>
<!-- 使用JSTL的forEach标签循环遍历名为“fileLists”的集合应该是在后台传递过来的文件相关数据集合 -->
<c:forEach items="${fileLists}" var="filelist" varStatus="f">
<tr>
<!-- 在表格行中显示当前循环的序号从1开始计数通过EL表达式“${f.count}”获取并展示 -->
<td>${f.count}</td>
<!-- 在表格行中显示当前循环对象filelist中的文件名属性值通过EL表达式“${filelist.fileName}”获取并展示 -->
<td>${filelist.fileName}</td>
<!-- 在表格行中显示当前循环对象filelist中的文件路径属性值通过EL表达式“${filelist.filePath}”获取并展示 -->
<td>${filelist.filePath}</td>
<!-- 在表格行中显示当前循环对象filelist中的文件大小属性值通过EL表达式“${filelist.fileSize}”获取并展示 -->
<td>${filelist.fileSize}</td>
<td>
<!-- 在表格行的操作列中添加一个下载按钮按钮样式为layui的普通按钮样式layui-btn-normal
点击按钮会跳转到“${pageContext.request.contextPath}/downloadServlet?filename=${filelist.fileName}”路径,
通过URL参数传递文件名信息给对应的Servlet用于实现文件下载功能 -->
<a class="layui-btn layui-btn-normal" href="${pageContext.request.contextPath}/downloadServlet?filename=${filelist.fileName}">下载</a>
<!-- 在表格行的操作列中添加一个删除按钮按钮样式为layui的危险按钮样式layui-btn-danger
点击按钮会跳转到“${pageContext.request.contextPath}/deleteFileServlet?filename=${filelist.fileName}”路径,
通过URL参数传递文件名信息给对应的Servlet用于实现文件删除功能 -->
<a class="layui-btn layui-btn-danger" href="${pageContext.request.contextPath}/deleteFileServlet?filename=${filelist.fileName}">删除</a>
</td>
</tr>
</c:forEach>
</table>
<!-- 包含名为“footer.jsp”的JSP页面一般用于引入页面底部部分可能包含版权信息、联系方式等通用的底部元素 -->
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<!-- 使用jQuery选择器选择特定的DOM元素此处是导航栏中特定位置的元素并为其添加“layui-this”类名通常用于设置该元素的选中状态样式等具体样式效果取决于对应的CSS定义 -->
<script type="text/javascript">
$("#nav li:nth-child(5) dl dd:nth-child(4)").addClass("layui-this");
$("#nav li:nth-child(5)").addClass("layui-nav-itemed");
</script>
<!-- 使用layui框架的“element”模块调用其“init”方法进行相关初始化操作“element”模块常用于实现页面的交互元素如折叠面板、导航栏等的功能初始化 -->
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
<script type="text/javascript">
$("#nav li:nth-child(5) dl dd:nth-child(4)").addClass("layui-this");
$("#nav li:nth-child(5)").addClass("layui-nav-itemed");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
</body>
</html>

@ -1,222 +1,172 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 上述两行是JSP页面相关指令
第一行用于设置该JSP页面的内容类型为text/html即HTML格式页面同时指定字符编码为UTF-8表明页面使用Java语言来处理逻辑。
第二行引入了JSTLJavaServer Pages Standard Tag Library核心标签库定义前缀为“c”方便后续在页面中使用JSTL提供的标签进行动态数据处理比如循环遍历、条件判断等操作 -->
<html>
<head>
<title>查询学生</title>
<!-- 设置HTML页面的标题为“查询学生”此标题会显示在浏览器的标题栏让用户明确该页面的主要功能 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件通过相对路径从当前页面所在目录下的css文件夹中查找应用layui框架提供的样式用于页面布局、组件美化等使页面呈现layui框架特有的外观风格 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的样式表文件style.css同样采用相对路径引用目的是添加符合特定需求的个性化页面样式对页面显示效果做进一步定制 -->
<script src="./layui.js"></script>
<!-- 引入layui框架的JavaScript脚本文件从当前页面所在目录获取该文件layui的JavaScript脚本为页面提供众多交互功能以及各种组件支持例如实现菜单交互、页面元素动态展示等功能 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 从CDN内容分发网络引入jQuery库的最小化版本jQuery是常用的JavaScript库能简化页面中对DOM元素的操作、事件处理以及实现各种动画效果等方便开发人员编写JavaScript代码实现页面交互逻辑 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 为页面主体body设置类名“layui-layout-body”同时将背景颜色设定为浅灰色#F2F2F2该类名通常与layui框架的布局样式相关联按照其框架规范来构建页面整体外观 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 通过JSP的include指令包含名为filterLogin.jsp的页面内容一般这个页面用于处理用户登录相关的验证逻辑或者展示登录相关的界面元素比如登录表单等以此确保只有登录后的用户能够访问后续页面内容 -->
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<!-- 包含位于WEB-INF/admin目录下的aHeader.jsp页面通常用于构建页面的头部区域可能包含如网站logo、导航栏等常见的头部元素起到统一页面头部布局的作用 -->
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<!-- 再次使用JSP的include指令包含WEB-INF/admin目录下的adminNav.jsp页面此页面一般用来展示管理员端特有的导航菜单内容便于用户在不同功能模块间进行切换操作 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建一个div元素并赋予其两个类名“layui-layout”和“layui-layout-admin”这是layui框架中用于定义页面整体布局结构的特定类名遵循layui框架的布局规范来划分页面不同区域例如头部、主体、侧边栏等具体根据框架设定 -->
<div class="layui-body">
<!-- 在上述布局div内部再创建一个div元素类名为“layui-body”在layui框架里该区域通常用于承载页面的主要内容比如展示各类业务数据、操作按钮等 -->
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 创建一个div元素并通过内联样式设置其四周内边距为15px这样做主要是为了对内部元素进行排版使页面内容看起来更规整避免显得过于紧凑或松散 -->
<span class="layui-breadcrumb">
<a href="">管理员</a>
<a href="">学生管理</a>
<a><cite>查询学生</cite></a>
</span>
<!-- 创建一个layui框架提供的面包屑导航组件通过一系列超链接a标签展示当前页面在整个系统中的层级路径这里展示了从“管理员”进入“学生管理”再到“查询学生”页面但目前超链接的href属性大多为空后续可能需要完善具体跳转地址以实现页面导航功能 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a href="">管理员</a>
<a href="">学生管理</a>
<a><cite>查询学生</cite></a>
</span>
<form style="padding-top: 20px;" action="${pageContext.request.contextPath}/findStudentByPageServlet" method="post">
<!-- 创建一个表单form元素通过内联样式设置顶部内边距为20px设置表单的action属性即表单提交的目标地址为名为findStudentByPageServlet的Servlet通过EL表达式动态获取上下文路径拼接而成提交方式为POST用于收集用户输入的查询条件并提交给后端进行学生信息查询操作 -->
<div class="layui-form-item">
<!-- 创建一个layui框架下用于表示表单项目form-item的div容器layui框架会依据这个结构来对内部的表单元素进行布局和样式处理 -->
<div class="layui-inline">
<!-- 创建一个内联的div容器在layui表单布局中它用于让内部的表单元素在同一行显示 -->
<label class="layui-form-label" style="width: auto;">学号</label>
<!-- 创建一个表单标签label元素用于标识后面的输入框对应的含义这里显示文本为“学号”并通过内联样式设置宽度为自适应width: auto -->
<div class="layui-input-inline">
<!-- 创建一个用于放置输入框的内联div容器在layui框架的表单布局里它控制着输入框的显示样式及宽度等 -->
<input type="tel" name="s_id" value="${condition.s_id[0]}" autocomplete="off" class="layui-input">
<!-- 创建一个文本输入框input元素类型为电话号码type: tel名称为“s_id”其值通过EL表达式从名为“condition”的对象中获取学号信息进行回显可能是上次查询输入的学号用于保留历史查询条件关闭自动完成功能autocomplete="off"并应用layui框架的输入框样式类layui-input用于让用户输入要查询的学生学号 -->
</div>
<label class="layui-form-label" style="width: auto;">姓名</label>
<div class="layui-input-inline">
<input type="text" name="s_name" value="${condition.s_name[0]}" autocomplete="off" class="layui-input">
<!-- 同样创建一个文本输入框类型为文本type: text名称为“s_name”通过EL表达式回显上次输入的姓名信息关闭自动完成功能用于让用户输入要查询的学生姓名 -->
</div>
<form style="padding-top: 20px;" action="${pageContext.request.contextPath}/findStudentByPageServlet" method="post">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label" style="width: auto;">学号</label>
<div class="layui-input-inline">
<input type="tel" name="s_id" value="${condition.s_id[0]}" autocomplete="off" class="layui-input">
</div>
<label class="layui-form-label" style="width: auto;">姓名</label>
<div class="layui-input-inline">
<input type="text" name="s_name" value="${condition.s_name[0]}" autocomplete="off" class="layui-input">
</div>
<div class="layui-input-inline">
<button type="submit" class="layui-btn">查询</button>
<!-- 创建一个提交按钮button类型为提交type: submit应用layui框架的按钮样式类layui-btn点击该按钮会触发表单提交操作将用户在学号和姓名输入框中输入的查询条件发送到指定的Servlet进行学生信息查询 -->
<a class="layui-btn layui-btn-danger" href="javascript:void(0);" id="deleteSelectStudent">删除选中</a>
<!-- 创建一个超链接a标签应用layui框架的危险样式按钮类layui-btn layui-btn-danger表示红色警示样式按钮设置href属性为“javascript:void(0);”使其点击时不进行实际的页面跳转设置id为“deleteSelectStudent”用于后续绑定JavaScript事件实现删除选中学生信息的功能 -->
</div>
<div class="layui-input-inline">
<button type="submit" class="layui-btn">查询</button>
<a class="layui-btn layui-btn-danger" href="javascript:void(0);" id="deleteSelectStudent">删除选中</a>
</div>
</div>
</form>
</div>
</form>
<form id="selectStudent" action="${pageContext.request.contextPath}/deleteSelectStudentServlet" method="post">
<table class="layui-table" lay-filter="test">
<thead>
<tr>
<th><input id="firstCb" type="checkbox" class="my-checkbox" name="" title="" lay-skin="primary"></th>
<th>ID</th>
<th>学号</th>
<th>学院</th>
<th>系别</th>
<th>班级</th>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>城市</th>
<th>手机号</th>
<th>邮箱</th>
<th>操作</th>
</tr>
</thead>
<form id="selectStudent" action="${pageContext.request.contextPath}/deleteSelectStudentServlet" method="post">
<!-- 创建另一个表单元素设置id为“selectStudent”用于标记这个表单其action属性设置为提交到名为deleteSelectStudentServlet的Servlet通过EL表达式获取上下文路径拼接而成提交方式为POST该表单主要用于批量删除选中的学生信息 -->
<table class="layui-table" lay-filter="test">
<!-- 创建一个layui框架的表格组件设置名为“test”的过滤器该过滤器可在后续JavaScript代码中用于配置表格相关交互功能例如实现表格行点击事件、数据筛选、排序等操作 -->
<thead>
<c:forEach items="${pb.list}" var="student" varStatus="s">
<tr>
<th><input id="firstCb" type="checkbox" class="my-checkbox" name="" title="" lay-skin="primary"></th>
<th>ID</th>
<th>学号</th>
<th>学院</th>
<th>系别</th>
<th>班级</th>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>城市</th>
<th>手机号</th>
<th>邮箱</th>
<th>操作</th>
<!-- 定义表格头部的列标题分别列出要展示的学生相关的各个字段如全选复选框通过一个带有特定样式和属性的input复选框实现、序号ID、学号、学院、系别、班级、姓名、性别、年龄、城市、手机号、邮箱以及操作用于进行修改、删除等相关操作 -->
<th><input type="checkbox" class="my-checkbox" name="sid" value="${student.s_id}" title="" lay-skin="primary"></th>
<td>${s.count}</td>
<td>${student.s_id}</td>
<td>${student.s_college}</td>
<td>${student.s_department}</td>
<td>${student.s_class}</td>
<td>${student.s_name}</td>
<td>${student.s_sex}</td>
<td>${student.s_age}</td>
<td>${student.s_address}</td>
<td>${student.s_phone}</td>
<td>${student.s_email}</td>
<td><a class="layui-btn layui-btn-normal" href="${pageContext.request.contextPath}/updateStudentServlet?sid=${student.s_id}">修改</a><a class="layui-btn layui-btn-danger" href="javascript:deleteStudent(${student.s_id});">删除</a></td>
</tr>
</thead>
<c:forEach items="${pb.list}" var="student" varStatus="s">
<!-- 使用JSTL的forEach标签进行循环遍历操作循环的对象是名为“pb.list”的数据集合通常是从后端传递过来的分页后的学生信息列表每次循环将当前元素赋值给变量“student”同时利用“varStatus”获取循环状态信息如当前循环次数等并赋值给变量“s” -->
<tr>
<th><input type="checkbox" class="my-checkbox" name="sid" value="${student.s_id}" title="" lay-skin="primary"></th>
<td>${s.count}</td>
<td>${student.s_id}</td>
<td>${student.s_college}</td>
<td>${student.s_department}</td>
<td>${student.s_class}</td>
<td>${student.s_name}</td>
<td>${student.s_sex}</td>
<td>${student.s_age}</td>
<td>${student.s_address}</td>
<td>${student.s_phone}</td>
<td>${student.s_email}</td>
<td><a class="layui-btn layui-btn-normal" href="${pageContext.request.contextPath}/updateStudentServlet?sid=${student.s_id}">修改</a><a class="layui-btn layui-btn-danger" href="javascript:deleteStudent(${student.s_id});">删除</a></td>
<!-- 在表格的每一行中通过EL表达式Expression Language如${s.count}等)分别展示对应的数据:
先创建一个复选框input类型为checkbox设置类名、名称、值以及相关样式属性用于单独选中某一行学生信息以便进行批量操作如批量删除
然后依次展示学生的序号(通过${s.count}表示当前循环次数)、学号、学院、系别、班级、姓名、性别、年龄、城市、手机号、邮箱等具体信息;
最后一列创建两个超链接a标签分别应用layui框架的不同样式按钮类一个是常规样式layui-btn layui-btn-normal用于跳转到修改学生信息的页面通过拼接学生ID参数传递给对应的Servlet另一个是危险样式layui-btn layui-btn-danger点击后会调用名为deleteStudent的JavaScript函数并传递当前学生的ID作为参数用于删除当前行对应的学生信息 -->
</tr>
</c:forEach>
</table>
</form>
</c:forEach>
</table>
</form>
<%-- <div class="layui-box layui-laypage layui-laypage-default" id="layui-laypage-1"><a href="javascript:;" class="layui-laypage-prev" data-page="3">上一页</a><a href="javascript:;" data-page="1">1</a><a href="javascript:;" data-page="2">2</a><a href="javascript:;" data-page="3">3</a><span class="layui-laypage-curr"><em class="layui-laypage-em"></em><em>4</em></span><a href="javascript:;" data-page="5">5</a><a href="javascript:;" class="layui-laypage-next" data-page="5">下一页</a></div>--%>
<ul>
<!-- 创建一个无序列表ul元素用于构建分页导航链接 -->
<ul>
<c:if test="${pb.currentPage == 1}">
<a href ="javascript:return false;">
<!-- 使用JSTL的条件判断标签c:if当名为“pb”的对象中的当前页码currentPage等于1时创建一个超链接a标签设置href属性为“javascript:return false;”,使其点击时不执行实际的页面跳转,用于禁用上一页链接(因为已经是第一页了) -->
</c:if>
<c:if test="${pb.currentPage!= 1}">
<a href="${pageContext.request.contextPath}/findStudentByPageServlet?currentPage=${pb.currentPage-1}&rows=5&s_id=${condition.s_id[0]}&s_name=${condition.s_name[0]}">
<!-- 当当前页码不等于1时创建一个超链接链接地址指向名为findStudentByPageServlet的Servlet并通过EL表达式动态传递当前页码减1、每页显示行数、学号查询条件、姓名查询条件等参数用于跳转到上一页的学生信息查询结果页面 -->
</c:if>
<li class="page-li">上一页</li></a>
<!-- 创建一个列表项li元素应用“page-li”类名可能对应特定样式显示文本为“上一页”作为分页导航中的上一页按钮文本 -->
</a>
<c:forEach begin="1" end="${pb.totalPage}" var="i">
<!-- 使用JSTL的forEach标签进行循环从1开始到总页数totalPage结束每次循环变量为“i”用于生成页码导航链接 -->
<c:if test="${pb.currentPage == i}">
<a href="${pageContext.request.contextPath}/findStudentByPageServlet?currentPage=${i}&rows=5&s_id=${condition.s_id[0]}&s_name=${condition.s_name[0]}"><li class="page-li" style="background-color: #009688;border-radius: 2px;color: white;">${i}</li></a>
<!-- 当当前页码等于循环中的页码“i”时创建一个超链接链接地址同样指向findStudentByPageServlet并传递相关参数内部包含一个列表项元素应用“page-li”类名并通过内联样式设置背景颜色、边框圆角和文本颜色显示当前页码用于突出显示当前所在页码 -->
</c:if>
<c:if test="${pb.currentPage!= i}">
<a href="${pageContext.request.contextPath}/findStudentByPageServlet?currentPage=${i}&rows=5&s_id=${condition.s_id[0]}&s_name=${condition.s_name[0]}"><li class="page-li">${i}</li></a>
<!-- 当当前页码不等于循环中的页码“i”时创建类似的超链接和列表项元素只是列表项元素的样式为普通样式用于显示其他页码链接 -->
</c:if>
</c:forEach>
<c:if test="${pb.currentPage == 1}">
<a href ="javascript:return false;">
</c:if>
<c:if test="${pb.currentPage != 1}">
<a href="${pageContext.request.contextPath}/findStudentByPageServlet?currentPage=${pb.currentPage-1}&rows=5&s_id=${condition.s_id[0]}&s_name=${condition.s_name[0]}">
</c:if>
<c:if test="${pb.currentPage == pb.totalPage}">
<a href="javascript:return false;">
<!-- 当当前页码等于总页数时创建一个超链接设置href属性使其点击不跳转用于禁用下一页链接因为已经是最后一页了 -->
<li class="page-li">上一页</li></a>
</a>
<c:forEach begin="1" end="${pb.totalPage}" var="i">
<c:if test="${pb.currentPage == i}">
<a href="${pageContext.request.contextPath}/findStudentByPageServlet?currentPage=${i}&rows=5&s_id=${condition.s_id[0]}&s_name=${condition.s_name[0]}"><li class="page-li" style="background-color: #009688;border-radius: 2px;color: white;">${i}</li></a>
</c:if>
<c:if test="${pb.currentPage!= pb.totalPage}">
<a href="${pageContext.request.contextPath}/findStudentByPageServlet?currentPage=${pb.currentPage+1}&rows=5&s_id=${condition.s_id[0]}&s_name=${condition.s_name[0]}">
<!-- 当当前页码不等于总页数时创建超链接链接地址指向findStudentByPageServlet并传递当前页码加1等参数用于跳转到下一页的学生信息查询结果页面 -->
<c:if test="${pb.currentPage != i}">
<a href="${pageContext.request.contextPath}/findStudentByPageServlet?currentPage=${i}&rows=5&s_id=${condition.s_id[0]}&s_name=${condition.s_name[0]}"><li class="page-li">${i}</li></a>
</c:if>
<li class="page-li">下一页</li></a>
<!-- 创建列表项元素,显示文本为“下一页”,作为分页导航中的下一页按钮文本 -->
</ul>
</c:forEach>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 0px;">
<legend>共${pb.totalCount}条记录,共${pb.totalPage}页</legend>
<!-- 创建一个字段集fieldset元素应用layui框架的相关样式类设置顶部外边距为0px内部包含一个图例legend元素通过EL表达式显示总记录数totalCount和总页数totalPage用于向用户展示学生信息查询结果的统计情况让用户清楚知晓数据的总量以及分页的情况 -->
</fieldset>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含名为footer.jsp的页面一般此页面用于展示页面底部的一些通用信息比如版权声明、网站相关链接、联系方式等内容 -->
</div>
<c:if test="${pb.currentPage == pb.totalPage}">
<a href="javascript:return false;">
</c:if>
<c:if test="${pb.currentPage != pb.totalPage}">
<a href="${pageContext.request.contextPath}/findStudentByPageServlet?currentPage=${pb.currentPage+1}&rows=5&s_id=${condition.s_id[0]}&s_name=${condition.s_name[0]}">
</c:if>
<li class="page-li">下一页</li></a>
</ul>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 0px;">
<legend>共${pb.totalCount}条记录,共${pb.totalPage}页</legend>
</fieldset>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<script type="text/javascript">
$("#nav li:nth-child(2) dl dd:nth-child(1)").addClass("layui-this");
// 使用jQuery选择器选中页面中id为“nav”的元素下的第2个子元素li下的dl元素下的第1个dd元素并为其添加类名“layui-this”。在layui框架中添加这个类名通常意味着将对应的导航菜单项标记为当前选中状态使其呈现特定的样式比如改变颜色、加粗等以此表明当前所在页面功能模块对应的菜单选项
$("#nav li:nth-child(2)").addClass("layui-nav-itemed");
// 同样使用jQuery选择器选中页面中id为“nav”的元素下的第2个子元素li并为其添加类名“layui-nav-itemed”。在layui框架里这个类名可能用于控制导航菜单的展开或折叠状态让对应的菜单层级结构展示相应的效果方便用户查看相关的子菜单
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
// 使用layui框架的element模块调用其init方法进行初始化操作。在layui框架中element模块提供了很多页面元素交互相关的功能例如实现页面布局动态切换、菜单展开收起等交互效果通过调用init方法可以激活这些功能确保页面上基于element模块构建的各种UI组件能够正常工作
});
</script>
<script>
function deleteStudent(s_id) {
if (confirm("你确定删除该学生吗?")) {
location.href = "${pageContext.request.contextPath}/deleteStudentServlet?s_id=" + s_id;
// 定义一个名为deleteStudent的函数接收学生的IDs_id作为参数。在函数内部通过JavaScript的confirm函数弹出一个确认框询问用户是否确定要删除该学生。当用户点击确定即confirm函数返回true使用location.href属性将页面重定向到名为deleteStudentServlet的Servlet并通过URL拼接的方式传递要删除的学生的ID参数从而触发后端对应的删除学生信息的逻辑
}
<script type="text/javascript">
$("#nav li:nth-child(2) dl dd:nth-child(1)").addClass("layui-this");
$("#nav li:nth-child(2)").addClass("layui-nav-itemed");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
<script>
function deleteStudent(s_id) {
if (confirm("你确定删除该学生吗?")) {
location.href = "${pageContext.request.contextPath}/deleteStudentServlet?s_id=" + s_id;
}
}
window.onload = function () {
document.getElementById("deleteSelectStudent").onclick = function () {
var flag = false;
var cbs = document.getElementsByName("sid");
for (var i = 0; i < cbs.length; i++) {
if (cbs[i].checked) {
// 为id为“deleteSelectStudent”的元素也就是页面上的“删除选中”按钮绑定点击事件处理函数。在函数内部首先定义一个标志变量flag并初始化为false然后通过document.getElementsByName获取所有名为“sid”的元素即表格中每行学生对应的复选框接着循环遍历这些复选框当有任何一个复选框被选中即其checked属性为true将flag设置为true并跳出循环
flag = true;
break;
}
window.onload = function () {
document.getElementById("deleteSelectStudent").onclick = function () {
var flag = false;
var cbs = document.getElementsByName("sid");
for (var i = 0; i < cbs.length; i++) {
if (cbs[i].checked) {
//有一个条目选中了,那么就不显示提示删除框
//且不提交
flag = true;
break;
}
if (flag) {
if (confirm("你确定要删除选中条目吗?")) {
document.getElementById("selectStudent").submit();
// 如果有复选框被选中即flag为true则再次弹出确认框询问用户是否确定要删除选中的条目。当用户确认后通过document.getElementById获取id为“selectStudent”的表单元素并调用其submit方法触发表单提交操作将选中的学生信息通过表单中复选框的name和value属性传递选中学生的ID等相关数据发送到对应的Servlet前面设置的action为deleteSelectStudentServlet以进行批量删除操作
}
}
}
document.getElementById("firstCb").onclick = function () {
var cbs = document.getElementsByName("sid");
for (var i = 0; i < cbs.length; i++) {
cbs[i].checked = this.checked;
// 为id为“firstCb”的元素即表格头部的全选复选框绑定点击事件处理函数。在函数内部先获取所有名为“sid”的复选框元素然后循环遍历它们将每个复选框的checked属性设置为与全选复选框this表示当前点击的元素也就是“firstCb”的checked属性一致以此实现全选或全不选的功能
if (flag) {
if (confirm("你确定要删除选中条目吗?")) {
document.getElementById("selectStudent").submit();
}
}
}
</script>
document.getElementById("firstCb").onclick = function () {
var cbs = document.getElementsByName("sid");
for (var i = 0; i < cbs.length; i++) {
cbs[i].checked = this.checked;
}
}
}
</script>
</body>
</html>
</html>

@ -1,44 +1,27 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 上述两行是JSP页面的相关指令
第一行用于设定该JSP页面的内容类型为text/html即表明这是一个HTML格式的页面同时指定字符编码为UTF-8并且表明页面使用Java语言来处理相关逻辑。
第二行引入了JSTLJavaServer Pages Standard Tag Library核心标签库定义其前缀为“c”后续就能通过这个前缀使用JSTL提供的各类标签比如用于循环遍历、条件判断等操作的标签方便在JSP页面中进行动态数据处理 -->
<html>
<head>
<title>查询教师</title>
<!-- 设置当前HTML页面的标题为“查询教师”此标题会显示在浏览器的标题栏中让用户直观知晓该页面的主要功能 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件通过相对路径从当前页面所在目录下的css文件夹中查找应用layui框架所提供的样式可用于页面布局、组件美化等使页面呈现出layui框架特有的外观风格 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的样式表文件style.css同样采用相对路径引用用于添加符合特定需求的个性化页面样式对页面显示效果做进一步定制 -->
<script src="./layui.js"></script>
<!-- 引入layui框架的JavaScript脚本文件从当前页面所在目录获取该文件layui脚本为页面提供众多交互功能以及各种组件支持比如实现菜单交互、页面元素动态展示等 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 从CDN内容分发网络引入jQuery库的最小化版本jQuery是常用的JavaScript库能简化页面中对DOM元素的操作、事件处理以及实现各种动画效果等方便开发人员编写JavaScript代码来实现页面交互逻辑 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 为页面主体body设置类名“layui-layout-body”同时将背景颜色设定为浅灰色#F2F2F2这里的类名大概率与layui框架的布局样式相关联按照其框架规范来构建页面整体外观 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 通过JSP的include指令包含名为filterLogin.jsp的页面内容通常这个页面用于处理用户登录相关的验证逻辑或者展示登录相关的界面元素比如登录表单等以此保证只有登录后的用户可访问后续页面内容 -->
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<!-- 包含位于WEB-INF/admin目录下的aHeader.jsp页面一般用于构建页面的头部区域可能包含网站logo、导航栏等常见的头部元素起到统一页面头部布局的作用 -->
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<!-- 再次使用JSP的include指令包含WEB-INF/admin目录下的adminNav.jsp页面通常用来展示管理员端特有的导航菜单内容便于用户在不同功能模块间进行切换操作 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<!-- 创建一个div元素并赋予其两个类名“layui-layout”和“layui-layout-admin”这一般是layui框架中用于定义页面整体布局结构的特定类名遵循layui框架的布局规范来划分页面不同区域 -->
<div class="layui-body">
<!-- 在上述布局div内部再创建一个div元素类名为“layui-body”在layui框架里该区域通常用于承载页面的主要内容例如展示各类业务数据、操作按钮等 -->
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 新建一个div元素并通过内联样式设置其四周内边距为15px主要用于对内部元素进行排版让页面内容看起来更规整避免显得过于紧凑或松散 -->
<span class="layui-breadcrumb">
<a href="">管理员</a>
<a href="">教师管理</a>
<a><cite>查询教师</cite></a>
</span>
<!-- 创建一个layui框架提供的面包屑导航组件通过一系列超链接a标签展示当前页面在整个系统中的层级路径这里展示了从“管理员”进入“教师管理”再到“查询教师”页面但超链接的href属性为空可能后续需完善具体跳转地址以实现页面导航功能 -->
<table class="layui-table" lay-filter="test">
<!-- 创建一个layui框架的表格组件设置名为“test”的过滤器该过滤器可在后续JavaScript代码中用于配置表格相关交互功能例如实现表格行点击事件、数据筛选、排序等操作 -->
<thead>
<tr>
<th>ID</th>
@ -48,12 +31,10 @@
<th>文化程度</th>
<th>职称</th>
<th>操作</th>
<!-- 定义表格头部的列标题分别列出要展示的教师相关的各个字段如序号ID、工号、姓名、性别、文化程度、职称以及操作用于进行修改、删除等相关操作 -->
</tr>
</thead>
<c:forEach items="${teachers}" var="teacher" varStatus="t">
<!-- 使用JSTL的forEach标签进行循环遍历操作循环的对象是名为“teachers”的数据集合通常是从后端传递过来的教师信息列表每次循环将当前元素赋值给变量“teacher”同时利用“varStatus”获取循环状态信息如当前循环次数等并赋值给变量“t” -->
<tr>
<td>${t.count}</td>
<td>${teacher.t_id}</td>
@ -62,41 +43,33 @@
<td>${teacher.t_education}</td>
<td>${teacher.t_title}</td>
<td><a class="layui-btn layui-btn-normal" href="${pageContext.request.contextPath}/updateTeacherServlet?tid=${teacher.t_id}">修改</a><a class="layui-btn layui-btn-danger" href="javascript:deleteTeacher(${teacher.t_id});">删除</a></td>
<!-- 在表格的每一行中通过EL表达式Expression Language如${t.count}等)分别展示对应的数据:
先展示序号(通过${t.count}表示当前循环次数),然后依次展示工号、姓名、性别、文化程度、职称等具体信息;
最后一列创建两个超链接a标签分别应用layui框架的不同样式按钮类一个是常规样式layui-btn layui-btn-normal用于跳转到修改教师信息的页面通过拼接教师ID参数传递给对应的Servlet另一个是危险样式layui-btn layui-btn-danger点击后会调用名为deleteTeacher的JavaScript函数并传递当前教师的ID作为参数用于删除当前行对应的教师信息 -->
</tr>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含名为footer.jsp的页面一般用于展示页面底部的一些通用信息比如版权声明、网站相关链接、联系方式等内容 -->
</div>
</div>
</div>
<script type="text/javascript">
$("#nav li:nth-child(3) dl dd:nth-child(1)").addClass("layui-this");
// 使用jQuery选择器选中页面中id为“nav”的元素下的第3个子元素li下的dl元素下的第1个dd元素并为其添加类名“layui-this”在layui框架中添加这个类名通常意味着将对应的导航菜单项标记为当前选中状态使其呈现特定的样式如改变颜色、加粗等以此表明当前所在页面功能模块对应的菜单选项
$("#nav li:nth-child(3)").addClass("layui-nav-itemed");
// 同样用jQuery选择器选中页面中id为“nav”的元素下的第3个子元素li并为其添加类名“layui-nav-itemed”在layui框架里这个类名可能用于控制导航菜单的展开或折叠状态让对应的菜单层级结构展示相应效果方便用户查看相关子菜单
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
// 使用layui框架的element模块调用其init方法进行初始化操作。在layui框架中element模块提供了很多页面元素交互相关的功能例如实现页面布局动态切换、菜单展开收起等交互效果通过调用init方法可激活这些功能确保页面上基于element模块构建的各种UI组件能正常工作
});
</script>
<script>
function deleteTeacher(t_id) {
if (confirm("你确定删除该教师吗?")) {
location.href = "${pageContext.request.contextPath}/deleteTeacherServlet?tid=" + t_id;
// 定义一个名为deleteTeacher的函数接收教师的IDt_id作为参数在函数内部通过JavaScript的confirm函数弹出一个确认框询问用户是否确定删除该教师当用户点击确定返回true使用location.href属性将页面重定向到名为deleteTeacherServlet的Servlet并通过URL拼接传递要删除的教师的ID参数从而触发后端对应的删除教师信息的逻辑
}
<script type="text/javascript">
$("#nav li:nth-child(3) dl dd:nth-child(1)").addClass("layui-this");
$("#nav li:nth-child(3)").addClass("layui-nav-itemed");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
<script>
function deleteTeacher(t_id) {
if (confirm("你确定删除该教师吗?")) {
location.href = "${pageContext.request.contextPath}/deleteTeacherServlet?tid=" + t_id;
}
</script>
}
</script>
</body>
</html>
</html>

@ -1,85 +1,55 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!-- 这是JSP页面的指令用于设置页面的相关属性。
contentType指定页面响应的内容类型为HTML字符编码采用UTF-8。
language表示使用的编程语言是JavapageEncoding同样指定页面编码为UTF-8确保能正确处理中文等各种字符 -->
<html>
<head>
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件路径为相对路径下的css/layui.css用于页面的样式布局等美化 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的样式表文件style.css相对路径用于添加项目特定的样式规则 -->
<link rel="icon" href="./images/favicon.ico" type="image/x-icon">
<!-- 设置页面的图标图标文件位于相对路径下的images/favicon.ico指定图标类型为image/x-icon -->
<link rel="shortcut icon" href="./images/favicon.ico" type="image/x-icon">
<!-- 同样是设置页面的快捷方式图标,与上面的图标设置类似,很多浏览器会根据此显示页面标签上的小图标 -->
<script src="layui.js"></script>
<!-- 引入layui框架的JavaScript脚本文件用于实现layui框架相关的功能 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 从CDN内容分发网络引入jQuery库的最小化版本jQuery是常用的JavaScript库方便进行DOM操作、事件处理等 -->
</head>
<body class="layui-layout-body">
<!-- 设置body标签的类名为layui-layout-body可能会被相关的样式表用于布局等样式应用 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建一个具有layui-layout和layui-layout-admin类名的div可能是用于整体的页面布局框架layui框架相关的布局样式会作用于此 -->
<div class="layui-header">
<!-- 这是页面头部区域的div通常放置一些导航、标题等元素 -->
<div class="layui-logo" style="font-size: 52px">SIMS</div>
<!-- 创建一个具有layui-logo类名的div显示内容为“SIMS”并且设置字体大小为52px可能是页面的标识、系统名称等 -->
<!-- 头部区域可配合layui已有的水平导航 -->
<ul class="layui-nav layui-layout-left">
<!-- 创建一个无序列表类名为layui-nav和layui-layout-left用于放置左侧的导航栏元素layui-nav类名表明这是layui框架的导航组件 -->
<li class="layui-nav-item"><a class = "layui-icon layui-icon-home" id="fresh" href="index.jsp"> 主页</a></li>
<!-- 创建一个列表项里面包含一个链接。链接具有layui-icon和layui-icon-home类名可能用于显示特定图标id为fresh点击链接会跳转到index.jsp页面显示的文本为“主页” -->
<li class="layui-nav-item "><a class = "layui-icon layui-icon-refresh-3" href="javascript:location.reload();"> 刷新</a></li>
<!-- 类似上面的列表项这个链接点击时会执行JavaScript代码location.reload()来刷新当前页面图标类名为layui-icon-refresh-3显示文本为“刷新” -->
<li class="layui-nav-item">
<a class="layui-icon layui-icon-link" href="javascript:;"> 其它</a>
<!-- 创建一个列表项里面的链接初始点击没有具体跳转地址href为javascript:;图标类名为layui-icon-link显示文本为“其它”可能后续通过JavaScript动态添加功能 -->
<dl class="layui-nav-child">
<!-- 在这个列表项里创建一个定义列表类名为layui-nav-child通常用于显示下拉菜单等子导航内容 -->
<dd><a href="#">小吐槽</a></dd>
<!-- 定义列表中的一项里面的链接暂时没有具体跳转地址href为#),显示文本为“小吐槽”,可能后续添加对应功能 -->
<dd><a href="#">学校公告</a></dd>
<!-- 同样是定义列表中的一项链接暂时无实际跳转href为#),显示文本为“学校公告” -->
</dl>
</li>
</ul>
<ul class="layui-nav layui-layout-right">
<!-- 创建一个无序列表类名为layui-nav和layui-layout-right用于放置右侧的导航栏元素 -->
<li class="layui-nav-item">
<a href="javascript:;">
<!-- 列表项中的链接初始点击无具体跳转href为javascript:;可能后续添加对应JavaScript逻辑 -->
<img src="https://cdn.yoyling.com/logo.png" class="layui-nav-img">
<!-- 显示一张图片图片来源是指定的URL并且具有layui-nav-img类名可能是用户头像等用途 -->
${admin.a_id} 管理员
<!-- 这里使用了EL表达式Expression Language${admin.a_id},可能是从后台获取管理员的编号等信息并显示,后面跟着文本“管理员” -->
</a>
<dl class="layui-nav-child">
<!-- 同样创建一个定义列表,用于显示下拉菜单等子导航内容 -->
<dd><a href="#">个人信息</a></dd>
<!-- 定义列表项链接暂时无实际跳转href为#),显示文本为“个人信息” -->
<dd><a href="${pageContext.request.contextPath}/logoutServlet">退出</a></dd>
<!-- 定义列表项链接指向名为logoutServlet的后端资源路径通过pageContext.request.contextPath获取当前项目的上下文路径拼接显示文本为“退出”用于执行退出登录等相关操作 -->
</dl>
</li>
<li class="layui-nav-item"><a class="layui-icon layui-icon-about" href="JavaScript:alertabout()"> 关于</a></li>
<!-- 列表项中的链接点击时会调用名为alertabout的JavaScript函数图标类名为layui-icon-about显示文本为“关于” -->
</ul>
</div>
<div class="layui-layout layui-layout-admin">
<div class="layui-header">
<div class="layui-logo" style="font-size: 52px">SIMS</div>
<!-- 头部区域可配合layui已有的水平导航 -->
<ul class="layui-nav layui-layout-left">
<li class="layui-nav-item"><a class = "layui-icon layui-icon-home" id="fresh" href="index.jsp"> 主页</a></li>
<li class="layui-nav-item "><a class = "layui-icon layui-icon-refresh-3" href="javascript:location.reload();"> 刷新</a></li>
<li class="layui-nav-item">
<a class="layui-icon layui-icon-link" href="javascript:;"> 其它</a>
<dl class="layui-nav-child">
<dd><a href="#">小吐槽</a></dd>
<dd><a href="#">学校公告</a></dd>
</dl>
</li>
</ul>
<ul class="layui-nav layui-layout-right">
<li class="layui-nav-item">
<a href="javascript:;">
<img src="https://cdn.yoyling.com/logo.png" class="layui-nav-img">
${admin.a_id} 管理员
</a>
<dl class="layui-nav-child">
<dd><a href="#">个人信息</a></dd>
<dd><a href="${pageContext.request.contextPath}/logoutServlet">退出</a></dd>
</dl>
</li>
<li class="layui-nav-item"><a class="layui-icon layui-icon-about" href="JavaScript:alertabout()"> 关于</a></li>
</ul>
</div>
<script>
//注意:导航 依赖 element 模块,否则无法进行功能性操作
layui.use('element', function(){
var element = layui.element;
element.init();
});
<!-- 使用layui框架的use方法来加载element模块加载成功后获取element对象并调用其init方法对页面中的相关元素进行初始化等操作确保导航等功能正常使用 -->
</script>
<script type="text/javascript">
function alertabout() {
alert("学生信息管理系统\n陈双全1812123206");
}
<!-- 定义一个名为alertabout的JavaScript函数当函数被调用时会弹出一个包含“学生信息管理系统”以及“陈双全1812123206”内容的提示框 -->
</script>
</div>
<script>
//注意:导航 依赖 element 模块,否则无法进行功能性操作
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
<script type="text/javascript">
function alertabout() {
alert("学生信息管理系统\n陈双全1812123206");
}
</script>
</body>
</html>
</html>

@ -1,22 +1,17 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- JSP页面指令设置页面响应的内容类型为HTML字符编码采用UTF-8使用的编程语言为Java -->
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 引入JSTLJavaServer Pages Standard Tag Library核心标签库前缀为“c”后续可以使用该前缀来调用核心标签库中的各种标签 -->
<html>
<head>
<title>${html_title}</title>
<!-- 设置页面的标题这里使用了EL表达式Expression Language${html_title},意味着标题的值可能是从后台动态传递过来的 -->
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
<!-- 使用layui框架的use方法加载element模块加载成功后获取element对象并调用其init方法对页面中的相关元素进行初始化等操作确保layui框架相关的导航、布局等功能正常使用 -->
</script>
<style>
.layui-card.layui-card-body.layui-icon {
.layui-card .layui-card-body .layui-icon {
display: inline-block;
width: 100%;
height: 60px;
@ -26,163 +21,127 @@
font-size: 30px;
background-color: #F8F8F8;
color: #333;
transition: all.3s;
-webkit-transition: all.3s;
transition: all .3s;
-webkit-transition: all .3s;
}
<!-- 对类名为layui-card下的layui-card-body里的layui-icon元素设置样式。使其以块级元素内联显示设置宽度、高度、行高、文本对齐方式、边框圆角、字体大小、背景颜色、文字颜色以及过渡效果等样式属性 -->
.layui-card.layui-card-body {
.layui-card .layui-card-body {
text-align: center;
}
<!-- 对类名为layui-card下的layui-card-body元素设置文本对齐方式为居中 -->
#notify {
text-align: left;
}
<!-- 对id为notify的元素设置文本对齐方式为左对齐 -->
</style>
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 设置body标签的类名为layui-layout-body并设置背景颜色为#F2F2F2类名可能会被layui框架相关样式应用 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 使用JSP的include指令包含名为filterLogin.jsp的页面内容可能用于处理登录相关的过滤、验证等逻辑 -->
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<!-- 包含位于WEB-INF/admin目录下的aHeader.jsp页面内容通常用于展示页面头部相关的布局、导航等元素 -->
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<!-- 包含位于WEB-INF/admin目录下的adminNav.jsp页面内容大概率是用于展示管理员相关的导航栏内容 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建一个具有layui-layout和layui-layout-admin类名的div可能是用于整体的页面布局框架layui框架相关的布局样式会作用于此 -->
<div class="layui-body">
<!-- 这是页面的主体内容区域的div -->
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 创建一个带有内边距为15px的div用于放置具体的内容模块 -->
<div class="layui-card">
<!-- 创建一个具有layui-card类名的div通常是layui框架中卡片式布局的容器 -->
<div class="layui-card-header" id="index-function">功能</div>
<!-- 创建一个具有layui-card-header类名且id为index-function的div用于显示卡片的头部标题这里标题为“功能” -->
<div class="layui-card-body">
<!-- 创建一个具有layui-card-body类名的div用于放置卡片的主体内容 -->
<ul class="layui-row layui-col-space10 layui-this">
<!-- 创建一个无序列表应用了layui框架相关的类名layui-row表示行布局layui-col-space10可能用于设置列之间的间距layui-this可能是表示当前选中之类的样式相关类名 -->
<li class="layui-col-xs3">
<!-- 创建一个列表项应用了layui-col-xs3类名表示该列在小屏幕xs下占3份可能基于layui的栅格系统 -->
<a lay-href="/mavenTemplate/student/query">
<!-- 创建一个链接使用了layui框架自定义的属性lay-href来指定跳转地址指向/mavenTemplate/student/query路径 -->
<i class="layui-icon layui-icon-survey"></i>
<!-- 创建一个图标元素应用了layui-icon和layui-icon-survey类名用于显示特定图标 -->
<cite>选课列表</cite>
<!-- 使用cite标签包裹文本“选课列表”用于表示引用等语义在这里可能就是显示链接对应的文字说明 -->
</a>
</li>
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/class/query">
<i class="layui-icon layui-icon-survey"></i>
<cite>可选课程</cite>
</a>
</li>
<!-- 与上面类似的列表项结构,链接指向/mavenTemplate/class/query路径显示文本为“可选课程” -->
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/major/query">
<i class="layui-icon layui-icon-survey"></i>
<cite>查询学生</cite>
</a>
</li>
<!-- 链接指向/mavenTemplate/major/query路径显示文本为“查询学生” -->
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/user/info">
<i class="layui-icon layui-icon-user"></i>
<cite>增加学生</cite>
</a>
</li>
<!-- 链接指向/mavenTemplate/user/info路径显示文本为“增加学生” -->
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/user/password">
<i class="layui-icon layui-icon-set"></i>
<cite>查询教师</cite>
</a>
</li>
<!-- 链接指向/mavenTemplate/user/password路径显示文本为“查询教师” -->
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/user/email">
<i class="layui-icon layui-icon-set"></i>
<cite>增加教师</cite>
</a>
</li>
<!-- 链接指向/mavenTemplate/user/email路径显示文本为“增加教师” -->
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/student/modify">
<i class="layui-icon layui-icon-survey"></i>
<cite>学院专业查询</cite>
</a>
</li>
<!-- 链接指向/mavenTemplate/student/modify路径显示文本为“学院专业查询” -->
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/student/modify">
<i class="layui-icon layui-icon-survey"></i>
<cite>学院专业增加</cite>
</a>
</li>
<!-- 链接同样指向/mavenTemplate/student/modify路径显示文本为“学院专业增加” -->
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/student/modify">
<i class="layui-icon layui-icon-survey"></i>
<cite>公告发布</cite>
</a>
</li>
<!-- 链接指向/mavenTemplate/student/modify路径显示文本为“公告发布” -->
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/student/modify">
<i class="layui-icon layui-icon-survey"></i>
<cite>公告列表</cite>
</a>
</li>
<!-- 链接指向/mavenTemplate/student/modify路径显示文本为“公告列表” -->
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/student/modify">
<i class="layui-icon layui-icon-survey"></i>
<cite>文件发布</cite>
</a>
</li>
<!-- 链接指向/mavenTemplate/student/modify路径显示文本为“文件发布” -->
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/student/modify">
<i class="layui-icon layui-icon-survey"></i>
<cite>文件列表</cite>
</a>
</li>
<!-- 链接指向/mavenTemplate/student/modify路径显示文本为“文件列表” -->
</ul>
</div>
</div>
<div class="layui-card">
<!-- 创建另一个layui-card类名的卡片式布局容器 -->
<div class="layui-card-header">学校最新公告</div>
<!-- 设置卡片头部标题为“学校最新公告” -->
<c:forEach items="${notifys}" var="notify">
<!-- 使用JSTL的forEach标签循环遍历名为notifys的集合可能是从后台传递过来的公告数据集合每次循环将集合中的一个元素赋值给变量notify -->
<div class="layui-card-body" id="notify">${notify.notifyInfo}<p>${notify.notifyDate}</div>
<!-- 在卡片主体内容区域使用EL表达式展示当前公告元素notify中的notifyInfo公告信息内容和notifyDate公告日期这里的HTML结构不太规范<p>标签没有闭合,可能会导致渲染问题 -->
</c:forEach>
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<div class="layui-card">
<div class="layui-card-header" id="index-function">功能</div>
<div class="layui-card-body">
<ul class="layui-row layui-col-space10 layui-this">
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/student/query">
<i class="layui-icon layui-icon-survey"></i>
<cite>选课列表</cite>
</a>
</li>
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/class/query">
<i class="layui-icon layui-icon-survey"></i>
<cite>可选课程</cite>
</a>
</li>
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/major/query">
<i class="layui-icon layui-icon-survey"></i>
<cite>查询学生</cite>
</a>
</li>
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/user/info">
<i class="layui-icon layui-icon-user"></i>
<cite>增加学生</cite>
</a>
</li>
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/user/password">
<i class="layui-icon layui-icon-set"></i>
<cite>查询教师</cite>
</a>
</li>
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/user/email">
<i class="layui-icon layui-icon-set"></i>
<cite>增加教师</cite>
</a>
</li>
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/student/modify">
<i class="layui-icon layui-icon-survey"></i>
<cite>学院专业查询</cite>
</a>
</li>
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/student/modify">
<i class="layui-icon layui-icon-survey"></i>
<cite>学院专业增加</cite>
</a>
</li>
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/student/modify">
<i class="layui-icon layui-icon-survey"></i>
<cite>公告发布</cite>
</a>
</li>
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/student/modify">
<i class="layui-icon layui-icon-survey"></i>
<cite>公告列表</cite>
</a>
</li>
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/student/modify">
<i class="layui-icon layui-icon-survey"></i>
<cite>文件发布</cite>
</a>
</li>
<li class="layui-col-xs3">
<a lay-href="/mavenTemplate/student/modify">
<i class="layui-icon layui-icon-survey"></i>
<cite>文件列表</cite>
</a>
</li>
</ul>
</div>
</div>
<div class="layui-card">
<div class="layui-card-header">学校最新公告</div>
<c:forEach items="${notifys}" var="notify">
<div class="layui-card-body" id="notify">${notify.notifyInfo}<p>${notify.notifyDate}</div>
</c:forEach>
</div>
</div>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含名为footer.jsp的页面内容通常用于展示页面底部的相关信息如版权声明、联系方式等 -->
</div>
<script type="text/javascript">
document.onkeydown = function(e) {
e = window.event || e;
var k = e.keyCode;
}
<!-- 给document对象绑定keydown事件监听器当键盘按键被按下时触发该函数。在函数内将事件对象进行兼容处理兼容不同浏览器获取事件对象的方式然后获取按下按键的键码keyCode但目前代码里没有针对键码进行后续的具体操作 -->
</script>
<script type="text/javascript">
$("#nav li:nth-child(1)").addClass("layui-nav-itemed");
$("#nav li:nth-child(2)").addClass("layui-nav-itemed");
$("#nav li:nth-child(3)").addClass("layui-nav-itemed");
$("#nav li:nth-child(4)").addClass("layui-nav-itemed");
$("#nav li:nth-child(5)").addClass("layui-nav-itemed");
<!-- 通过jQuery选择器选择id为nav的元素下的第1、2、3、4、5个子元素li标签并给它们添加类名为layui-nav-itemed的类可能是用于设置这些导航项的选中状态等样式相关操作但前提是页面中存在id为nav的元素且有对应的li子元素这里没有对jQuery库是否加载成功做判断 -->
</script>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
<script type="text/javascript">
document.onkeydown = function(e) {
e = window.event || e;
var k = e.keyCode;
}
</script>
<script type="text/javascript">
$("#nav li:nth-child(1)").addClass("layui-nav-itemed");
$("#nav li:nth-child(2)").addClass("layui-nav-itemed");
$("#nav li:nth-child(3)").addClass("layui-nav-itemed");
$("#nav li:nth-child(4)").addClass("layui-nav-itemed");
$("#nav li:nth-child(5)").addClass("layui-nav-itemed");
</script>
</body>
</html>
</html>

@ -2,186 +2,143 @@
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<!-- 设置页面标题为“增加学生”,在浏览器标签页等位置显示该标题 -->
<title>增加学生</title>
<!-- 引入layui的样式文件layui是一个前端UI框架该文件用于页面的样式布局等美化 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入自定义的样式文件,可能包含针对本页面特定的样式设置 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入layui的JavaScript文件用于实现layui框架相关的交互功能等 -->
<script src="./layui.js"></script>
<!-- 引入jQuery库的.min压缩版本jQuery是常用的JavaScript库方便进行DOM操作、事件处理等 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 包含用于过滤登录状态的JSP页面可能用于判断用户是否登录等相关逻辑处理 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 包含管理员头部页面,通常包含页面头部的一些通用元素,比如页面标题、导航栏等 -->
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<!-- 包含管理员导航栏页面,用于展示管理员操作相关的导航菜单等 -->
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 使用layui的面包屑组件展示当前页面的层级导航路径 -->
<span class="layui-breadcrumb">
<!-- 面包屑的一级导航,链接指向根路径(此处可能根据实际情况有对应功能) -->
<a href="">管理员</a>
<!-- 面包屑的二级导航,链接指向学生管理相关页面(同样可能有对应功能) -->
<a href="">学生管理</a>
<!-- 面包屑的三级导航,显示当前页面的具体名称 -->
<a><cite>增加学生</cite></a>
</span>
<!-- 定义一个表单使用layui的表单样式class="layui-form"表单提交的目标地址由EL表达式${pageContext.request.contextPath}/addStudentInfoServlet指定提交方式为POST -->
<form class="layui-form" action="${pageContext.request.contextPath}/addStudentInfoServlet" style="padding-top: 50px" method="post">
<!-- 表单中的一个输入项对应一个“layui-form-item”样式的布局块用于输入学号 -->
<div class="layui-form-item">
<!-- 该项的标签,显示为“学号” -->
<label class="layui-form-label">学号</label>
<div class="layui-input-block">
<!-- 定义一个文本输入框name属性用于在表单提交时标识该字段设置为“student-id”required表示该字段为必填项lay-verify="required"用于layui框架验证该字段必填autocomplete="off"关闭浏览器自动填充功能class="layui-input"应用layui的输入框样式 -->
<input type="text" name="student-id" required lay-verify="required" autocomplete="off" class="layui-input">
</div>
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a href="">管理员</a>
<a href="">学生管理</a>
<a><cite>增加学生</cite></a>
</span>
<form class="layui-form" action="${pageContext.request.contextPath}/addStudentInfoServlet" style="padding-top: 50px" method="post">
<div class="layui-form-item">
<label class="layui-form-label">学号</label>
<div class="layui-input-block">
<input type="text" name="student-id" required lay-verify="required" autocomplete="off" class="layui-input">
</div>
<!-- 表单中的一个输入项对应一个“layui-form-item”样式的布局块用于选择学院 -->
<div class="layui-form-item">
<label class="layui-form-label">学院</label>
<div class="layui-input-block">
<!-- 定义一个下拉选择框name属性设置为“selectCollege”用于在表单提交时传递所选学院的值 -->
<select name="selectCollege">
<!-- 一个默认被选中的空选项,可能用于占位或者等待用户选择实际学院 -->
<option selected></option>
<!-- 使用JSTL的forEach标签循环遍历名为“collegeLists”的集合应该是在后台传递过来的学院相关数据集合为下拉框生成具体的学院选项选项的值和显示文本都使用集合中对象collegeList的“college”属性值 -->
<c:forEach items="${collegeLists}" var="collegeList">
<option value="${collegeList.college}">${collegeList.college}</option>
</c:forEach>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">学院</label>
<div class="layui-input-block">
<select name="selectCollege">
<option selected></option>
<c:forEach items="${collegeLists}" var="collegeList">
<option value="${collegeList.college}">${collegeList.college}</option>
</c:forEach>
</select>
</div>
<!-- 表单中的一个输入项对应一个“layui-form-item”样式的布局块用于选择系别 -->
<div class="layui-form-item">
<label class="layui-form-label">系别</label>
<div class="layui-input-block">
<!-- 定义一个下拉选择框name属性设置为“selectDepartment”lay-search属性开启layui框架的搜索功能方便在选项较多时查找用于在表单提交时传递所选系别的值 -->
<select name="selectDepartment" lay-search>
<!-- 一个默认被选中的空选项,可能用于占位或者等待用户选择实际系别 -->
<option selected></option>
<!-- 使用JSTL的forEach标签循环遍历名为“departmentLists”的集合应该是在后台传递过来的系别相关数据集合为下拉框生成具体的系别选项选项的显示文本使用集合中对象departmentList的“department”属性值此处未设置value值可能默认与显示文本相同 -->
<c:forEach items="${departmentLists}" var="departmentList">
<option>${departmentList.department}</option>
</c:forEach>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">系别</label>
<div class="layui-input-block">
<select name="selectDepartment" lay-search>
<option selected></option>
<c:forEach items="${departmentLists}" var="departmentList">
<option>${departmentList.department}</option>
</c:forEach>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">班级</label>
<div class="layui-input-block">
<select name="selectClass" lay-search>
<option selected></option>
<c:forEach items="${classLists}" var="classList">
<option>${classList.cclass}</option>
</c:forEach>
</select>
</div>
<!-- 表单中的一个输入项对应一个“layui-form-item”样式的布局块用于选择班级 -->
<div class="layui-form-item">
<label class="layui-form-label">班级</label>
</div>
<div class="layui-form-item">
<label class="layui-form-label">姓名</label>
<div class="layui-input-block">
<input type="text" name="student-name" id="student-name" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">性别</label>
<div class="layui-input-block">
<!-- 定义一个下拉选择框name属性设置为“selectClass”lay-search属性开启layui框架的搜索功能方便在选项较多时查找用于在表单提交时传递所选班级的值 -->
<select name="selectClass" lay-search>
<!-- 一个默认被选中的空选项,可能用于占位或者等待用户选择实际班级 -->
<option selected></option>
<!-- 使用JSTL的forEach标签循环遍历名为“classLists”的集合应该是在后台传递过来的班级相关数据集合为下拉框生成具体的班级选项选项的显示文本使用集合中对象classList的“cclass”属性值此处未设置value值可能默认与显示文本相同 -->
<c:forEach items="${classLists}" var="classList">
<option>${classList.cclass}</option>
</c:forEach>
</select>
<input type="radio" name="student-sex" id="idsex" value="男" title="男">
<input type="radio" name="student-sex" id="idsex2" value="女" title="女">
</div>
</div>
<!-- 表单中的一个输入项对应一个“layui-form-item”样式的布局块用于输入姓名 -->
<div class="layui-form-item">
<label class="layui-form-label">姓名</label>
<div class="layui-inline">
<label class="layui-form-label">年龄</label>
<div class="layui-input-block">
<!-- 定义一个文本输入框name属性设置为“student-name”id属性设置为“student-name”可用于后续JavaScript操作等placeholder属性可用于显示提示文本此处为空autocomplete="off"关闭浏览器自动填充功能class="layui-input"应用layui的输入框样式 -->
<input type="text" name="student-name" id="student-name" placeholder="" autocomplete="off" class="layui-input">
<input type="text" name="student-age" id="student-age" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
</div>
<!-- 表单中的一个输入项对应一个“layui-form-item”样式的布局块包含多个内联的输入项用于输入性别、年龄、电话、邮箱等信息 -->
<div class="layui-form-item">
<!-- 第一个内联布局块,用于选择性别 -->
<div class="layui-inline">
<label class="layui-form-label">性别</label>
<div class="layui-input-block">
<!-- 定义两个单选按钮name属性都设置为“student-sex”表示同一组单选按钮只能选择一个id属性分别为“idsex”和“idsex2”用于区分value属性分别设置为“男”和“女”title属性用于显示按钮的文本描述 -->
<input type="radio" name="student-sex" id="idsex" value="男" title="男">
<input type="radio" name="student-sex" id="idsex2" value="女" title="女">
</div>
</div>
<!-- 第二个内联布局块,用于输入年龄 -->
<div class="layui-inline">
<label class="layui-form-label">年龄</label>
<div class="layui-input-block">
<!-- 定义一个文本输入框name属性设置为“student-age”id属性设置为“student-age”可用于后续JavaScript操作等placeholder属性可用于显示提示文本此处为空autocomplete="off"关闭浏览器自动填充功能class="layui-input"应用layui的输入框样式 -->
<input type="text" name="student-age" id="student-age" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<!-- 第三个内联布局块,用于输入电话 -->
<div class="layui-inline">
<label class="layui-form-label">电话</label>
<div class="layui-input-block">
<!-- 定义一个文本输入框name属性设置为“student-phone”id属性设置为“student-phone”可用于后续JavaScript操作等placeholder属性可用于显示提示文本此处为空autocomplete="off"关闭浏览器自动填充功能class="layui-input"应用layui的输入框样式 -->
<input type="text" name="student-phone" id="student-phone" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<!-- 第四个内联布局块,用于输入邮箱 -->
<div class="layui-inline">
<label class="layui-form-label">邮箱</label>
<div class="layui-input-block">
<!-- 定义一个文本输入框name属性设置为“student-email”id属性设置为“student-email”可用于后续JavaScript操作等placeholder属性可用于显示提示文本此处为空autocomplete="off"关闭浏览器自动填充功能class="layui-input"应用layui的输入框样式 -->
<input type="text" name="student-email" id="student-email" placeholder="" autocomplete="off" class="layui-input">
</div>
<div class="layui-inline">
<label class="layui-form-label">电话</label>
<div class="layui-input-block">
<input type="text" name="student-phone" id="student-phone" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<!-- 表单中的一个输入项对应一个“layui-form-item”样式的布局块用于输入所在城市信息文本区域样式layui-form-text -->
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">城市</label>
<div class="layui-inline">
<label class="layui-form-label">邮箱</label>
<div class="layui-input-block">
<!-- 定义一个文本输入框name属性设置为“student-address”id属性设置为“student-address”可用于后续JavaScript操作等placeholder属性设置为“请输入你所在的省市”用于提示用户输入内容autocomplete="off"关闭浏览器自动填充功能class="layui-input"应用layui的输入框样式 -->
<input type="text" name="student-address" id="student-address" placeholder="请输入你所在的省市" autocomplete="off" class="layui-input">
<input type="text" name="student-email" id="student-email" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">城市</label>
<div class="layui-input-block">
<input type="text" name="student-address" id="student-address" placeholder="请输入你所在的省市" autocomplete="off" class="layui-input">
</div>
</div>
<!-- 表单中的一个输入项对应一个“layui-form-item”样式的布局块包含提交按钮和重置按钮等操作按钮 -->
<div class="layui-form-item">
<div class="layui-input-block">
<!-- 定义一个提交按钮class="layui-btn"应用layui的按钮样式lay-submit属性表示该按钮用于提交表单lay-filter="formDemo"可用于layui框架对表单提交进行额外的验证等操作按钮文本为“添加” -->
<button class="layui-btn" lay-submit lay-filter="formDemo">添加</button>
<!-- 定义一个重置按钮class="layui-btn layui-btn-primary"应用layui的默认样式按钮样式type="reset"表示点击该按钮会重置表单内容,按钮文本为“重置” -->
<button class="layui-btn layui-btn-primary" type="reset">重置</button>
<!-- 用于显示可能的后台反馈信息如添加成功、失败等提示信息通过EL表达式${update_msg}获取相应的值 -->
<span style="padding-left: 20px;">${update_msg}</span>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formDemo">添加</button>
<button class="layui-btn layui-btn-primary" type="reset">重置</button>
<span style="padding-left: 20px;">${update_msg}</span>
</div>
</form>
<!-- 包含页面底部相关内容的JSP页面可能包含版权信息、联系方式等通用的底部元素 -->
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</form>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<script type="text/javascript">
$("#nav li:nth-child(2) dl dd:last-child").addClass("layui-this");
$("#nav li:nth-child(2)").addClass("layui-nav-itemed");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
<!-- 使用jQuery选择器选择特定的DOM元素此处可能是导航栏中的某个元素并添加类名“layui-this”用于设置样式等相关操作具体功能取决于对应的CSS样式定义 -->
<script type="text/javascript">
$("#nav li:nth-child(2) dl dd:last-child").addClass("layui-this");
$("#nav li:nth-child(2)").addClass("layui-nav-itemed");
</script>
<!-- 使用layui框架的element模块进行相关初始化操作element模块通常用于实现页面的交互元素如折叠面板、导航栏等的功能 -->
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
<!-- 使用layui框架的form模块通常用于对表单相关功能进行进一步配置、验证等操作但目前函数体为空可能需要补充具体代码 -->
<script>
layui.use('form', function(){
<script>
layui.use('form', function(){
});
</script>
});
</script>
</body>
</html>
</html>

@ -1,98 +1,60 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<!-- 设置页面的字符编码为UTF-8确保页面能正确显示各种字符包括中文、特殊符号等不同语言的字符内容 -->
<meta charset="utf-8">
<!-- 设置页面的视口viewport相关属性让页面在不同设备如手机、平板、电脑等上能自适应显示具体含义如下
width=device-width表示页面宽度与设备屏幕宽度相同使得页面能根据设备屏幕大小进行自适应调整宽度
initial-scale=1表示初始缩放比例为1即页面初始显示时按照原始设计大小呈现不进行缩放
maximum-scale=1表示最大缩放比例为1意味着限制用户不能对页面进行缩放操作保持页面布局的稳定性 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
</head>
<body class="layui-layout-body">
<!-- 创建一个layui布局的容器layui是一个前端UI框架通过使用其特定的布局类和样式能够方便地构建出具有一定规范和交互功能的页面整体布局结构 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建页面左侧的侧边栏区域应用layui的背景颜色样式类layui-bg-black将侧边栏背景设置为黑色用于视觉上区分不同的页面区域 -->
<div class="layui-side layui-bg-black">
<!-- 创建一个可滚动的区域,当侧边栏内的内容超出侧边栏本身的高度时,用户可以通过滚动条来查看全部内容,提升页面的可浏览性和用户体验 -->
<div class="layui-side-scroll">
<!-- 左侧导航区域使用layui的导航组件layui-nav以树形结构展示layui-nav-tree这种结构便于展示具有层级关系的菜单选项
同时设置了过滤器lay-filter="test"用于后续与JavaScript等脚本语言配合实现一些交互操作比如菜单点击事件的处理等
并且设置了id为“nav”方便通过JavaScript代码根据这个id来精准地获取和操作该导航元素 -->
<ul class="layui-nav layui-nav-tree" lay-filter="test" id="nav">
<!-- 一个导航菜单项代表一级菜单应用layui-nav-item类来添加相应的样式使其在视觉上呈现出符合layui框架风格的菜单样式 -->
<li class="layui-nav-item">
<!-- 一级菜单的链接文本点击暂时无实际跳转动作href="javascript:;"表示执行一段JavaScript代码此处为空即点击时不会跳转到其他页面显示文本为“选课信息管理”用于提示用户该菜单所代表的功能板块 -->
<a class="" href="javascript:;">选课信息管理</a>
<!-- 一级菜单下的子菜单列表使用dl标签配合layui的样式来展示子菜单符合HTML语义化和layui框架对于菜单结构的规范 -->
<dl class="layui-nav-child">
<!-- 子菜单中的一个选项点击后通过EL表达式指定的路径${pageContext.request.contextPath}/studentSelectCourseListServlet跳转到选课列表页面这里利用了服务器端的请求路径配置来实现页面导航功能 -->
<dd><a href="${pageContext.request.contextPath}/studentSelectCourseListServlet">选课列表</a></dd>
<!-- 子菜单中的另一个选项点击后通过EL表达式指定的路径${pageContext.request.contextPath}/studentOptionalCourseServlet跳转到可选课程页面同样借助服务器端配置的路径来实现页面跳转 -->
<dd><a href="${pageContext.request.contextPath}/studentOptionalCourseServlet">可选课程</a></dd>
</dl>
</li>
<!-- 一个导航菜单项代表一级菜单应用layui-nav-item类来添加相应的样式 -->
<li class="layui-nav-item">
<!-- 一级菜单的链接文本点击暂时无实际跳转动作href="javascript:;"表示执行一段JavaScript代码此处为空显示文本为“学生管理”用于标识该菜单对应的功能分类 -->
<a class="" href="javascript:;">学生管理</a>
<!-- 一级菜单下的子菜单列表使用dl标签配合layui的样式来展示子菜单 -->
<dl class="layui-nav-child">
<!-- 子菜单中的一个选项点击后通过EL表达式指定的路径${pageContext.request.contextPath}/findStudentByPageServlet跳转到查询学生页面通过服务器端配置的请求路径实现页面跳转 -->
<dd><a href="${pageContext.request.contextPath}/findStudentByPageServlet">查询学生</a></dd>
<!-- 一个隐藏的子菜单选项通过hidden属性隐藏设置了id为“hidden-update”点击后暂时无实际跳转动作href="#"表示链接到当前页面顶部显示文本为“修改学生信息”可能后续通过JavaScript等操作来显示并赋予实际功能比如在满足某些条件下将其显示出来供用户点击操作 -->
<dd hidden id="hidden-update"><a href="#">修改学生信息</a></dd>
<!-- 子菜单中的另一个选项点击后通过EL表达式指定的路径${pageContext.request.contextPath}/addStudentServlet跳转到增加学生页面依靠服务器端配置的请求路径来实现页面导航 -->
<dd><a href="${pageContext.request.contextPath}/addStudentServlet">增加学生</a></dd>
</dl>
</li>
<!-- 一个导航菜单项代表一级菜单应用layui-nav-item类来添加相应的样式 -->
<li class="layui-nav-item">
<!-- 一级菜单的链接文本点击暂时无实际跳转动作href="javascript:;"表示执行一段JavaScript代码此处为空显示文本为“教师管理”用于表明该菜单对应的管理功能范围 -->
<a class="" href="javascript:;">教师管理</a>
<!-- 一级菜单下的子菜单列表使用dl标签配合layui的样式来展示子菜单 -->
<dl class="layui-nav-child">
<!-- 子菜单中的一个选项点击后通过EL表达式指定的路径${pageContext.request.contextPath}/teacherListServlet跳转到查询教师页面借助服务器端配置的请求路径实现页面跳转 -->
<dd><a href="${pageContext.request.contextPath}/teacherListServlet">查询教师</a></dd>
<!-- 一个隐藏的子菜单选项通过hidden属性隐藏设置了id为“hidden-update2”点击后暂时无实际跳转动作href="#"表示链接到当前页面顶部显示文本为“修改教师信息”可能后续通过JavaScript等操作来显示并赋予实际功能 -->
<dd hidden id="hidden-update2"><a href="#">修改教师信息</a></dd>
<!-- 子菜单中的另一个选项点击后通过EL表达式指定的路径${pageContext.request.contextPath}/addTeacherServlet跳转到增加教师页面依靠服务器端配置的请求路径来实现页面导航 -->
<dd><a href="${pageContext.request.contextPath}/addTeacherServlet">增加教师</a></dd>
</dl>
</li>
<!-- 一个导航菜单项代表一级菜单应用layui-nav-item类来添加相应的样式 -->
<li class="layui-nav-item">
<!-- 一级菜单的链接文本点击暂时无实际跳转动作href="javascript:;"表示执行一段JavaScript代码此处为空显示文本为“学院专业管理”用于提示该菜单对应的功能板块 -->
<a class="" href="javascript:;">学院专业管理</a>
<!-- 一级菜单下的子菜单列表使用dl标签配合layui的样式来展示子菜单 -->
<dl class="layui-nav-child">
<!-- 子菜单中的一个选项点击后通过EL表达式指定的路径${pageContext.request.contextPath}/cdcListServlet跳转到学院专业查询页面通过服务器端配置的请求路径实现页面跳转 -->
<dd><a href="${pageContext.request.contextPath}/cdcListServlet">学院专业查询</a></dd>
<!-- 子菜单中的另一个选项点击后暂时无实际跳转动作href="#"表示链接到当前页面顶部显示文本为“学院专业增加”可能后续通过JavaScript等操作来赋予实际功能比如在合适的时机触发相应的业务逻辑实现增加学院专业的功能 -->
<dd><a href="#">学院专业增加</a></dd>
</dl>
</li>
<!-- 一个导航菜单项代表一级菜单应用layui-nav-item类来添加相应的样式 -->
<li class="layui-nav-item">
<!-- 一级菜单的链接文本点击暂时无实际跳转动作href="javascript:;"表示执行一段JavaScript代码此处为空显示文本为“系统管理”用于标识该菜单对应的功能分类 -->
<a class="" href="javascript:;">系统管理</a>
<!-- 一级菜单下的子菜单列表使用dl标签配合layui的样式来展示子菜单 -->
<dl class="layui-nav-child">
<!-- 子菜单中的一个选项点击后通过EL表达式指定的路径${pageContext.request.contextPath}/notifyServlet跳转到公告发布页面借助服务器端配置的请求路径实现页面跳转 -->
<dd><a href="${pageContext.request.contextPath}/notifyServlet">公告发布</a></dd>
<!-- 子菜单中的另一个选项点击后通过EL表达式指定的路径${pageContext.request.contextPath}/notifyListServlet跳转到公告列表页面依靠服务器端配置的请求路径来实现页面导航 -->
<dd><a href="${pageContext.request.contextPath}/notifyListServlet">公告列表</a></dd>
<!-- 子菜单中的另一个选项点击后通过EL表达式指定的路径${pageContext.request.contextPath}/fileServlet跳转到文件发布页面通过服务器端配置的请求路径实现页面跳转 -->
<dd><a href="${pageContext.request.contextPath}/fileServlet">文件发布</a></dd>
<!-- 子菜单中的另一个选项点击后通过EL表达式指定的路径${pageContext.request.contextPath}/fileListServlet跳转到文件列表页面依靠服务器端配置的请求路径来实现页面导航 -->
<dd><a href="${pageContext.request.contextPath}/fileListServlet">文件列表</a></dd>
<!-- 子菜单中的另一个选项点击后通过EL表达式指定的路径${pageContext.request.contextPath}/adminPasswordIndexServlet跳转到修改密码页面借助服务器端配置的请求路径实现页面跳转 -->
<dd><a href="${pageContext.request.contextPath}/adminPasswordIndexServlet">修改密码</a></dd>
</dl>
</li>
</ul>
</div>
<div class="layui-layout layui-layout-admin">
<div class="layui-side layui-bg-black">
<div class="layui-side-scroll">
<!-- 左侧导航区域可配合layui已有的垂直导航 -->
<ul class="layui-nav layui-nav-tree" lay-filter="test" id="nav">
<li class="layui-nav-item">
<a class="" href="javascript:;">选课信息管理</a>
<dl class="layui-nav-child">
<dd><a href="${pageContext.request.contextPath}/studentSelectCourseListServlet">选课列表</a></dd>
<dd><a href="${pageContext.request.contextPath}/studentOptionalCourseServlet">可选课程</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a class="" href="javascript:;">学生管理</a>
<dl class="layui-nav-child">
<dd><a href="${pageContext.request.contextPath}/findStudentByPageServlet">查询学生</a></dd>
<dd hidden id="hidden-update"><a href="#">修改学生信息</a></dd>
<dd><a href="${pageContext.request.contextPath}/addStudentServlet">增加学生</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a class="" href="javascript:;">教师管理</a>
<dl class="layui-nav-child">
<dd><a href="${pageContext.request.contextPath}/teacherListServlet">查询教师</a></dd>
<dd hidden id="hidden-update2"><a href="#">修改教师信息</a></dd>
<dd><a href="${pageContext.request.contextPath}/addTeacherServlet">增加教师</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a class="" href="javascript:;">学院专业管理</a>
<dl class="layui-nav-child">
<dd><a href="${pageContext.request.contextPath}/cdcListServlet">学院专业查询</a></dd>
<dd><a href="#">学院专业增加</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a class="" href="javascript:;">系统管理</a>
<dl class="layui-nav-child">
<dd><a href="${pageContext.request.contextPath}/notifyServlet">公告发布</a></dd>
<dd><a href="${pageContext.request.contextPath}/notifyListServlet">公告列表</a></dd>
<dd><a href="${pageContext.request.contextPath}/fileServlet">文件发布</a></dd>
<dd><a href="${pageContext.request.contextPath}/fileListServlet">文件列表</a></dd>
<dd><a href="${pageContext.request.contextPath}/adminPasswordIndexServlet">修改密码</a></dd>
</dl>
</li>
</ul>
</div>
</div>
</div>
</body>
</html>
</html>

@ -2,115 +2,84 @@
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<!-- 设置页面标题为“修改密码”,该标题会显示在浏览器的标签栏上 -->
<title>修改密码</title>
<!-- 引入layui框架的样式文件用于设置页面的整体样式风格使页面呈现出layui框架定义的外观效果 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入自定义的样式文件可能用于覆盖或补充layui样式实现针对本页面特定的样式需求 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入layui框架的JavaScript文件这是使用layui框架各种功能组件如表单验证、元素操作等的基础 -->
<script src="./layui.js"></script>
<!-- 引入jQuery库的压缩版本jQuery是一个广泛使用的JavaScript库方便进行DOM操作、事件处理以及与页面元素交互等操作 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 包含名为“filterLogin.jsp”的JSP页面通常用于进行登录状态的过滤判断比如验证用户是否已登录等相关逻辑处理 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 包含名为“WEB-INF/admin/aHeader.jsp”的JSP页面一般用于引入页面的头部部分可能包含页面的通用头部元素如页面标题、导航栏等 -->
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<!-- 包含名为“WEB-INF/admin/adminNav.jsp”的JSP页面主要用于引入管理员导航栏部分展示管理员相关操作的导航菜单选项 -->
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 页面的内容主体区域,在这里放置页面主要展示和交互的内容 -->
<div style="padding: 15px;">
<!-- 使用layui的面包屑组件来展示当前页面在整个系统中的层级路径方便用户了解所处位置 -->
<span class="layui-breadcrumb">
<!-- 面包屑的第一项代表顶层分类点击可跳转到管理员相关的根页面此处具体跳转功能取决于href属性对应的实际路径设置当前为空 -->
<a href="">管理员</a>
<!-- 面包屑的第二项代表系统管理分类点击可跳转到系统管理相关页面同样具体跳转依赖href属性实际设置当前为空 -->
<a href="">系统管理</a>
<!-- 面包屑的第三项,显示当前页面具体名称为“修改密码” -->
<a><cite>修改密码</cite></a>
</span>
<!-- 定义一个表单使用layui的表单样式类“layui-form”设置表单提交的目标地址为“${pageContext.request.contextPath}/adminPasswordUpdateServlet”通过EL表达式动态获取路径提交方式为POST -->
<form class="layui-form" action="${pageContext.request.contextPath}/adminPasswordUpdateServlet" style="padding-top: 50px" method="post">
<!-- 表单中的一个输入项使用layui的表单元素布局类“layui-form-item”进行布局用于显示帐号信息 -->
<div class="layui-form-item">
<!-- 该项对应的标签,显示文本为“帐号”,用于提示用户该输入项的含义 -->
<label class="layui-form-label">帐号</label>
<div class="layui-input-block">
<!-- 定义一个文本输入框name属性设置为“title”用于在表单提交时标识该字段通过EL表达式“${admin.a_id}”设置输入框的初始值显示当前帐号信息设置为“required”表示该字段必填“disabled”属性使其不可编辑“lay-verify="required"”用于配合layui框架进行前端验证确保该必填项有值“autocomplete="off"”关闭浏览器的自动填充功能应用“layui-input”类来呈现layui框架定义的输入框样式 -->
<input type="text" name="title" value="${admin.a_id}" required disabled lay-verify="required" autocomplete="off" class="layui-input">
</div>
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a href="">管理员</a>
<a href="">系统管理</a>
<a><cite>修改密码</cite></a>
</span>
<form class="layui-form" action="${pageContext.request.contextPath}/adminPasswordUpdateServlet" style="padding-top: 50px" method="post">
<div class="layui-form-item">
<label class="layui-form-label">帐号</label>
<div class="layui-input-block">
<input type="text" name="title" value="${admin.a_id}" required disabled lay-verify="required" autocomplete="off" class="layui-input">
</div>
<!-- 表单中的另一个输入项同样使用“layui-form-item”布局用于显示当前密码信息 -->
<div class="layui-form-item">
<!-- 该项对应的标签,显示文本为“当前密码”,提示用户此输入框显示的内容 -->
<label class="layui-form-label">当前密码</label>
<div class="layui-input-block">
<!-- 定义一个文本输入框name属性为“admin-password”id属性设置为“admin-password”方便后续通过JavaScript等方式操作该元素通过EL表达式“${admin.a_password}”设置初始值显示当前密码设置“disabled”使其不可编辑“placeholder”属性未设置具体提示内容为空“autocomplete="off"”关闭自动填充应用“layui-input”样式类 -->
<input type="text" name="admin-password" id="admin-password" value="${admin.a_password}" disabled placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">当前密码</label>
<div class="layui-input-block">
<input type="text" name="admin-password" id="admin-password" value="${admin.a_password}" disabled placeholder="" autocomplete="off" class="layui-input">
</div>
<!-- 表单中的又一个输入项使用“layui-form-item”布局用于输入新密码 -->
<div class="layui-form-item">
<!-- 该项对应的标签,显示文本为“新密码”,告知用户此处应输入新的密码内容 -->
<label class="layui-form-label">新密码</label>
<div class="layui-input-block">
<!-- 定义一个文本输入框name属性为“admin-newpassword”id属性为“admin-newpassword”初始值为空需要用户手动输入设置为“required”表示必填项“lay-verify="required"”用于layui框架验证必填“placeholder”属性未设置提示内容为空“autocomplete="off"”关闭自动填充应用“layui-input”样式类 -->
<input type="text" name="admin-newpassword" id="admin-newpassword" value="" required lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">新密码</label>
<div class="layui-input-block">
<input type="text" name="admin-newpassword" id="admin-newpassword" value="" required lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<!-- 表单中的一个输入项使用“layui-form-item layui-form-text”布局用于再次输入密码进行确认通常用于防止用户输入错误密码 -->
<div class="layui-form-item layui-form-text">
<!-- 该项对应的标签,显示文本为“确认密码”,提示用户此处应再次输入新密码进行确认 -->
<label class="layui-form-label">确认密码</label>
<div class="layui-input-block">
<!-- 定义一个文本输入框name属性为“admin-ennewpassword”id属性为“admin-ennewpassword”初始值为空需要用户再次输入新密码“lay-verify="required"”用于layui框架验证必填“placeholder”属性未设置提示内容为空“autocomplete="off"”关闭自动填充应用“layui-input”样式类 -->
<input type="text" name="admin-ennewpassword" id="admin-ennewpassword" value="" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">确认密码</label>
<div class="layui-input-block">
<input type="text" name="admin-ennewpassword" id="admin-ennewpassword" value="" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<!-- 表单中的一个操作按钮项使用“layui-form-item”布局包含提交按钮和可能的提示信息 -->
<div class="layui-form-item">
<div class="layui-input-block">
<!-- 定义一个提交按钮应用“layui-btn”样式类呈现layui框架的按钮样式“lay-submit”属性表示该按钮用于提交表单“lay-filter="formDemo"”可用于在layui框架中对表单提交进行额外的验证、触发相关事件等操作按钮显示文本为“修改” -->
<button class="layui-btn" lay-submit lay-filter="formDemo">修改</button>
<!-- 用于显示可能的后台反馈信息如密码修改成功、失败等提示消息通过EL表达式“${update_msg}”获取相应的值,在页面上展示给用户 -->
<span style="padding-left: 20px;">${update_msg}</span>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formDemo">修改</button>
<span style="padding-left: 20px;">${update_msg}</span>
</div>
</form>
<!-- 包含名为“footer.jsp”的JSP页面一般用于引入页面底部部分可能包含版权信息、联系方式等通用的底部元素 -->
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</form>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<!-- 使用jQuery选择器选择特定的DOM元素此处是导航栏中特定位置的元素并为其添加“layui-this”类名通常用于设置该元素的选中状态样式等具体样式效果取决于对应的CSS定义 -->
<script type="text/javascript">
$("#nav li:nth-child(5) dl dd:nth-child(5)").addClass("layui-this");
$("#nav li:nth-child(5)").addClass("layui-nav-itemed");
</script>
<!-- 使用layui框架的“element”模块调用其“init”方法进行相关初始化操作“element”模块常用于实现页面的交互元素如折叠面板、导航栏等的功能初始化 -->
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
<script type="text/javascript">
$("#nav li:nth-child(5) dl dd:nth-child(5)").addClass("layui-this");
$("#nav li:nth-child(5)").addClass("layui-nav-itemed");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
<!-- 使用layui框架的“form”模块不过当前函数体为空一般可在这里编写针对表单相关功能如自定义验证规则、提交前后的额外处理等的代码 -->
<script>
//Demo
layui.use('form', function(){
<script>
//Demo
layui.use('form', function(){
});
</script>
});
</script>
</body>
</html>
</html>

@ -1,105 +1,77 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 以上两行是JSP页面相关指令
第一行用于设置该JSP页面的内容类型为text/html即HTML格式页面同时指定字符编码为UTF-8表明页面使用Java语言来处理相关逻辑。
第二行引入了JSTLJavaServer Pages Standard Tag Library核心标签库定义前缀为“c”方便后续在页面中使用JSTL提供的各类标签进行动态数据处理比如循环遍历、条件判断等操作 -->
<html>
<head>
<title>可选课程</title>
<!-- 设置HTML页面的标题为“可选课程”此标题会显示在浏览器的标题栏让用户明确该页面的主要功能 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件通过相对路径从当前页面所在目录下的css文件夹中查找应用layui框架提供的样式用于页面布局、组件美化等使页面呈现layui框架特有的外观风格 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的样式表文件style.css同样采用相对路径引用目的是添加符合特定需求的个性化页面样式对页面显示效果做进一步定制 -->
<script src="./layui.js"></script>
<!-- 引入layui框架的JavaScript脚本文件从当前页面所在目录获取该文件layui的JavaScript脚本为页面提供众多交互功能以及各种组件支持例如实现菜单交互、页面元素动态展示等功能 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 从CDN内容分发网络引入jQuery库的最小化版本jQuery是常用的JavaScript库能简化页面中对DOM元素的操作、事件处理以及实现各种动画效果等方便开发人员编写JavaScript代码实现页面交互逻辑 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 为页面主体body设置类名“layui-layout-body”同时将背景颜色设定为浅灰色#F2F2F2该类名通常与layui框架的布局样式相关联按照其框架规范来构建页面整体外观 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 通过JSP的include指令包含名为filterLogin.jsp的页面内容一般这个页面用于处理用户登录相关的验证逻辑或者展示登录相关的界面元素比如登录表单等以此确保只有登录后的用户能够访问后续页面内容 -->
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<!-- 包含位于WEB-INF/admin目录下的aHeader.jsp页面通常用于构建页面的头部区域可能包含如网站logo、导航栏等常见的头部元素起到统一页面头部布局的作用 -->
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<!-- 再次使用JSP的include指令包含WEB-INF/admin目录下的adminNav.jsp页面此页面一般用来展示管理员端特有的导航菜单内容便于用户在不同功能模块间进行切换操作 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建一个div元素并赋予其两个类名“layui-layout”和“layui-layout-admin”这是layui框架中用于定义页面整体布局结构的特定类名遵循layui框架的布局规范来划分页面不同区域例如头部、主体、侧边栏等具体根据框架设定 -->
<div class="layui-body">
<!-- 在上述布局div内部再创建一个div元素类名为“layui-body”在layui框架里该区域通常用于承载页面的主要内容比如展示各类业务数据、操作按钮等 -->
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 创建一个div元素并通过内联样式设置其四周内边距为15px这样做主要是为了对内部元素进行排版使页面内容看起来更规整避免显得过于紧凑或松散 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a href="">管理员</a>
<a href="">选课信息管理</a>
<a><cite>可选课程</cite></a>
</span>
<!-- 创建一个layui框架提供的面包屑导航组件通过一系列超链接a标签展示当前页面在整个系统中的层级路径这里展示了从“管理员”进入“选课信息管理”再到“可选课程”页面但目前超链接的href属性大多为空后续可能需要完善具体跳转地址以实现页面导航功能 -->
<span style="color: red;margin-right: 100px;float: right;">${select_msg}</span>
<!-- 创建一个<span>标签设置文本颜色为红色通过右浮动float: right使其靠右显示并设置右边距为100px内部通过EL表达式显示名为“select_msg”的变量的值可能用于在页面上显示一些与可选课程操作相关的提示信息比如课程删除成功或失败等消息 -->
<table class="layui-table" lay-filter="test">
<!-- 创建一个layui框架的表格组件设置名为“test”的过滤器该过滤器可在后续JavaScript代码中用于配置表格相关交互功能例如实现表格行点击事件、数据筛选、排序等操作 -->
<thead>
<table class="layui-table" lay-filter="test">
<thead>
<tr>
<th>ID</th>
<th>课程号</th>
<th>课程名</th>
<th>课程简介</th>
<th>教师号</th>
<th>教师姓名</th>
<th>操作</th>
</tr>
</thead>
<c:forEach items="${optionalcourses}" var="optionalcourse" varStatus="s">
<tr>
<th>ID</th>
<th>课程号</th>
<th>课程名</th>
<th>课程简介</th>
<th>教师号</th>
<th>教师姓名</th>
<th>操作</th>
<!-- 定义表格头部的列标题分别列出要展示的可选课程相关的各个字段如序号ID、课程号、课程名、课程简介、教师号、教师姓名以及操作用于进行删除等相关操作 -->
<td>${s.count}</td>
<td>${optionalcourse.c_id}</td>
<td>${optionalcourse.c_name}</td>
<td>${optionalcourse.c_info}</td>
<td>${optionalcourse.t_id}</td>
<td>${optionalcourse.t_name}</td>
<td><a class="layui-btn layui-btn-danger" href="javascript:deleteCourse(${optionalcourse.c_id});">删除</a></td>
</tr>
</thead>
<c:forEach items="${optionalcourses}" var="optionalcourse" varStatus="s">
<!-- 使用JSTL的forEach标签进行循环遍历操作循环的对象是名为“optionalcourses”的数据集合通常是从后端传递过来的可选课程信息列表每次循环将当前元素赋值给变量“optionalcourse”同时利用“varStatus”获取循环状态信息如当前循环次数等并赋值给变量“s” -->
<tr>
<td>${s.count}</td>
<td>${optionalcourse.c_id}</td>
<td>${optionalcourse.c_name}</td>
<td>${optionalcourse.c_info}</td>
<td>${optionalcourse.t_id}</td>
<td>${optionalcourse.t_name}</td>
<td><a class="layui-btn layui-btn-danger" href="javascript:deleteCourse(${optionalcourse.c_id});">删除</a></td>
<!-- 在表格的每一行中通过EL表达式Expression Language如${s.count}等)分别展示对应的数据:
先展示序号(通过${s.count}表示当前循环次数),然后依次展示课程号、课程名、课程简介、教师号、教师姓名等具体信息;
最后一列创建一个超链接a标签应用layui框架的危险样式按钮类layui-btn layui-btn-danger表示红色警示样式按钮设置href属性为调用名为“deleteCourse”的JavaScript函数并传递当前课程的ID通过EL表达式获取当前课程对象中的课程ID即${optionalcourse.c_id})作为参数,用于实现删除当前行对应的课程信息的功能 -->
</tr>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含名为footer.jsp的页面一般此页面用于展示页面底部的一些通用信息比如版权声明、网站相关链接、联系方式等内容 -->
</div>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<script type="text/javascript">
$("#nav li:nth-child(1) dl dd:nth-child(2)").addClass("layui-this");
// 使用jQuery选择器选中页面中id为“nav”的元素下的第1个子元素li下的dl元素下的第2个dd元素并为其添加类名“layui-this”。在layui框架中添加这个类名通常意味着将对应的导航菜单项标记为当前选中状态使其呈现特定的样式比如改变颜色、加粗等以此表明当前所在页面功能模块对应的菜单选项
$("#nav li:nth-child(1)").addClass("layui-nav-itemed");
// 同样使用jQuery选择器选中页面中id为“nav”的元素下的第1个子元素li并为其添加类名“layui-nav-itemed”。在layui框架里这个类名可能用于控制导航菜单的展开或折叠状态让对应的菜单层级结构展示相应的效果方便用户查看相关的子菜单
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
// 使用layui框架的element模块调用其init方法进行初始化操作。在layui框架中element模块提供了很多页面元素交互相关的功能例如实现页面布局动态切换、菜单展开收起等交互效果通过调用init方法可以激活这些功能确保页面上基于element模块构建的各种UI组件能够正常工作
});
</script>
<script>
function deleteCourse(c_id) {
if (confirm("你确定删除该学生吗?")) {
location.href = "${pageContext.request.contextPath}/doDeleteSelectCourseServlet?cid=" + c_id;
// 定义一个名为deleteCourse的函数接收课程的IDc_id作为参数。这里函数名虽然是deleteCourse暗示删除课程但函数内部确认提示文字是“你确定删除该学生吗”可能存在文本错误正常应该提示“你确定删除该课程吗”。
// 在函数内部通过JavaScript的confirm函数弹出一个确认框询问用户是否确定要执行删除操作当前文本提示的是删除学生应为删除课程。当用户点击确定即confirm函数返回true使用location.href属性将页面重定向到名为“doDeleteSelectCourseServlet”的Servlet并通过URL拼接的方式传递要删除的课程的ID参数从而触发后端对应的删除课程信息的逻辑
}
<script type="text/javascript">
$("#nav li:nth-child(1) dl dd:nth-child(2)").addClass("layui-this");
$("#nav li:nth-child(1)").addClass("layui-nav-itemed");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
<script>
function deleteCourse(c_id) {
if (confirm("你确定删除该学生吗?")) {
location.href = "${pageContext.request.contextPath}/doDeleteSelectCourseServlet?cid=" + c_id;
}
</script>
}
</script>
</body>
</html>
</html>

@ -1,98 +1,73 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 以上两行是JSP页面相关的指令
- 第一行用于设置该JSP页面的内容类型为text/html也就是表明这是一个HTML格式的页面同时指定字符编码为UTF-8并且告知服务器此页面使用Java语言来处理相关逻辑。
- 第二行引入了JSTLJavaServer Pages Standard Tag Library核心标签库定义其前缀为“c”后续就能通过这个前缀方便地使用JSTL提供的各类标签例如用于循环遍历、条件判断等操作的标签以此在JSP页面中实现动态数据处理 -->
<html>
<head>
<title>选课列表</title>
<!-- 设置当前HTML页面的标题为“选课列表”这个标题会显示在浏览器的标题栏位置让用户直观地知晓该页面的主要功能 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件通过相对路径从当前页面所在目录下的css文件夹中查找来应用layui框架所提供的样式可用于对页面进行布局排版、美化页面中的各个组件等使得页面呈现出layui框架特有的外观风格 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的样式表文件style.css同样采用相对路径的方式进行引用其目的是添加符合特定业务需求的个性化页面样式对页面显示效果做进一步的定制 -->
<script src="./layui.js"></script>
<!-- 引入layui框架的JavaScript脚本文件从当前页面所在的目录获取该文件layui框架的脚本文件能够为页面提供众多交互功能以及各种各样的组件支持比如实现菜单的交互效果、页面元素的动态展示等功能 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 从CDN内容分发网络引入jQuery库的最小化版本jQuery是在Web开发中常用的JavaScript库它可以简化页面中对DOM文档对象模型元素的操作、方便进行事件处理以及实现各种动画效果等便于开发人员编写JavaScript代码来实现页面的交互逻辑 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 为页面主体body设置类名“layui-layout-body”同时通过内联样式将背景颜色设定为浅灰色#F2F2F2这里的类名大概率是与layui框架的布局样式相关联按照其框架所规定的规范来构建页面整体的外观样式 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 通过JSP的include指令包含名为filterLogin.jsp的页面内容通常这个页面是用于处理用户登录相关的验证逻辑或者展示登录相关的一些界面元素比如登录表单等通过这种方式来保证只有已经登录后的用户才能够访问后续的页面内容 -->
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<!-- 包含位于WEB-INF/admin目录下的aHeader.jsp页面一般来说这个页面是用于构建页面的头部区域可能会包含像网站logo、导航栏等常见的头部元素起到统一页面头部布局的作用 -->
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<!-- 再次使用JSP的include指令包含WEB-INF/admin目录下的adminNav.jsp页面通常这个页面是用来展示管理员端特有的导航菜单内容方便用户在不同的功能模块之间进行切换操作 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建一个div元素并赋予它两个类名“layui-layout”和“layui-layout-admin”这通常是layui框架中用于定义页面整体布局结构的特定类名会遵循layui框架的布局规范来划分页面的不同区域例如划分出头部、主体内容区域、侧边栏等具体的划分取决于layui框架自身的设定 -->
<div class="layui-body">
<!-- 在上述带有布局类名的div内部再创建一个div元素其类名为“layui-body”在layui框架里这个区域一般是用于承载页面的主要内容比如展示各类业务相关的数据、放置操作按钮等 -->
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 创建一个新的div元素并通过内联样式设置它的四周内边距都为15px这样做的主要目的是对内部的元素进行合理的排版使得页面内容看起来更加规整避免出现过于紧凑或者松散的情况 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a href="">管理员</a>
<a href="">选课信息管理</a>
<a><cite>选课列表</cite></a>
</span>
<!-- 创建一个layui框架提供的面包屑导航组件通过一系列的超链接a标签来展示当前页面在整个系统中的层级路径这里展示了从“管理员”这个大的功能入口进入到“选课信息管理”模块再进一步进入到当前的“选课列表”页面不过目前这些超链接的href属性大多为空后续可能需要完善具体的跳转地址以便真正实现页面之间的导航功能 -->
<table class="layui-table" lay-filter="test">
<!-- 创建一个layui框架的表格组件并且设置了名为“test”的过滤器这个过滤器可以在后续的JavaScript代码中用于配置表格相关的交互功能例如实现表格行的点击事件、对表格数据进行筛选、排序等操作 -->
<thead>
<table class="layui-table" lay-filter="test">
<thead>
<tr>
<th>ID</th>
<th>学号</th>
<th>学生姓名</th>
<th>课程号</th>
<th>课程名</th>
<th>课程简介</th>
<th>教师号</th>
<th>教师</th>
<th>分数</th>
</tr>
</thead>
<c:forEach items="${selectcourses}" var="selectcourse" varStatus="s">
<tr>
<th>ID</th>
<th>学号</th>
<th>学生姓名</th>
<th>课程号</th>
<th>课程名</th>
<th>课程简介</th>
<th>教师号</th>
<th>教师</th>
<th>分数</th>
<!-- 定义表格头部的列标题分别列出了要展示的选课相关信息的各个字段依次为序号ID、学号、学生姓名、课程号、课程名、课程简介、教师号、教师姓名以及课程分数等 -->
<td>${s.count}</td>
<td>${selectcourse.s_id}</td>
<td>${selectcourse.s_name}</td>
<td>${selectcourse.c_id}</td>
<td>${selectcourse.c_name}</td>
<td>${selectcourse.c_info}</td>
<td>${selectcourse.t_id}</td>
<td>${selectcourse.t_name}</td>
<td>${selectcourse.score}</td>
</tr>
</thead>
<c:forEach items="${selectcourses}" var="selectcourse" varStatus="s">
<!-- 使用JSTL的forEach标签进行循环遍历操作循环的对象是名为“selectcourses”的数据集合通常是从后端传递过来的已经选了课的相关信息列表每次循环会将当前元素赋值给变量“selectcourse”同时利用“varStatus”获取循环的状态信息例如当前循环的次数等并赋值给变量“s” -->
<tr>
<td>${s.count}</td>
<td>${selectcourse.s_id}</td>
<td>${selectcourse.s_name}</td>
<td>${selectcourse.c_id}</td>
<td>${selectcourse.c_name}</td>
<td>${selectcourse.c_info}</td>
<td>${selectcourse.t_id}</td>
<td>${selectcourse.t_name}</td>
<td>${selectcourse.score}</td>
<!-- 在表格的每一行中通过EL表达式Expression Language像${s.count}等这种写法就是EL表达式分别展示对应的选课数据
- 首先展示序号(通过${s.count}表示当前循环的次数也就是从1开始的行号
- 然后依次展示选课记录中包含的学号、学生姓名、课程号、课程名、课程简介、教师号、教师姓名以及课程分数等具体信息。 -->
</tr>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含名为footer.jsp的页面一般这个页面是用于展示页面底部的一些通用信息比如版权声明、网站相关链接、联系方式等内容 -->
</div>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<script type="text/javascript">
$("#nav li:nth-child(1) dl dd:nth-child(1)").addClass("layui-this");
// 使用jQuery选择器选中页面中id为“nav”的元素下的第1个子元素li下的dl元素下的第1个dd元素并为其添加类名“layui-this”。在layui框架中添加这个类名通常意味着将对应的导航菜单项标记为当前选中状态使其呈现出特定的样式例如改变颜色、加粗等以此来表明当前所在页面功能模块对应的菜单选项。
$("#nav li:nth-child(1)").addClass("layui-nav-itemed");
// 同样使用jQuery选择器选中页面中id为“nav”的元素下的第1个子元素li并为其添加类名“layui-nav-itemed”。在layui框架里这个类名可能用于控制导航菜单的展开或折叠状态让对应的菜单层级结构展示出相应的效果方便用户查看相关的子菜单内容。
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
// 使用layui框架的element模块调用其init方法进行初始化操作。在layui框架中element模块提供了很多与页面元素交互相关的功能例如可以实现页面布局的动态切换、菜单的展开收起等交互效果通过调用init方法能够激活这些功能确保页面上基于element模块构建的各种UI组件都能够正常工作。
});
</script>
<script type="text/javascript">
$("#nav li:nth-child(1) dl dd:nth-child(1)").addClass("layui-this");
$("#nav li:nth-child(1)").addClass("layui-nav-itemed");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
</body>
</html>
</html>

@ -1,221 +1,175 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 以上两行是JSP页面相关的指令
第一行用于设置该JSP页面的内容类型为text/html即HTML格式页面同时指定字符编码为UTF-8并且表明页面使用Java语言来处理相关逻辑。
第二行引入了JSTLJavaServer Pages Standard Tag Library核心标签库定义其前缀为“c”后续就可以通过这个前缀使用JSTL提供的各类标签例如用于循环遍历、条件判断等操作的标签方便在JSP页面中进行动态数据处理 -->
<html>
<head>
<title>修改学生信息</title>
<!-- 设置当前HTML页面的标题为“修改学生信息”此标题会显示在浏览器的标题栏中让用户直观知晓页面的主要功能 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件通过相对路径从当前页面所在目录下的css文件夹中查找来应用layui框架所提供的样式可用于页面布局、组件美化等使页面呈现出特定的外观风格 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的样式表文件style.css同样采用相对路径引用用于添加符合特定需求的个性化页面样式对页面显示效果做进一步定制 -->
<script src="./layui.js"></script>
<!-- 引入layui框架的JavaScript脚本文件从当前页面所在目录获取该文件layui脚本为页面提供众多交互功能以及各种组件支持比如实现菜单交互、页面元素动态展示等 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 从CDN内容分发网络引入jQuery库的最小化版本jQuery是常用的JavaScript库能简化页面中对DOM元素的操作、事件处理以及实现各种动画效果等方便开发人员编写JavaScript代码来实现页面交互逻辑 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 为页面主体body设置类名“layui-layout-body”同时将背景颜色设定为浅灰色#F2F2F2这里的类名大概率与layui框架的布局样式相关联按照其框架规范来构建页面整体外观 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 通过JSP的include指令包含名为filterLogin.jsp的页面内容通常这个页面用于处理用户登录相关的验证逻辑或者展示登录相关的界面元素比如登录表单等以此保证只有登录后的用户可访问后续页面内容 -->
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<!-- 包含位于WEB-INF/admin目录下的aHeader.jsp页面一般用于构建页面的头部区域可能包含网站logo、导航栏等常见的头部元素起到统一页面头部布局的作用 -->
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<!-- 再次使用JSP的include指令包含WEB-INF/admin目录下的adminNav.jsp页面通常用来展示管理员端特有的导航菜单内容便于用户在不同功能模块间进行切换操作 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建一个div元素并赋予其两个类名“layui-layout”和“layui-layout-admin”这一般是layui框架中用于定义页面整体布局结构的特定类名遵循layui框架的布局规范来划分页面不同区域 -->
<div class="layui-body">
<!-- 在上述布局div内部再创建一个div元素类名为“layui-body”在layui框架里该区域通常用于承载页面的主要内容例如展示各类业务数据、操作按钮等 -->
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 新建一个div元素并通过内联样式设置其四周内边距为15px主要用于对内部元素进行排版让页面内容看起来更规整避免显得过于紧凑或松散 -->
<span class="layui-breadcrumb">
<a href="">管理员</a>
<a href="">学生管理</a>
<a><cite>修改学生信息</cite></a>
</span>
<!-- 创建一个layui框架提供的面包屑导航组件通过一系列超链接a标签展示当前页面在整个系统中的层级路径这里展示了从“管理员”进入“学生管理”再到“修改学生信息”页面但超链接的href属性为空可能后续需完善具体跳转地址以实现页面导航功能 -->
<form class="layui-form" action="${pageContext.request.contextPath}/updateStudentInfoServlet" style="padding-top: 50px" method="post">
<!-- 创建一个layui框架的表单form设置其提交的目标地址为名为updateStudentInfoServlet的Servlet通过EL表达式动态获取上下文路径拼接而成通过内联样式设置顶部内边距为50px提交方式为POST用于收集用户输入的修改后的学生信息并提交给后端进行信息更新操作 -->
<div class="layui-form-item">
<!-- 创建一个layui框架下表单项目form-item的div容器layui框架通常会依据这个结构来对内部的表单元素进行布局和样式处理 -->
<label class="layui-form-label">学号</label>
<!-- 创建一个表单标签label元素用于标识后面的输入框对应的含义这里显示为“学号” -->
<div class="layui-input-block">
<!-- 创建一个用于放置输入框的div容器在layui框架的表单布局里控制输入框的显示样式 -->
<input type="text" readonly="readonly" name="student-id" value="${student.s_id}" autocomplete="off" class="layui-input">
<!-- 创建一个文本输入框input元素类型为文本type: text设置为只读readonly="readonly"名称为“student-id”其值通过EL表达式从名为“student”的对象中获取可能是从后台查询出当前要修改信息的学生的学号进行回显关闭自动完成功能autocomplete="off"并应用layui框架的输入框样式类layui-input这里用于展示学号但不允许用户修改 -->
</div>
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a href="">管理员</a>
<a href="">学生管理</a>
<a><cite>修改学生信息</cite></a>
</span>
<form class="layui-form" action="${pageContext.request.contextPath}/updateStudentInfoServlet" style="padding-top: 50px" method="post">
<div class="layui-form-item">
<label class="layui-form-label">学号</label>
<div class="layui-input-block">
<input type="text" readonly="readonly" name="student-id" value="${student.s_id}" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-item">
<label class="layui-form-label">学院</label>
<div class="layui-input-block">
<select name="selectCollege">
<!-- 创建一个下拉选择框select元素名称为“selectCollege”用于让用户选择学生所属的学院 -->
<option value="${student.s_college}" selected>${student.s_college}</option>
<!-- 创建一个默认选中的选项option其值和显示文本都通过EL表达式获取当前学生所属学院信息进行回显设置为默认选中selected表示当前学生已有的学院信息 -->
<c:forEach items="${collegeLists}" var="collegeList">
<option value="${collegeList.college}">${collegeList.college}</option>
<!-- 使用JSTL的forEach标签进行循环遍历操作循环的对象是名为“collegeLists”的数据集合通常是从后端获取的所有学院信息列表每次循环将当前元素赋值给变量“collegeList”并创建一个选项元素其值和显示文本都设置为当前学院信息用于展示可选择的其他学院选项 -->
</c:forEach>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">学院</label>
<div class="layui-input-block">
<select name="selectCollege">
<option value="${student.s_college}" selected>${student.s_college}</option>
<c:forEach items="${collegeLists}" var="collegeList">
<option value="${collegeList.college}">${collegeList.college}</option>
</c:forEach>
</select>
</div>
<div class="layui-form-item">
<label class="layui-form-label">系别</label>
<div class="layui-input-block">
<select name="selectDepartment" lay-search>
<!-- 创建一个下拉选择框名称为“selectDepartment”并设置了lay-search属性在layui框架中可能用于开启搜索功能方便在选项较多时快速查找用于让用户选择学生所属的系别 -->
<option value="${student.s_department}" selected>${student.s_department}</option>
<!-- 创建一个默认选中的选项通过EL表达式获取当前学生所属系别信息进行回显并设置为默认选中展示当前学生已有的系别 -->
<c:forEach items="${departmentLists}" var="departmentList">
<option>${departmentList.department}</option>
<!-- 同样使用forEach标签循环遍历名为“departmentLists”的系别信息集合每次循环创建一个选项元素显示文本为当前系别信息用于展示可选择的其他系别选项 -->
</c:forEach>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">系别</label>
<div class="layui-input-block">
<select name="selectDepartment" lay-search>
<option value="${student.s_department}" selected>${student.s_department}</option>
<c:forEach items="${departmentLists}" var="departmentList">
<option>${departmentList.department}</option>
</c:forEach>
</select>
</div>
<div class="layui-form-item">
<label class="layui-form-label">班级</label>
</div>
<div class="layui-form-item">
<label class="layui-form-label">班级</label>
<div class="layui-input-block">
<select name="selectClass" lay-search>
<option value="${student.s_class}" selected>${student.s_class}</option>
<c:forEach items="${classLists}" var="classList">
<option>${classList.cclass}</option>
</c:forEach>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">姓名</label>
<div class="layui-input-block">
<input type="text" name="student-name" id="student-name" value="${student.s_name}" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">性别</label>
<div class="layui-input-block">
<select name="selectClass" lay-search>
<!-- 创建一个下拉选择框名称为“selectClass”设置lay-search属性用于让用户选择学生所在的班级 -->
<option value="${student.s_class}" selected>${student.s_class}</option>
<!-- 创建一个默认选中的选项通过EL表达式获取当前学生所在班级信息进行回显并设置为默认选中展示当前学生已有的班级 -->
<c:forEach items="${classLists}" var="classList">
<option>${classList.cclass}</option>
<!-- 使用forEach标签循环遍历名为“classLists”的班级信息集合每次循环创建一个选项元素显示文本为当前班级信息用于展示可选择的其他班级选项 -->
</c:forEach>
</select>
<input type="radio" name="student-sex" id="idsex" value="男" title="男">
<input type="radio" name="student-sex" id="idsex2" value="女" title="女">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">姓名</label>
<div class="layui-inline">
<label class="layui-form-label">年龄</label>
<div class="layui-input-block">
<input type="text" name="student-name" id="student-name" value="${student.s_name}" placeholder="" autocomplete="off" class="layui-input">
<!-- 创建一个文本输入框类型为文本名称为“student-name”设置了id为“student-name”方便后续通过JavaScript操作该元素其值通过EL表达式获取当前学生姓名信息进行回显关闭自动完成功能用于让用户修改学生的姓名信息 -->
<input type="text" name="student-age" id="student-age" value="${student.s_age}" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">性别</label>
<div class="layui-input-block">
<input type="radio" name="student-sex" id="idsex" value="男" title="男">
<input type="radio" name="student-sex" id="idsex2" value="女" title="女">
<!-- 创建两个单选按钮input类型为radio它们的名称都为“student-sex”表示属于同一组单选选项同一组单选按钮的名称要相同分别设置不同的id、值和标题属性用于让用户选择学生的性别 -->
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">年龄</label>
<div class="layui-input-block">
<input type="text" name="student-age" id="student-age" value="${student.s_age}" placeholder="" autocomplete="off" class="layui-input">
<!-- 创建一个文本输入框用于输入学生的年龄信息名称为“student-age”通过EL表达式回显当前学生年龄关闭自动完成功能 -->
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">电话</label>
<div class="layui-input-block">
<input type="text" name="student-phone" id="student-phone" value="${student.s_phone}" placeholder="" autocomplete="off" class="layui-input">
<!-- 创建一个文本输入框用于输入学生的电话号码信息名称为“student-phone”回显当前学生电话号码关闭自动完成功能 -->
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">邮箱</label>
<div class="layui-input-block">
<input type="text" name="student-email" id="student-email" value="${student.s_email}" placeholder="" autocomplete="off" class="layui-input">
<!-- 创建一个文本输入框用于输入学生的邮箱信息名称为“student-email”回显当前学生邮箱地址关闭自动完成功能 -->
</div>
<div class="layui-inline">
<label class="layui-form-label">电话</label>
<div class="layui-input-block">
<input type="text" name="student-phone" id="student-phone" value="${student.s_phone}" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">城市</label>
<div class="layui-inline">
<label class="layui-form-label">邮箱</label>
<div class="layui-input-block">
<input type="text" name="student-address" id="student-address" value="${student.s_address}" placeholder="请输入你所在的省市" autocomplete="off" class="layui-input">
<!-- 创建一个文本输入框用于输入学生所在城市信息名称为“student-address”回显当前学生城市信息设置了提示性的占位符placeholder关闭自动完成功能 -->
<input type="text" name="student-email" id="student-email" value="${student.s_email}" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">城市</label>
<div class="layui-input-block">
<input type="text" name="student-address" id="student-address" value="${student.s_address}" placeholder="请输入你所在的省市" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formDemo">修改</button>
<!-- 创建一个提交按钮button应用layui框架的按钮样式类layui-btn设置其为可提交表单lay-submit并通过lay-filter属性设置一个名为“formDemo”的过滤器点击该按钮会触发表单提交操作将用户修改后的学生信息发送到指定的Servlet -->
<button class="layui-btn layui-btn-primary" id="inforeset">重置</button>
<!-- 创建一个按钮应用layui框架的主要样式类layui-btn layui-btn-primary表示基础样式按钮设置id为“inforeset”用于后续绑定JavaScript事件实现重置表单的功能 -->
<span style="padding-left: 20px;">${update_msg}</span>
<!-- 通过EL表达式显示名为“update_msg”的变量的值可能用于在页面上显示一些与学生信息更新操作相关的提示信息比如更新成功或失败的消息等 -->
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formDemo">修改</button>
<button class="layui-btn layui-btn-primary" id="inforeset">重置</button>
<span style="padding-left: 20px;">${update_msg}</span>
</div>
</form>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含名为footer.jsp的页面一般用于展示页面底部的一些通用信息比如版权声明、网站相关链接、联系方式等内容 -->
</div>
</div>
</form>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<script type="text/javascript">
$("#nav li:nth-child(2) dl dd:nth-child(2)").addClass("layui-this");
// 使用jQuery选择器选中页面中id为“nav”的元素下的第2个子元素li下的dl元素下的第2个dd元素并为其添加类名“layui-this”在layui框架中添加这个类名通常意味着将对应的导航菜单项标记为当前选中状态使其呈现特定的样式如改变颜色、加粗等以此表明当前所在页面功能模块对应的菜单选项
$("#nav li:nth-child(2)").addClass("layui-nav-itemed");
// 同样用jQuery选择器选中页面中id为“nav”的元素下的第2个子元素li并为其添加类名“layui-nav-itemed”在layui框架里这个类名可能用于控制导航菜单的展开或折叠状态让对应的菜单层级结构展示相应效果方便用户查看相关子菜单
$("#hidden-update").removeAttr("hidden");
// 通过jQuery选择器选中id为“hidden-update”的元素可能是一个隐藏的元素具体要看页面其他部分的定义并移除其“hidden”属性使其变为可见状态如果原本是隐藏的话不过这里不清楚“hidden-update”元素具体用途可能与页面特定功能相关
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
// 使用layui框架的element模块调用其init方法进行初始化操作。在layui框架中element模块提供了很多页面元素交互相关的功能例如实现页面布局动态切换、菜单展开收起等交互效果通过调用init方法可激活这些功能确保页面上基于element模块构建的各种UI组件能正常工作
});
</script>
<script type="text/javascript">
$("#nav li:nth-child(2) dl dd:nth-child(2)").addClass("layui-this");
$("#nav li:nth-child(2)").addClass("layui-nav-itemed");
$("#hidden-update").removeAttr("hidden");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
<script>
//Demo
layui.use('form', function(){
// 使用layui框架的form模块后续可以在这个回调函数内部编写与表单相关的交互逻辑代码不过目前这里没有具体内容可能是预留的用于进一步开发表单验证、提交等相关功能的地方
});
</script>
<script>
var sex = "${student.s_sex}";
if (sex == '男') {
$("#idsex").attr("checked","checked");
$("#idsex2").removeAttr("checked");
// 通过EL表达式获取名为“student”的对象中的学生性别信息s_sex赋值给变量sex然后进行条件判断如果性别是“男”则使用jQuery的attr方法为id为“idsex”的单选按钮即代表男性的单选按钮设置“checked”属性为“checked”表示选中该按钮同时移除另一个代表女性的单选按钮id为“idsex2”的“checked”属性确保只有代表“男”性的单选按钮处于选中状态实现根据已有学生信息回显性别选项的功能 -->
} else if (sex == '女') {
$("#idsex2").attr("checked","checked");
$("#idsex").removeAttr("checked");
// 如果性别是“女”则使用jQuery的attr方法为id为“idsex2”的单选按钮即代表女性的单选按钮设置“checked”属性为“checked”表示选中该按钮同时移除代表男性的单选按钮id为“idsex”的“checked”属性使代表“女”性的单选按钮处于选中状态同样是为了依据已有学生信息准确回显性别选项 -->
} else {
<script>
//Demo
layui.use('form', function(){
});
</script>
<script>
var sex = "${student.s_sex}";
if (sex == '男') {
$("#idsex").attr("checked","checked");
$("#idsex2").removeAttr("checked");
} else if (sex == '女') {
$("#idsex2").attr("checked","checked");
$("#idsex").removeAttr("checked");
}else{
$("#idsex").removeAttr("checked");
$("#idsex2").removeAttr("checked");
}
</script>
<script type="text/javascript">
$(function () {
$('#inforeset').bind('click',function () {
$("#idsex").removeAttr("checked");
$("#idsex2").removeAttr("checked");
// 如果学生性别既不是“男”也不是“女”可能是数据异常等情况则移除两个单选按钮“idsex”和“idsex2”的“checked”属性也就是让两个单选按钮都不处于选中状态保证表单的初始状态在这种特殊情况下的合理性
}
</script>
<script type="text/javascript">
$(function () {
$('#inforeset').bind('click', function () {
$("#idsex").removeAttr("checked");
$("#idsex2").removeAttr("checked");
$("#student-name").val("");
$("#student-age").val("");
$("#student-phone").val("");
$("#student-email").val("");
$("#student-address").val("");
alert("已重置!");
// 这是一个jQuery的文档就绪函数当页面的DOM结构加载完成后会执行内部的代码。
// 为id为“inforeset”的元素也就是前面提到的“重置”按钮绑定点击事件处理函数。
// 在点击事件处理函数内部首先移除代表性别单选按钮“idsex”和“idsex2”的“checked”属性使其都不被选中然后将各个输入框“student-name”“student-age”“student-phone”“student-email”“student-address”的值设置为空字符串达到清空用户输入内容的效果最后通过JavaScript的alert函数弹出一个提示框显示“已重置”的提示信息告知用户表单已被重置。
});
$("#student-name").val("");
$("#student-age").val("");
$("#student-phone").val("");
$("#student-email").val("");
$("#student-address").val("");
alert("已重置!");
});
});
</script>
});
</script>
</body>
</html>
</html>

@ -1,201 +1,162 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- JSP页面指令设置页面响应的内容类型为HTML字符编码采用UTF-8表明使用的编程语言是Java -->
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 引入JSTLJavaServer Pages Standard Tag Library核心标签库前缀为“c”后续可以通过该前缀调用核心标签库中的各种标签 -->
<html>
<head>
<title>修改教师信息</title>
<!-- 设置页面的标题为“修改教师信息” -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件路径为相对路径下的css/layui.css用于页面的样式布局等美化 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的样式表文件style.css相对路径用于添加项目特定的样式规则 -->
<script src="./layui.js"></script>
<!-- 引入layui框架的JavaScript脚本文件用于实现layui框架相关的功能 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 从CDN内容分发网络引入jQuery库的最小化版本jQuery是常用的JavaScript库方便进行DOM操作、事件处理等 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 设置body标签的类名为layui-layout-body并设置背景颜色为#F2F2F2类名可能会被相关的样式表用于布局等样式应用 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 使用JSP的include指令包含名为filterLogin.jsp的页面内容可能用于处理登录相关的过滤、验证等逻辑 -->
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<!-- 包含位于WEB-INF/admin目录下的aHeader.jsp页面内容通常用于展示页面头部相关的布局、导航等元素 -->
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<!-- 包含位于WEB-INF/admin目录下的adminNav.jsp页面内容大概率是用于展示管理员相关的导航栏内容 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建一个具有layui-layout和layui-layout-admin类名的div可能是用于整体的页面布局框架layui框架相关的布局样式会作用于此 -->
<div class="layui-body">
<!-- 这是页面的主体内容区域的div -->
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 创建一个带有内边距为15px的div用于放置具体的内容模块 -->
<span class="layui-breadcrumb">
<a href="">管理员</a>
<a href="">教师管理</a>
<a><cite>修改教师信息</cite></a>
</span>
<!-- 创建一个layui框架的面包屑导航元素包含三个链接分别指向不同层级这里链接暂时都为空可能后续会补充完整路径最后一个链接包裹的cite标签内显示“修改教师信息”文本用于展示当前页面在整个系统中的层级位置 -->
<form class="layui-form" action="${pageContext.request.contextPath}/updateTeacherInfoServlet" style="padding-top: 50px" method="post">
<!-- 创建一个layui框架的表单设置表单提交的目标地址为通过EL表达式动态获取的路径指向名为updateTeacherInfoServlet的后端资源设置表单顶部的内边距为50px提交方法为post -->
<div class="layui-form-item">
<label class="layui-form-label">工号</label>
<!-- 创建一个表单标签元素,用于显示“工号”文本 -->
<div class="layui-input-block">
<input type="text" readonly="readonly" name="teacher-id" value="${teacher.t_id}" autocomplete="off" class="layui-input">
<!-- 创建一个文本输入框设置为只读状态其name属性为“teacher-id”输入框的值通过EL表达式从名为teacher的对象可能是从后台传递过来的教师相关数据对象中获取t_id属性值关闭自动完成功能应用layui-input类名用于展示教师的工号信息不可编辑 -->
</div>
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a href="">管理员</a>
<a href="">教师管理</a>
<a><cite>修改教师信息</cite></a>
</span>
<form class="layui-form" action="${pageContext.request.contextPath}/updateTeacherInfoServlet" style="padding-top: 50px" method="post">
<div class="layui-form-item">
<label class="layui-form-label">工号</label>
<div class="layui-input-block">
<input type="text" readonly="readonly" name="teacher-id" value="${teacher.t_id}" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-item">
<label class="layui-form-label">学院</label>
<div class="layui-input-block">
<select name="selectCollege">
<!-- 创建一个下拉选择框name属性为“selectCollege”用于选择教师所属学院 -->
<%-- <option value="${teacher.t_college}" selected>${teacher.t_college}</option>--%>
<option value="" selected></option>
<!-- 这里原本可能是想默认选中教师当前所属学院通过EL表达式获取t_college值但目前注释掉了改为一个空的默认选中项可能后续有其他逻辑处理默认值 -->
<c:forEach items="${collegeLists}" var="collegeList">
<option value="${collegeList.college}">${collegeList.college}</option>
</c:forEach>
<!-- 使用JSTL的forEach标签循环遍历名为collegeLists的集合可能是从后台获取的学院列表数据集合每次循环创建一个下拉选项选项的值和显示文本都通过当前循环的collegeList对象的college属性获取 -->
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">学院</label>
<div class="layui-input-block">
<select name="selectCollege">
<%-- <option value="${teacher.t_college}" selected>${teacher.t_college}</option>--%>
<option value="" selected></option>
<c:forEach items="${collegeLists}" var="collegeList">
<option value="${collegeList.college}">${collegeList.college}</option>
</c:forEach>
</select>
</div>
<div class="layui-form-item">
<label class="layui-form-label">系别</label>
<div class="layui-input-block">
<select name="selectDepartment" lay-search>
<!-- 创建一个带有lay-search属性的下拉选择框layui框架中可能用于支持搜索功能name属性为“selectDepartment”用于选择教师所属系别 -->
<%-- <option value="${teacher.t_department}" selected>${teacher.t_department}</option>--%>
</div>
<div class="layui-form-item">
<label class="layui-form-label">系别</label>
<div class="layui-input-block">
<select name="selectDepartment" lay-search>
<%-- <option value="${teacher.t_department}" selected>${teacher.t_department}</option>--%>
<option value="" selected></option>
<!-- 同样原本可能想默认选中教师当前系别通过EL表达式获取t_department值现注释掉改为空的默认选中项 -->
<c:forEach items="${departmentLists}" var="departmentList">
<option>${departmentList.department}</option>
</c:forEach>
<!-- 循环遍历名为departmentLists的集合可能是系别列表数据集合创建下拉选项显示文本为当前departmentList对象的department属性值 -->
</select>
</div>
<c:forEach items="${departmentLists}" var="departmentList">
<option>${departmentList.department}</option>
</c:forEach>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">班级</label>
<div class="layui-input-block">
<select name="selectClass" lay-search>
<%-- <option value="${teacher.t_class}" selected>${teacher.t_class}</option>--%>
<option value="" selected></option>
<c:forEach items="${classLists}" var="classList">
<option>${classList.cclass}</option>
</c:forEach>
</select>
</div>
<div class="layui-form-item">
<label class="layui-form-label">班级</label>
</div>
<div class="layui-form-item">
<label class="layui-form-label">姓名</label>
<div class="layui-input-block">
<input type="text" name="teacher-name" id="teacher-name" value="${teacher.t_name}" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">性别</label>
<div class="layui-input-block">
<select name="selectClass" lay-search>
<!-- 创建一个带有lay-search属性的下拉选择框name属性为“selectClass”用于选择教师所属班级 -->
<%-- <option value="${teacher.t_class}" selected>${teacher.t_class}</option>--%>
<option value="" selected></option>
<!-- 也是原本想默认选中教师当前班级通过EL表达式获取t_class值现注释掉改为空默认选中项 -->
<c:forEach items="${classLists}" var="classList">
<option>${classList.cclass}</option>
</c:forEach>
<!-- 循环遍历名为classLists的集合班级列表数据集合创建下拉选项显示文本为当前classList对象的cclass属性值 -->
</select>
<input type="radio" name="teacher-sex" id="idsex" value="男" title="男">
<input type="radio" name="teacher-sex" id="idsex2" value="女" title="女">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">姓名</label>
<div class="layui-inline">
<label class="layui-form-label">文化程度</label>
<div class="layui-input-block">
<input type="text" name="teacher-name" id="teacher-name" value="${teacher.t_name}" placeholder="" autocomplete="off" class="layui-input">
<!-- 创建一个文本输入框name属性为“teacher-name”id为“teacher-name”输入框的值通过EL表达式从teacher对象获取t_name属性值无占位符文本关闭自动完成功能应用layui-input类名用于输入教师姓名 -->
<input type="text" name="teacher-education" id="teacher-education" value="${teacher.t_education}" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">性别</label>
<div class="layui-input-block">
<input type="radio" name="teacher-sex" id="idsex" value="男" title="男">
<input type="radio" name="teacher-sex" id="idsex2" value="女" title="女">
<!-- 创建两个单选按钮name属性都为“teacher-sex”用于选择教师性别id分别为“idsex”和“idsex2”对应的值分别为“男”和“女”显示的标题文本也分别为“男”和“女” -->
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">文化程度</label>
<div class="layui-input-block">
<input type="text" name="teacher-education" id="teacher-education" value="${teacher.t_education}" placeholder="" autocomplete="off" class="layui-input">
<!-- 创建一个文本输入框,用于输入教师的文化程度,相关属性设置与前面类似 -->
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">职称</label>
<div class="layui-input-block">
<input type="text" name="teacher-title" id="teacher-title" value="${teacher.t_title}" placeholder="" autocomplete="off" class="layui-input">
<!-- 创建一个文本输入框,用于输入教师的职称,相关属性设置与前面类似 -->
</div>
<div class="layui-inline">
<label class="layui-form-label">职称</label>
<div class="layui-input-block">
<input type="text" name="teacher-title" id="teacher-title" value="${teacher.t_title}" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formDemo">修改</button>
<!-- 创建一个layui框架样式的按钮点击该按钮会触发表单提交并且通过lay-filter属性关联到名为“formDemo”的过滤器可能用于在提交前进行一些验证等操作按钮显示文本为“修改” -->
<button class="layui-btn layui-btn-primary" id="inforeset">重置</button>
<!-- 创建一个layui框架样式的按钮应用了layui-btn-primary类名可能是默认样式id为“inforeset”按钮显示文本为“重置”用于重置表单输入内容 -->
<span style="padding-left: 20px;">${update_msg}</span>
<!-- 显示一个文本内容通过EL表达式展示名为update_msg的值可能是从后台传递过来的与修改操作相关的提示信息并且设置左边距为20px -->
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formDemo">修改</button>
<button class="layui-btn layui-btn-primary" id="inforeset">重置</button>
<span style="padding-left: 20px;">${update_msg}</span>
</div>
</form>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含名为footer.jsp的页面内容通常用于展示页面底部的相关信息如版权声明、联系方式等 -->
</div>
</div>
</form>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<script type="text/javascript">
$("#nav li:nth-child(3) dl dd:nth-child(2)").addClass("layui-this");
<!-- 通过jQuery选择器选择id为nav的元素下的第3个子元素li标签里的dl元素下的第2个dd元素并给其添加类名为layui-this的类可能是用于设置当前导航项或子项的选中状态等样式相关操作但前提是页面中存在相应结构的元素 -->
$("#nav li:nth-child(3)").addClass("layui-nav-itemed");
<!-- 通过jQuery选择器选择id为nav的元素下的第3个子元素li标签并给其添加类名为layui-nav-itemed的类同样可能是用于设置导航项的选中状态等样式相关操作 -->
$("#hidden-update2").removeAttr("hidden");
<!-- 通过jQuery选择器找到id为hidden-update2的元素并移除其hidden属性如果有的话可能是用于显示原本隐藏的某个元素 -->
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
<!-- 使用layui框架的use方法加载element模块加载成功后获取element对象并调用其init方法对页面中的相关元素进行初始化等操作确保layui框架相关的导航、布局等功能正常使用 -->
</script>
<script type="text/javascript">
$("#nav li:nth-child(3) dl dd:nth-child(2)").addClass("layui-this");
$("#nav li:nth-child(3)").addClass("layui-nav-itemed");
$("#hidden-update2").removeAttr("hidden");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
<script>
//Demo
layui.use('form', function(){
<script>
//Demo
layui.use('form', function(){
});
<!-- 这里本意可能是使用layui框架的use方法加载form模块但函数体里暂时没有具体代码一般加载form模块后可以利用其提供的表单相关功能比如表单验证等 -->
</script>
<script>
var sex = "${teacher.t_sex}";
if (sex == '男') {
$("#idsex").attr("checked","checked");
$("#idsex2").removeAttr("checked");
} else if (sex == '女') {
$("#idsex2").attr("checked","checked");
$("#idsex").removeAttr("checked");
}else{
});
</script>
<script>
var sex = "${teacher.t_sex}";
if (sex == '男') {
$("#idsex").attr("checked","checked");
$("#idsex2").removeAttr("checked");
} else if (sex == '女') {
$("#idsex2").attr("checked","checked");
$("#idsex").removeAttr("checked");
}else{
$("#idsex").removeAttr("checked");
$("#idsex2").removeAttr("checked");
}
</script>
<script type="text/javascript">
$(function () {
$('#inforeset').bind('click',function () {
$("#idsex").removeAttr("checked");
$("#idsex2").removeAttr("checked");
}
<!-- 通过EL表达式获取teacher对象的t_sex属性值赋值给变量sex然后根据sex的值来设置对应的性别单选按钮id为idsex和idsex2的的选中状态如果是“男”则选中“男”对应的单选按钮“女”则选中“女”对应的其他情况则都不选中 -->
</script>
<script type="text/javascript">
$(function () {
$('#inforeset').bind('click',function () {
$("#idsex").removeAttr("checked");
$("#idsex2").removeAttr("checked");
$("#teacher-name").val("");
$("#teacher-education").val("");
$("#teacher-title").val("");
alert("已重置!");
});
$("#teacher-name").val("");
$("#teacher-education").val("");
$("#teacher-title").val("");
alert("已重置!");
});
<!-- 当页面DOM加载完成后通过$(function () {...}) 结构给id为inforeset的元素即前面的“重置”按钮绑定点击事件监听器当按钮被点击时执行函数内的代码清除所有单选按钮的选中状态清空姓名、文化程度、职称输入框的内容并弹出一个提示框显示“已重置” -->
</script>
});
</script>
</body>
</html>
</html>

@ -1,99 +1,72 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!-- JSP页面指令设置页面响应的内容类型为HTML字符编码采用UTF-8同时指定页面使用的编程语言为Java这里pageEncoding再次强调页面编码确保字符能正确处理 -->
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<!-- 定义HTML文档的字符编码为UTF-8与上面JSP指令中的设置作用类似确保页面内容能正确显示各种字符 -->
<title>文件传输</title>
<!-- 设置页面的标题为“文件传输” -->
<link rel="stylesheet" href="./css/file.css"/>
<!-- 引入自定义的file.css样式表文件相对路径用于为文件传输相关功能定制样式 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件用于页面整体的样式布局等美化 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入另一个自定义的style.css样式表文件可能包含通用或特定的页面样式规则 -->
<script src="./layui.js"></script>
<!-- 引入layui框架的JavaScript脚本文件用于实现layui框架相关的功能 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 从CDN内容分发网络引入jQuery库的最小化版本方便在页面中进行DOM操作、事件处理等操作 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<!-- 设置页面的视口属性让页面宽度自适应设备宽度初始缩放比例为1最大缩放比例为1禁止用户手动缩放常用于移动端页面适配 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 设置body标签的类名为layui-layout-body并设置背景颜色为#F2F2F2类名通常会被layui框架相关样式应用来布局页面 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 使用JSP的include指令包含名为filterLogin.jsp的页面内容一般用于处理登录相关的过滤、验证等逻辑 -->
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<!-- 包含位于WEB-INF/admin目录下的aHeader.jsp页面内容通常用来展示页面头部相关的布局、导航等元素 -->
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<!-- 包含位于WEB-INF/admin目录下的adminNav.jsp页面内容大概率是用于展示管理员相关的导航栏内容 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建一个具有layui-layout和layui-layout-admin类名的div是layui框架用于整体页面布局的常见结构相关布局样式会作用于此 -->
<div class="layui-body">
<!-- 这是页面主体内容区域的div -->
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 创建一个带有内边距为15px的div用于放置具体的内容模块 -->
<span class="layui-breadcrumb">
<a>管理员</a>
<a>系统管理</a>
<a><cite>文件发布</cite></a>
</span>
<!-- 创建一个layui框架的面包屑导航元素包含三个链接分别显示“管理员”“系统管理”最后一个链接包裹cite标签显示“文件发布”用于展示当前页面在整个系统中的层级位置 -->
<p> &nbsp;</p>
<!-- 插入一个空的段落元素,可能用于增加一点页面间距等布局效果 -->
<div id="center-file" style="padding-left: 41%;">
<!-- 创建一个id为“center-file”的div并设置左边距为41%,可能用于将内部内容在页面中居中显示等布局用途 -->
<h2>文件上传</h2>
<!-- 显示二级标题“文件上传” -->
<ol>
<li>可上传任意大小任意类型文件 </li>
</ol>
<!-- 创建一个有序列表,里面包含一个列表项,说明文件上传的相关规则,即可以上传任意大小和类型的文件 -->
<br>
<!-- 插入一个换行符,用于页面布局上的间隔 -->
<form enctype="multipart/form-data" method="POST" name="formf">
<!-- 创建一个表单设置表单的编码类型为“multipart/form-data”用于支持文件上传提交方法为POST表单名称为“formf” -->
<h4>请选择上传文件:</h4>
<!-- 显示四级标题“请选择上传文件:” -->
<div id="ossfile"><span id="filename"></span>
<span id="filesize"></span>
<b>
<span id="percentage"></span>
</b>
<div class="progress"><div class="progress-bar" style="width: 100%;"></div></div></div>
<!-- 创建一个id为“ossfile”的div内部包含几个用于显示文件相关信息文件名、文件大小、上传进度等的span元素以及一个用于展示进度条外观的div结构初始进度条宽度设置为100%(可能后续会动态改变) -->
<br/>
<!-- 插入一个换行符 -->
<div id="container">
<!-- 创建一个id为“container”的div用于放置文件选择和上传相关的操作元素 -->
<a href="javascript:;" class="file">选择文件
<input id="selectfiles" type="file" name="myfile">
</a>
<!-- 创建一个链接元素点击链接无实际跳转href为javascript:;应用“file”类名里面包含一个文件选择的输入框id为“selectfiles”类型为“file”name属性为“myfile”用于让用户选择要上传的文件 -->
<a href="javascript:;" class="file" type="submit">开始上传
<input type="submit" id="postfiles" value="upload">
</a>
<!-- 创建另一个链接元素同样点击无实际跳转应用“file”类名且设置类型为“submit”虽然这种写法不太规范一般表单提交按钮直接用button或input[type="submit"]这里可能是借助链接样式模拟按钮效果里面包含一个真正的提交按钮id为“postfiles”显示文本为“upload”用于触发文件上传操作 -->
</div>
<p> </p>
<!-- 插入一个空的段落元素 -->
<span id="news">${news}</span>
<!-- 显示一个id为“news”的span元素其内容通过EL表达式展示名为“news”的值可能是从后台传递过来的与文件上传相关的提示信息等 -->
</form>
</div>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含名为footer.jsp的页面内容通常用于展示页面底部的相关信息如版权声明、联系方式等 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a>管理员</a>
<a>系统管理</a>
<a><cite>文件发布</cite></a>
</span>
<p> &nbsp;</p>
<div id="center-file" style="padding-left: 41%;">
<h2>文件上传</h2>
<ol>
<li>可上传任意大小任意类型文件 </li>
</ol>
<br>
<form enctype="multipart/form-data" method="POST" name="formf">
<h4>请选择上传文件:</h4>
<div id="ossfile"><span id="filename"></span>
<span id="filesize"></span>
<b>
<span id="percentage"></span>
</b>
<div class="progress"><div class="progress-bar" style="width: 100%;"></div></div></div>
<br/>
<div id="container">
<a href="javascript:;" class="file">选择文件
<input id="selectfiles" type="file" name="myfile">
</a>
<a href="javascript:;" class="file" type="submit">开始上传
<input type="submit" id="postfiles" value="upload">
</a>
</div>
<p> </p>
<span id="news">${news}</span>
</form>
</div>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
</body>
<script type="text/javascript">
$("#nav li:nth-child(5) dl dd:nth-child(3)").addClass("layui-this");
<!-- 通过jQuery选择器选择id为“nav”的元素下的第5个子元素li标签里的dl元素下的第3个dd元素并给其添加类名为“layui-this”的类可能是用于设置当前导航项或子项的选中状态等样式相关操作但前提是页面中存在相应结构的元素 -->
$("#nav li:nth-child(5)").addClass("layui-nav-itemed");
<!-- 通过jQuery选择器选择id为“nav”的元素下的第5个子元素li标签并给其添加类名为“layui-nav-itemed”的类同样可能是用于设置导航项的选中状态等样式相关操作 -->
</script>
<script>
//JavaScript代码区域
@ -101,66 +74,51 @@
var element = layui.element;
element.init();
});
<!-- 使用layui框架的use方法加载“element”模块加载成功后获取“element”对象并调用其“init”方法对页面中的相关元素进行初始化等操作确保layui框架相关的导航、布局等功能正常使用 -->
</script>
<script>
$('#selectfiles').change(function(e){
// console.log($(this).val());//val()获取到的是完整的文件路径值C:\fakepath\js-dom.png
// 当文件选择输入框的值发生改变(即用户选择了文件)时触发此函数,这里注释掉了打印文件完整路径值的代码,因为在浏览器中获取到的路径通常是假路径(出于安全考虑)
$('#news').text("");
// 清空id为“news”的元素内的文本内容可能是清除之前显示的相关提示信息
var fileMsg = e.currentTarget.files;
// 获取当前触发事件的目标元素即文件选择输入框的files属性得到用户选择的文件列表虽然一般一次只选一个文件上传但这里是数组形式
var fileName = fileMsg[0].name;
// 获取选择的第一个文件(通常就是用户选的那个文件)的文件名
var fileSize = fileMsg[0].size;
// 获取该文件的大小(单位为字节)
var fileType = fileMsg[0].type;
// 获取文件的类型如image/png等
$('#filename').text(fileName);
// 将获取到的文件名显示在id为“filename”的元素内
$('#filesize').text('('+getfilesize(fileSize)+')');
// 调用getfilesize函数将文件大小转换为合适的单位如KB、MB等并显示在id为“filesize”的元素内外面加上括号
$('#percentage').text('0%');
// 初始化上传进度显示为0%显示在id为“percentage”的元素内
$('.progress-bar').css("width","0%");
// 将进度条的宽度设置为0%,通过修改样式来更新进度条的外观
function getfilesize(size) {
if (!size)
return "";
// 如果文件大小为空,直接返回空字符串
var num = 1024.00; //byte
// 定义单位换算的基数这里以字节为基础1KB = 1024字节
if (size < num)
return size + "B";
// 如果文件大小小于1024字节直接以字节为单位显示后面加上“B”表示字节
if (size < Math.pow(num, 2))
return (size / num).toFixed(2) + "K"; //kb
// 如果文件大小小于1024 * 1024字节即1MB将字节数除以1024转换为KB并保留两位小数后面加上“K”表示KB
if (size < Math.pow(num, 3))
return (size / Math.pow(num, 2)).toFixed(2) + "M"; //M
// 如果文件大小小于1024 * 1024 * 1024字节即1GB将字节数除以1024的平方转换为MB并保留两位小数后面加上“M”表示MB
if (size < Math.pow(num, 4))
return (size / Math.pow(num, 3)).toFixed(2) + "G"; //G
// 如果文件大小小于1024 * 1024 * 1024 * 1024字节即1TB将字节数除以1024的三次方转换为GB并保留两位小数后面加上“G”表示GB
return (size / Math.pow(num, 4)).toFixed(2) + "T"; //T
// 如果文件大小大于等于1TB将字节数除以1024的四次方转换为TB并保留两位小数后面加上“T”表示TB
}
});
$('#postfiles').click(function(){
var fileInput = $('#selectfiles').get(0).files[0];
// 获取文件选择输入框的第一个文件(也就是用户选择准备上传的那个文件)
if (fileInput == null) {
alert("请先选择文件!");
// 如果没有选择文件,弹出提示框提醒用户先选择文件
} else {
document.formf.action="${pageContext.request.contextPath}/uploadServlet";
// 如果选择了文件设置表单名为“formf”的提交地址为通过EL表达式动态获取的路径指向名为“uploadServlet”的后端资源用于将文件上传到服务器端对应的处理逻辑
}
$('.inp_file').val(null);
// 这里代码可能有误页面中似乎没有名为“inp_file”的元素如果有这行代码是将其值清空可能是想清空相关的文件输入框之类的但要确保元素存在且类型合适
});
</script>

@ -1,113 +1,88 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 以上两行是JSP页面的指令第一行设置页面内容类型为HTML且编码为UTF-8语言为Java
第二行引入JSTL核心标签库方便在页面中进行逻辑处理等操作 -->
<html>
<head>
<title>公告发布</title>
<!-- 设置页面标题为“公告发布” -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui的样式文件用于页面布局和样式美化 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的style.css样式文件可能包含针对该页面的特定样式 -->
<script src="./layui.js"></script>
<!-- 引入layui的JavaScript脚本文件提供各种交互功能等 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 引入jQuery库方便进行DOM操作、事件处理等 -->
<style type="text/css">
.input-block {
.input-block {
margin-left: 0px;
min-height: 36px;
}
/* 定义类名为.input-block的样式设置左边距为0像素最小高度为36像素 */
#addnotifybutton {
text-align: center;
}
/* 定义id为addnotifybutton的元素样式使其内部文本居中对齐 */
.layui-btn {
.layui-btn {
width: 30%;
}
/* 定义类名为layui-btn的按钮样式设置宽度为30% */
</style>
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 设置页面主体的类名和背景颜色可能与layui的布局样式相关 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 包含filterLogin.jsp页面可能用于登录验证等相关功能 -->
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<!-- 包含aHeader.jsp页面通常用于页面头部布局等内容 -->
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<!-- 包含adminNav.jsp页面一般用于展示页面导航栏相关内容 -->
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a>管理员</a>
<a>系统管理</a>
<a><cite>公告发布</cite></a>
</span>
<!-- 展示面包屑导航,显示当前页面在系统中的层级位置 -->
<p> &nbsp;</p>
<form action="${pageContext.request.contextPath}/addNotifyServlet" method="post">
<!-- 创建一个表单表单提交的目标地址是addNotifyServlet提交方式为POST -->
<div class="input-block">
<textarea name="notifyInfo" placeholder="请输入内容" class="layui-textarea" required lay-verify="required"></textarea>
<!-- 创建一个文本域,用于输入公告内容,设置了名称、占位提示文本、样式类以及必填验证等属性 -->
<p>
</div>
<%-- <input type="text" name="notifyInfo" />--%>
<div id="addnotifybutton">
<button type="submit" class="layui-btn">发布</button>
</div>
<!-- 创建一个按钮类型为提交按钮样式类为layui-btn点击时会提交表单 -->
</form>
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a>管理员</a>
<a>系统管理</a>
<a><cite>公告发布</cite></a>
</span>
<p> &nbsp;</p>
<form action="${pageContext.request.contextPath}/addNotifyServlet" method="post">
<div class="input-block">
<textarea name="notifyInfo" placeholder="请输入内容" class="layui-textarea" required lay-verify="required"></textarea>
<p>
</div>
<%-- <input type="text" name="notifyInfo" />--%>
<div id="addnotifybutton">
<button type="submit" class="layui-btn">发布</button>
</div>
</form>
<table class="layui-table" lay-filter="test">
<thead>
<tr>
<th>公告ID</th>
<th>公告日期</th>
<th>公告内容</th>
<th>操作</th>
</tr>
</thead>
<!-- 定义表格的表头包含公告ID、日期、内容和操作列 -->
<c:forEach items="${notifys}" var="notify">
<tr>
<td>${notify.id}</td>
<td>${notify.notifyDate}</td>
<td>${notify.notifyInfo}</td>
<td><button class="layui-btn layui-btn-normal">修改</button><button class="layui-btn layui-btn-danger">删除</button></td>
</tr>
</c:forEach>
<!-- 使用JSTL的forEach标签循环遍历notifys集合将每个元素这里假设是公告对象的数据展示在表格行中
每行包含公告的相关信息以及修改和删除按钮 -->
</table>
<table class="layui-table" lay-filter="test">
<thead>
<tr>
<th>公告ID</th>
<th>公告日期</th>
<th>公告内容</th>
<th>操作</th>
</tr>
</thead>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含footer.jsp页面通常用于页面底部相关内容展示比如版权信息等 -->
</div>
<c:forEach items="${notifys}" var="notify">
<tr>
<td>${notify.id}</td>
<td>${notify.notifyDate}</td>
<td>${notify.notifyInfo}</td>
<td><button class="layui-btn layui-btn-normal">修改</button><button class="layui-btn layui-btn-danger">删除</button></td>
</tr>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<script type="text/javascript">
$("#nav li:nth-child(5) dl dd:nth-child(1)").addClass("layui-this");
// 使用jQuery选择器选中特定的导航栏元素第5个li下的第一个dl下的第一个dd并添加类名layui-this
// 可能用于标记当前选中的导航项样式
$("#nav li:nth-child(5)").addClass("layui-nav-itemed");
// 使用jQuery选择器选中特定的导航栏元素第5个li并添加类名layui-nav-itemed
// 可能用于展开或标记特定导航栏的展开状态相关样式
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
// 使用layui框架的element模块调用init方法进行初始化可能用于初始化页面的一些交互元素等功能
</script>
<script type="text/javascript">
$("#nav li:nth-child(5) dl dd:nth-child(1)").addClass("layui-this");
$("#nav li:nth-child(5)").addClass("layui-nav-itemed");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
</body>
</html>
</html>

@ -1,55 +1,40 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 上述两行是JSP页面的指令
第一行设置页面内容类型为HTML编码格式为UTF-8并且指定使用Java语言
第二行引入JSTLJavaServer Pages Standard Tag Library的核心标签库方便在页面中进行一些逻辑处理、数据遍历等操作 -->
<html>
<head>
<title>公告列表</title>
<!-- 设置页面的标题为“公告列表”,该标题会显示在浏览器的标题栏 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式文件layui.css用于实现页面的布局、样式美化等功能 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的style.css样式文件可能包含针对本页面特有的样式规则用于进一步定制页面外观 -->
<script src="./layui.js"></script>
<!-- 引入layui框架的JavaScript脚本文件提供了众多交互功能、组件等相关的代码逻辑 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 引入jQuery库它是一个广泛使用的JavaScript库便于进行DOM操作、事件处理、动画效果等各种前端开发任务 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 设置页面主体的类名为layui-layout-body并指定背景颜色为浅灰色#F2F2F2可能是基于layui框架的布局样式规范 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 通过JSP的include指令包含filterLogin.jsp页面通常用于处理用户登录验证等相关逻辑保证只有登录后的用户能访问本页面 -->
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<!-- 包含aHeader.jsp页面一般用于构建页面的头部区域比如展示网站名称、导航栏等内容 -->
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<!-- 包含adminNav.jsp页面大概率是用于展示页面的导航菜单方便用户在不同功能页面之间进行切换 -->
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域layui框架中用于承载页面主要内容的部分 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a>管理员</a>
<a>系统管理</a>
<a><cite>公告列表</cite></a>
</span>
<!-- 展示面包屑导航,清晰地呈现当前页面在整个系统层级结构中的位置,方便用户知晓所在路径 -->
<p> &nbsp;</p>
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/aHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/admin/adminNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a>管理员</a>
<a>系统管理</a>
<a><cite>公告列表</cite></a>
</span>
<p> &nbsp;</p>
<table class="layui-table" lay-filter="test">
<thead>
<tr>
<th><input type="checkbox" class="my-checkbox" name="" title="" lay-skin="primary"></th>
<th>公告ID</th>
<th>公告日期</th>
<th>公告内容</th>
<th>操作</th>
</tr>
</thead>
<!-- 定义表格的表头部分:
第一个<th>中创建了一个带有layui样式的复选框可能用于批量操作如批量删除等
后续的<th>分别定义了公告ID、公告日期、公告内容和操作列的表头名称 -->
<c:forEach items="${notifys}" var="notify" varStatus="n">
<table class="layui-table" lay-filter="test">
<thead>
<tr>
<th><input type="checkbox" class="my-checkbox" name="" title="" lay-skin="primary"></th>
<th>公告ID</th>
<th>公告日期</th>
<th>公告内容</th>
<th>操作</th>
</tr>
</thead>
<c:forEach items="${notifys}" var="notify" varStatus="n">
<tr>
<th><input type="checkbox" class="my-checkbox" name="" title="" lay-skin="primary"></th>
<td>${n.count}</td>
@ -57,51 +42,34 @@
<td>${notify.notifyInfo}</td>
<td><a class="layui-btn layui-btn-danger" href="javascript:deleteNotify(${notify.id});">删除</a></td>
</tr>
</c:forEach>
<!-- 使用JSTL的forEach标签循环遍历名为notifys的集合通常是从后端传递过来的公告数据列表
对于每个公告元素用notify变量表示创建表格的一行<tr>
第一个<td>同样创建一个复选框;
第二个<td>使用varStatus属性的count属性展示序号从1开始计数
第三个<td>展示公告的日期;
第四个<td>展示公告的内容;
第五个<td>创建一个带有layui样式的删除按钮点击按钮会调用JavaScript函数deleteNotify并传递当前公告的ID作为参数 -->
</table>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含footer.jsp页面通常用于展示页面底部的相关信息比如版权声明、联系方式等内容 -->
</div>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<script type="text/javascript">
$("#nav li:nth-child(5) dl dd:nth-child(2)").addClass("layui-this");
// 使用jQuery选择器选中特定的导航栏元素第5个li下的第二个dl下的第二个dd并添加类名layui-this
// 可能用于标记当前选中的导航项样式,使其呈现出与其他导航项不同的视觉效果,表明当前所在页面为“公告列表”相关页面
$("#nav li:nth-child(5)").addClass("layui-nav-itemed");
// 使用jQuery选择器选中特定的导航栏元素第5个li并添加类名layui-nav-itemed
// 可能用于展开或标记特定导航栏的展开状态相关样式,以展示对应的二级导航等内容
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
// 使用layui框架的element模块调用init方法进行初始化可能用于初始化页面的一些交互元素、组件等功能
// 比如菜单的展开收起、选项卡切换等交互效果的初始化
</script>
<script type="text/javascript">
$("#nav li:nth-child(5) dl dd:nth-child(2)").addClass("layui-this");
$("#nav li:nth-child(5)").addClass("layui-nav-itemed");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
<script>
function deleteNotify(n_id) {
if (confirm("你确定删除该通知吗?")) {
location.href = "${pageContext.request.contextPath}/deleteNotifyServlet?id=" + n_id;
}
<script>
function deleteNotify(n_id) {
if (confirm("你确定删除该通知吗?")) {
location.href = "${pageContext.request.contextPath}/deleteNotifyServlet?id=" + n_id;
}
// 定义名为deleteNotify的JavaScript函数接收一个参数n_id公告的ID
// 首先通过confirm函数弹出一个确认框询问用户是否确定删除该通知
// 如果用户点击确认点击“确定”按钮则将页面重定向到后端的deleteNotifyServlet并通过URL参数传递要删除的公告ID
// 由后端的这个Servlet来处理实际的删除逻辑
</script>
}
</script>
</body>
</html>
</html>

@ -1,79 +1,59 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 以上两行是JSP页面的相关指令
第一行用于设置该JSP页面输出的内容类型为text/html即HTML格式字符编码采用UTF-8同时指定页面使用的编程语言为Java
第二行引入了JSTLJavaServer Pages Standard Tag Library核心标签库通过指定的前缀“c”后续就能在页面中方便地使用该库提供的各种标签进行逻辑处理、数据展示等操作 -->
<html>
<head>
<title>公告列表</title>
<!-- 设置当前HTML页面的标题为“公告列表”这个标题通常会显示在浏览器的标题栏位置 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件layui.css中定义了诸多用于页面布局、组件样式等方面的样式规则能帮助快速搭建出具有一定风格的页面 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的style.css样式文件这里面可以包含针对当前页面特殊需求所定制的一些样式用于覆盖或补充layui框架样式的不足 -->
<script src="./layui.js"></script>
<!-- 引入layui框架对应的JavaScript脚本文件layui.js包含了实现各种交互功能、组件逻辑等的代码是页面实现动态效果的重要依赖 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 引入jQuery库jQuery是一个非常流行的JavaScript库它提供了简洁易用的方法来操作DOM元素、处理事件、实现动画效果等方便前端开发 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 设置页面主体的类名为“layui-layout-body”同时指定背景颜色为#F2F2F2一种淡灰色这可能是基于layui框架的布局样式要求使页面呈现出相应的外观效果 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 通过JSP的include指令包含名为“filterLogin.jsp”的页面通常这个页面用于处理用户登录验证相关的逻辑确保只有合法登录的用户才能访问当前页面的内容 -->
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<!-- 包含“/WEB-INF/student/sHeader.jsp”页面一般来说这个页面用于构建学生端页面的头部区域比如展示学校标识、学生相关的功能菜单等 -->
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<!-- 包含“/WEB-INF/student/studentNav.jsp”页面大概率是用于生成学生端的导航栏方便学生在不同的功能模块或页面之间进行切换 -->
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 这里是layui框架中用于承载页面主要内容的部分也就是内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a>学生端</a>
<a><cite>公告列表</cite></a>
</span>
<!-- 展示面包屑导航,通过这种方式可以清晰地向学生展示当前页面在整个学生端系统层级结构中的位置,便于他们了解所处的页面路径 -->
<p> &nbsp;</p>
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a>学生端</a>
<a><cite>公告列表</cite></a>
</span>
<p> &nbsp;</p>
<table class="layui-table" lay-filter="test">
<thead>
<tr>
<th>公告ID</th>
<th>公告日期</th>
<th>公告内容</th>
</tr>
</thead>
<!-- 定义表格的表头部分分别创建了三个列标题用于表示公告的ID、发布日期以及具体的内容后续数据会按照这个表头结构进行展示 -->
<c:forEach items="${notifys}" var="notify" varStatus="n">
<table class="layui-table" lay-filter="test">
<thead>
<tr>
<th>公告ID</th>
<th>公告日期</th>
<th>公告内容</th>
</tr>
</thead>
<c:forEach items="${notifys}" var="notify" varStatus="n">
<tr>
<td>${n.count}</td>
<td>${notify.notifyDate}</td>
<td>${notify.notifyInfo}</td>
</tr>
</c:forEach>
<!-- 使用JSTL的forEach标签对名为“notifys”的集合进行循环遍历这个集合通常是从后端传递过来的公告数据列表。
对于列表中的每一个公告元素用“notify”变量表示创建表格中的一行<tr>标签)来展示对应公告的数据:
第一个<td>单元格展示序号通过varStatus的count属性实现从1开始计数
第二个<td>单元格展示公告的发布日期;
第三个<td>单元格展示公告的具体内容 -->
</table>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含“/footer.jsp”页面通常这个页面用于展示页面底部的相关信息比如版权声明、联系方式、页面底部的导航链接等内容 -->
</div>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<script>
//JavaScript代码区域以下代码用于初始化layui框架的相关功能模块
layui.use('element', function(){
var element = layui.element;
element.init();
});
// 通过layui.use方法调用“element”模块并在回调函数中获取该模块的实例赋值给“element”变量然后调用其“init”方法进行初始化操作。
// “element”模块通常用于处理页面元素相关的交互逻辑例如菜单的展开与收起、选项卡的切换等功能的初始化
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
</body>
</html>
</html>

@ -1,79 +1,59 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 以上两行是JSP页面的指令声明
第一行设置此JSP页面输出内容的类型为HTML格式text/html并且指定字符编码为UTF-8同时表明该页面使用Java语言来编写相关逻辑代码
第二行引入了JSTLJavaServer Pages Standard Tag Library的核心标签库定义了前缀“c”后续就能利用这个标签库提供的标签在页面里进行诸如数据遍历、条件判断等操作 -->
<html>
<head>
<title>公告列表</title>
<!-- 设置HTML页面的标题为“公告列表”这个标题会显示在浏览器的标题栏上让用户直观知晓当前页面的主要内容 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件layui.css里面包含了众多用于页面布局设计、各种组件样式定义等的样式规则借助它可以快速搭建出风格统一的页面外观 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的style.css样式文件通常是开发者根据页面的特定需求编写的用于对layui框架的默认样式进行补充或者覆盖实现更个性化的页面展示效果 -->
<script src="./layui.js"></script>
<!-- 引入layui框架对应的JavaScript文件layui.js包含了大量实现页面交互功能、各种组件业务逻辑等的代码是让页面具备动态交互能力的关键所在 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 引入jQuery库jQuery是一个广泛应用的JavaScript库它提供了简洁且方便的方法来操作DOM元素、处理页面事件、实现动画效果等能极大地简化前端开发工作 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 设置页面主体的类名为“layui-layout-body”并指定背景颜色为#F2F2F2一种淡灰色这大概率是依据layui框架的布局样式规范来设定的以此营造出特定的页面视觉风格 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 通过JSP的include指令引入“filterLogin.jsp”页面一般情况下这个页面用于执行用户登录验证相关的逻辑操作只有当用户成功登录后才能继续访问当前页面展示的内容 -->
<jsp:include page="/WEB-INF/teacher/tHeader.jsp"></jsp:include>
<!-- 引入“/WEB-INF/teacher/tHeader.jsp”页面通常该页面用于构建教师端页面的头部区域例如展示学校名称、教师相关的功能菜单、个人信息等内容 -->
<jsp:include page="/WEB-INF/teacher/teacherNav.jsp"></jsp:include>
<!-- 引入“/WEB-INF/teacher/teacherNav.jsp”页面其主要作用是生成教师端的导航栏方便教师在不同的功能模块、业务页面之间进行切换操作 -->
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 这是layui框架中定义的用于承载页面主要内容的部分也就是所谓的内容主体区域各种核心业务数据、功能展示都会放置在此处 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a>教师端</a>
<a><cite>公告列表</cite></a>
</span>
<!-- 展示面包屑导航,通过这种方式可以清晰地向教师展示当前页面在整个教师端系统的层级结构中所处的位置,方便教师了解自己当前所在的页面路径 -->
<p> &nbsp;</p>
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/teacher/tHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/teacher/teacherNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a>教师端</a>
<a><cite>公告列表</cite></a>
</span>
<p> &nbsp;</p>
<table class="layui-table" lay-filter="test">
<thead>
<tr>
<th>公告ID</th>
<th>公告日期</th>
<th>公告内容</th>
</tr>
</thead>
<!-- 定义表格的表头部分这里创建了三个列标题分别用于展示公告的唯一标识符公告ID、公告发布的具体日期以及公告包含的详细内容后续表格行的数据会按照这个表头结构来依次填充 -->
<c:forEach items="${notifys}" var="notify" varStatus="n">
<table class="layui-table" lay-filter="test">
<thead>
<tr>
<th>公告ID</th>
<th>公告日期</th>
<th>公告内容</th>
</tr>
</thead>
<c:forEach items="${notifys}" var="notify" varStatus="n">
<tr>
<td>${n.count}</td>
<td>${notify.notifyDate}</td>
<td>${notify.notifyInfo}</td>
</tr>
</c:forEach>
<!-- 使用JSTL的forEach标签对名为“notifys”的集合进行循环遍历这个集合通常是由后端程序传递过来的公告数据列表。
针对列表里的每一条公告数据用变量“notify”表示都会创建一个表格行<tr>标签)来展示对应公告的相关信息:
第一个<td>单元格展示的是序号通过varStatus对象的count属性来实现计数功能序号从1开始
第二个<td>单元格展示的是该公告的发布日期;
第三个<td>单元格展示的是该公告包含的具体内容 -->
</table>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 引入“/footer.jsp”页面一般来说这个页面用于展示页面底部的相关信息像版权声明、联系方式、网站相关的友情链接等内容 -->
</div>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<script>
//JavaScript代码区域以下代码的目的是初始化layui框架的相关功能模块使其能正常工作并提供相应的交互功能
layui.use('element', function(){
var element = layui.element;
element.init();
});
// 通过layui框架提供的use方法来加载“element”模块在加载完成后的回调函数里获取该模块的实例将其赋值给变量“element”然后调用实例的“init”方法进行初始化操作。
// “element”模块在layui框架中主要负责处理页面元素相关的交互逻辑例如菜单的展开与收起、选项卡的切换等功能的初始化工作
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
</body>
</html>
</html>

@ -1,84 +1,62 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 以上两行是JSP页面的指令。第一行设置页面内容类型为HTML字符编码为UTF-8且指定使用Java语言。
第二行引入了JSTLJavaServer Pages Standard Tag Library核心标签库前缀为"c"用于在JSP页面中方便地进行逻辑处理比如循环、条件判断等 -->
<html>
<head>
<title>学院专业查询</title>
<!-- 设置页面的标题为"学院专业查询",会显示在浏览器的标题栏 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式文件用于页面的样式布局和美化这里是相对路径引用从当前页面所在目录下的css文件夹中查找layui.css文件 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的样式文件style.css同样是相对路径引用用于添加额外的页面样式满足特定的设计需求 -->
<script src="./layui.js"></script>
<!-- 引入layui框架的JavaScript文件提供各种交互功能和组件支持通过相对路径从当前页面所在目录下获取该文件 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 从CDN内容分发网络引入jQuery库的最小化版本jQuery常用于简化JavaScript中的DOM操作、事件处理等功能 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 设置页面主体的类名为"layui-layout-body",并将背景颜色设置为浅灰色(#F2F2F2可能是基于layui框架的布局要求来设定样式 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 包含名为filterLogin.jsp的页面内容通常用于处理登录相关的验证或展示登录相关的模块等功能 -->
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<!-- 包含位于WEB-INF/student目录下的sHeader.jsp页面一般用于展示页面的头部内容比如导航栏、logo等 -->
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<!-- 包含位于WEB-INF/student目录下的studentNav.jsp页面大概率是用来展示学生端特定的导航菜单等内容 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建一个类名为"layui-layout"和"layui-layout-admin"的div容器可能是layui框架用于布局管理的特定结构 -->
<div class="layui-body">
<!-- 这个div通常用于承载页面的主要内容区域在layui框架的布局体系里有特定含义 -->
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 创建一个带有内边距为15px的div用于放置具体的内容起到一定的排版作用 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a href="">学生端</a>
<a href="">学院专业信息</a>
<a><cite>学院专业查询</cite></a>
</span>
<!-- 创建一个layui框架的面包屑导航组件用于展示当前页面的层级路径这里显示了从"学生端"到"学院专业信息"再到"学院专业查询"的导航链路但链接href目前为空可能后续需要完善具体的跳转地址 -->
<table class="layui-table" lay-filter="test">
<!-- 创建一个layui框架的表格组件设置了一个名为"test"的过滤器,用于后续对表格进行一些交互功能的配置,比如行点击事件、筛选等 -->
<thead>
<table class="layui-table" lay-filter="test">
<thead>
<tr>
<th>ID</th>
<th>学院</th>
<th>专业</th>
<th>班级</th>
</tr>
</thead>
<c:forEach items="${cdcs}" var="cdc" varStatus="c">
<tr>
<th>ID</th>
<th>学院</th>
<th>专业</th>
<th>班级</th>
<!-- 定义表格头部的列标题,分别为"ID"、"学院"、"专业"、"班级" -->
<td>${c.count}</td>
<td>${cdc.college}</td>
<td>${cdc.department}</td>
<td>${cdc.cclass}</td>
</tr>
</thead>
<c:forEach items="${cdcs}" var="cdc" varStatus="c">
<!-- 使用JSTL的forEach标签进行循环遍历循环的对象是名为"cdcs"的数据集合(可能是从后台传递过来的包含学院专业班级等信息的列表),每次循环将当前元素赋值给变量"cdc",并通过"varStatus"获取循环的状态信息(比如当前循环次数等),赋值给变量"c" -->
<tr>
<td>${c.count}</td>
<td>${cdc.college}</td>
<td>${cdc.department}</td>
<td>${cdc.cclass}</td>
<!-- 在表格的每一行中,分别展示循环当前元素("cdc")对应的序号(通过"c.count"获取当前是第几次循环)、学院名称("${cdc.college}")、专业名称("${cdc.department}")、班级名称("${cdc.cclass}" -->
</tr>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含名为footer.jsp的页面一般用于展示页面底部的版权信息、相关链接等内容 -->
</div>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<script type="text/javascript">
$("#nav li:nth-child(4) dl dd:nth-child(1)").addClass("layui-this");
// 使用jQuery选择器选中页面中id为"nav"的元素下的第4个子元素li下的dl元素下的第1个dd元素并为其添加类名"layui-this"可能是用于标记当前选中的导航菜单项使其呈现特定的样式表明处于选中状态具体依赖layui框架的样式规则
$("#nav li:nth-child(4)").addClass("l ayui-nav-itemed");
// 使用jQuery选择器选中页面中id为"nav"的元素下的第4个子元素li并为其添加类名"layui-nav-itemed"可能是用于展开或折叠对应的导航菜单同样依赖layui框架的样式和交互逻辑
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
// 使用layui框架的element模块调用其init方法进行初始化通常是为了激活layui框架中基于element模块的各种UI组件的交互功能比如菜单的展开收起、页面元素的显示隐藏等
});
</script>
<script type="text/javascript">
$("#nav li:nth-child(4) dl dd:nth-child(1)").addClass("layui-this");
$("#nav li:nth-child(4)").addClass("layui-nav-itemed");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
</body>
</html>
</html>

@ -1,91 +1,63 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 上述两行是JSP页面相关指令
第一行设置此JSP页面的内容类型为text/html即HTML页面字符编码采用UTF-8并且指定该页面使用Java语言来处理相关逻辑。
第二行引入了JSTLJavaServer Pages Standard Tag Library的核心标签库给其定义的前缀为"c"后续可以通过这个前缀来使用JSTL提供的各种标签比如用于循环、条件判断等操作的标签方便在JSP页面中进行动态数据处理 -->
<html>
<head>
<title>文件列表</title>
<!-- 设置当前HTML页面的标题为"文件列表",这个标题通常会显示在浏览器的标题栏位置 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件通过相对路径从当前页面所在目录下的css文件夹中查找来应用layui框架所提供的样式用于页面布局、组件美化等方面 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 同样是引入样式表文件不过这里的style.css是自定义的样式文件也是通过相对路径引用用于添加一些个性化的页面样式满足特定的页面设计需求 -->
<script src="./layui.js"></script>
<!-- 引入layui框架的JavaScript脚本文件从当前页面所在目录下获取该文件该脚本为页面提供了诸多交互功能以及各种组件支持方便实现如菜单交互、页面元素动态展示等功能 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 从CDN内容分发网络引入jQuery库的最小化版本jQuery是一个非常流行的JavaScript库能够简化在页面中对DOM元素的操作、事件处理以及实现各种动画效果等方便开发人员编写JavaScript代码 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 为页面主体body设置了类名"layui-layout-body",同时将背景颜色设置为浅灰色(颜色值为#F2F2F2这里的类名可能与layui框架的布局样式相关联按照其框架规范来设置页面的整体外观 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 通过JSP的include指令包含名为filterLogin.jsp的页面内容通常这个页面用于处理用户登录相关的验证逻辑或者展示登录相关的界面元素比如登录表单等 -->
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<!-- 包含位于WEB-INF/student目录下的sHeader.jsp页面一般这个页面用于构建页面的头部区域可能包含如网站logo、导航栏等常见的头部元素 -->
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<!-- 再次使用JSP的include指令包含了WEB-INF/student目录下的studentNav.jsp页面大概率是用来展示学生端特有的导航菜单内容方便用户在不同功能模块之间进行切换操作 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建一个div元素并赋予其两个类名"layui-layout"和"layui-layout-admin"这很可能是layui框架中用于定义页面整体布局结构的特定类名遵循layui框架的布局规范来划分页面的不同区域 -->
<div class="layui-body">
<!-- 在上述布局div内部再创建一个div元素类名为"layui-body"通常在layui框架里这个区域是用于承载页面主要内容的部分例如展示各种业务数据、操作按钮等 -->
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 新建一个div元素并通过内联样式设置其四周内边距为15px主要用于对内部元素进行一定的排版让内容看起来更加规整避免显得过于紧凑或者松散 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a href="">学生端</a>
<a href="">个人信息管理</a>
<a><cite>文件列表</cite></a>
</span>
<!-- 创建一个layui框架提供的面包屑导航组件通过一系列的超链接a标签展示当前页面在整个系统中的层级路径这里展示了从"学生端"进入到"个人信息管理",再到当前的"文件列表"页面但目前超链接的href属性为空可能后续需要完善具体的跳转地址以实现页面导航功能 -->
<table class="layui-table" lay-filter="test">
<!-- 创建一个layui框架的表格组件设置了一个名为"test"的过滤器该过滤器可以在后续的JavaScript代码中用于配置表格相关的交互功能例如实现表格行的点击事件、数据筛选、排序等操作 -->
<thead>
<table class="layui-table" lay-filter="test">
<thead>
<tr>
<th>ID</th>
<th>文件名</th>
<th>文件路径</th>
<th>文件大小</th>
<th>操作</th>
</tr>
</thead>
<c:forEach items="${fileLists}" var="filelist" varStatus="f">
<tr>
<th>ID</th>
<th>文件名</th>
<th>文件路径</th>
<th>文件大小</th>
<th>操作</th>
<!-- 定义表格头部的列标题,分别为"ID"(可能用于标识每条文件记录的序号等)、"文件名"、"文件路径"(用于显示文件存储的具体位置信息)、"文件大小"(展示文件所占存储空间大小)以及"操作"(一般用于放置针对文件的各种操作按钮,如下载、删除等) -->
<td>${f.count}</td>
<td>${filelist.fileName}</td>
<td>${filelist.filePath}</td>
<td>${filelist.fileSize}</td>
<td><a class="layui-btn layui-btn-normal" href="${pageContext.request.contextPath}/downloadServlet?filename=${filelist.fileName}">下载</a></td>
</tr>
</thead>
<c:forEach items="${fileLists}" var="filelist" varStatus="f">
<!-- 使用JSTL的forEach标签来进行循环遍历操作循环的对象是名为"fileLists"的数据集合(这个集合通常是从后台传递过来的,包含了一系列文件相关信息的列表,比如文件名、路径、大小等),每次循环将当前元素赋值给变量"filelist",同时利用"varStatus"获取循环的状态信息(例如当前循环的次数等)并赋值给变量"f" -->
<tr>
<td>${f.count}</td>
<td>${filelist.fileName}</td>
<td>${filelist.filePath}</td>
<td>${filelist.fileSize}</td>
<td><a class="layui-btn layui-btn-normal" href="${pageContext.request.contextPath}/downloadServlet?filename=${filelist.fileName}">下载</a></td>
<!-- 在表格的每一行中通过EL表达式Expression Language如${f.count}等)分别展示对应的数据:
${f.count}表示当前循环的次数,作为序号列的值;
${filelist.fileName}展示文件的名称;
${filelist.filePath}显示文件存储的路径;
${filelist.fileSize}呈现文件的大小;
最后一列是一个超链接a标签设置了layui框架的按钮类名layui-btn和layui-btn-normal使其呈现出特定的按钮样式其href属性指向了一个名为downloadServlet的Servlet并通过URL传递参数filename值为当前行对应的文件名用于实现文件下载的功能 -->
</tr>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含名为footer.jsp的页面一般该页面用于展示页面底部的一些通用信息比如版权声明、网站相关链接、联系方式等内容 -->
</div>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<script type="text/javascript">
$("#nav li:nth-child(5) dl dd:nth-child(3)").addClass("layui-this");
// 使用jQuery选择器来选中页面中id为"nav"的元素下的第5个子元素li下的dl元素下的第3个dd元素并为其添加类名"layui-this"在layui框架中添加这个类名通常意味着将对应的导航菜单项标记为当前选中状态使其呈现出特定的样式例如改变颜色、加粗等以此来表明当前所在的页面功能模块对应的菜单选项
$("#nav li:nth-child(5)").addClass("layui-nav-itemed");
// 同样使用jQuery选择器选中页面中id为"nav"的元素下的第5个子元素li并为其添加类名"layui-nav-itemed"在layui框架里这个类名可能用于控制导航菜单的展开或折叠状态使得对应的菜单层级结构展示相应的效果方便用户查看相关子菜单 -->
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
// 使用layui框架的element模块调用其init方法进行初始化操作。在layui框架中element模块提供了很多页面元素交互相关的功能例如实现页面布局的动态切换、菜单的展开收起等交互效果通过调用init方法可以激活这些功能确保页面上基于element模块构建的各种UI组件能够正常工作
});
</script>
<script type="text/javascript">
$("#nav li:nth-child(5) dl dd:nth-child(3)").addClass("layui-this");
$("#nav li:nth-child(5)").addClass("layui-nav-itemed");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
</body>
</html>

@ -1,66 +1,41 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 上述两行是JSP页面相关的指令
第一行用于设置此JSP页面的内容类型为text/html即HTML格式页面指定字符编码为UTF-8同时表明该页面使用Java语言来处理页面中的相关逻辑。
第二行引入了JSTLJavaServer Pages Standard Tag Library的核心标签库给其定义的前缀是"c"后续就能通过这个前缀来使用JSTL提供的各类标签例如用于循环遍历、条件判断等操作的标签便于在JSP页面中灵活处理动态数据 -->
<html>
<head>
<title>学生信息查询</title>
<!-- 设置当前HTML页面的标题为"学生信息查询",这个标题通常会显示在浏览器的标题栏上,让用户明确当前页面的主要功能 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件通过相对路径从当前页面所在目录下的css文件夹中查找来应用layui框架提供的样式可用于页面布局、组件美化等操作使页面呈现出特定的外观风格 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的样式表文件style.css同样采用相对路径引用方式用于添加一些符合特定需求的个性化页面样式对页面的显示效果进行进一步定制 -->
<script src="./layui.js"></script>
<!-- 引入layui框架的JavaScript脚本文件从当前页面所在目录下获取该文件layui脚本为页面提供了众多交互功能以及各种组件支持例如实现菜单交互、页面元素动态展示等功能 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 从CDN内容分发网络引入jQuery库的最小化版本jQuery是一个广泛使用的JavaScript库它能够简化在页面中对DOM元素的操作、事件处理以及实现各种动画效果等方便开发人员编写JavaScript代码来实现页面交互逻辑 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 为页面主体body设置了类名"layui-layout-body",同时将背景颜色设定为浅灰色(颜色值为#F2F2F2这里的类名大概率与layui框架的布局样式相关联按照其框架规范来构建页面的整体外观 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 通过JSP的include指令包含名为filterLogin.jsp的页面内容通常这个页面用于处理用户登录相关的验证逻辑或者展示登录相关的界面元素比如登录表单等以此确保只有登录后的用户才能访问后续页面内容 -->
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<!-- 包含位于WEB-INF/student目录下的sHeader.jsp页面该页面一般用于构建页面的头部区域可能包含如网站logo、导航栏等常见的头部元素起到统一页面头部布局的作用 -->
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<!-- 再次使用JSP的include指令包含了WEB-INF/student目录下的studentNav.jsp页面这个页面大概率是用来展示学生端特有的导航菜单内容方便用户在不同功能模块之间进行切换操作 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<!-- 创建一个div元素并赋予其两个类名"layui-layout"和"layui-layout-admin"这通常是layui框架中用于定义页面整体布局结构的特定类名遵循layui框架的布局规范来划分页面的不同区域 -->
<div class="layui-body">
<!-- 在上述布局div内部再创建一个div元素类名为"layui-body"在layui框架里这个区域一般是用于承载页面主要内容的部分例如展示各种业务数据、操作按钮等内容 -->
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 新建一个div元素并通过内联样式设置其四周内边距为15px这样做主要是为了对内部元素进行一定的排版让页面内容看起来更加规整避免显得过于紧凑或者松散 -->
<span class="layui-breadcrumb">
<a href="">学生端</a>
<a href="">学生通讯录</a>
<a><cite>本院学生信息</cite></a>
</span>
<!-- 创建一个layui框架提供的面包屑导航组件通过一系列的超链接a标签展示当前页面在整个系统中的层级路径这里展示了从"学生端"进入到"学生通讯录",再到当前的"本院学生信息"页面但目前超链接的href属性为空可能后续需要完善具体的跳转地址以实现页面导航功能 -->
<form style="padding-top: 20px;" action="${pageContext.request.contextPath}/findStudentByPageServlet" method="post">
<!-- 创建一个表单form元素通过内联样式设置其顶部内边距为20px设置表单的提交地址为名为findStudentByPageServlet的Servlet通过EL表达式动态获取上下文路径拼接而成提交方式为POST这个表单用于收集用户输入的查询条件并提交给后端进行数据查询操作 -->
<div class="layui-form-item">
<!-- 创建一个layui框架的表单项目form-item的div容器layui框架通常会根据这个结构来对内部的表单元素进行布局和样式处理 -->
<div class="layui-inline">
<!-- 创建一个内联的div容器在layui表单布局中用于让内部的表单元素在同一行显示方便排列多个输入框和按钮等元素 -->
<label class="layui-form-label" style="width: auto;">学号</label>
<!-- 创建一个表单标签label元素用于标识后面的输入框对应的含义这里显示为"学号"通过设置宽度为自动width: auto来根据内容自适应宽度 -->
<div class="layui-input-inline">
<!-- 创建一个内联的div容器用于放置输入框在layui框架的表单布局里控制输入框在一行内的显示样式 -->
<input type="tel" name="s_id" value="${condition.s_id[0]}" autocomplete="off" class="layui-input">
<!-- 创建一个输入框input元素类型为电话号码type: tel设置其名称为"s_id"用于在表单提交时传递参数给后端输入框的值通过EL表达式从名为"condition"的对象中获取可能是之前查询条件的回显关闭自动完成功能autocomplete="off"并应用layui框架的输入框样式类layui-input -->
</div>
<label class="layui-form-label" style="width: auto;">姓名</label>
<!-- 类似上面的学号标签,这里创建一个用于标识姓名输入框含义的表单标签元素,显示为"姓名" -->
<div class="layui-input-inline">
<input type="text" name="s_name" value="${condition.s_name[0]}" autocomplete="off" class="layui-input">
<!-- 创建一个文本输入框type: text名称为"s_name"同样通过EL表达式获取之前的输入值用于回显关闭自动完成功能并应用layui框架的输入框样式 -->
</div>
<div class="layui-input-inline">
<!-- 再次创建一个内联的div容器用于放置按钮 -->
<button type="submit" class="layui-btn">查询</button>
<!-- 创建一个提交按钮button类型为提交type: submit按钮文本为"查询"并应用layui框架的按钮样式类layui-btn点击该按钮会触发表单的提交操作将输入的查询条件发送到指定的Servlet -->
</div>
</div>
</div>
@ -68,7 +43,6 @@
<table class="layui-table" lay-filter="test">
<!-- 创建一个layui框架的表格组件设置了一个名为"test"的过滤器该过滤器可以在后续的JavaScript代码中用于配置表格相关的交互功能例如实现表格行的点击事件、数据筛选、排序等操作 -->
<thead>
<tr>
<th>ID</th>
@ -82,12 +56,10 @@
<th>城市</th>
<th>手机号</th>
<th>邮箱</th>
<!-- 定义表格头部的列标题分别列出了要展示的学生信息相关的各个字段如序号ID、学号、所在学院、系别、班级、姓名、性别、年龄、所在城市、手机号以及邮箱等 -->
</tr>
</thead>
<c:forEach items="${pb.list}" var="student" varStatus="s">
<!-- 使用JSTL的forEach标签来进行循环遍历操作循环的对象是名为"pb.list"的数据集合(这个集合通常是从后端传递过来的分页查询后的学生信息列表),每次循环将当前元素赋值给变量"student",同时利用"varStatus"获取循环的状态信息(例如当前循环的次数等)并赋值给变量"s" -->
<tr style="height: 70px;">
<td>${s.count}</td>
<td>${student.s_id}</td>
@ -100,70 +72,58 @@
<td>${student.s_address}</td>
<td>${student.s_phone}</td>
<td>${student.s_email}</td>
<!-- 在表格的每一行中通过EL表达式Expression Language如${s.count}等)分别展示对应的数据:
${s.count}表示当前循环的次数,作为序号列的值;
后面依次展示学生的学号、学院、系别、班级、姓名、性别、年龄、城市、手机号以及邮箱等具体信息 -->
</tr>
</c:forEach>
</table>
<ul>
<!-- 创建一个无序列表ul元素用于放置分页相关的链接和页码显示等内容 -->
<c:if test="${pb.currentPage == 1}">
<!-- 使用JSTL的条件判断标签c:if来判断当前页码从名为"pb"的对象中获取当前页码属性是否等于1如果是则执行下面的代码块 -->
<a href ="javascript:return false;">
<!-- 创建一个超链接a标签但通过设置href属性为"javascript:return false;"使其点击时不执行任何实际跳转操作,通常用于禁用当前不可用的上一页链接(当在第一页时,没有上一页了) -->
<a href ="javascript:return false;">
</c:if>
<c:if test="${pb.currentPage!= 1}">
<!-- 如果当前页码不等于1则执行下面的代码块用于创建一个有效的上一页链接 -->
<a href="${pageContext.request.contextPath}/findStudentByPageServlet?currentPage=${pb.currentPage-1}&rows=5&s_id=${condition.s_id[0]}&s_name=${condition.s_name[0]}">
<!-- 创建一个超链接链接地址指向名为findStudentByPageServlet的Servlet并通过URL传递多个参数包括当前页码减1用于获取上一页的数据、每页显示行数这里固定为5行以及之前输入的学号和姓名查询条件用于保持查询条件不变进行分页查询 -->
<c:if test="${pb.currentPage != 1}">
<a href="${pageContext.request.contextPath}/findStudentByPageServlet?currentPage=${pb.currentPage-1}&rows=5&s_id=${condition.s_id[0]}&s_name=${condition.s_name[0]}">
</c:if>
<li class="page-li">上一页</li></a>
<!-- 创建一个列表项li元素应用了名为"page-li"的类名(可能用于设置样式),显示文本为"上一页",并包裹在上面的超链接中,点击这个列表项就会触发对应的上一页链接跳转 -->
</a>
<c:forEach begin="1" end="${pb.totalPage}" var="i">
<!-- 使用JSTL的forEach标签进行循环从1开始到总页数从名为"pb"的对象中获取总页码属性)结束,每次循环将当前页码赋值给变量"i",用于生成每一页的链接 -->
<c:if test="${pb.currentPage == i}">
<!-- 判断当前页码是否等于循环中的页码"i",如果相等,则执行下面代码块,用于突出显示当前页码(比如改变背景色等样式) -->
<a href="${pageContext.request.contextPath}/findStudentByPageServlet?currentPage=${i}&rows=5&s_id=${condition.s_id[0]}&s_name=${condition.s_name[0]}"><li class="page-li" style="background-color: #009688;border-radius: 2px;color: white;">${i}</li></a>
<!-- 创建一个超链接链接到指定的Servlet并传递当前页码等参数内部包裹一个列表项元素应用"page-li"类名,并通过内联样式设置背景色为绿色(#009688、圆角border-radius: 2px以及文字颜色为白色显示的文本为当前页码值"i",以此突出显示当前所在页码 -->
</c:if>
<c:if test="${pb.currentPage!= i}">
<!-- 如果当前页码不等于循环中的页码"i",则执行下面代码块,用于创建普通的页码链接 -->
<c:if test="${pb.currentPage != i}">
<a href="${pageContext.request.contextPath}/findStudentByPageServlet?currentPage=${i}&rows=5&s_id=${condition.s_id[0]}&s_name=${condition.s_name[0]}"><li class="page-li">${i}</li></a>
<!-- 创建一个超链接指向指定Servlet并传递参数内部包裹一个应用"page-li"类名的列表项元素,显示的文本为当前页码值"i",用于点击跳转到对应页码的页面 -->
</c:if>
</c:forEach>
<c:if test="${pb.currentPage == pb.totalPage}">
<!-- 判断当前页码是否等于总页码,如果相等,则执行下面代码块,用于禁用下一页链接(当在最后一页时,没有下一页了) -->
<a href="javascript:return false;">
<!-- 创建一个超链接设置href属性为"javascript:return false;"使其点击时不执行任何实际跳转操作 -->
<a href="javascript:return false;">
</c:if>
<c:if test="${pb.currentPage!= pb.totalPage}">
<!-- 如果当前页码不等于总页码,则执行下面代码块,用于创建有效的下一页链接 -->
<a href="${pageContext.request.contextPath}/findStudentByPageServlet?currentPage=${pb.currentPage+1}&rows=5&s_id=${condition.s_id[0]}&s_name=${condition.s_name[0]}">
<!-- 创建一个超链接链接地址指向名为findStudentByPageServlet的Servlet并通过URL传递多个参数包括当前页码加1用于获取下一页的数据、每页显示行数以及之前输入的学号和姓名查询条件用于实现下一页的分页查询跳转 -->
<c:if test="${pb.currentPage != pb.totalPage}">
<a href="${pageContext.request.contextPath}/findStudentByPageServlet?currentPage=${pb.currentPage+1}&rows=5&s_id=${condition.s_id[0]}&s_name=${condition.s_name[0]}">
</c:if>
<li class="page-li">下一页</li></a>
<!-- 创建一个列表项元素,应用"page-li"类名,显示文本为"下一页",包裹在上面的超链接中,点击可触发下一页的跳转操作 -->
</ul>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 0px;">
<legend>共${pb.totalCount}条记录,共${pb.totalPage}页</legend>
<!-- 创建一个layui框架的字段集fieldset元素应用了相关的类名用于样式设置设置顶部内边距为0px内部通过<legend>标签显示页面相关的统计信息,即总共的记录条数(从名为"pb"的对象中获取总记录数属性)以及总页数(从"pb"对象获取总页码属性) -->
</fieldset>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含名为footer.jsp的页面一般该页面用于展示页面底部的一些通用信息比如版权声明、网站相关链接、联系方式等内容 -->
</div>
</div>
</div>
<script type="text/javascript">
$("#nav li:nth-child(2) dl dd:nth-child(1)").addClass("layui-this");
// 使用jQuery选择器来选中页面中id为"nav"的元素下的第2个子元素li下的dl元素下的第1个dd元素并为其添加类名"layui-this"在layui框架中添加这个类名通常意味着将对应的导航菜单项标记为当前选中状态使其呈现出特定的样式例如改变颜色、加粗等以此来表明当前所在的页面功能模块对应的菜单选项
$("#nav li:nth-child(2)").addClass("layui-nav-itemed");
// 同样使用jQuery选择器选中页面中id为"nav"的元素下的第2个子元素li并为其添加类名"layui-nav-itemed"在layui框架里这个类名可能用于控制导航菜单的展开或折叠状态使得对应的菜单层级结构展示相应的效果方便用户查看相关子菜单 -->
<script type="text/javascript">
$("#nav li:nth-child(2) dl dd:nth-child(1)").addClass("layui-this");
$("#nav li:nth-child(2)").addClass("layui-nav-itemed");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
</body>
</html>

@ -1,44 +1,27 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 以上两行是JSP页面的相关指令
第一行用于设置该JSP页面的内容类型为text/html即HTML格式并指定字符编码为UTF-8同时表明页面使用Java语言来处理相关逻辑。
第二行引入了JSTLJavaServer Pages Standard Tag Library核心标签库定义其前缀为“c”后续就能通过这个前缀来使用JSTL提供的各类标签例如用于循环、条件判断等操作的标签方便在JSP页面中进行动态数据处理 -->
<html>
<head>
<title>本院教师信息</title>
<!-- 设置当前HTML页面的标题为“本院教师信息”此标题会显示在浏览器的标题栏中让用户直观知晓页面展示的主要内容 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件通过相对路径从当前页面所在目录下的css文件夹中查找来应用layui框架所提供的样式可用于页面布局、组件美化等使页面呈现出特定的外观风格 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的样式表文件style.css同样采用相对路径引用用于添加符合特定需求的个性化页面样式对页面显示效果做进一步定制 -->
<script src="./layui.js"></script>
<!-- 引入layui框架的JavaScript脚本文件从当前页面所在目录获取该文件layui脚本为页面提供众多交互功能以及各种组件支持比如实现菜单交互、页面元素动态展示等 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 从CDN内容分发网络引入jQuery库的最小化版本jQuery是常用的JavaScript库能简化页面中对DOM元素的操作、事件处理以及实现各种动画效果等方便开发人员编写JavaScript代码来实现页面交互逻辑 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 为页面主体body设置类名“layui-layout-body”同时将背景颜色设定为浅灰色#F2F2F2这里的类名大概率与layui框架的布局样式相关联按照其框架规范来构建页面整体外观 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 通过JSP的include指令包含名为filterLogin.jsp的页面内容通常这个页面用于处理用户登录相关的验证逻辑或者展示登录相关的界面元素比如登录表单等以此保证只有登录后的用户可访问后续页面内容 -->
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<!-- 包含位于WEB-INF/student目录下的sHeader.jsp页面一般用于构建页面的头部区域可能包含网站logo、导航栏等常见的头部元素起到统一页面头部布局的作用 -->
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<!-- 再次使用JSP的include指令包含WEB-INF/student目录下的studentNav.jsp页面通常用来展示学生端特有的导航菜单内容便于用户在不同功能模块间进行切换操作 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<!-- 创建一个div元素并赋予其两个类名“layui-layout”和“layui-layout-admin”这一般是layui框架中用于定义页面整体布局结构的特定类名遵循layui框架的布局规范来划分页面不同区域 -->
<div class="layui-body">
<!-- 在上述布局div内部再创建一个div元素类名为“layui-body”在layui框架里该区域通常用于承载页面的主要内容例如展示各类业务数据、操作按钮等 -->
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 新建一个div元素并通过内联样式设置其四周内边距为15px主要用于对内部元素进行排版让页面内容看起来更规整避免显得过于紧凑或松散 -->
<span class="layui-breadcrumb">
<a href="">学生端</a>
<a href="">教师通讯录</a>
<a><cite>本院教师信息</cite></a>
</span>
<!-- 创建一个layui框架提供的面包屑导航组件通过一系列超链接a标签展示当前页面在整个系统中的层级路径这里展示了从“学生端”进入“教师通讯录”再到“本院教师信息”页面但目前超链接的href属性为空可能后续需完善具体跳转地址以实现页面导航功能 -->
<table class="layui-table" lay-filter="test">
<!-- 创建一个layui框架的表格组件设置名为“test”的过滤器该过滤器可在后续JavaScript代码中用于配置表格相关交互功能例如实现表格行点击事件、数据筛选、排序等操作 -->
<thead>
<tr>
<th>ID</th>
@ -47,12 +30,10 @@
<th>性别</th>
<th>文化程度</th>
<th>职称</th>
<!-- 定义表格头部的列标题分别列出要展示的教师信息相关的各个字段如序号ID、工号、姓名、性别、文化程度、职称等 -->
</tr>
</thead>
<c:forEach items="${teachers}" var="teacher" varStatus="t">
<!-- 使用JSTL的forEach标签进行循环遍历操作循环的对象是名为“teachers”的数据集合通常是从后端传递过来的教师信息列表每次循环将当前元素赋值给变量“teacher”同时利用“varStatus”获取循环状态信息如当前循环次数等并赋值给变量“t” -->
<tr style="height: 70px;">
<td>${t.count}</td>
<td>${teacher.t_id}</td>
@ -60,33 +41,26 @@
<td>${teacher.t_sex}</td>
<td>${teacher.t_education}</td>
<td>${teacher.t_title}</td>
<!-- 在表格的每一行中通过EL表达式Expression Language如${t.count}等)分别展示对应的数据:
${t.count}表示当前循环次数,作为序号列的值;
后面依次展示教师的工号、姓名、性别、文化程度、职称等具体信息 -->
</tr>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含名为footer.jsp的页面一般用于展示页面底部的一些通用信息比如版权声明、网站相关链接、联系方式等内容 -->
</div>
</div>
</div>
<script type="text/javascript">
$("#nav li:nth-child(3) dl dd:nth-child(1)").addClass("layui-this");
// 使用jQuery选择器选中页面中id为“nav”的元素下的第3个子元素li下的dl元素下的第1个dd元素并为其添加类名“layui-this”在layui框架中添加此名通常意味着将对应的导航菜单项标记为当前选中状态使其呈现特定样式如改变颜色、加粗等表明当前所在页面功能模块对应的菜单选项
$("#nav li:nth-child(3)").addClass("layui-nav-itemed");
// 同样用jQuery选择器选中页面中id为“nav”的元素下的第3个子元素li并为其添加类名“layui-nav-itemed”在layui框架里这个类名可能用于控制导航菜单的展开或折叠状态让对应的菜单层级结构展示相应效果方便用户查看相关子菜单 -->
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
// 使用layui框架的element模块调用其init方法进行初始化操作。在layui框架中element模块提供很多页面元素交互相关功能例如实现页面布局动态切换、菜单展开收起等交互效果通过调用init方法可激活这些功能确保页面上基于element模块构建的各种UI组件能正常工作
});
</script>
<script type="text/javascript">
$("#nav li:nth-child(3) dl dd:nth-child(1)").addClass("layui-this");
$("#nav li:nth-child(3)").addClass("layui-nav-itemed");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
</body>
</html>
</html>

@ -1,83 +1,56 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!-- 这是JSP页面的指令设置页面的内容类型为text/html即HTML格式页面指定字符编码为UTF-8同时表明页面使用Java语言编写并且编码格式也是UTF-8确保页面能正确处理和显示各种字符 -->
<html>
<head>
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件通过相对路径从当前页面所在目录下的css文件夹中查找应用layui框架提供的样式用于页面布局、组件美化等使页面呈现出layui框架定义的外观风格 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的样式表文件style.css同样采用相对路径引用用于添加符合特定需求的个性化页面样式对页面显示效果做进一步定制 -->
<link rel="icon" href="./images/favicon.ico" type="image/x-icon">
<!-- 设置页面的图标favicon即浏览器标签页上显示的小图标通过相对路径指定图标文件的位置位于当前页面所在目录下的images文件夹中类型为image/x-icon -->
<link rel="shortcut icon" href="./images/favicon.ico" type="image/x-icon">
<!-- 同样是设置页面的快捷图标,功能和上面的<link rel="icon">类似,用于在浏览器中更好地标识该页面,不同浏览器对这两种设置的兼容性有所不同,所以常一起使用来确保图标能正确显示 -->
<script src="layui.js"></script>
<!-- 引入layui框架的JavaScript脚本文件从当前页面所在目录获取该文件这里假设layui.js和当前页面在同一级目录下layui脚本为页面提供众多交互功能以及各种组件支持例如实现菜单交互、页面元素动态展示等功能 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 从CDN内容分发网络引入jQuery库的最小化版本jQuery是常用的JavaScript库能简化页面中对DOM元素的操作、事件处理以及实现各种动画效果等方便开发人员编写JavaScript代码来实现页面交互逻辑 -->
</head>
<body class="layui-layout-body">
<!-- 为页面主体body设置类名“layui-layout-body”这个类名通常与layui框架的布局样式相关联按照其框架规范来构建页面整体外观可能会应用默认的背景、边距等样式 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建一个div元素并赋予其两个类名“layui-layout”和“layui-layout-admin”这一般是layui框架中用于定义页面整体布局结构的特定类名遵循layui框架的布局规范来划分页面不同区域比如头部、主体、侧边栏等具体根据框架的设定 -->
<div class="layui-header">
<!-- 创建一个用于表示页面头部的div元素在layui框架布局里这个区域通常用于放置如网站logo、导航栏等头部相关的元素 -->
<div class="layui-logo" style="font-size: 52px">SIMS</div>
<!-- 创建一个带有特定样式设置字体大小为52px的div元素显示内容为“SIMS”一般作为网站或系统的标识logo在layui框架里这个元素通常会按照框架对.logo类的样式设定来展示比如位置、颜色等 -->
<!-- 头部区域可配合layui已有的水平导航 -->
<ul class="layui-nav layui-layout-left">
<!-- 创建一个无序列表ul元素应用了“layui-nav”和“layui-layout-left”类名在layui框架中“layui-nav”用于构建导航栏“layui-layout-left”表示该导航栏在页面布局中靠左显示这个列表里会放置导航栏的各个菜单项 -->
<li class="layui-nav-item"><a class = "layui-icon layui-icon-home" id="fresh" href="index.jsp"> 主页</a></li>
<!-- 创建一个列表项li元素应用“layui-nav-item”类名表示这是导航栏中的一个可点击项内部包含一个超链接a标签超链接应用了layui框架的图标类layui-icon layui-icon-home表示一个主页图标设置了id为“fresh”链接地址指向“index.jsp”页面显示文本为“ 主页”(前面有个空格可能是为了排版美观),点击该链接可跳转到主页 -->
<li class="layui-nav-item "><a class = "layui-icon layui-icon-refresh-3" href="javascript:location.reload();"> 刷新</a></li>
<!-- 类似上面的列表项这里创建一个导航项用于刷新页面超链接应用了刷新图标类layui-icon layui-icon-refresh-3通过设置href属性为“javascript:location.reload();”点击时会执行JavaScript代码来重新加载当前页面 -->
<li class="layui-nav-item">
<a class="layui-icon layui-icon-link" href="javascript:;"> 其它</a>
<!-- 创建一个导航项,显示文本为“ 其它”应用了链接图标类layui-icon layui-icon-link但href属性设置为“javascript:;”暂时没有实际的跳转链接可能后续会通过JavaScript动态添加功能点击时目前不会有实际跳转操作 -->
<dl class="layui-nav-child">
<!-- 创建一个定义列表dl元素应用“layui-nav-child”类名在layui框架中这个类名用于表示该列表是上面导航项的子菜单用于展示下拉菜单等子级导航内容 -->
<dd><a href="${pageContext.request.contextPath}/complaintListServlet">小吐槽</a></dd>
<!-- 创建一个定义列表项dd元素内部包含一个超链接链接地址指向名为“complaintListServlet”的Servlet通过EL表达式动态获取上下文路径拼接而成显示文本为“小吐槽”点击可跳转到对应的功能页面可能用于查看一些吐槽信息等功能 -->
<dd><a href="${pageContext.request.contextPath}/notifyListToServlet">学校公告</a></dd>
<!-- 类似上面的dd元素这里的超链接指向“notifyListToServlet”Servlet显示文本为“学校公告”用于跳转到查看学校公告的页面 -->
</dl>
</li>
</ul>
<ul class="layui-nav layui-layout-right">
<!-- 创建另一个无序列表元素应用“layui-nav”和“layui-layout-right”类名用于构建靠右显示的导航栏放置一些和用户相关或者其他功能的导航项 -->
<li class="layui-nav-item">
<a href="javascript:;">
<img src="${pageContext.request.contextPath}/showPhotoServlet" class="layui-nav-img">
${student.s_id} ${student.s_name}
</a>
<!-- 创建一个导航项超链接的href属性暂时设置为“javascript:;”无实际跳转功能可能后续添加内部包含一个图片元素img图片的src属性指向名为“showPhotoServlet”的Servlet通过EL表达式动态获取上下文路径拼接可能用于获取并显示用户头像并应用“layui-nav-img”类名按照layui框架样式展示图片后面跟着通过EL表达式显示的学生学号${student.s_id})和姓名(${student.s_name}),整体用于展示当前登录学生的信息 -->
<dl class="layui-nav-child">
<dd><a href="${pageContext.request.contextPath}/studentInfomationServlet">个人信息</a></dd>
<!-- 创建子菜单列表项超链接指向“studentInfomationServlet”Servlet显示文本为“个人信息”点击可跳转到查看或修改个人信息的页面 -->
<dd><a href="${pageContext.request.contextPath}/uploadImageServlet">修改头像</a></dd>
<!-- 子菜单列表项超链接指向“uploadImageServlet”Servlet显示文本为“修改头像”用于跳转到修改用户头像的功能页面 -->
<dd><a href="${pageContext.request.contextPath}/logoutServlet">退出</a></dd>
<!-- 子菜单列表项超链接指向“logoutServlet”Servlet显示文本为“退出”点击可执行退出登录等相关操作 -->
</dl>
</li>
<li class="layui-nav-item"><a class="layui-icon layui-icon-about" href="JavaScript:alertabout()"> 关于</a></li>
<!-- 创建一个导航项超链接应用“layui-icon layui-icon-about”图标类表示关于图标href属性设置为调用JavaScript函数“alertabout()”的代码,点击时会执行该函数弹出关于系统的相关信息 -->
</ul>
</div>
<div class="layui-layout layui-layout-admin">
<div class="layui-header">
<div class="layui-logo" style="font-size: 52px">SIMS</div>
<!-- 头部区域可配合layui已有的水平导航 -->
<ul class="layui-nav layui-layout-left">
<li class="layui-nav-item"><a class = "layui-icon layui-icon-home" id="fresh" href="index.jsp"> 主页</a></li>
<li class="layui-nav-item "><a class = "layui-icon layui-icon-refresh-3" href="javascript:location.reload();"> 刷新</a></li>
<li class="layui-nav-item">
<a class="layui-icon layui-icon-link" href="javascript:;"> 其它</a>
<dl class="layui-nav-child">
<dd><a href="${pageContext.request.contextPath}/complaintListServlet">小吐槽</a></dd>
<dd><a href="${pageContext.request.contextPath}/notifyListToServlet">学校公告</a></dd>
</dl>
</li>
</ul>
<ul class="layui-nav layui-layout-right">
<li class="layui-nav-item">
<a href="javascript:;">
<img src="${pageContext.request.contextPath}/showPhotoServlet" class="layui-nav-img">
${student.s_id} ${student.s_name}
</a>
<dl class="layui-nav-child">
<dd><a href="${pageContext.request.contextPath}/studentInfomationServlet">个人信息</a></dd>
<dd><a href="${pageContext.request.contextPath}/uploadImageServlet">修改头像</a></dd>
<dd><a href="${pageContext.request.contextPath}/logoutServlet">退出</a></dd>
</dl>
</li>
<li class="layui-nav-item"><a class="layui-icon layui-icon-about" href="JavaScript:alertabout()"> 关于</a></li>
</ul>
</div>
<script>
//注意:导航 依赖 element 模块,否则无法进行功能性操作
layui.use('element', function(){
var element = layui.element;
element.init();
// 使用layui框架的element模块调用其init方法进行初始化操作。在layui框架中element模块提供很多页面元素交互相关功能例如实现页面布局动态切换、菜单展开收起等交互效果通过调用init方法可激活这些功能确保页面上基于element模块构建的各种UI组件能正常工作
});
</script>
<script type="text/javascript">
function alertabout() {
alert("学生信息管理系统\n陈双全1812123206");
// 定义一个名为“alertabout”的JavaScript函数当被调用时会弹出一个包含特定文本信息“学生信息管理系统”以及“陈双全1812123206”中间换行显示的提示框用于展示关于系统的一些基本信息比如系统名称、开发者相关信息等
}
</script>
</div>
<script>
//注意:导航 依赖 element 模块,否则无法进行功能性操作
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
<script type="text/javascript">
function alertabout() {
alert("学生信息管理系统\n陈双全1812123206");
}
</script>
</body>
</html>
</html>

@ -1,22 +1,17 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 上述两行是JSP页面相关的指令
第一行用于设置此JSP页面的内容类型为text/html即HTML格式页面指定字符编码为UTF-8同时表明该页面使用Java语言来处理页面中的相关逻辑。
第二行引入了JSTLJavaServer Pages Standard Tag Library的核心标签库给其定义的前缀是"c"后续就能通过这个前缀来使用JSTL提供的各类标签例如用于循环遍历、条件判断等操作的标签便于在JSP页面中灵活处理动态数据 -->
<html>
<head>
<title>${html_title}</title>
<!-- 设置当前HTML页面的标题这里使用了EL表达式${html_title}),意味着标题的值是动态从后台传递过来的某个变量所对应的值,而不是固定的文本 -->
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
// 使用layui框架的element模块调用其init方法进行初始化操作。在layui框架中element模块提供了很多页面元素交互相关的功能例如实现页面布局的动态切换、菜单的展开收起等交互效果通过调用init方法可以激活这些功能确保页面上基于element模块构建的各种UI组件能够正常工作
});
</script>
<style>
.layui-card.layui-card-body.layui-icon {
.layui-card .layui-card-body .layui-icon {
display: inline-block;
width: 100%;
height: 60px;
@ -26,145 +21,98 @@
font-size: 30px;
background-color: #F8F8F8;
color: #333;
transition: all.3s;
-webkit-transition: all.3s;
/* 以下是针对类名为"layui-card.layui-card-body.layui-icon"的元素设置的样式规则:
将其设置为行内块元素display: inline-block使其能在水平方向排列且可以设置宽高
宽度占满父元素的100%高度设置为60px
通过line-height属性让内部文本垂直居中
文本水平居中text-align: center
设置圆角半径为2px使其边角更圆润
字体大小为30px
背景颜色为浅灰色(#F8F8F8文本颜色为深灰色#333
定义了CSS过渡效果transition当元素的样式属性发生变化时会在0.3秒内平滑过渡,同时添加了-webkit-前缀是为了兼容webkit内核的浏览器如Chrome、Safari等 */
transition: all .3s;
-webkit-transition: all .3s;
}
.layui-card.layui-card-body {
.layui-card .layui-card-body {
text-align: center;
/* 针对类名为"layui-card.layui-card-body"的元素设置文本水平居中样式,影响其内部包含的子元素的文本对齐方式 */
}
#notify {
text-align: left;
/* 针对id为"notify"的元素设置文本左对齐样式,覆盖可能存在的其他文本对齐规则,使其内部文本靠左显示 */
}
</style>
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 为页面主体body设置了类名"layui-layout-body",同时将背景颜色设定为浅灰色(颜色值为#F2F2F2这里的类名大概率与layui框架的布局样式相关联按照其框架规范来构建页面的整体外观 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 通过JSP的include指令包含名为filterLogin.jsp的页面内容通常这个页面用于处理用户登录相关的验证逻辑或者展示登录相关的界面元素比如登录表单等以此确保只有登录后的用户才能访问后续页面内容 -->
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<!-- 包含位于WEB-INF/student目录下的sHeader.jsp页面该页面一般用于构建页面的头部区域可能包含如网站logo、导航栏等常见的头部元素起到统一页面头部布局的作用 -->
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<!-- 再次使用JSP的include指令包含了WEB-INF/student目录下的studentNav.jsp页面这个页面大概率是用来展示学生端特有的导航菜单内容方便用户在不同功能模块之间进行切换操作 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建一个div元素并赋予其两个类名"layui-layout"和"layui-layout-admin"这通常是layui框架中用于定义页面整体布局结构的特定类名遵循layui框架的布局规范来划分页面的不同区域 -->
<div class="layui-body">
<!-- 在上述布局div内部再创建一个div元素类名为"layui-body"在layui框架里这个区域一般是用于承载页面主要内容的部分例如展示各种业务数据、操作按钮等内容 -->
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 新建一个div元素并通过内联样式设置其四周内边距为15px这样做主要是为了对内部元素进行一定的排版让页面内容看起来更加规整避免显得过于紧凑或者松散 -->
<div class="layui-card">
<!-- 创建一个layui框架的卡片card组件layui的卡片组件常用于对相关内容进行分组展示使其在页面上有比较清晰的视觉划分 -->
<div class="layui-card-header" id="index-function">功能</div>
<!-- 创建一个用于显示卡片头部的div元素设置了id为"index-function",显示文本为"功能"通常用于给卡片添加标题说明在layui框架里会按照其样式规则展示比如有特定的背景色、字体样式等 -->
<div class="layui-card-body">
<!-- 创建一个用于显示卡片主体内容的div元素在layui框架中这个区域就是放置具体内容的地方 -->
<ul class="layui-row layui-col-space10 layui-this">
<!-- 创建一个无序列表ul元素应用了"layui-row"、"layui-col-space10"和"layui-this"类名:
"layui-row"表示该列表按照layui框架的布局规则以行的形式进行排列
"layui-col-space10"用于设置列表项之间的水平间距为10px
"layui-this"可能是用于标记当前元素处于某种特定状态比如选中状态等具体依赖layui框架的样式设定 -->
<li class="layui-col-xs3">
<!-- 创建一个列表项li元素应用"layui-col-xs3"类名表示该元素在小屏幕xs一般指手机等小尺寸设备下占父元素宽度的1/4基于layui的响应式布局规则 -->
<a href="${pageContext.request.contextPath}/studentSelectCourseListServlet">
<!-- 创建一个超链接a标签链接地址指向名为"studentSelectCourseListServlet"的Servlet通过EL表达式动态获取上下文路径拼接而成点击该链接会跳转到对应的功能页面用于实现相关业务操作 -->
<i class="layui-icon layui-icon-survey"></i>
<!-- 创建一个图标元素i标签应用了layui框架的图标类layui-icon layui-icon-survey表示一个特定的图标样式用于直观展示相关功能 -->
<cite>选课与成绩</cite>
<!-- 使用<cite>标签显示文本"选课与成绩",用于对链接对应的功能进行文字说明 -->
</a>
</li>
<li class="layui-col-xs3">
<a href="${pageContext.request.contextPath}/studentOptionalCourseServlet">
<i class="layui-icon layui-icon-survey"></i>
<cite>可选课程</cite>
</a>
<!-- 与上面的列表项类似这个li元素也是创建一个功能链接链接到"studentOptionalCourseServlet" Servlet显示图标和文字说明分别为对应的图标样式和"可选课程",用于跳转到查看可选课程的页面 -->
</li>
<li class="layui-col-xs3">
<a href="${pageContext.request.contextPath}/findStudentByPageServlet">
<i class="layui-icon layui-icon-survey"></i>
<cite>本院学生信息</cite>
</a>
<!-- 同样的结构,链接指向"findStudentByPageServlet" Servlet显示图标和文字说明用于跳转到查询本院学生信息的页面 -->
</li>
<li class="layui-col-xs3">
<a href="${pageContext.request.contextPath}/teacherListServlet">
<i class="layui-icon layui-icon-user"></i>
<cite>本院教师信息</cite>
</a>
<!-- 链接到"teacherListServlet" Servlet图标样式换为表示用户的图标layui-icon layui-icon-user文字说明为"本院教师信息",用于查看本院教师相关信息 -->
</li>
<li class="layui-col-xs3">
<a href="${pageContext.request.contextPath}/cdcListServlet">
<i class="layui-icon layui-icon-set"></i>
<cite>学院专业查询</cite>
</a>
<!-- 链接到"cdcListServlet" Servlet图标样式为另一种layui-icon layui-icon-set文字说明是"学院专业查询",用于进行学院专业相关信息的查询操作 -->
</li>
<li class="layui-col-xs3">
<a href="${pageContext.request.contextPath}/studentInfomationServlet">
<i class="layui-icon layui-icon-set"></i>
<cite>个人信息</cite>
</a>
<!-- 链接到"studentInfomationServlet" Servlet图标样式和文字说明用于跳转到查看或修改个人信息的页面 -->
</li>
<li class="layui-col-xs3">
<a href="${pageContext.request.contextPath}/studentPasswordIndexServlet">
<i class="layui-icon layui-icon-survey"></i>
<cite>修改密码</cite>
</a>
<!-- 链接到"studentPasswordIndexServlet" Servlet图标样式搭配文字说明用于进入修改密码的功能页面 -->
</li>
<li class="layui-col-xs3">
<a href="${pageContext.request.contextPath}/fileListServlet">
<i class="layui-icon layui-icon-survey"></i>
<cite>文件列表</cite>
</a>
<!-- 链接到"fileListServlet" Servlet图标样式与文字说明对应查看文件列表的功能点击可跳转到相应页面 -->
</li>
</ul>
</div>
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<div class="layui-card">
<div class="layui-card-header" id="index-function">功能</div>
<div class="layui-card-body">
<ul class="layui-row layui-col-space10 layui-this">
<li class="layui-col-xs3">
<a href="${pageContext.request.contextPath}/studentSelectCourseListServlet">
<i class="layui-icon layui-icon-survey"></i>
<cite>选课与成绩</cite>
</a>
</li>
<li class="layui-col-xs3">
<a href="${pageContext.request.contextPath}/studentOptionalCourseServlet">
<i class="layui-icon layui-icon-survey"></i>
<cite>可选课程</cite>
</a>
</li>
<li class="layui-col-xs3">
<a href="${pageContext.request.contextPath}/findStudentByPageServlet">
<i class="layui-icon layui-icon-survey"></i>
<cite>本院学生信息</cite>
</a>
</li>
<li class="layui-col-xs3">
<a href="${pageContext.request.contextPath}/teacherListServlet">
<i class="layui-icon layui-icon-user"></i>
<cite>本院教师信息</cite>
</a>
</li>
<li class="layui-col-xs3">
<a href="${pageContext.request.contextPath}/cdcListServlet">
<i class="layui-icon layui-icon-set"></i>
<cite>学院专业查询</cite>
</a>
</li>
<li class="layui-col-xs3">
<a href="${pageContext.request.contextPath}/studentInfomationServlet">
<i class="layui-icon layui-icon-set"></i>
<cite>个人信息</cite>
</a>
</li>
<li class="layui-col-xs3">
<a href="${pageContext.request.contextPath}/studentPasswordIndexServlet">
<i class="layui-icon layui-icon-survey"></i>
<cite>修改密码</cite>
</a>
</li>
<li class="layui-col-xs3">
<a href="${pageContext.request.contextPath}/fileListServlet">
<i class="layui-icon layui-icon-survey"></i>
<cite>文件列表</cite>
</a>
</li>
</ul>
</div>
<div class="layui-card">
<!-- 再创建一个layui框架的卡片组件用于展示另一部分内容 -->
<div class="layui-card-header">学校最新公告</div>
<!-- 创建卡片头部元素,显示文本为"学校最新公告",用于给下面的公告内容添加标题说明 -->
<c:forEach items="${notifys}" var="notify">
<!-- 使用JSTL的forEach标签来进行循环遍历操作循环的对象是名为"notifys"的数据集合(这个集合通常是从后端传递过来的学校公告信息列表),每次循环将当前元素赋值给变量"notify" -->
<div class="layui-card-body" id="notify">${notify.notifyInfo}<p>${notify.notifyDate}</div>
<!-- 在每个循环中创建一个用于显示卡片主体内容的div元素设置id为"notify"虽然这里id重复使用了可能不太规范但根据代码逻辑应该是想统一设置样式等通过EL表达式展示公告的具体信息${notify.notifyInfo}),后面跟着一个段落标签(<p>再通过EL表达式展示公告的发布日期${notify.notifyDate}),但这里缺少闭合的</p>标签,可能是代码遗漏,正确应该是<</p>来闭合段落标签,用于在页面上展示每条公告的详细内容和发布时间 -->
</c:forEach>
</div>
</div>
<div class="layui-card">
<div class="layui-card-header">学校最新公告</div>
<c:forEach items="${notifys}" var="notify">
<div class="layui-card-body" id="notify">${notify.notifyInfo}<p>${notify.notifyDate}</div>
</c:forEach>
</div>
</div>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含名为footer.jsp的页面一般该页面用于展示页面底部的一些通用信息比如版权声明、网站相关链接、联系方式等内容 -->
</div>
<script type="text/javascript">
$("#nav li:nth-child(1)").addClass("layui-nav-itemed");
// 使用jQuery选择器选中页面中id为"nav"的元素下的第1个子元素li并为其添加类名"layui-nav-itemed"在layui框架里这个类名可能用于控制导航菜单的展开或折叠状态使得对应的菜单层级结构展示相应的效果方便用户查看相关子菜单这里是对第1个菜单项进行此操作
$("#nav li:nth-child(2)").addClass("layui-nav-itemed");
// 对id为"nav"的元素下的第2个子元素li添加"layui-nav-itemed"类名,作用同上,用于处理对应的导航菜单状态
$("#nav li:nth-child(3)").addClass("layui-nav-itemed");
// 对第3个li元素添加类名控制对应菜单状态
$("#nav li:nth-child(4)").addClass("layui-nav-itemed");
// 对第4个li元素添加类名控制对应菜单状态
$("#nav li:nth-child(5)").addClass("layui-nav-itemed");
// 对第5个li元素添加类名控制对应菜单状态具体效果都依赖layui框架对于该类名的样式和交互逻辑定义
</script>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
<script type="text/javascript">
$("#nav li:nth-child(1)").addClass("layui-nav-itemed");
$("#nav li:nth-child(2)").addClass("layui-nav-itemed");
$("#nav li:nth-child(3)").addClass("layui-nav-itemed");
$("#nav li:nth-child(4)").addClass("layui-nav-itemed");
$("#nav li:nth-child(5)").addClass("layui-nav-itemed");
</script>
</body>
</html>
</html>

@ -1,204 +1,162 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 以上两行是JSP页面的指令
第一行设置页面的内容类型为text/html即HTML页面字符编码采用UTF-8并且指定该页面使用Java语言来处理相关逻辑。
第二行引入了JSTLJavaServer Pages Standard Tag Library核心标签库前缀为"c"后续可通过这个前缀使用JSTL提供的各类标签例如用于循环、条件判断等操作的标签方便在JSP页面中进行动态数据处理 -->
<html>
<head>
<title>个人信息</title>
<!-- 设置当前HTML页面的标题为"个人信息",该标题通常会显示在浏览器的标题栏中,让用户明确当前页面的主要功能 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件通过相对路径从当前页面所在目录下的css文件夹中查找来应用layui框架所提供的样式用于页面布局、组件美化等方面 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的样式表文件style.css同样是相对路径引用用于添加一些个性化的页面样式满足特定的页面设计需求 -->
<script src="./layui.js"></script>
<!-- 引入layui框架的JavaScript脚本文件从当前页面所在目录下获取该文件该脚本为页面提供了诸多交互功能以及各种组件支持 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 从CDN内容分发网络引入jQuery库的最小化版本jQuery常用于简化JavaScript中的DOM操作、事件处理等功能 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 设置页面主体的类名为"layui-layout-body",并将背景颜色设置为浅灰色(#F2F2F2可能是基于layui框架的布局要求来设定样式 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 包含名为filterLogin.jsp的页面内容通常用于处理登录相关的验证或展示登录相关的模块等功能 -->
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<!-- 包含位于WEB-INF/student目录下的sHeader.jsp页面一般用于展示页面的头部内容比如导航栏、logo等 -->
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<!-- 包含位于WEB-INF/student目录下的studentNav.jsp页面大概率是用来展示学生端特定的导航菜单等内容 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建一个类名为"layui-layout"和"layui-layout-admin"的div容器可能是layui框架用于布局管理的特定结构 -->
<div class="layui-body">
<!-- 这个div通常用于承载页面的主要内容区域在layui框架的布局体系里有特定含义 -->
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 创建一个带有内边距为15px的div用于放置具体的内容起到一定的排版作用 -->
<span class="layui-breadcrumb">
<a href="">学生端</a>
<a href="">个人信息管理</a>
<a><cite>个人信息</cite></a>
</span>
<!-- 创建一个layui框架的面包屑导航组件用于展示当前页面的层级路径这里显示了从"学生端"到"个人信息管理"再到"个人信息"的导航链路但链接href目前为空可能后续需要完善具体的跳转地址 -->
<form class="layui-form" action="${pageContext.request.contextPath}/studentInfomationUpdateServlet" style="padding-top: 50px" method="post">
<!-- 创建一个layui框架的表单form设置其提交的目标地址为名为studentInfomationUpdateServlet的Servlet通过EL表达式动态获取上下文路径拼接而成通过内联样式设置顶部内边距为50px提交方式为POST用于收集用户输入的个人信息并提交给后端进行更新操作 -->
<div class="layui-form-item">
<!-- 创建一个layui框架下表单项目form-item的div容器layui框架通常会依据这个结构来对内部的表单元素进行布局和样式处理 -->
<label class="layui-form-label">学号</label>
<!-- 创建一个表单标签label元素用于标识后面的输入框对应的含义这里显示为"学号" -->
<div class="layui-input-block">
<!-- 创建一个用于放置输入框的div容器在layui框架的表单布局里控制输入框的显示样式 -->
<input type="text" readonly="readonly" name="student-id" value="${student.s_id}" required lay-verify="required" autocomplete="off" class="layui-input">
<!-- 创建一个文本输入框input元素类型为文本type: text设置为只读readonly="readonly"),其名称为"student-id"用于在表单提交时传递参数给后端输入框的值通过EL表达式从名为"student"的对象中获取可能是从后台查询出当前登录学生的学号信息进行回显设置为必填项required且通过layui框架的验证机制lay-verify="required"来确保用户不能留空关闭自动完成功能autocomplete="off"并应用layui框架的输入框样式类layui-input -->
</div>
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a href="">学生端</a>
<a href="">个人信息管理</a>
<a><cite>个人信息</cite></a>
</span>
<form class="layui-form" action="${pageContext.request.contextPath}/studentInfomationUpdateServlet" style="padding-top: 50px" method="post">
<div class="layui-form-item">
<label class="layui-form-label">学号</label>
<div class="layui-input-block">
<input type="text" readonly="readonly" name="student-id" value="${student.s_id}" required lay-verify="required" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-item">
<label class="layui-form-label">学院</label>
<div class="layui-input-block">
<select name="selectCollege" readonly="readonly">
<!-- 创建一个下拉选择框select元素名称为"selectCollege",设置为只读,用于选择学院信息 -->
<option selected>${student.s_college}</option>
<!-- 创建一个下拉选项option设置为已选中selected其显示文本通过EL表达式从名为"student"的对象中获取当前学生所在学院信息进行回显,通常表示当前学生已有的学院信息,且不允许用户修改 -->
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">学院</label>
<div class="layui-input-block">
<select name="selectCollege" readonly="readonly">
<option selected>${student.s_college}</option>
</select>
</div>
<div class="layui-form-item">
<label class="layui-form-label">系别</label>
<div class="layui-input-block">
<select name="selectDepartment" readonly="readonly">
<option selected>${student.s_department}</option>
<!-- 与上面学院的下拉框类似这里创建系别department的下拉选择框同样是只读且默认选中当前学生所在系别信息通过EL表达式获取不允许用户修改 -->
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">系别</label>
<div class="layui-input-block">
<select name="selectDepartment" readonly="readonly">
<option selected>${student.s_department}</option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">班级</label>
<div class="layui-input-block">
<select name="selectClass" readonly="readonly">
<option selected>${student.s_class}</option>
</select>
</div>
<div class="layui-form-item">
<label class="layui-form-label">班级</label>
</div>
<div class="layui-form-item">
<label class="layui-form-label">姓名</label>
<div class="layui-input-block">
<input type="text" name="student-name" id="student-name" value="${student.s_name}" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">性别</label>
<div class="layui-input-block">
<select name="selectClass" readonly="readonly">
<option selected>${student.s_class}</option>
<!-- 创建班级class的下拉选择框只读默认选中当前学生所在班级信息通过EL表达式获取用户不可修改 -->
</select>
<input type="radio" name="student-sex" id="idsex" value="男" title="男">
<input type="radio" name="student-sex" id="idsex2" value="女" title="女">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">姓名</label>
<div class="layui-inline">
<label class="layui-form-label">年龄</label>
<div class="layui-input-block">
<input type="text" name="student-name" id="student-name" value="${student.s_name}" placeholder="" autocomplete="off" class="layui-input">
<!-- 创建一个文本输入框,类型为文本,名称为"student-name"设置了id为"student-name"方便后续通过JavaScript操作该元素输入框的值通过EL表达式获取当前学生姓名进行回显关闭自动完成功能应用layui框架输入框样式这里用户可以修改姓名信息 -->
<input type="text" name="student-age" id="student-age" value="${student.s_age}" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
</div>
<div class="layui-form-item">
<div class="layui-inline">
<!-- 创建一个内联的div容器在layui表单布局中用于让内部的表单元素在同一行显示 -->
<label class="layui-form-label">性别</label>
<div class="layui-input-block">
<input type="radio" name="student-sex" id="idsex" value="男" title="男">
<input type="radio" name="student-sex" id="idsex2" value="女" title="女">
<!-- 创建两个单选按钮input类型为radio它们的名称都为"student-sex"意味着同一时间只能选择其中一个id分别为"idsex"和"idsex2"方便后续操作,值分别为"男"和"女"通过title属性设置显示的文本为对应的性别文字用户可从中选择性别信息 -->
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">年龄</label>
<div class="layui-input-block">
<input type="text" name="student-age" id="student-age" value="${student.s_age}" placeholder="" autocomplete="off" class="layui-input">
<!-- 创建一个文本输入框用于输入年龄,名称为"student-age"id为"student-age"通过EL表达式获取当前学生年龄进行回显用户可以修改年龄信息 -->
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">电话</label>
<div class="layui-input-block">
<input type="text" name="student-phone" id="student-phone" value="${student.s_phone}" placeholder="" autocomplete="off" class="layui-input">
<!-- 创建文本输入框用于输入电话号码通过EL表达式回显已有电话号码用户可修改 -->
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">邮箱</label>
<div class="layui-input-block">
<input type="text" name="student-email" id="student-email" value="${student.s_email}" placeholder="" autocomplete="off" class="layui-input">
<!-- 创建文本输入框用于输入邮箱地址,回显已有邮箱信息,用户可修改 -->
</div>
<div class="layui-inline">
<label class="layui-form-label">电话</label>
<div class="layui-input-block">
<input type="text" name="student-phone" id="student-phone" value="${student.s_phone}" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">城市</label>
<div class="layui-inline">
<label class="layui-form-label">邮箱</label>
<div class="layui-input-block">
<input type="text" name="student-address" id="student-address" value="${student.s_address}" placeholder="请输入你所在的省市" autocomplete="off" class="layui-input">
<!-- 创建文本输入框用于输入所在城市信息回显已有城市信息通过placeholder属性提示用户输入的格式要求用户可修改 -->
<input type="text" name="student-email" id="student-email" value="${student.s_email}" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">城市</label>
<div class="layui-input-block">
<input type="text" name="student-address" id="student-address" value="${student.s_address}" placeholder="请输入你所在的省市" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formDemo">修改</button>
<!-- 创建一个提交按钮button应用layui框架的按钮样式类layui-btn设置其为可提交表单lay-submit并通过lay-filter属性设置一个名为"formDemo"的过滤器点击该按钮会触发表单提交操作将用户修改后的信息发送到指定的Servlet -->
<button class="layui-btn layui-btn-primary" id="inforeset">重置</button>
<!-- 创建一个普通按钮应用layui框架的按钮样式类layui-btn layui-btn-primary表示一个默认样式的按钮设置了id为"inforeset",用于触发重置表单信息的操作 -->
<span style="padding-left: 20px;">${update_msg}</span>
<!-- 通过EL表达式显示名为"update_msg"的变量的值,可能用于在页面上显示一些与更新操作相关的提示信息,比如更新成功或失败的消息等 -->
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formDemo">修改</button>
<button class="layui-btn layui-btn-primary" id="inforeset">重置</button>
<span style="padding-left: 20px;">${update_msg}</span>
</div>
</form>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含名为footer.jsp的页面一般用于展示页面底部的一些通用信息比如版权声明、网站相关链接、联系方式等内容 -->
</div>
</div>
</form>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<script type="text/javascript">
$("#nav li:nth-child(5) dl dd:nth-child(1)").addClass("layui-this");
// 使用jQuery选择器选中页面中id为"nav"的元素下的第5个子元素li下的dl元素下的第1个dd元素并为其添加类名"layui-this"在layui框架中添加这个类名通常意味着将对应的导航菜单项标记为当前选中状态使其呈现特定的样式例如改变颜色、加粗等以此表明当前所在的页面功能模块对应的菜单选项
$("#nav li:nth-child(5)").addClass("layui-nav-itemed");
// 同样使用jQuery选择器选中页面中id为"nav"的元素下的第5个子元素li并为其添加类名"layui-nav-itemed"在layui框架里这个类名可能用于控制导航菜单的展开或折叠状态使得对应的菜单层级结构展示相应的效果方便用户查看相关子菜单 -->
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
// 使用layui框架的element模块调用其init方法进行初始化操作。在layui框架中element模块提供了很多页面元素交互相关的功能例如实现页面布局的动态切换、菜单的展开收起等交互效果通过调用init方法可以激活这些功能确保页面上基于element模块构建的各种UI组件能够正常工作
});
</script>
<script type="text/javascript">
$("#nav li:nth-child(5) dl dd:nth-child(1)").addClass("layui-this");
$("#nav li:nth-child(5)").addClass("layui-nav-itemed");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
<script>
//Demo
layui.use('form', function(){
// 使用layui框架的form模块后续可以在这个回调函数内部编写与表单相关的交互逻辑代码不过目前这里没有具体内容可能是预留的用于进一步开发表单验证、提交等相关功能的地方
});
</script>
<script>
var sex = "${student.s_sex}";
if (sex == '男') {
$("#idsex").attr("checked","checked");
$("#idsex2").removeAttr("checked");
// 通过EL表达式获取名为"student"的对象中的学生性别信息存储在变量sex中然后进行条件判断如果性别为"男"则使用jQuery的attr方法将id为"idsex"的单选按钮设置为选中状态checked同时移除id为"idsex2"的单选按钮的选中状态,确保页面上性别信息的正确显示
} else if (sex == '女') {
$("#idsex2").attr("checked","checked");
$("#idsex").removeAttr("checked");
// 如果性别为"女"则相反操作选中id为"idsex2"的单选按钮移除id为"idsex"的单选按钮的选中状态
}else{
<script>
//Demo
layui.use('form', function(){
});
</script>
<script>
var sex = "${student.s_sex}";
if (sex == '男') {
$("#idsex").attr("checked","checked");
$("#idsex2").removeAttr("checked");
} else if (sex == '女') {
$("#idsex2").attr("checked","checked");
$("#idsex").removeAttr("checked");
}else{
$("#idsex").removeAttr("checked");
$("#idsex2").removeAttr("checked");
}
</script>
<script type="text/javascript">
$(function () {
$('#inforeset').bind('click',function () {
$("#idsex").removeAttr("checked");
$("#idsex2").removeAttr("checked");
// 如果获取到的性别信息不是"男"或"女"(可能为空等情况),则将两个单选按钮的选中状态都移除
}
</script>
<script type="text/javascript">
$(function () {
$('#inforeset').bind('click',function () {
$("#idsex").removeAttr("checked");
$("#idsex2").removeAttr("checked");
$("#student-name").val("");
$("#student-age").val("");
$("#student-phone").val("");
$("#student-email").val("");
$("#student-address").val("");
alert("已重置!");
// 使用jQuery的文档就绪函数$(function () {...}当页面DOM加载完成后执行内部代码。这里给id为"inforeset"的按钮绑定点击事件bind('click', function () {...})),当点击该按钮时,执行以下操作:
// 先移除两个性别单选按钮的选中状态,然后将各个可修改的输入框(姓名、年龄、电话、邮箱、地址)的值清空,最后弹出一个提示框显示"已重置!",实现表单信息的重置功能
});
$("#student-name").val("");
$("#student-age").val("");
$("#student-phone").val("");
$("#student-email").val("");
$("#student-address").val("");
alert("已重置!");
});
});
</script>
});
</script>
</body>
</html>
</html>

@ -1,172 +1,117 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 以上两行是JSP页面的指令
第一行用于设置该JSP页面的内容类型为text/html即HTML格式页面指定字符编码为UTF-8同时表明该页面使用Java语言来处理页面相关逻辑。
第二行引入了JSTLJavaServer Pages Standard Tag Library核心标签库定义前缀为“c”后续可通过这个前缀使用JSTL提供的各类标签比如用于循环遍历、条件判断等操作的标签方便在JSP页面中处理动态数据 -->
<html>
<head>
<title>个人信息</title>
<!-- 设置当前HTML页面的标题为“个人信息”该标题会显示在浏览器的标题栏让用户知晓此页面主要与个人信息相关 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件通过相对路径从当前页面所在目录下的css文件夹中查找应用layui框架提供的样式用于页面布局、组件美化等操作使页面呈现layui框架定义的外观风格 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的样式表文件style.css同样采用相对路径引用用于添加符合特定需求的个性化页面样式对页面显示效果做进一步定制 -->
<link rel="stylesheet" href="./css/file.css">
<!-- 引入名为file.css的样式表文件同样通过相对路径可能专门用于此页面中与文件相关元素的样式设置比如文件选择、上传等部分的样式 -->
<script src="./layui.js"></script>
<!-- 引入layui框架的JavaScript脚本文件从当前页面所在目录获取该文件假设layui.js与当前页面处于同一级目录layui脚本为页面提供众多交互功能以及各种组件支持例如实现菜单交互、页面元素动态展示等功能 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 从CDN内容分发网络引入jQuery库的最小化版本jQuery是常用的JavaScript库能简化页面中对DOM元素的操作、事件处理以及实现各种动画效果等方便开发人员编写JavaScript代码来实现页面交互逻辑 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 为页面主体body设置类名“layui-layout-body”同时将背景颜色设定为浅灰色#F2F2F2这里的类名通常与layui框架的布局样式相关联按照其框架规范来构建页面整体外观 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 通过JSP的include指令包含名为filterLogin.jsp的页面内容通常这个页面用于处理用户登录相关的验证逻辑或者展示登录相关的界面元素比如登录表单等以此保证只有登录后的用户可访问后续页面内容 -->
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<!-- 包含位于WEB-INF/student目录下的sHeader.jsp页面一般用于构建页面的头部区域可能包含网站logo、导航栏等常见的头部元素起到统一页面头部布局的作用 -->
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<!-- 再次使用JSP的include指令包含WEB-INF/student目录下的studentNav.jsp页面通常用来展示学生端特有的导航菜单内容便于用户在不同功能模块间进行切换操作 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建一个div元素并赋予其两个类名“layui-layout”和“layui-layout-admin”这一般是layui框架中用于定义页面整体布局结构的特定类名遵循layui框架的布局规范来划分页面不同区域比如头部、主体、侧边栏等具体根据框架设定 -->
<div class="layui-body">
<!-- 在上述布局div内部再创建一个div元素类名为“layui-body”在layui框架里该区域通常用于承载页面的主要内容例如展示各类业务数据、操作按钮等 -->
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 新建一个div元素并通过内联样式设置其四周内边距为15px主要用于对内部元素进行排版让页面内容看起来更规整避免显得过于紧凑或松散 -->
<span class="layui-breadcrumb">
<a href="">学生端</a>
<a><cite>修改头像</cite></a>
</span>
<!-- 创建一个layui框架提供的面包屑导航组件通过一系列超链接a标签展示当前页面在整个系统中的层级路径这里展示了从“学生端”进入到当前的“修改头像”页面但超链接的href属性为空可能后续需完善具体跳转地址以实现页面导航功能 -->
<p style="text-align: center;">
<!-- 创建一个段落p元素并通过内联样式设置文本居中对齐用于包裹下面的元素使其整体在页面中居中显示 -->
<img id="sphoto" src="${pageContext.request.contextPath}/showPhotoServlet" style="border: solid #009688;padding: 10px;margin: 20px;text-align: center;width: 100px;">
<!-- 创建一个图片img元素设置了id为“sphoto”方便后续通过JavaScript操作该元素图片的src属性指向名为“showPhotoServlet”的Servlet通过EL表达式动态获取上下文路径拼接而成可能用于获取并显示当前用户的头像图片同时通过内联样式设置图片的边框样式solid #009688表示实线边框颜色为特定的绿色、内边距为10px、外边距为20px、文本对齐方式为居中以及宽度为100px使其在页面中有合适的显示效果 -->
</p>
<p style="text-align: center;">
<span id="filename"></span>
<span id="filesize"></span>
<!-- 创建一个段落元素,文本居中对齐,内部包含两个空的<span>元素分别设置了id为“filename”和“filesize”后续会通过JavaScript代码往这两个元素中填充选择文件的名称和大小信息 -->
</p>
<form name="formf" method="post" enctype="multipart/form-data" style="text-align: center;">
<!-- 创建一个表单form元素设置其名称为“formf”提交方法为POST设置enctype属性为“multipart/form-data”这是用于实现文件上传功能的必要设置表明表单数据包含文件类型的数据通过内联样式设置文本居中对齐此表单用于用户选择要上传的头像文件并进行提交操作 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a href="">学生端</a>
<a><cite>修改头像</cite></a>
</span>
<p style="text-align: center;">
<img id="sphoto" src="${pageContext.request.contextPath}/showPhotoServlet" style="border: solid #009688;padding: 10px;margin: 20px;text-align: center;width: 100px;">
</p>
<p style="text-align: center;">
<span id="filename"></span>
<span id="filesize"></span>
</p>
<form name="formf" method="post" enctype="multipart/form-data" style="text-align: center;">
<a href="javascript:;" class="file">选择文件
<input id="selectfiles" accept="image/jpeg,image/gif" type="file" name="myfile">
<!-- 创建一个超链接a标签设置href属性为“javascript:;”使其点击时不进行实际的页面跳转应用了“file”类名可能对应特定样式内部包含一个文件选择输入框input类型为file设置了id为“selectfiles”方便后续操作通过accept属性限制可选择的文件类型为JPEG图像和GIF图像设置名称为“myfile”用于在表单提交时传递文件数据 -->
</a>
<a href="javascript:;" class="file" type="submit">开始上传
<input type="submit" id="postfiles" value="upload">
<!-- 创建另一个超链接同样href属性设置为“javascript:;”应用“file”类名且设置类型为“submit”虽然这里在超链接上设置提交类型不太规范实际起提交作用的是内部的input按钮内部包含一个提交按钮input类型为submit设置了id为“postfiles”按钮文本为“upload”点击这个按钮会触发表单的提交操作将选择的文件发送到服务器端 -->
</a>
</form>
<p style="text-align: center;">
<span id="msg">${update_msg}</span>
<!-- 创建一个段落元素,文本居中对齐,内部包含一个<span>元素设置了id为“msg”通过EL表达式显示名为“update_msg”的变量的值可能用于在页面上显示一些与头像更新操作相关的提示信息比如上传成功或失败的消息等 -->
</p>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含名为footer.jsp的页面一般用于展示页面底部的一些通用信息比如版权声明、网站相关链接、联系方式等内容 -->
</div>
<p style="text-align: center;">
<span id="msg">${update_msg}</span>
</p>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
// 使用layui框架的element模块调用其init方法进行初始化操作。在layui框架中element模块提供了很多页面元素交互相关的功能例如实现页面布局的动态切换、菜单的展开收起等交互效果通过调用init方法可激活这些功能确保页面上基于element模块构建的各种UI组件能正常工作
});
</script>
<script>
//Demo
layui.use('form', function(){
// 使用layui框架的form模块后续可以在这个回调函数内部编写与表单相关的交互逻辑代码不过目前这里没有具体内容可能是预留的用于进一步开发表单验证、提交等相关功能的地方
});
</script>
<script>
$('#selectfiles').change(function(e){
// 为id为“selectfiles”的元素即文件选择输入框绑定“change”事件当用户选择了新的文件时会触发此函数执行相应操作
// console.log($(this).val());//val()获取到的是完整的文件路径值C:\fakepath\js-dom.png
// 这行代码是用于在控制台打印出选择文件的完整路径值目前被注释掉了在实际调试时可查看用户选择的文件路径情况但由于浏览器的安全限制通常获取到的路径是类似“C:\fakepath\...”这样的假路径,实际应用中不能依赖这个路径做后续操作
//前端替换图片
var fileObj = document.getElementById("selectfiles").files[0];
// 通过DOM方法获取到用户选择的文件对象files属性返回一个文件列表这里取第一个文件因为一次只能选择一个文件假设此处只处理单个文件上传情况
var filepath = window.URL.createObjectURL(fileObj);
// 使用浏览器的URL对象的createObjectURL方法根据文件对象创建一个临时的URL用于在页面上展示该文件比如图片文件可以直接显示
$('#sphoto').attr('src',filepath);
// 使用jQuery选择器选中id为“sphoto”的图片元素并通过attr方法将其src属性设置为上面创建的临时URL实现用户选择文件后在页面上即时预览图片的效果
$('#news').text("");
// 这里试图清空id为“news”的元素的文本内容但代码中未看到该元素的定义可能是遗留的多余代码或者后续计划添加的元素相关操作
var fileMsg = e.currentTarget.files;
// 获取当前触发事件的目标元素即文件选择框的文件列表和上面获取文件对象的方式类似但这里是通过事件对象的currentTarget属性来获取结果是一样的都是获取用户选择的文件信息
var fileName = fileMsg[0].name;
// 从文件列表中获取第一个文件(也就是用户选择的文件)的文件名,用于后续显示文件名信息
var fileSize = fileMsg[0].size;
// 获取文件的大小(单位为字节),同样用于后续展示文件大小相关信息
var fileType = fileMsg[0].type;
// 获取文件的类型例如image/jpeg等不过在代码中暂时未看到对文件类型做进一步处理可能仅用于判断是否符合要求前面在文件选择框设置了可接受的文件类型
$('#filename').text(fileName);
// 使用jQuery选择器选中id为“filename”的<span>元素并通过text方法将其文本内容设置为获取到的文件名实现文件名在页面上的显示
$('#filesize').text('('+getfilesize(fileSize)+')');
// 选中id为“filesize”的<span>元素将其文本内容设置为调用getfilesize函数处理文件大小后的结果会根据文件大小转换为合适的单位并显示如KB、MB等括号用于让显示格式更清晰
$('#msg').text('');
// 清空id为“msg”的<span>元素的文本内容,可能是为了清除之前显示的提示信息,准备显示新的相关提示
function getfilesize(size) {
if (!size)
return "";
// 如果传入的文件大小参数为0或者未定义即!size为真则直接返回空字符串表示不显示文件大小信息
var num = 1024.00; //byte
// 定义一个常量表示字节与其他单位换算时的基数这里以1024字节为1KB进行单位换算
if (size < num)
return size + "B";
// 如果文件大小小于1024字节直接返回文件大小数值加上单位“B”表示字节例如文件大小为500字节就显示“500B”
if (size < Math.pow(num, 2))
return (size / num).toFixed(2) + "K"; //kb
// 如果文件大小小于1024 * 1024字节即1MB将文件大小除以1024并保留两位小数然后加上单位“K”表示KB例如文件大小为2048字节就显示“2.00K”
if (size < Math.pow(num, 3))
return (size / Math.pow(num, 2)).toFixed(2) + "M"; //M
// 如果文件大小小于1024 * 1024 * 1024字节即1GB将文件大小除以1024的平方即换算为MB并保留两位小数加上单位“M”表示MB例如文件大小为2097152字节就显示“2.00M”
if (size < Math.pow(num, 4))
return (size / Math.pow(num, 3)).toFixed(2) + "G"; //G
// 如果文件大小小于1024 * 1024 * 1024 * 1024字节即1TB将文件大小除以1024的立方即换算为GB并保留两位小数加上单位“G”表示GB
return (size / Math.pow(num, 4)).toFixed(2) + "T"; //T
// 如果文件大小大于等于1TB将文件大小除以1024的四次方即换算为TB并保留两位小数加上单位“T”表示TB
}
});
$('#postfiles').click(function(){
// 为id为“postfiles”的元素即提交按钮绑定“click”事件当点击该按钮时执行以下操作
var fileInput = $('#selectfiles').get(0).files[0];
// 通过jQuery选择器获取id为“selectfiles”的文件选择框元素再通过DOM方法获取其第一个文件对象和前面获取文件对象的方式类似目的是获取用户选择的文件信息
if (fileInput == null) {
alert("请先选择文件!");
return;
// 如果获取到的文件对象为空即用户没有选择文件就点击了提交按钮则弹出一个提示框提醒用户先选择文件并通过return语句终止后续代码的执行避免表单提交无效的数据
} else {
document.formf.action="${pageContext.request.contextPath}/uploadImageServlet";
// 如果用户已经选择了文件就设置名为“formf”的表单的action属性将表单提交的目标地址设置为名为“uploadImageServlet”的Servlet通过EL表达式动态获取上下文路径拼接而成以便将用户选择的文件发送到服务器端进行头像上传处理
}
});
</script>
</div>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
<script>
//Demo
layui.use('form', function(){
});
</script>
<script>
$('#selectfiles').change(function(e){
// console.log($(this).val());//val()获取到的是完整的文件路径值C:\fakepath\js-dom.png
//前端替换图片
var fileObj = document.getElementById("selectfiles").files[0];
var filepath = window.URL.createObjectURL(fileObj);
$('#sphoto').attr('src',filepath);
$('#news').text("");
var fileMsg = e.currentTarget.files;
var fileName = fileMsg[0].name;
var fileSize = fileMsg[0].size;
var fileType = fileMsg[0].type;
$('#filename').text(fileName);
$('#filesize').text('('+getfilesize(fileSize)+')');
$('#msg').text('');
function getfilesize(size) {
if (!size)
return "";
var num = 1024.00; //byte
if (size < num)
return size + "B";
if (size < Math.pow(num, 2))
return (size / num).toFixed(2) + "K"; //kb
if (size < Math.pow(num, 3))
return (size / Math.pow(num, 2)).toFixed(2) + "M"; //M
if (size < Math.pow(num, 4))
return (size / Math.pow(num, 3)).toFixed(2) + "G"; //G
return (size / Math.pow(num, 4)).toFixed(2) + "T"; //T
}
});
$('#postfiles').click(function(){
var fileInput = $('#selectfiles').get(0).files[0];
if (fileInput == null) {
alert("请先选择文件!");
return;
} else {
document.formf.action="${pageContext.request.contextPath}/uploadImageServlet";
}
});
</script>
</body>
</html>
</html>

@ -1,86 +1,59 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- 这是JSP页面的指令用于设置页面的内容类型为text/html即HTML格式页面同时指定字符编码为UTF-8表明该页面使用Java语言来处理相关逻辑确保页面能正确显示各种字符 -->
<html>
<head>
<meta charset="utf-8">
<!-- 再次明确页面的字符编码为utf-8虽然前面的JSP指令已经设置了编码但HTML页面中添加此<meta>标签也是一种常见的做法,用于告知浏览器页面的编码格式,增强兼容性 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<!-- 这是一个用于设置页面视口viewport的元标签它的作用是让页面在移动设备上能正确显示具体含义如下
"width=device-width"表示页面的宽度将根据设备的屏幕宽度进行自适应调整;
"initial-scale=1"设置页面初始缩放比例为1也就是不进行缩放显示
"maximum-scale=1"限制页面最大缩放比例为1防止用户过度缩放页面保证页面布局在一定范围内保持相对稳定 -->
</head>
<body class="layui-layout-body">
<!-- 为页面主体body设置类名“layui-layout-body”这个类名通常与layui框架的布局样式相关联按照layui框架的规范来构建页面整体外观比如应用默认的背景、边距等样式 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建一个div元素并赋予其两个类名“layui-layout”和“layui-layout-admin”这是layui框架中用于定义页面整体布局结构的特定类名遵循layui框架的布局规范来划分页面不同区域常见的会划分出如侧边栏、头部、主体内容区域等 -->
<div class="layui-side layui-bg-black">
<!-- 创建一个用于表示页面左侧侧边栏的div元素应用了“layui-side”类名表示这是侧边栏区域“layui-bg-black”类名则用于设置该侧边栏的背景颜色为黑色使其在视觉上与页面其他区域区分开来 -->
<div class="layui-side-scroll">
<!-- 创建一个div元素应用“layui-side-scroll”类名通常在layui框架中用于处理侧边栏内容的滚动效果当侧边栏内容较多超出可视范围时可以通过滚动条来查看全部内容 -->
<!-- 左侧导航区域可配合layui已有的垂直导航 -->
<ul class="layui-nav layui-nav-tree" lay-filter="test" id="nav">
<!-- 创建一个无序列表ul元素应用了“layui-nav”和“layui-nav-tree”类名以及“lay-filter”属性和“id”属性
“layui-nav”用于构建layui框架下的导航栏
“layui-nav-tree”表示这是一个树形结构的导航通常用于有层级关系的菜单比如这里的下拉子菜单形式
“lay-filter”属性设置了一个名为“test”的过滤器可在后续JavaScript代码中利用这个过滤器来对导航栏进行相关的交互操作配置例如菜单展开收起、点击事件等
“id”属性设置为“nav”方便后续通过JavaScript或者CSS选择器来选中这个导航栏元素进行操作 -->
<li class="layui-nav-item">
<!-- 创建一个列表项li元素应用“layui-nav-item”类名表示这是导航栏中的一个可点击的菜单项 -->
<a class="" href="javascript:;">选课信息</a>
<!-- 创建一个超链接a标签href属性设置为“javascript:;”表示点击该链接时暂时不执行实际的页面跳转而是可以通过后续添加JavaScript代码来定义点击后的具体行为显示文本为“选课信息”作为该菜单项的标题 -->
<dl class="layui-nav-child">
<!-- 创建一个定义列表dl元素应用“layui-nav-child”类名在layui框架中用于表示这是上面菜单项的子菜单列表用于展示下拉菜单等子级导航内容 -->
<dd><a href="${pageContext.request.contextPath}/studentSelectCourseListServlet">选课与成绩</a></dd>
<!-- 创建一个定义列表项dd元素内部包含一个超链接链接地址指向名为“studentSelectCourseListServlet”的Servlet通过EL表达式动态获取上下文路径拼接而成显示文本为“选课与成绩”点击可跳转到对应的功能页面查看选课以及成绩相关信息 -->
<dd><a href="${pageContext.request.contextPath}/studentOptionalCourseServlet">可选课程</a></dd>
<!-- 类似上面的dd元素这个超链接指向“studentOptionalCourseServlet”Servlet显示文本为“可选课程”用于跳转到查看可选课程的页面 -->
</dl>
</li>
<li class="layui-nav-item">
<a class="" href="javascript:;">学生通讯录</a>
<dl class="layui-nav-child">
<dd><a href="${pageContext.request.contextPath}/findStudentByPageServlet">本院学生信息</a></dd>
<!-- 创建一个子菜单链接指向“findStudentByPageServlet”Servlet显示文本为“本院学生信息”点击可查询并展示本院学生的相关信息 -->
</dl>
</li>
<li class="layui-nav-item">
<a class="" href="javascript:;">教师通讯录</a>
<dl class="layui-nav-child">
<dd><a href="${pageContext.request.contextPath}/teacherListServlet">本院教师信息</a></dd>
<!-- 超链接指向“teacherListServlet”Servlet显示文本为“本院教师信息”用于查看本院教师的相关信息 -->
</dl>
</li>
<li class="layui-nav-item">
<a class="" href="javascript:;">学院专业信息</a>
<dl class="layui-nav-child">
<dd><a href="${pageContext.request.contextPath}/cdcListServlet">学院专业查询</a></dd>
<!-- 链接到“cdcListServlet”Servlet显示文本为“学院专业查询”用于查询学院专业相关的信息 -->
</dl>
</li>
<li class="layui-nav-item">
<a class="" href="javascript:;">个人信息管理</a>
<dl class="layui-nav-child">
<dd><a href="${pageContext.request.contextPath}/studentInfomationServlet">个人信息</a></dd>
<!-- 超链接指向“studentInfomationServlet”Servlet显示文本为“个人信息”点击可查看或修改个人信息 -->
<dd><a href="${pageContext.request.contextPath}/studentPasswordIndexServlet">修改密码</a></dd>
<!-- 链接到“studentPasswordIndexServlet”Servlet显示文本为“修改密码”用于进入修改密码的功能页面 -->
<dd><a href="${pageContext.request.contextPath}/fileListServlet">文件列表</a></dd>
<!-- 超链接指向“fileListServlet”Servlet显示文本为“文件列表”用于查看相关文件列表信息 -->
</dl>
</li>
</ul>
</div>
<div class="layui-layout layui-layout-admin">
<div class="layui-side layui-bg-black">
<div class="layui-side-scroll">
<!-- 左侧导航区域可配合layui已有的垂直导航 -->
<ul class="layui-nav layui-nav-tree" lay-filter="test" id="nav">
<li class="layui-nav-item">
<a class="" href="javascript:;">选课信息</a>
<dl class="layui-nav-child">
<dd><a href="${pageContext.request.contextPath}/studentSelectCourseListServlet">选课与成绩</a></dd>
<dd><a href="${pageContext.request.contextPath}/studentOptionalCourseServlet">可选课程</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a class="" href="javascript:;">学生通讯录</a>
<dl class="layui-nav-child">
<dd><a href="${pageContext.request.contextPath}/findStudentByPageServlet">本院学生信息</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a class="" href="javascript:;">教师通讯录</a>
<dl class="layui-nav-child">
<dd><a href="${pageContext.request.contextPath}/teacherListServlet">本院教师信息</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a class="" href="javascript:;">学院专业信息</a>
<dl class="layui-nav-child">
<dd><a href="${pageContext.request.contextPath}/cdcListServlet">学院专业查询</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a class="" href="javascript:;">个人信息管理</a>
<dl class="layui-nav-child">
<dd><a href="${pageContext.request.contextPath}/studentInfomationServlet">个人信息</a></dd>
<dd><a href="${pageContext.request.contextPath}/studentPasswordIndexServlet">修改密码</a></dd>
<dd><a href="${pageContext.request.contextPath}/fileListServlet">文件列表</a></dd>
</dl>
</li>
</ul>
</div>
</div>
<script>
//注意:导航 依赖 element 模块,否则无法进行功能性操作
layui.use('element', function(){
var element = layui.element;
element.init();
// 使用layui框架的element模块调用其init方法进行初始化操作。在layui框架中element模块提供很多页面元素交互相关功能例如实现页面布局动态切换、菜单展开收起等交互效果通过调用init方法可激活这些功能确保页面上基于element模块构建的各种UI组件能正常工作
});
</script>
</div>
<script>
//注意:导航 依赖 element 模块,否则无法进行功能性操作
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
</body>
</html>
</html>

@ -1,97 +1,70 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 以上两行是JSP页面相关的指令
第一行用于设置该JSP页面的内容类型为text/html即HTML格式页面并指定字符编码为UTF-8同时表明页面使用Java语言来处理相关逻辑。
第二行引入了JSTLJavaServer Pages Standard Tag Library核心标签库定义其前缀为“c”后续就能通过这个前缀使用JSTL提供的各类标签例如用于循环遍历、条件判断等操作的标签方便在JSP页面中进行动态数据处理 -->
<html>
<head>
<title>可选课程</title>
<!-- 设置当前HTML页面的标题为“可选课程”此标题会显示在浏览器的标题栏中让用户直观知晓页面展示的主要内容 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件通过相对路径从当前页面所在目录下的css文件夹中查找来应用layui框架所提供的样式可用于页面布局、组件美化等使页面呈现出特定的外观风格 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的样式表文件style.css同样采用相对路径引用用于添加符合特定需求的个性化页面样式对页面显示效果做进一步定制 -->
<script src="./layui.js"></script>
<!-- 引入layui框架的JavaScript脚本文件从当前页面所在目录获取该文件layui脚本为页面提供众多交互功能以及各种组件支持比如实现菜单交互、页面元素动态展示等 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 从CDN内容分发网络引入jQuery库的最小化版本jQuery是常用的JavaScript库能简化页面中对DOM元素的操作、事件处理以及实现各种动画效果等方便开发人员编写JavaScript代码来实现页面交互逻辑 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 为页面主体body设置类名“layui-layout-body”同时将背景颜色设定为浅灰色#F2F2F2这里的类名大概率与layui框架的布局样式相关联按照其框架规范来构建页面整体外观 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 通过JSP的include指令包含名为filterLogin.jsp的页面内容通常这个页面用于处理用户登录相关的验证逻辑或者展示登录相关的界面元素比如登录表单等以此保证只有登录后的用户可访问后续页面内容 -->
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<!-- 包含位于WEB-INF/student目录下的sHeader.jsp页面一般用于构建页面的头部区域可能包含网站logo、导航栏等常见的头部元素起到统一页面头部布局的作用 -->
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<!-- 再次使用JSP的include指令包含WEB-INF/student目录下的studentNav.jsp页面通常用来展示学生端特有的导航菜单内容便于用户在不同功能模块间进行切换操作 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建一个div元素并赋予其两个类名“layui-layout”和“layui-layout-admin”这一般是layui框架中用于定义页面整体布局结构的特定类名遵循layui框架的布局规范来划分页面不同区域 -->
<div class="layui-body">
<!-- 在上述布局div内部再创建一个div元素类名为“layui-body”在layui框架里该区域通常用于承载页面的主要内容例如展示各类业务数据、操作按钮等 -->
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 新建一个div元素并通过内联样式设置其四周内边距为15px主要用于对内部元素进行排版让页面内容看起来更规整避免显得过于紧凑或松散 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<span class="layui-breadcrumb">
<a href="">学生端</a>
<a href="">选课信息</a>
<a><cite>可选课程</cite></a>
</span>
<!-- 创建一个layui框架提供的面包屑导航组件通过一系列超链接a标签展示当前页面在整个系统中的层级路径这里展示了从“学生端”进入“选课信息”再到“可选课程”页面但目前超链接的href属性为空可能后续需完善具体跳转地址以实现页面导航功能 -->
<span style="color: red;margin-right: 100px;float: right;">${select_msg}</span>
<!-- 创建一个<span>元素通过内联样式设置文本颜色为红色、右边距为100px以及向右浮动用于显示名为“select_msg”的变量的值通过EL表达式获取可能是用于展示一些与选课相关的提示信息比如选课成功/失败的消息等) -->
<table class="layui-table" lay-filter="test">
<!-- 创建一个layui框架的表格组件设置名为“test”的过滤器该过滤器可在后续JavaScript代码中用于配置表格相关交互功能例如实现表格行点击事件、数据筛选、排序等操作 -->
<thead>
<table class="layui-table" lay-filter="test">
<thead>
<tr>
<th>ID</th>
<th>课程号</th>
<th>课程名</th>
<th>课程简介</th>
<th>教师号</th>
<th>教师姓名</th>
<th>操作</th>
</tr>
</thead>
<c:forEach items="${optionalcourses}" var="optionalcourse" varStatus="s">
<tr>
<th>ID</th>
<th>课程号</th>
<th>课程名</th>
<th>课程简介</th>
<th>教师号</th>
<th>教师姓名</th>
<th>操作</th>
<!-- 定义表格头部的列标题分别列出要展示的可选课程相关的各个字段如序号ID、课程号、课程名、课程简介、教师号、教师姓名以及操作用于进行选课等相关操作 -->
<td>${s.count}</td>
<td>${optionalcourse.c_id}</td>
<td>${optionalcourse.c_name}</td>
<td>${optionalcourse.c_info}</td>
<td>${optionalcourse.t_id}</td>
<td>${optionalcourse.t_name}</td>
<td><a class="layui-btn layui-btn-normal" href="${pageContext.request.contextPath}/doSelectCourseServlet?id=${optionalcourse.c_id}">选课</a></td>
</tr>
</thead>
<c:forEach items="${optionalcourses}" var="optionalcourse" varStatus="s">
<!-- 使用JSTL的forEach标签进行循环遍历操作循环的对象是名为“optionalcourses”的数据集合通常是从后端传递过来的可选课程信息列表每次循环将当前元素赋值给变量“optionalcourse”同时利用“varStatus”获取循环状态信息如当前循环次数等并赋值给变量“s” -->
<tr>
<td>${s.count}</td>
<td>${optionalcourse.c_id}</td>
<td>${optionalcourse.c_name}</td>
<td>${optionalcourse.c_info}</td>
<td>${optionalcourse.t_id}</td>
<td>${optionalcourse.t_name}</td>
<td><a class="layui-btn layui-btn-normal" href="${pageContext.request.contextPath}/doSelectCourseServlet?id=${optionalcourse.c_id}">选课</a></td>
<!-- 在表格的每一行中通过EL表达式Expression Language如${s.count}等)分别展示对应的数据:
${s.count}表示当前循环次数,作为序号列的值;
后面依次展示课程的课程号、课程名、课程简介、教师号、教师姓名等具体信息;
最后一列创建一个超链接a标签应用layui框架的按钮样式类layui-btn layui-btn-normal表示一个常规样式的按钮链接地址指向名为“doSelectCourseServlet”的Servlet通过EL表达式动态传递当前课程的ID参数拼接在URL中显示文本为“选课”点击该链接可进行相应课程的选课操作 -->
</tr>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含名为footer.jsp的页面一般用于展示页面底部的一些通用信息比如版权声明、网站相关链接、联系方式等内容 -->
</div>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<script type="text/javascript">
$("#nav li:nth-child(1) dl dd:nth-child(2)").addClass("layui-this");
// 使用jQuery选择器选中页面中id为“nav”的元素下的第1个子元素li下的dl元素下的第2个dd元素并为其添加类名“layui-this”在layui框架中添加此名通常意味着将对应的导航菜单项标记为当前选中状态使其呈现特定样式如改变颜色、加粗等表明当前所在页面功能模块对应的菜单选项
$("#nav li:nth-child(1)").addClass("layui-nav-itemed");
// 同样用jQuery选择器选中页面中id为“nav”的元素下的第1个子元素li并为其添加类名“layui-nav-itemed”在layui框架里这个类名可能用于控制导航菜单的展开或折叠状态让对应的菜单层级结构展示相应效果方便用户查看相关子菜单 -->
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
// 使用layui框架的element模块调用其init方法进行初始化操作。在layui框架中element模块提供很多页面元素交互相关功能例如实现页面布局动态切换、菜单展开收起等交互效果通过调用init方法可激活这些功能确保页面上基于element模块构建的各种UI组件能正常工作
});
</script>
<script type="text/javascript">
$("#nav li:nth-child(1) dl dd:nth-child(2)").addClass("layui-this");
$("#nav li:nth-child(1)").addClass("layui-nav-itemed");
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
});
</script>
</body>
</html>
</html>

@ -1,44 +1,27 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 以上两行是JSP页面的相关指令
第一行用于设置该JSP页面的内容类型为text/html即HTML格式页面并指定字符编码为UTF-8同时表明页面使用Java语言来处理相关逻辑。
第二行引入了JSTLJavaServer Pages Standard Tag Library核心标签库定义其前缀为“c”后续就能通过这个前缀使用JSTL提供的各类标签例如用于循环遍历、条件判断等操作的标签方便在JSP页面中进行动态数据处理 -->
<html>
<head>
<title>选课与成绩</title>
<!-- 设置当前HTML页面的标题为“选课与成绩”此标题会显示在浏览器的标题栏中让用户直观知晓页面展示的主要内容 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入layui框架的样式表文件通过相对路径从当前页面所在目录下的css文件夹中查找来应用layui框架所提供的样式可用于页面布局、组件美化等使页面呈现出特定的外观风格 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入自定义的样式表文件style.css同样采用相对路径引用用于添加符合特定需求的个性化页面样式对页面显示效果做进一步定制 -->
<script src="./layui.js"></script>
<!-- 引入layui框架的JavaScript脚本文件从当前页面所在目录获取该文件layui脚本为页面提供众多交互功能以及各种组件支持比如实现菜单交互、页面元素动态展示等 -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 从CDN内容分发网络引入jQuery库的最小化版本jQuery是常用的JavaScript库能简化页面中对DOM元素的操作、事件处理以及实现各种动画效果等方便开发人员编写JavaScript代码来实现页面交互逻辑 -->
</head>
<body class="layui-layout-body" style="background-color: #F2F2F2">
<!-- 为页面主体body设置类名“layui-layout-body”同时将背景颜色设定为浅灰色#F2F2F2这里的类名大概率与layui框架的布局样式相关联按照其框架规范来构建页面整体外观 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<!-- 通过JSP的include指令包含名为filterLogin.jsp的页面内容通常这个页面用于处理用户登录相关的验证逻辑或者展示登录相关的界面元素比如登录表单等以此保证只有登录后的用户可访问后续页面内容 -->
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<!-- 包含位于WEB-INF/student目录下的sHeader.jsp页面一般用于构建页面的头部区域可能包含网站logo、导航栏等常见的头部元素起到统一页面头部布局的作用 -->
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<!-- 再次使用JSP的include指令包含WEB-INF/student目录下的studentNav.jsp页面通常用来展示学生端特有的导航菜单内容便于用户在不同功能模块间进行切换操作 -->
<div class="layui-layout layui-layout-admin">
<!-- 创建一个div元素并赋予其两个类名“layui-layout”和“layui-layout-admin”这一般是layui框架中用于定义页面整体布局结构的特定类名遵循layui框架的布局规范来划分页面不同区域 -->
<jsp:include page="/filterLogin.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/sHeader.jsp"></jsp:include>
<jsp:include page="/WEB-INF/student/studentNav.jsp"></jsp:include>
<div class="layui-layout layui-layout-admin">
<div class="layui-body">
<!-- 在上述布局div内部再创建一个div元素类名为“layui-body”在layui框架里该区域通常用于承载页面的主要内容例如展示各类业务数据、操作按钮等 -->
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<!-- 新建一个div元素并通过内联样式设置其四周内边距为15px主要用于对内部元素进行排版让页面内容看起来更规整避免显得过于紧凑或松散 -->
<span class="layui-breadcrumb">
<a href="">学生端</a>
<a href="">选课信息</a>
<a><cite>选课与成绩</cite></a>
</span>
<!-- 创建一个layui框架提供的面包屑导航组件通过一系列超链接a标签展示当前页面在整个系统中的层级路径这里展示了从“学生端”进入“选课信息”再到“选课与成绩”页面但目前超链接的href属性为空可能后续需完善具体跳转地址以实现页面导航功能 -->
<span class="layui-breadcrumb">
<a href="">学生端</a>
<a href="">选课信息</a>
<a><cite>选课与成绩</cite></a>
</span>
<table class="layui-table" lay-filter="test">
<!-- 创建一个layui框架的表格组件设置名为“test”的过滤器该过滤器可在后续JavaScript代码中用于配置表格相关交互功能例如实现表格行点击事件、数据筛选、排序等操作 -->
<thead>
<tr>
<th>ID</th>
@ -50,12 +33,10 @@
<th>教师号</th>
<th>教师</th>
<th>分数</th>
<!-- 定义表格头部的列标题分别列出要展示的选课与成绩相关的各个字段如序号ID、学号、学生姓名、课程号、课程名、课程简介、教师号、教师姓名以及成绩等 -->
</tr>
</thead>
<c:forEach items="${selectcourses}" var="selectcourse" varStatus="s">
<!-- 使用JSTL的forEach标签进行循环遍历操作循环的对象是名为“selectcourses”的数据集合通常是从后端传递过来的选课与成绩信息列表每次循环将当前元素赋值给变量“selectcourse”同时利用“varStatus”获取循环状态信息如当前循环次数等并赋值给变量“s” -->
<tr style="height: 70px;">
<td>${s.count}</td>
<td>${selectcourse.s_id}</td>
@ -66,14 +47,10 @@
<td>${selectcourse.t_id}</td>
<td>${selectcourse.t_name}</td>
<td>${selectcourse.score}</td>
<!-- 在表格的每一行中通过EL表达式Expression Language如${s.count}等)分别展示对应的数据:
${s.count}表示当前循环次数,作为序号列的值;
后面依次展示选课的学号、学生姓名、课程号、课程名、课程简介、教师号、教师姓名以及成绩等具体信息 -->
</tr>
</c:forEach>
</table>
<jsp:include page="/footer.jsp"></jsp:include>
<!-- 包含名为footer.jsp的页面一般用于展示页面底部的一些通用信息比如版权声明、网站相关链接、联系方式等内容 -->
</div>
</div>
</div>
@ -81,18 +58,16 @@
<script type="text/javascript">
$("#nav li:nth-child(1) dl dd:nth-child(1)").addClass("layui-this");
// 使用jQuery选择器选中页面中id为“nav”的元素下的第1个子元素li下的dl元素下的第1个dd元素并为其添加类名“layui-this”在layui框架中添加此名通常意味着将对应的导航菜单项标记为当前选中状态使其呈现特定样式如改变颜色、加粗等表明当前所在页面功能模块对应的菜单选项
$("#nav li:nth-child(1)").addClass("layui-nav-itemed");
// 同样用jQuery选择器选中页面中id为“nav”的元素下的第1个子元素li并为其添加类名“layui-nav-itemed”在layui框架里这个类名可能用于控制导航菜单的展开或折叠状态让对应的菜单层级结构展示相应效果方便用户查看相关子菜单 -->
</script>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
element.init();
// 使用layui框架的element模块调用其init方法进行初始化操作。在layui框架中element模块提供很多页面元素交互相关功能例如实现页面布局动态切换、菜单展开收起等交互效果通过调用init方法可激活这些功能确保页面上基于element模块构建的各种UI组件能正常工作
});
</script>
</body>
</html>
</html>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save