Compare commits

..

No commits in common. 'main' and 'cyn_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);
}
}
}

@ -51,12 +51,4 @@ public class DeleteSelectStudentServlet extends HttpServlet {
// 这里的实现是直接调用doPost方法意味着不管是GET请求还是POST请求都会执行同样的业务逻辑处理
doPost(request,response);
}
<<<<<<< HEAD
}
//yuo
//tu
//rre
//s
=======
}
>>>>>>> develop1
}

@ -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,90 +1,83 @@
<%@ 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中包含了众多预先定义好的样式规则用于实现页面的布局、组件样式等方面的美化效果,能帮助快速搭建出具有一定风格的页面 -->
<!-- 引入layui的样式文件用于页面的样式布局等美化 -->
<link rel="stylesheet" href="./css/layui.css">
<!-- 引入自定义的样式文件,style.css文件可以由开发者根据本页面的特定需求来编写样式规则用于对layui框架默认样式进行补充或者覆盖以实现更符合业务需求的页面外观展示 -->
<!-- 引入自定义的样式文件,可能包含针对本页面特定的样式设置 -->
<link rel="stylesheet" href="./css/style.css">
<!-- 引入layui的JavaScript文件layui.js包含了丰富的代码逻辑实现了诸多交互组件如表单、表格、菜单等以及相应的交互功能是页面实现动态效果的重要依赖 -->
<!-- 引入layui的JavaScript文件layui是一个前端UI框架提供了很多交互组件等功能 -->
<script src="./layui.js"></script>
<!-- 引入jQuery库的.min压缩版本jQuery是一个广受欢迎的JavaScript库它提供了简洁易用的方法来操作DOM元素例如查找、修改、删除页面元素等、处理页面事件如点击、鼠标移动等事件以及实现动画效果等极大地方便了前端开发工作 -->
<!-- 引入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页面可能用于判断用户是否登录等相关逻辑处理 -->
<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的面包屑组件通过面包屑可以清晰地向用户展示当前页面在整个系统层级结构中的位置,方便用户了解自己所在的页面路径以及页面之间的关联关系 -->
<!-- 使用layui的面包屑组件展示当前页面的层级导航路径 -->
<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代码来实现具体交互 -->
<!-- 使用layui的表格组件,用于展示学院专业相关的数据 -->
<table class="layui-table" lay-filter="test">
<thead>
<tr>
<!-- 定义表格表头的第一列标题为“ID”用于展示每条学院专业相关记录的唯一标识符 -->
<!-- 表格表头定义第一列的标题为“ID” -->
<th>ID</th>
<!-- 定义表格表头的第二列标题为“学院”,用于展示对应的学院名称信息 -->
<!-- 表格表头,定义第二列的标题为“学院” -->
<th>学院</th>
<!-- 定义表格表头的第三列标题为“专业”,用于展示所属的专业名称信息 -->
<!-- 表格表头,定义第三列的标题为“专业” -->
<th>专业</th>
<!-- 定义表格表头的第四列标题为“班级”,用于展示具体的班级名称信息 -->
<!-- 表格表头,定义第四列的标题为“班级” -->
<th>班级</th>
<!-- 定义表格表头的第五列标题为“操作”,这一列通常用于放置对表格中每一条数据记录进行操作的按钮等交互元素,比如删除、编辑等操作按钮 -->
<!-- 表格表头,定义第五列的标题为“操作”,通常用于放置对数据进行操作的按钮等 -->
<th>操作</th>
</tr>
</thead>
<!-- 使用JSTL的forEach标签对名为“cdcs”的集合进行循环遍历这个集合通常是由后端程序传递过来的、包含学院专业相关数据的集合每一个元素代表一条具体的学院专业记录 -->
<!-- 使用JSTL的forEach标签循环遍历名为“cdcs”的集合应该是在后台传递过来的学院专业相关数据集合 -->
<c:forEach items="${cdcs}" var="cdc" varStatus="c">
<tr>
<!-- 在表格行的第一列单元格中显示当前循环的序号通过varStatus对象的count属性来实现计数功能序号从1开始方便用户查看数据的顺序 -->
<!-- 在表格行中显示当前循环的序号从1开始计数 -->
<td>${c.count}</td>
<!-- 在表格行的第二列单元格中显示当前循环对象cdc中的学院名称属性值,该属性值应该是从后端传递过来的数据对象中提取出来的,用于展示具体的学院名称信息 -->
<!-- 在表格行中显示当前循环对象cdc中的学院名称属性值 -->
<td>${cdc.college}</td>
<!-- 在表格行的第三列单元格中显示当前循环对象cdc中的专业名称属性值,同样是从后端数据对象中获取对应属性值来展示具体的专业名称 -->
<!-- 在表格行中显示当前循环对象cdc中的专业名称属性值 -->
<td>${cdc.department}</td>
<!-- 在表格行的第四列单元格中显示当前循环对象cdc中的班级名称属性值,用于展示具体的班级名称情况 -->
<!-- 在表格行中显示当前循环对象cdc中的班级名称属性值 -->
<td>${cdc.cclass}</td>
<!-- 在表格行的第五列操作列单元格中添加一个删除按钮按钮应用了layui的危险按钮样式layui-btn-danger使其在视觉上更醒目地提示用户操作的危险性
点击该按钮时会调用JavaScript中的deleteCDC函数目前函数未定义完整后续需要补充具体的删除逻辑比如向服务器发送删除请求等相关操作 -->
<!-- 在表格行的操作列中添加一个删除按钮按钮样式为layui的危险按钮样式点击时调用JavaScript中的deleteCDC函数目前函数未定义完整可能需要补充具体删除逻辑 -->
<td><a class="layui-btn layui-btn-danger" href="javascript:deleteCDC();">删除</a></td>
</tr>
</c:forEach>
</table>
<!-- 引入“/footer.jsp”页面通常这个页面用于展示页面底部的相关信息例如版权声明、联系方式、网站相关的友情链接等通用的底部元素 -->
<!-- 包含页面底部相关内容的JSP页面可能包含版权信息、联系方式等通用的底部元素 -->
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</div>
</div>
<!-- 使用jQuery选择器通过特定的选择表达式选择导航栏中特定的DOM元素此处是第4个li元素下的第一个dl元素下的第一个dd元素并为其添加类名“layui-this”
一般来说添加这个类名是为了通过CSS样式来改变该元素的外观使其呈现出与其他导航项不同的样式效果用于标识当前选中的导航项或者处于特定状态的导航项具体样式效果取决于对应的CSS定义 -->
<!-- 使用jQuery选择器选择特定的DOM元素此处可能是导航栏中的某个元素并添加类名“layui-this”用于设置样式等相关操作具体功能取决于对应的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框架中主要负责处理页面元素相关的交互逻辑例如菜单的展开与收起、选项卡的切换等功能的初始化工作确保这些交互元素能正常展示和使用 -->
<!-- 使用layui框架的element模块进行相关初始化操作element模块通常用于实现页面的交互元素如折叠面板、导航栏等的功能 -->
<script>
//JavaScript代码区域
layui.use('element', function(){

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

@ -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>

Loading…
Cancel
Save