package com.controller.schoadmin; // 声明该类所在的包名为 com.controller.schoadmin,通常用于组织与学校管理员相关的控制器类 import com.dao.DeptAdminDao; // 导入自定义的数据访问对象类 DeptAdminDao,该类可能包含了用于执行数据库查询等操作的方法 import com.entity.StuPunch; // 导入自定义的实体类 StuPunch,用于封装学生打卡的相关信息,例如学生编号、姓名、打卡状态等 import com.utils.JDBCUtils; // 导入自定义的工具类 JDBCUtils,该类可能提供了与 JDBC(Java Database Connectivity)操作相关的工具方法,如数据库连接的获取、关闭以及结果集的处理等 import javax.servlet.ServletException; // 导入 Servlet 异常类,用于处理在 Servlet 执行过程中可能出现的异常情况 import javax.servlet.annotation.WebServlet; // 导入 WebServlet 注解,用于将普通的 Java 类标记为 Servlet,并指定其在 Web 应用中的访问路径 import javax.servlet.http.HttpServlet; // 导入 HttpServlet 类,所有的 HTTP Servlet 都需要继承该类,并重写相应方法来处理 HTTP 请求 import javax.servlet.http.HttpServletRequest; // 导入 HttpServletRequest 接口,用于封装客户端发送的 HTTP 请求信息,如请求参数、请求头、请求方法等 import javax.servlet.http.HttpServletResponse; // 导入 HttpServletResponse 接口,用于封装服务器返回给客户端的 HTTP 响应信息,如响应状态码、响应头、响应内容等 import java.io.IOException; // 导入 IOException 类,用于处理在输入输出操作中可能出现的异常情况 import java.sql.ResultSet; // 导入 ResultSet 接口,用于表示数据库查询的结果集,通过该接口可以遍历和获取查询结果中的每一行数据 @WebServlet("/SchoQueryStuPunchByIdServlet") // 使用 WebServlet 注解将当前类标记为一个 Servlet,并指定其访问路径为 /SchoQueryStuPunchByIdServlet,客户端可通过该路径访问此 Servlet public class SchoQueryStuPunchByIdServlet extends HttpServlet { // 定义一个公共类 SchoQueryStuPunchByIdServlet,继承自 HttpServlet 类,用于处理 HTTP 请求 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 重写 HttpServlet 类的 doGet 方法,用于处理客户端发送的 GET 请求 // req 是 HttpServletRequest 对象,封装了客户端的请求信息;resp 是 HttpServletResponse 对象,用于向客户端发送响应信息 req.setCharacterEncoding("utf-8"); // 设置请求的字符编码为 UTF-8,以确保能够正确处理包含中文等特殊字符的请求参数 resp.setCharacterEncoding("utf-8"); // 设置响应的字符编码为 UTF-8,以保证能够正确输出包含中文等特殊字符的响应内容 resp.setContentType("text/html;charset=utf-8"); // 设置响应的内容类型为 text/html,并指定字符编码为 UTF-8,告知客户端响应的内容是 HTML 格式,且使用 UTF-8 编码 //获取请求参数 String sno = req.getParameter("sno"); // 从请求中获取名为 "sno" 的参数值,该参数可能表示学生的编号,将其存储在字符串变量 sno 中 String spunchdate = req.getParameter("spunchdate"); // 从请求中获取名为 "spunchdate" 的参数值,该参数可能表示学生的打卡日期,将其存储在字符串变量 spunchdate 中 String sql = null; // 声明一个字符串变量 sql,用于存储 SQL 查询语句,初始值设为 null Object[] objects = {sno, spunchdate}; // 创建一个 Object 类型的数组 objects,将 sno 和 spunchdate 作为数组元素,用于后续的 SQL 查询参数传递 //查询是否存在此人 sql = "select count(*) as num from stupunchin where sno = ? and spunchdate = ?"; // 定义一个 SQL 查询语句,用于查询 stupunchin 表中,学生编号为 sno 且打卡日期为 spunchdate 的记录数量,并将结果列命名为 num int count = DeptAdminDao.findTotalCount(sql, objects); // 调用 DeptAdminDao 类的 findTotalCount 方法,传入 SQL 查询语句和查询参数数组 objects,执行查询并返回满足条件的记录数量,将结果存储在整数变量 count 中 if (count > 0){ //有则继续操作 // 如果查询到的记录数量大于 0,说明存在符合条件的学生打卡记录,则继续后续操作 sql = "select s.sname,sp.* from student s,stupunchin sp where s.sno = sp.sno and sp.sno = ? and sp.spunchdate = ?"; // 定义一个新的 SQL 查询语句,通过关联 student 表和 stupunchin 表,查询学生姓名以及学生打卡的详细信息,条件是学生编号为 sno 且打卡日期为 spunchdate ResultSet resultSet = DeptAdminDao.qureyInfo(sql, objects); // 调用 DeptAdminDao 类的 qureyInfo 方法,传入 SQL 查询语句和查询参数数组 objects,执行查询并返回结果集,将结果存储在 ResultSet 对象 resultSet 中 StuPunch stuPunch = new StuPunch(); // 创建一个 StuPunch 类的对象 stuPunch,用于存储查询到的学生打卡信息 try { while (resultSet.next()){ // 遍历结果集,每次循环处理结果集中的一行数据 stuPunch.setSno(resultSet.getString("sno")); // 从结果集中获取名为 "sno" 的列的值,并将其设置到 stuPunch 对象的 sno 属性中 stuPunch.setSname(resultSet.getString("sname")); // 从结果集中获取名为 "sname" 的列的值,并将其设置到 stuPunch 对象的 sname 属性中 stuPunch.setSispunch(resultSet.getString("sispunch")); // 从结果集中获取名为 "sispunch" 的列的值,并将其设置到 stuPunch 对象的 sispunch 属性中 stuPunch.setSpunchdate(resultSet.getDate("spunchdate")); // 从结果集中获取名为 "spunchdate" 的列的值,并将其设置到 stuPunch 对象的 spunchdate 属性中 stuPunch.setSpunchtime(resultSet.getString("spunchtime")); // 从结果集中获取名为 "spunchtime" 的列的值,并将其设置到 stuPunch 对象的 spunchtime 属性中 stuPunch.setSishot(resultSet.getString("sishot")); // 从结果集中获取名为 "sishot" 的列的值,并将其设置到 stuPunch 对象的 sishot 属性中 stuPunch.setSiscough(resultSet.getString("siscough")); // 从结果集中获取名为 "siscough" 的列的值,并将其设置到 stuPunch 对象的 siscough 属性中 stuPunch.setSisseem(resultSet.getString("sisseem")); // 从结果集中获取名为 "sisseem" 的列的值,并将其设置到 stuPunch 对象的 sisseem 属性中 stuPunch.setSisdiagnose(resultSet.getString("sisdiagnose")); // 从结果集中获取名为 "sisdiagnose" 的列的值,并将其设置到 stuPunch 对象的 sisdiagnose 属性中 stuPunch.setSstatus(resultSet.getString("sstatus")); // 从结果集中获取名为 "sstatus" 的列的值,并将其设置到 stuPunch 对象的 sstatus 属性中 } } catch (Exception e) { e.printStackTrace(); // 捕获并处理可能出现的异常情况,将异常的堆栈跟踪信息输出到控制台,以便进行调试 }finally { JDBCUtils.close(resultSet); // 无论是否发生异常,最终都调用 JDBCUtils 类的 close 方法关闭结果集,释放相关的数据库资源 } req.setAttribute("stuPunch", stuPunch); // 将 stuPunch 对象作为属性添加到请求对象 req 中,属性名为 "stuPunch",以便后续的 JSP 页面可以获取该对象 req.getRequestDispatcher("/view/schoadmin/alterstupunch.jsp").forward(req, resp); // 获取请求转发器,将请求 req 和响应 resp 转发到 /view/schoadmin/alterstupunch.jsp 页面,使该页面能够继续处理请求并显示学生的打卡信息,可能用于修改操作 }else { req.getRequestDispatcher("/view/alluse/noexistdataofalter.jsp").forward(req, resp); // 如果查询到的记录数量为 0,说明不存在符合条件的学生打卡记录,则将请求 req 和响应 resp 转发到 /view/alluse/noexistdataofalter.jsp 页面,提示用户没有可修改的相关数据 } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 重写 HttpServlet 类的 doPost 方法,用于处理客户端发送的 POST 请求 doGet(req, resp); // 调用 doGet 方法来处理 POST 请求,即对于该 Servlet,POST 请求和 GET 请求的处理逻辑相同 } }