Compare commits

...

11 Commits

Author SHA1 Message Date
pt3ulnghe 792898cee1 end
10 months ago
pt3ulnghe 85dc7cf823 end
10 months ago
p2hfxpyuo 1a0cf08595 ZP
10 months ago
pxake4hfp 9a30a44727 LJC
10 months ago
pt3ulnghe 2f7f7d12cb 5 (#25)
10 months ago
pt3ulnghe af14ef13d1 3
10 months ago
pt3ulnghe 05fe986d55 4
10 months ago
pt3ulnghe 82b0daa7f8 3
10 months ago
pt3ulnghe f55c8d9468 1
10 months ago
p2hfxpyuo 939720085e 1
10 months ago
pxake4hfp 62d89ef238 1
10 months ago

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_23" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

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

@ -5,8 +5,13 @@
<artifact name="lsepidemicsituationsystem:war exploded" />
</artifacts-to-build>
</component>
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="0ffa26fe-3275-4667-90ad-c688ca600b30" name="Default Changelist" comment="" />
<list default="true" id="0ffa26fe-3275-4667-90ad-c688ca600b30" name="Default Changelist" comment="Default Changelist">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@ -23,6 +28,14 @@
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_BRANCH_BY_REPOSITORY">
<map>
<entry key="$PROJECT_DIR$" value="zp" />
</map>
</option>
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="LogFilters">
<option name="FILTER_ERRORS" value="false" />
<option name="FILTER_WARNINGS" value="false" />
@ -33,7 +46,8 @@
<component name="MavenImportPreferences">
<option name="generalSettings">
<MavenGeneralSettings>
<option name="mavenHome" value="D:/Program Files/apache-maven-3.6.3-bin/apache-maven-3.6.3" />
<option name="customMavenHome" value="$PROJECT_DIR$/../../Program Files/apache-maven-3.6.3-bin/apache-maven-3.6.3" />
<option name="mavenHomeTypeForPersistence" value="CUSTOM" />
</MavenGeneralSettings>
</option>
<option name="importingSettings">
@ -42,27 +56,28 @@
</MavenImportingSettings>
</option>
</component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 8
}</component>
<component name="ProjectId" id="1ZsRq0O38W9j2DAyvPgaq78h6F5" />
<component name="ProjectViewState">
<option name="showExcludedFiles" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="aspect.path.notification.shown" value="true" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/web" />
<property name="node.js.detected.package.eslint" value="true" />
<property name="node.js.detected.package.tslint" value="true" />
<property name="node.js.path.for.package.eslint" value="project" />
<property name="node.js.path.for.package.tslint" value="project" />
<property name="node.js.selected.package.eslint" value="(autodetect)" />
<property name="node.js.selected.package.tslint" value="(autodetect)" />
<property name="project.structure.last.edited" value="Artifacts" />
<property name="project.structure.proportion" value="0.15" />
<property name="project.structure.side.proportion" value="0.2" />
<property name="settings.editor.selected.configurable" value="com.alibabacloud.intellij.config.AccountConfigurable" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"RunOnceActivity.git.unshallow": "true",
"SHARE_PROJECT_CONFIGURATION_FILES": "true",
"git-widget-placeholder": "feature/hql",
"kotlin-language-version-configured": "true",
"last_opened_file_path": "D:/demo8/lsepidemicsituationsystem",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)",
"nodejs_package_manager_path": "npm",
"vue.rearranger.settings.migration": "true"
}
}]]></component>
<component name="RecentsManager">
<key name="CopyClassDialog.RECENTS_KEY">
<recent name="com.filter" />
@ -181,6 +196,15 @@
</list>
</option>
</component>
<component name="SharedIndexes">
<attachedChunks>
<set>
<option value="bundled-jdk-9823dce3aa75-125ca727e0f0-intellij.indexing.shared.core-IU-243.24978.46" />
<option value="bundled-js-predefined-d6986cc7102b-76f8388c3a79-JavaScript-IU-243.24978.46" />
</set>
</attachedChunks>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="应用程序级" UseSingleDictionary="true" transferred="true" />
<component name="SshConsoleOptionsProvider">
<option name="myEncoding" value="UTF-8" />
</component>
@ -328,116 +352,40 @@
<workItem from="1588858985099" duration="3090000" />
<workItem from="1588865103089" duration="22000" />
<workItem from="1589092133957" duration="947000" />
<workItem from="1745901580332" duration="1948000" />
</task>
<task id="LOCAL-00001" summary="Default Changelist">
<option name="closed" value="true" />
<created>1745902440005</created>
<option name="number" value="00001" />
<option name="presentableId" value="LOCAL-00001" />
<option name="project" value="LOCAL" />
<updated>1745902440005</updated>
</task>
<task id="LOCAL-00002" summary="Default Changelist">
<option name="closed" value="true" />
<created>1745903462350</created>
<option name="number" value="00002" />
<option name="presentableId" value="LOCAL-00002" />
<option name="project" value="LOCAL" />
<updated>1745903462350</updated>
</task>
<task id="LOCAL-00003" summary="Default Changelist">
<option name="closed" value="true" />
<created>1745904438150</created>
<option name="number" value="00003" />
<option name="presentableId" value="LOCAL-00003" />
<option name="project" value="LOCAL" />
<updated>1745904438150</updated>
</task>
<option name="localTasksCounter" value="4" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="1" />
<option name="version" value="3" />
</component>
<component name="WindowStateProjectService">
<state x="361" y="71" key="#Deployment" timestamp="1586742405632">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state x="361" y="71" key="#Deployment/0.0.1536.824@0.0.1536.824" timestamp="1586742405632" />
<state x="361" y="71" key="#Notifications" timestamp="1586873500031">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state x="361" y="71" key="#Notifications/0.0.1536.824@0.0.1536.824" timestamp="1586873500031" />
<state x="223" y="67" key="#com.intellij.execution.impl.EditConfigurationsDialog" timestamp="1587092060624">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state x="223" y="67" key="#com.intellij.execution.impl.EditConfigurationsDialog/0.0.1536.824@0.0.1536.824" timestamp="1587092060624" />
<state x="574" y="113" key="#com.intellij.ide.util.MemberChooser" timestamp="1588834378807">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state x="574" y="113" key="#com.intellij.ide.util.MemberChooser/0.0.1536.824@0.0.1536.824" timestamp="1588834378807" />
<state x="360" y="70" key="#com.intellij.j2ee.appServerIntegrations.ApplicationServersConfigurable" timestamp="1586936177273">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state x="360" y="70" key="#com.intellij.j2ee.appServerIntegrations.ApplicationServersConfigurable/0.0.1536.824@0.0.1536.824" timestamp="1586936177273" />
<state x="449" y="147" key="#com.intellij.openapi.updateSettings.impl.PluginUpdateInfoDialog" timestamp="1587015912260">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state x="449" y="147" key="#com.intellij.openapi.updateSettings.impl.PluginUpdateInfoDialog/0.0.1536.824@0.0.1536.824" timestamp="1587015912260" />
<state x="548" y="297" width="441" height="239" key="#com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesDialog.classes" timestamp="1588836089834">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state x="548" y="297" width="441" height="239" key="#com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesDialog.classes/0.0.1536.824@0.0.1536.824" timestamp="1588836089834" />
<state x="499" y="159" key="#com.intellij.refactoring.safeDelete.UnsafeUsagesDialog" timestamp="1585703317967">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state x="499" y="159" key="#com.intellij.refactoring.safeDelete.UnsafeUsagesDialog/0.0.1536.824@0.0.1536.824" timestamp="1585703317967" />
<state x="499" y="167" key="#com.intellij.util.ui.classpath.ChooseLibrariesDialog" timestamp="1585649986773">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state x="499" y="167" key="#com.intellij.util.ui.classpath.ChooseLibrariesDialog/0.0.1536.824@0.0.1536.824" timestamp="1585649986773" />
<state x="548" y="167" key="FileChooserDialogImpl" timestamp="1588862467375">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state x="548" y="167" key="FileChooserDialogImpl/0.0.1536.824@0.0.1536.824" timestamp="1588862467375" />
<state width="1023" height="221" key="GridCell.Tab.0.bottom" timestamp="1589093158079">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state width="1023" height="221" key="GridCell.Tab.0.bottom/0.0.1536.824@0.0.1536.824" timestamp="1589093158079" />
<state width="1023" height="221" key="GridCell.Tab.0.center" timestamp="1589093158079">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state width="1023" height="221" key="GridCell.Tab.0.center/0.0.1536.824@0.0.1536.824" timestamp="1589093158079" />
<state width="1023" height="221" key="GridCell.Tab.0.left" timestamp="1589093158079">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state width="1023" height="221" key="GridCell.Tab.0.left/0.0.1536.824@0.0.1536.824" timestamp="1589093158079" />
<state width="1023" height="221" key="GridCell.Tab.0.right" timestamp="1589093158079">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state width="1023" height="221" key="GridCell.Tab.0.right/0.0.1536.824@0.0.1536.824" timestamp="1589093158079" />
<state width="1023" height="221" key="GridCell.Tab.1.bottom" timestamp="1589093158079">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state width="1023" height="221" key="GridCell.Tab.1.bottom/0.0.1536.824@0.0.1536.824" timestamp="1589093158079" />
<state width="1023" height="221" key="GridCell.Tab.1.center" timestamp="1589093158079">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state width="1023" height="221" key="GridCell.Tab.1.center/0.0.1536.824@0.0.1536.824" timestamp="1589093158079" />
<state width="1023" height="221" key="GridCell.Tab.1.left" timestamp="1589093158079">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state width="1023" height="221" key="GridCell.Tab.1.left/0.0.1536.824@0.0.1536.824" timestamp="1589093158079" />
<state width="1023" height="221" key="GridCell.Tab.1.right" timestamp="1589093158079">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state width="1023" height="221" key="GridCell.Tab.1.right/0.0.1536.824@0.0.1536.824" timestamp="1589093158079" />
<state width="1023" height="221" key="GridCell.Tab.2.bottom" timestamp="1589093158079">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state width="1023" height="221" key="GridCell.Tab.2.bottom/0.0.1536.824@0.0.1536.824" timestamp="1589093158079" />
<state width="1023" height="221" key="GridCell.Tab.2.center" timestamp="1589093158079">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state width="1023" height="221" key="GridCell.Tab.2.center/0.0.1536.824@0.0.1536.824" timestamp="1589093158079" />
<state width="1023" height="221" key="GridCell.Tab.2.left" timestamp="1589093158079">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state width="1023" height="221" key="GridCell.Tab.2.left/0.0.1536.824@0.0.1536.824" timestamp="1589093158079" />
<state width="1023" height="221" key="GridCell.Tab.2.right" timestamp="1589093158079">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state width="1023" height="221" key="GridCell.Tab.2.right/0.0.1536.824@0.0.1536.824" timestamp="1589093158079" />
<state x="270" y="0" key="SettingsEditor" timestamp="1588862594087">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state x="270" y="0" key="SettingsEditor/0.0.1536.824@0.0.1536.824" timestamp="1588862594087" />
<state x="418" y="92" key="com.intellij.openapi.editor.actions.MultiplePasteAction$ClipboardContentChooser" timestamp="1587023080650">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state x="418" y="92" key="com.intellij.openapi.editor.actions.MultiplePasteAction$ClipboardContentChooser/0.0.1536.824@0.0.1536.824" timestamp="1587023080650" />
<state x="178" y="22" key="new project wizard" timestamp="1586955583169">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state x="178" y="22" key="new project wizard/0.0.1536.824@0.0.1536.824" timestamp="1586955583169" />
<state x="431" y="145" width="672" height="678" key="search.everywhere.popup" timestamp="1586439092287">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state x="431" y="145" width="672" height="678" key="search.everywhere.popup/0.0.1536.824@0.0.1536.824" timestamp="1586439092287" />
<component name="VcsManagerConfiguration">
<MESSAGE value="Default Changelist" />
<option name="LAST_COMMIT_MESSAGE" value="Default Changelist" />
</component>
</project>

4336
ljc.txt

File diff suppressed because it is too large Load Diff

@ -13,7 +13,7 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.ResultSet;
//vgfghv
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {

@ -1,5 +1,5 @@
package com.controller.deptadmin;
//
import com.dao.DeptAdminDao;
import javax.servlet.ServletException;
@ -7,54 +7,59 @@ import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.IOException; //导入IO异常和日期类
import java.util.Date;
@WebServlet("/DeptAddStuPunchServlet")
public class DeptAddStuPunchServlet extends HttpServlet {
public class DeptAddStuPunchServlet extends HttpServlet { //定义一个继承自HttpServlet的Servlet类。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //重写doGet方法处理HTTP GET请求。
//统一请求和响应的字符编码为UTF-8防止中文乱码并设置响应内容类型为HTML。
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获取表单请求的参数
String sno = req.getParameter("sno");
String sispunch = req.getParameter("sispunch");
String spunchdate = req.getParameter("spunchdate");
String spunchtime = req.getParameter("spunchtime");
String sishot = req.getParameter("sishot");
String siscough = req.getParameter("siscough");
String sisseem = req.getParameter("sisseem");
String sisdiagnose = req.getParameter("sisdiagnose");
String sstatus = req.getParameter("sstatus");
String sno = req.getParameter("sno"); //从 HTTP 请求中获取参数名为 "sno" 的值,并将其赋值给 sno 变量
String sispunch = req.getParameter("sispunch");//从 HTTP 请求中获取参数名为 "sispunch" 的值,并将其赋值给 sispunch 变量
String spunchdate = req.getParameter("spunchdate");//从 HTTP 请求中获取参数名为 "spunchdate" 的值,并将其赋值给 spunchdate 变量
String spunchtime = req.getParameter("spunchtime");//从 HTTP 请求中获取参数名为 "spunchtime" 的值,并将其赋值给 spunchtime 变量
String sishot = req.getParameter("sishot");//从 HTTP 请求中获取参数名为 "sishot" 的值,并将其赋值给 sishot 变量
String siscough = req.getParameter("siscough");//从 HTTP 请求中获取参数名为 "siscough" 的值,并将其赋值给 siscough 变量
String sisseem = req.getParameter("sisseem");//从 HTTP 请求中获取参数名为 "sisseem" 的值,并将其赋值给 sisseem 变量
String sisdiagnose = req.getParameter("sisdiagnose");//从 HTTP 请求中获取参数名为 "sisdiagnose" 的值,并将其赋值给 sisdiagnose 变量
String sstatus = req.getParameter("sstatus");//从 HTTP 请求中获取参数名为 "sstatus" 的值,并将其赋值给 sstatus 变量
String sql = null;
//声明SQL语句变量并输出调试信息
System.out.println("shgshgh");
//查询是否存在此人
sql = "select count(*) as num from stupunchin where sno = ? and spunchdate = ?";
Object[] objects = {sno, spunchdate};
int count = DeptAdminDao.findTotalCount(sql, objects);
sql = "select count(*) as num from stupunchin where sno = ? and spunchdate = ?";//检查stupunchin表中是否存在相同学号和日期的记录
Object[] objects = {sno, spunchdate}; //使用Object数组传递参数防止SQL注入。
int count = DeptAdminDao.findTotalCount(sql, objects);//调用DAO方法findTotalCount返回匹配记录数。
if (count == 0){//无则操作
if (count == 0){//条件判断如果不存在重复记录count为0执行插入操作。
sql = "insert into stupunchin values(?, ?, ?, ?, ?, ?, ?, ?, ?)";
Object[] objects1 = {sno, sispunch, spunchdate, spunchtime, sishot, siscough, sisseem, sisdiagnose, sstatus};
//SQL插入语句向stupunchin表插入包含9个字段的新记录
//参数绑定:将表单参数按顺序填入占位符
int num = DeptAdminDao.executeUpdate(sql, objects1);
int num = DeptAdminDao.executeUpdate(sql, objects1);//执行更新调用DAO方法executeUpdate执行插入返回受影响的行数。
System.out.println(num);
req.getRequestDispatcher("/DeptQueryStuPunchByPageServlet?currentPage=1&rows=7&sname=&sclass=&spunchdate=").forward(req, resp);
}else {
req.getRequestDispatcher("/view/alluse/existdataofadd.jsp").forward(req, resp);
}
req.getRequestDispatcher("/view/alluse/existdataofadd.jsp").forward(req, resp);//转发请求插入成功后转发到分页查询Servlet显示第一页数据参数currentPage=1每页7行
}//处理重复数据如果记录已存在转发到提示页面existdataofadd.jsp
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
doGet(req, resp);//处理POST请求重写doPost方法直接调用doGet统一处理GET和POST请求
}
}

@ -9,56 +9,56 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/DeptAddStuServlet")
public class DeptAddStuServlet extends HttpServlet {
@WebServlet("/DeptAddStuServlet")//@WebServlet("/DeptAddStuServlet"):这是一个 Servlet 注解,表示这个类处理访问路径为 /DeptAddStuServlet 的 HTTP 请求。
public class DeptAddStuServlet extends HttpServlet { //DeptAddStuServlet 继承了 HttpServlet 类,是一个处理 HTTP 请求的 Servlet 类。
@Override
@Override//doGet 方法是处理 GET 请求的入口。由于 Web 表单通常使用 GET 或 POST 提交数据,因此我们在这里处理来自客户端的 GET 请求。
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
req.setCharacterEncoding("utf-8"); //设置请求和响应的字符编码为 UTF-8确保处理过程中不会出现中文乱码问题。
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
resp.setContentType("text/html;charset=utf-8");//设置响应内容类型为 HTML并指定字符编码为 UTF-8。
//获取表单请求的参数
String sno = req.getParameter("sno");
String sname = req.getParameter("sname");
String ssex = req.getParameter("ssex");
String sage = req.getParameter("sage");
String specialty = req.getParameter("specialty");
String sclass = req.getParameter("sclass");
String sdept = req.getParameter("sdept");
String sphone = req.getParameter("sphone");
String spsw = req.getParameter("spsw");
//req.getParameter("parameterName") 用来获取来自表单提交的参数值。每个 getParameter 调用会返回一个字符串,表示对应表单字段的值。
String sno = req.getParameter("sno");//学号
String sname = req.getParameter("sname");//姓名
String ssex = req.getParameter("ssex");//性别
String sage = req.getParameter("sage");//年龄
String specialty = req.getParameter("specialty");//学生专业
String sclass = req.getParameter("sclass");//学生班级
String sdept = req.getParameter("sdept");//学生所属部门
String sphone = req.getParameter("sphone");//学生电话
String spsw = req.getParameter("spsw");//学生密码
//数据类型转换
int sage1 = Integer.parseInt(sage);
//将学生的年龄 sage字符串类型转换为 int 类型。这里使用 Integer.parseInt() 方法进行类型转换。
String sql = null;
System.out.println("shgshgh");
//查询是否存在此人
sql = "select count(*) as num from student where sno = ?";
Object[] objects = {sno};
int count = DeptAdminDao.findTotalCount(sql, objects);
Object[] objects = {sno};//构造一个 SQL 查询语句,检查数据库中是否已经存在学号为 sno 的学生。
int count = DeptAdminDao.findTotalCount(sql, objects);//DeptAdminDao.findTotalCount() 是自定义的数据库操作方法,用于执行 SQL 查询并返回符合条件的记录数。返回值 count 为查询结果,表示匹配的学生数量。
if (count == 0){//无则操作
if (count == 0){//如果查询结果 count 为 0说明没有找到该学号的学生学生信息可以插入数据库。
sql = "insert into student values(?, ?, ?, ?, ?, ?, ?, ?, ?)";
Object[] objects1 = {sno, sname, ssex, sage1, sclass, specialty, sdept, sphone, spsw};
//构造一个 SQL 插入语句,将学生信息插入 student 表
int num = DeptAdminDao.executeUpdate(sql, objects1);
System.out.println(num);
//DeptAdminDao.executeUpdate() 方法执行插入操作,并返回受影响的行数(即成功插入的记录数)。此时 num 表示执行的结果。
System.out.println(num);//在控制台打印 num用来调试输出插入操作是否成功。通常在开发阶段使用 System.out.println() 打印日志。
// req.getRequestDispatcher("/DeptQueryStuByPageServlet?currentPage=1&rows=8").forward(req, resp);
req.getRequestDispatcher("/DeptQueryStuByPageServlet?currentPage=1&rows=7&sname=&sclass=&specialty=").forward(req, resp);
//如果学生成功插入数据库,跳转到另一个 ServletDeptQueryStuByPageServlet用于分页查询学生信息。
req.getRequestDispatcher("/DeptQueryStuByPageServlet?currentPage=1&rows=7&sname=&sclass=&specialty=").forward(req, resp);//使用 req.getRequestDispatcher().forward() 方法将请求转发到指定的 Servlet并携带一些查询参数例如当前页码 currentPage=1 和每页显示的学生数 rows=7
}else {
req.getRequestDispatcher("/view/alluse/existdataofadd.jsp").forward(req, resp);
req.getRequestDispatcher("/view/alluse/existdataofadd.jsp").forward(req, resp);//如果数据库中已经存在该学号的学生,转发到一个名为 existdataofadd.jsp 的页面,通常用于提示用户该学生已经存在,无法再次添加。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
doGet(req, resp);//doPost 方法处理 POST 请求。这里通过调用 doGet(req, resp),使得 POST 请求和 GET 请求的处理逻辑一致,避免重复代码。
}
}

@ -1,6 +1,6 @@
package com.controller.deptadmin;
package com.controller.deptadmin;//包声明类位于com.controller.deptadmin包中归类管理部门相关的控制器。
import com.dao.DeptAdminDao;
import com.dao.DeptAdminDao;//包声明类位于com.controller.deptadmin包中归类管理部门相关的控制器。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -9,51 +9,52 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/DeptAddTeaPunchServlet")
@WebServlet("/DeptAddTeaPunchServlet")//Servlet注解与类定义映射URL路径/DeptAddTeaPunchServlet继承HttpServlet处理HTTP请求。
public class DeptAddTeaPunchServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//处理GET请求重写doGet方法处理HTTP GET请求。
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获取表单请求的参数
String tno = req.getParameter("tno");
String tispunch = req.getParameter("tispunch");
String tpunchdate = req.getParameter("tpunchdate");
String tpunchtime = req.getParameter("tpunchtime");
String tishot = req.getParameter("tishot");
String tiscough = req.getParameter("tiscough");
String tisseem = req.getParameter("tisseem");
String tisdiagnose = req.getParameter("tisdiagnose");
String tstatus = req.getParameter("tstatus");
resp.setContentType("text/html;charset=utf-8");//统一请求和响应的字符编码为UTF-8防止中文乱码并设置响应内容类型为HTML
//使用 req.getParameter("parameterName") 获取前端表单提交的每个参数的值
String tno = req.getParameter("tno");//教师编号
String tispunch = req.getParameter("tispunch");//是否打卡
String tpunchdate = req.getParameter("tpunchdate");//打卡日期
String tpunchtime = req.getParameter("tpunchtime");//打卡时间
String tishot = req.getParameter("tishot");//是否发热
String tiscough = req.getParameter("tiscough");//是否咳嗽
String tisseem = req.getParameter("tisseem");//是否见过人
String tisdiagnose = req.getParameter("tisdiagnose");//是否诊断
String tstatus = req.getParameter("tstatus");//状态
String sql = null;
System.out.println("shgshgh");
System.out.println("shgshgh");//这行代码是一个调试语句,打印 "shgshgh" 到控制台。它通常用于开发调试阶段,帮助开发者跟踪程序执行情况。可以在正式环境中移除。
//查询是否已打卡
sql = "select count(*) as num from teapunchin where tno = ? and tpunchdate = ?";
Object[] objects = {tno, tpunchdate};
int count = DeptAdminDao.findTotalCount(sql, objects);
Object[] objects = {tno, tpunchdate};//构造一个 SQL 查询语句检查数据库中是否已经存在该教师tno在指定日期tpunchdate的打卡记录。
int count = DeptAdminDao.findTotalCount(sql, objects);//使用 DeptAdminDao.findTotalCount() 方法执行查询并返回匹配的记录数。count 表示查询结果,判断是否已有相同的打卡记录。
if (count == 0){//无则操作
if (count == 0){//如果查询结果 count 为 0表示该教师在该日期没有打卡记录因此可以插入新的打卡记录。
sql = "insert into teapunchin values(?, ?, ?, ?, ?, ?, ?, ?, ?)";
Object[] objects1 = {tno, tispunch, tpunchdate, tpunchtime, tishot, tiscough, tisseem, tisdiagnose, tstatus};
//构造 SQL 插入语句,将教师的打卡信息插入到 teapunchin 表中。插入的字段包括:教师编号、是否打卡、打卡日期、打卡时间、是否发热、是否咳嗽、是否见过人、是否诊断、状态。
int num = DeptAdminDao.executeUpdate(sql, objects1);
int num = DeptAdminDao.executeUpdate(sql, objects1);//使用 DeptAdminDao.executeUpdate() 方法执行插入操作,返回受影响的行数(即成功插入的记录数)。将插入操作的结果存储在 num 变量中。
System.out.println(num);
System.out.println(num);//在控制台打印 num用来调试输出插入操作是否成功通常用于开发过程中查看插入操作是否成功。
req.getRequestDispatcher("/DeptQueryTeaPunchByPageServlet?currentPage=1&rows=7&tno=&tname=&tpunchdate=").forward(req, resp);
}else {
}else {//如果插入操作成功,使用 req.getRequestDispatcher().forward() 方法将请求转发到另一个 Servlet (DeptQueryTeaPunchByPageServlet),用于分页查询教师的打卡记录。
req.getRequestDispatcher("/view/alluse/existdataofadd.jsp").forward(req, resp);
}
} //如果查询到已经存在相同的打卡记录count > 0则转发请求到 existdataofadd.jsp 页面,提示用户该打卡记录已存在,无法再次添加。
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
doGet(req, resp);//doPost 方法处理 HTTP POST 请求。此处doPost 方法调用 doGet 方法,使得 POST 请求和 GET 请求的处理逻辑一致,避免重复代码。
}
}

@ -1,59 +1,49 @@
package com.controller.deptadmin;
package com.controller.deptadmin;//这一行定义了当前类所在的包com.controller.deptadmin 表示该类是 deptadmin 包下的控制器类。
import com.dao.DeptAdminDao;
import com.dao.DeptAdminDao;//导入 DeptAdminDao 类,这个类通常包含与数据库交互的代码。它用于执行数据库操作,比如执行 update 或 select 操作。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.ServletException;//ServletException 用于处理 Servlet 的异常。
import javax.servlet.annotation.WebServlet;//WebServlet 是用于定义 Servlet 的注解。
//HttpServlet, HttpServletRequest, HttpServletResponse 是 HTTP 协议相关的 Servlet 类,处理请求和响应。
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.IOException;//IOException 用于处理输入输出相关的异常。
@WebServlet("/DeptAddTeaServlet")
public class DeptAddTeaServlet extends HttpServlet {
@WebServlet("/DeptAlterStuPunchServlet")//这是一个注解,用来声明这个 Servlet 的 URL 映射路径。用户访问 /DeptAlterStuPunchServlet 路径时会触发该 Servlet。
public class DeptAlterStuPunchServlet extends HttpServlet {//这是定义一个 DeptAlterStuPunchServlet 类,它继承自 HttpServlet说明这是一个处理 HTTP 请求的 Servlet 类。
//这是重写的 doGet 方法,处理 HTTP GET 请求。每当用户通过 GET 请求访问该 Servlet 时doGet 方法会被调用。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
resp.setContentType("text/html;charset=utf-8");//设置请求和响应的字符编码为 UTF-8确保请求和响应的文本内容能够正确处理中文字符。
//获取表单请求的参数
String tno = req.getParameter("tno");
String tname = req.getParameter("tname");
String tsex = req.getParameter("tsex");
String tage = req.getParameter("tage");
String tdept = req.getParameter("tdept");
String tphone = req.getParameter("tphone");
String tpsw = req.getParameter("tpsw");
//从 HTTP 请求中获取用户提交的表单参数
String sno = req.getParameter("sno");//学生学号
String sispunch = req.getParameter("sispunch");//是否打卡
String spunchdate = req.getParameter("spunchdate");//打卡日期
String spunchtime = req.getParameter("spunchtime");//打卡时间
String sishot = req.getParameter("sishot");//是否发热
String siscough = req.getParameter("siscough");//是否咳嗽
String sisseem = req.getParameter("sisseem");//是否有乏力
String sisdiagnose = req.getParameter("sisdiagnose");//诊断结果
String sstatus = req.getParameter("sstatus");//打卡状态
//数据类型转换
int tage1 = Integer.parseInt(tage);
//构造了一个 SQL 更新语句,用于修改 stupunchin 表中的数据。更新的字段包括打卡状态、时间、症状信息等,查询条件是 sno学生学号和 spunchdate打卡日期
String sql = "update stupunchin set sispunch = ?, spunchtime = ?, sishot = ?, siscough = ?, sisseem = ?, sisdiagnose = ?, sstatus = ? where sno = ? and spunchdate = ?";
Object[] objects = {sispunch, spunchtime, sishot, siscough, sisseem, sisdiagnose, sstatus, sno, spunchdate};//创建一个对象数组 objects该数组包含了 SQL 更新语句中使用的参数。数组中的值会被传递给数据库操作。
String sql = null;
int num = DeptAdminDao.executeUpdate(sql, objects);//调用 DeptAdminDao 类中的 executeUpdate 方法执行 SQL 更新操作。该方法会返回受影响的行数(更新成功的记录数),并将其赋值给 num 变量。
System.out.println("shgshgh");
System.out.println(num);//打印更新操作影响的记录行数,通常用于调试和查看更新操作的效果。
//查询是否存在此人
sql = "select count(*) as num from teacher where tno = ?";
Object[] objects = {tno};
int count = DeptAdminDao.findTotalCount(sql, objects);
req.getRequestDispatcher("/DeptQueryStuPunchByPageServlet?currentPage=1&rows=7&sname=&sclass=&spunchdate=").forward(req, resp);//调用 RequestDispatcher 的 forward 方法,将请求转发到另一个 Servlet通常是用于显示更新后的学生打卡信息。这会将用户重定向到 DeptQueryStuPunchByPageServlet并附带了一些查询参数。
if (count == 0){//无则操作
sql = "insert into teacher values(?, ?, ?, ?, ?, ?, ?)";
Object[] objects1 = {tno, tname, tsex, tage1, tdept, tphone, tpsw};
int num = DeptAdminDao.executeUpdate(sql, objects1);
System.out.println(num);
/* req.getRequestDispatcher("/DeptQueryTeaByPageServlet?currentPage=1&rows=8").forward(req, resp);*/
req.getRequestDispatcher("/DeptQueryTeaByPageServlet?currentPage=1&rows=7&tno=&tname=&tsex=").forward(req, resp);
}else {
req.getRequestDispatcher("/view/alluse/existdataofadd.jsp").forward(req, resp);
}
}
//这是重写的 doPost 方法。由于 doPost 方法的实现只是调用了 doGet这意味着该 Servlet 支持同时处理 GET 和 POST 请求。实际上POST 请求会被当作 GET 请求处理。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);

@ -1,7 +1,8 @@
package com.controller.deptadmin;
package com.controller.deptadmin;//这行代码定义了当前类的包路径,表示该类属于 com.controller.deptadmin 包。
import com.dao.DeptAdminDao;
import com.dao.DeptAdminDao;//导入 DeptAdminDao 类,这是一个自定义的 DAO (数据访问对象) 类,提供了与数据库交互的操作方法。
//这些是从 javax.servlet 和 java.io 包导入的类。它们提供了与 Servlet 相关的功能,比如请求处理 (HttpServletRequest 和 HttpServletResponse) 和异常处理 (ServletException, IOException)。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@ -9,37 +10,52 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/DeptAlterStuPunchServlet")
public class DeptAlterStuPunchServlet extends HttpServlet {
@WebServlet("/DeptAddTeaServlet")//@WebServlet("/DeptAddTeaServlet") 是一个注解,表示这个 Servlet 会处理 URL 为 /DeptAddTeaServlet 的请求。
public class DeptAddTeaServlet extends HttpServlet {//DeptAddTeaServlet 类继承自 HttpServlet意味着它是一个处理 HTTP 请求的 Servlet。
//重写 doGet 方法,处理 HTTP GET 请求。当浏览器发起 GET 请求时Servlet 会调用该方法。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
req.setCharacterEncoding("utf-8");//设置请求和响应的字符编码为 UTF-8确保中文字符能够正确处理避免乱码。
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
resp.setContentType("text/html;charset=utf-8");//设置响应的内容类型为 text/html并指定字符编码为 UTF-8这通常用于返回 HTML 页面。
//获取表单请求的参数
String sno = req.getParameter("sno");
String sispunch = req.getParameter("sispunch");
String spunchdate = req.getParameter("spunchdate");
String spunchtime = req.getParameter("spunchtime");
String sishot = req.getParameter("sishot");
String siscough = req.getParameter("siscough");
String sisseem = req.getParameter("sisseem");
String sisdiagnose = req.getParameter("sisdiagnose");
String sstatus = req.getParameter("sstatus");
String sql = "update stupunchin set sispunch = ?, spunchtime = ?, sishot = ?, siscough = ?, sisseem = ?, sisdiagnose = ?, sstatus = ? where sno = ? and spunchdate = ?";
Object[] objects = {sispunch, spunchtime, sishot, siscough, sisseem, sisdiagnose, sstatus, sno, spunchdate};
int num = DeptAdminDao.executeUpdate(sql, objects);
System.out.println(num);
req.getRequestDispatcher("/DeptQueryStuPunchByPageServlet?currentPage=1&rows=7&sname=&sclass=&spunchdate=").forward(req, resp);
String tno = req.getParameter("tno");//获取表单中名为 "tno" 的参数值,并将其赋值给变量 tno。这个参数通常是教师编号。
String tname = req.getParameter("tname");//获取表单中名为 "tname" 的参数值,并将其赋值给变量 tname。这个参数通常是教师的姓名。
String tsex = req.getParameter("tsex");//获取表单中名为 "tsex" 的参数值,并将其赋值给变量 tsex。这个参数通常是教师的性别。
String tage = req.getParameter("tage");//获取表单中名为 "tage" 的参数值,并将其赋值给变量 tage。这个参数通常是教师的年龄类型是字符串。
String tdept = req.getParameter("tdept");//获取表单中名为 "tdept" 的参数值,并将其赋值给变量 tdept。这个参数通常是教师所属的部门。
String tphone = req.getParameter("tphone");//获取表单中名为 "tphone" 的参数值,并将其赋值给变量 tphone。这个参数通常是教师的电话。
String tpsw = req.getParameter("tpsw");//获取表单中名为 "tpsw" 的参数值,并将其赋值给变量 tpsw。这个参数通常是教师的密码。
//将 tage年龄从字符串转换为整数类型。因为表单中的数据都是字符串需要进行类型转换才能插入到数据库中。
int tage1 = Integer.parseInt(tage);
String sql = null;//声明一个 SQL 语句字符串变量 sql用来存储后续的 SQL 查询语句。
System.out.println("shgshgh");//输出一个调试信息到控制台,用于验证代码是否正确执行。
//该段代码构造了一个 SQL 查询语句用于检查教师编号tno是否已经存在于数据库中的 teacher 表。
sql = "select count(*) as num from teacher where tno = ?";
Object[] objects = {tno};
int count = DeptAdminDao.findTotalCount(sql, objects);//DeptAdminDao.findTotalCount(sql, objects) 是自定义的方法,它执行该 SQL 查询并返回结果,即该编号的教师是否存在。返回的是一个整数,表示该编号的教师数量。
if (count == 0){//如果 count 为 0表示数据库中没有该教师编号的记录接下来的代码会执行插入操作。
sql = "insert into teacher values(?, ?, ?, ?, ?, ?, ?)";//构造 SQL 插入语句,将教师的各项信息插入到 teacher 表中。
Object[] objects1 = {tno, tname, tsex, tage1, tdept, tphone, tpsw};//objects1 数组包含了插入教师数据所需的所有参数。
int num = DeptAdminDao.executeUpdate(sql, objects1);//调用 DeptAdminDao.executeUpdate(sql, objects1) 执行插入操作。该方法执行 SQL 更新语句(包括插入、更新、删除),并返回受影响的记录数。
System.out.println(num);//输出插入操作的受影响的记录数,用于调试和验证。
/* req.getRequestDispatcher("/DeptQueryTeaByPageServlet?currentPage=1&rows=8").forward(req, resp);*/
//这里的代码会将请求转发到 DeptQueryTeaByPageServlet该 Servlet 用于显示教师列表的分页信息。请求被转发到新的 URL重新加载教师数据并显示给用户。这里的 currentPage=1&rows=7 表示请求第一页并每页显示 7 条记录。
req.getRequestDispatcher("/DeptQueryTeaByPageServlet?currentPage=1&rows=7&tno=&tname=&tsex=").forward(req, resp);
}else {
req.getRequestDispatcher("/view/alluse/existdataofadd.jsp").forward(req, resp);//如果 count 不为 0表示数据库中已经存在该编号的教师代码会将请求转发到 existdataofadd.jsp 页面,显示错误信息(例如“该教师编号已经存在”)。
}
}
//重写 doPost 方法,以便当接收到 POST 请求时,调用 doGet 方法进行处理。这是因为这两个方法的逻辑相同,都是处理添加教师的功能。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);

@ -1,50 +1,58 @@
package com.controller.deptadmin;
package com.controller.deptadmin;//这一行指定了当前类所在的 Java 包com.controller.deptadmin 表示该类属于 deptadmin 包下的控制器类。
import com.dao.DeptAdminDao;
import com.dao.DeptAdminDao;//导入 DeptAdminDao 类,它通常是一个用于与数据库交互的 DAO数据访问对象包含了执行 SQL 查询或更新操作的方法。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.ServletException;//ServletException用于处理 Servlet 相关的异常。
import javax.servlet.annotation.WebServlet;//WebServlet用于定义 Servlet 的注解,它可以声明 URL 映射。
//HttpServlet, HttpServletRequest, HttpServletResponse处理 HTTP 请求和响应的类。
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.IOException;//IOException用于处理输入输出相关的异常。
@WebServlet("/DeptAlterStuServlet")//这是一个 Servlet 注解,标明该类是一个 Servlet并定义了它的 URL 映射。用户访问 /DeptAlterStuServlet 路径时会触发该 Servlet。
@WebServlet("/DeptAlterStuServlet")
//定义了一个 DeptAlterStuServlet 类,它继承自 HttpServlet表示这是一个处理 HTTP 请求的 Servlet。
public class DeptAlterStuServlet extends HttpServlet {
//这是重写的 doGet 方法,用于处理 HTTP GET 请求。当用户通过 GET 请求访问该 Servlet 时doGet 方法会被调用。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获取表单请求的参数
String sno = req.getParameter("sno");
String sname = req.getParameter("sname");
String ssex = req.getParameter("ssex");
String sage = req.getParameter("sage");
String sclass = req.getParameter("sclass");
String specialty = req.getParameter("specialty");
String sdept = req.getParameter("sdept");
String sphone = req.getParameter("sphone");
String spsw = req.getParameter("spsw");
//类型转换
req.setCharacterEncoding("utf-8");//req.setCharacterEncoding("utf-8"):设置请求的字符编码。
resp.setCharacterEncoding("utf-8");//resp.setCharacterEncoding("utf-8"):设置响应的字符编码。
resp.setContentType("text/html;charset=utf-8");//resp.setContentType("text/html;charset=utf-8"):设置响应的内容类型为 HTML字符集为 UTF-8。
//从 HTTP 请求中获取前端表单提交的参数。req.getParameter() 方法用于获取指定参数名的值,并将其赋值给相应的变量
String sno = req.getParameter("sno");//学生学号
String sname = req.getParameter("sname");//学生姓名
String ssex = req.getParameter("ssex");//学生姓名
String sage = req.getParameter("sage");//学生年龄
String sclass = req.getParameter("sclass");//学生班级
String specialty = req.getParameter("specialty");//学生专业
String sdept = req.getParameter("sdept");//学生院系
String sphone = req.getParameter("sphone");//学生手机号码
String spsw = req.getParameter("spsw");//学生密码
//将 sage学生年龄字符串类型转换为整数类型 sage1。Integer.parseInt() 方法将字符串转换为整数。
int sage1 = Integer.parseInt(sage);
//构建 SQL 更新语句,用于更新 student 表中的学生信息。SQL 语句中使用了占位符 ?,这些占位符将在后面通过参数值进行替换。
String sql = "update student set sname = ?, ssex = ?, sage = ?, sclass = ?, specialty = ?, sdept = ?, sphone = ?, spsw = ? where sno = ?";
Object[] objects = {sname, ssex, sage1, sclass, specialty, sdept, sphone, spsw, sno};
Object[] objects = {sname, ssex, sage1, sclass, specialty, sdept, sphone, spsw, sno};//创建一个 Object 数组 objects数组中存储了 SQL 语句中的占位符所需的参数值,按顺序传入 sname, ssex, sage1, sclass, specialty, sdept, sphone, spsw, sno。
int num = DeptAdminDao.executeUpdate(sql, objects);
int num = DeptAdminDao.executeUpdate(sql, objects);//调用 DeptAdminDao.executeUpdate 方法执行 SQL 更新操作。该方法返回受影响的行数即更新的记录数。num 变量将存储这个结果
System.out.println(num);
System.out.println(num);//打印出更新操作影响的记录数,通常用于调试,确认操作是否成功。
// req.getRequestDispatcher("/DeptQueryStuByPageServlet?currentPage=1&rows=8").forward(req, resp);
//该行代码将请求转发到 DeptQueryStuByPageServlet并附带了查询参数currentPage=1, rows=7, sname=, sclass=, specialty=)。这是为了分页显示学生信息,并可能过滤学生的姓名、班级或专业。
req.getRequestDispatcher("/DeptQueryStuByPageServlet?currentPage=1&rows=7&sname=&sclass=&specialty=").forward(req, resp);
}
//这是重写的 doPost 方法。在 doPost 中调用 doGet 方法,意味着无论是通过 GET 请求还是 POST 请求,都会执行相同的操作。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);

@ -1,46 +1,53 @@
package com.controller.deptadmin;
package com.controller.deptadmin;//定义了当前类所在的 Java 包com.controller.deptadmin表示这是一个与部门管理员相关的控制器类。
import com.dao.DeptAdminDao;
import com.dao.DeptAdminDao;//导入 DeptAdminDao 类,它通常用于数据库操作(如执行 SQL 查询或更新)。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.ServletException;//ServletException用于处理 Servlet 相关的异常。
import javax.servlet.annotation.WebServlet;//WebServlet用于定义 Servlet 的注解,声明该类是一个 Servlet并且绑定 URL 映射。
//HttpServlet、HttpServletRequest 和 HttpServletResponse用于处理 HTTP 请求和响应。
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.IOException;//IOException用于处理与输入输出相关的异常。
@WebServlet("/DeptAlterTeaPunchServlet")
public class DeptAlterTeaPunchServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获取表单请求的参数
String tno = req.getParameter("tno");
String tispunch = req.getParameter("tispunch");
String tpunchdate = req.getParameter("tpunchdate");
String tpunchtime = req.getParameter("tpunchtime");
String tishot = req.getParameter("tishot");
String tiscough = req.getParameter("tiscough");
String tisseem = req.getParameter("tisseem");
String tisdiagnose = req.getParameter("tisdiagnose");
String tstatus = req.getParameter("tstatus");
@Override//使用 @WebServlet 注解将该类绑定到 /DeptAlterTeaPunchServlet 路径。意味着当浏览器请求这个 URL 时Servlet 将被触发。
//定义了一个继承自 HttpServlet 的 DeptAlterTeaPunchServlet 类。HttpServlet 是 Servlet 的一个标准实现,用于处理 HTTP 请求。
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");//req.setCharacterEncoding("utf-8"):设置请求的字符编码。
resp.setCharacterEncoding("utf-8");//resp.setCharacterEncoding("utf-8"):设置响应的字符编码。
resp.setContentType("text/html;charset=utf-8");//resp.setContentType("text/html;charset=utf-8"):设置响应内容的类型为 HTML并指定字符集为 UTF-8。
//从 HTTP 请求中获取前端表单提交的参数。req.getParameter() 方法用于获取特定参数名的值。
String tno = req.getParameter("tno");//教师工号
String tispunch = req.getParameter("tispunch");//是否打卡
String tpunchdate = req.getParameter("tpunchdate");//打卡日期
String tpunchtime = req.getParameter("tpunchtime");//打卡时间
String tishot = req.getParameter("tishot");//是否发热
String tiscough = req.getParameter("tiscough");//是否咳嗽
String tisseem = req.getParameter("tisseem");//是否有嗅觉
String tisdiagnose = req.getParameter("tisdiagnose");//是否诊断为疾病
String tstatus = req.getParameter("tstatus");//当前的考勤情况
//构建了一个 SQL 更新语句用于更新教师考勤记录。SQL 语句中使用了占位符(?),这些占位符将由 objects 数组中的实际值替换。
String sql = "update teapunchin set tispunch = ?, tpunchtime = ?, tishot = ?, tiscough = ?, tisseem = ?, tisdiagnose = ?, tstatus = ? where tno = ? and tpunchdate = ?";
Object[] objects = {tispunch, tpunchtime, tishot, tiscough, tisseem, tisdiagnose, tstatus, tno, tpunchdate};
Object[] objects = {tispunch, tpunchtime, tishot, tiscough, tisseem, tisdiagnose, tstatus, tno, tpunchdate};//创建一个 Object[] 数组 objects将前面从表单中获取的参数按顺序放入数组中这些值将在执行 SQL 更新时替代 SQL 语句中的 ? 占位符。
int num = DeptAdminDao.executeUpdate(sql, objects);
int num = DeptAdminDao.executeUpdate(sql, objects);//调用 DeptAdminDao.executeUpdate 方法执行 SQL 更新操作。executeUpdate 方法会根据 SQL 语句更新数据库中的记录,返回值 num 表示受影响的行数(即更新了多少条记录)。
System.out.println(num);
System.out.println(num);//打印更新操作影响的行数。通常用于调试,以确认操作是否成功。
//将请求转发到另一个 Servlet DeptQueryTeaPunchByPageServlet并传递一些分页参数currentPage=1&rows=7以及查询条件tno=, tname=, tpunchdate=)。
req.getRequestDispatcher("/DeptQueryTeaPunchByPageServlet?currentPage=1&rows=7&tno=&tname=&tpunchdate=").forward(req, resp);
}
@Override
//重写 doPost 方法。由于该方法没有做任何额外的处理,它直接调用了 doGet 方法。这样GET 请求和 POST 请求都会执行相同的操作。
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}

@ -1,47 +1,51 @@
package com.controller.deptadmin;
package com.controller.deptadmin;//定义了当前类所在的 Java 包com.controller.deptadmin说明这是一个部门管理员相关的控制器类。
import com.dao.DeptAdminDao;
import com.dao.DeptAdminDao;//导入 DeptAdminDao 类,它通常用于与数据库进行交互,例如执行 SQL 查询或更新操作。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.ServletException;//ServletException用于处理 Servlet 异常。
import javax.servlet.annotation.WebServlet;//WebServlet注解用于将这个类声明为一个 Servlet 并绑定一个 URL 路径。
//HttpServlet、HttpServletRequest 和 HttpServletResponse用于处理 HTTP 请求和响应。
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.IOException;//IOException用于处理输入输出异常。
@WebServlet("/DeptAlterTeaServlet")
public class DeptAlterTeaServlet extends HttpServlet {
@WebServlet("/DeptAlterTeaServlet")//使用 @WebServlet 注解定义了这个 Servlet 的 URL 映射为 /DeptAlterTeaServlet。当浏览器请求该路径时Servlet 会被调用。
public class DeptAlterTeaServlet extends HttpServlet {//定义了一个继承自 HttpServlet 的类 DeptAlterTeaServlet这是一个处理 HTTP 请求的 Servlet 类。
@Override
@Override//重写 doGet 方法,这个方法处理 HTTP GET 请求。当用户发出 GET 请求时,这个方法将被调用。
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获取表单请求的参数
String tno = req.getParameter("tno");
String tname = req.getParameter("tname");
String tsex = req.getParameter("tsex");
String tage = req.getParameter("tage");
String tdept = req.getParameter("tdept");
String tphone = req.getParameter("tphone");
String tpsw = req.getParameter("tpsw");
//数据类型转换
req.setCharacterEncoding("utf-8");//req.setCharacterEncoding("utf-8"):设置请求的字符编码。
resp.setCharacterEncoding("utf-8");//resp.setCharacterEncoding("utf-8"):设置响应的字符编码。
resp.setContentType("text/html;charset=utf-8");//resp.setContentType("text/html;charset=utf-8"):设置响应的内容类型为 HTML并指定字符集为 UTF-8。
//从 HTTP 请求中获取前端提交的表单参数
String tno = req.getParameter("tno");//教师工号
String tname = req.getParameter("tname");//教师姓名
String tsex = req.getParameter("tsex");//教师性别
String tage = req.getParameter("tage");//教师年龄
String tdept = req.getParameter("tdept");//教师所属部门
String tphone = req.getParameter("tphone");//教师联系电话
String tpsw = req.getParameter("tpsw");//教师密码
//将 tage从表单中获得的年龄转换为整数类型。Integer.parseInt() 方法将字符串类型的 tage 转换为整数 tage1。
int tage1 = Integer.parseInt(tage);
String sql = "update teacher set tname = ?, tsex = ?, tage = ?, tdept = ?, tphone = ?, tpsw = ? where tno = ?";
Object[] objects = {tname, tsex, tage1, tdept, tphone, tpsw, tno};
String sql = "update teacher set tname = ?, tsex = ?, tage = ?, tdept = ?, tphone = ?, tpsw = ? where tno = ?";//构建一个 SQL 更新语句,用于更新教师的信息。? 是占位符,在实际执行时会用实际参数替换。这个 SQL 语句将教师的姓名、性别、年龄、部门、电话和密码更新到数据库中,条件是教师的工号 tno。
Object[] objects = {tname, tsex, tage1, tdept, tphone, tpsw, tno};//创建一个 Object[] 数组,将前面从请求中获取的参数按顺序存放在数组中。这些参数将用于替代 SQL 语句中的占位符 ?。
int num = DeptAdminDao.executeUpdate(sql, objects);
int num = DeptAdminDao.executeUpdate(sql, objects);//调用 DeptAdminDao.executeUpdate 方法来执行 SQL 更新操作,传入 SQL 语句和参数数组。该方法返回一个整数 num表示受影响的行数即更新了多少条记录。
System.out.println(num);
System.out.println(num);//打印出受影响的行数 num用于调试和确认是否成功更新了记录。
// req.getRequestDispatcher("/DeptQueryTeaByPageServlet?currentPage=1&rows=8").forward(req, resp);
//通过 RequestDispatcher 转发请求到另一个 Servlet /DeptQueryTeaByPageServlet。在转发时传递一些分页参数currentPage=1&rows=7以及查询条件tno=, tname=, tsex=)。
req.getRequestDispatcher("/DeptQueryTeaByPageServlet?currentPage=1&rows=7&tno=&tname=&tsex=").forward(req, resp);
}
//重写 doPost 方法。该方法调用了 doGet这样无论是 GET 请求还是 POST 请求都会执行相同的逻辑。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);

@ -1,61 +1,144 @@
package com.controller.deptadmin;
// 声明该类所属的包为 com.controller.deptadmin包机制是 Java 中用于组织和管理类的一种方式,
// 它将相关的类归为一组,便于代码的维护、查找和管理,同时避免类名冲突。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,这个类通常包含了与数据库交互的各种方法,
// 比如执行 SQL 查询语句(如 select、插入数据insert、更新数据update以及删除数据delete等操作
// 在后续代码中会利用这些方法来实现对数据库中数据的操作。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在运行过程中出现错误或异常情况时,
// 例如请求处理失败、资源加载异常等,会抛出 ServletException 异常,以便进行异常处理。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,它是 Java EE 中用于将一个普通的 Java 类标记为 Servlet 的注解。
// 通过该注解可以方便地指定 Servlet 的访问路径,使得客户端能够通过特定的 URL 来访问该 Servlet。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本框架和方法。
// 我们定义的 Servlet 类需要继承 HttpServlet 类,从而获得处理 HTTP 请求的能力。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,它用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等内容。Servlet 可以通过这个类来获取客户端传递的各种数据。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,它用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等。Servlet 可以利用这个类来设置并返回给客户端相应的响应数据。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出相关的操作(如网络数据传输、文件读写等)时,
// 如果出现错误,就会抛出 IOException 异常,以便进行相应的错误处理。
@WebServlet("/DeptDelSelectedStuPunchServlet")
// 使用 WebServlet 注解将 DeptDelSelectedStuPunchServlet 类标记为一个 Servlet
// 并指定其访问路径为 /DeptDelSelectedStuPunchServlet这样客户端就可以通过这个路径向该 Servlet 发送请求。
public class DeptDelSelectedStuPunchServlet extends HttpServlet {
// 定义一个名为 DeptDelSelectedStuPunchServlet 的类,继承自 HttpServlet 类,
// 这使得该类成为一个可以处理 HTTP 请求的 Servlet能够响应客户端发送的 GET 和 POST 请求。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,该方法专门用于处理客户端发送的 HTTP GET 请求。
// 它接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误情况。
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[] snodates = req.getParameterValues("snodates");
// 从 HTTP 请求中获取名为 "snodates" 的参数值,由于该参数可能有多个值(对应多个复选框的选中状态),
// 所以使用 getParameterValues 方法,将获取到的值存储在字符串数组 snodates 中。这里的 snodates 可能包含了学生编号和打卡日期的组合信息。
System.out.println(snodates);
// 在控制台打印 snodates 数组,用于调试目的,方便开发人员查看接收到的参数数组。
// 但需要注意的是,直接打印数组会输出数组的内存地址,若要查看具体值,通常需要遍历数组。
if(snodates.length > 0 && snodates != null){
//遍历并删除选中的sno,y一个一个删除
for (String snodate: snodates) {
if (snodates.length > 0 && snodates != null) {
// 判断 snodates 数组是否为空且长度大于 0如果满足这个条件
// 说明客户端确实选中了一些复选框,有需要处理的参数数据,因此可以继续执行后续的删除操作。
//遍历并删除选中的sno,一个一个删除
for (String snodate : snodates) {
// 使用增强型 for 循环遍历 snodates 数组,每次取出一个 snodate 元素,
// 该元素包含了学生编号和打卡日期的组合信息,接下来对其进行分离处理。
//分离两个参数
String[] params = snodate.split(",");
// 使用 split 方法将 snodate 字符串按逗号分隔成一个字符串数组 params
// 以便将学生编号和打卡日期分开。
String sno = params[0];
// 将数组 params 的第一个元素赋值给字符串变量 sno代表学生编号。
String spunchdate = params[1];
// 将数组 params 的第二个元素赋值给字符串变量 spunchdate代表学生的打卡日期。
System.out.println(sno);
System.out.println(spunchdate);
// 在控制台分别打印 sno 和 spunchdate 的值,用于调试,
// 方便开发人员确认从参数中分离出的学生编号和打卡日期是否正确。
//字符串转为日期类型
// Date spunchdate1 = new Date(spunchdate);
// 注释掉的代码,原本意图是将字符串类型的打卡日期 spunchdate 转换为 Date 类型,
// 但这种方式在传入字符串格式不匹配时可能会出错,并且此处未实际使用。
//或
// SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
// Date spunchdate1 = ft.format(spunchdate);
// 注释掉的代码,提供了另一种将字符串按 "yyyy-MM-dd" 格式转换为 Date 类型的方式,
// 同样未在当前代码中实际使用,可能是后续功能的预留或根据实际需求不需要进行此转换。
String sql = null;
// 声明一个字符串变量 sql用于存储即将执行的 SQL 语句,初始值设为 null
// 后续会根据业务逻辑动态地构建和赋值 SQL 语句。
Object[] objects = {sno, spunchdate};
// 创建一个 Object 类型的数组 objects将 sno 和 spunchdate 作为元素存储在数组中,
// 这个数组将作为参数传递给数据库操作方法,用于绑定 SQL 语句中的占位符。
//删除stupunchin中的该导游信息
sql = "delete from stupunchin where sno = ? and spunchdate = ?";
// 定义一个 SQL 删除语句,用于从 stupunchin 表中删除学生编号为 sno 且打卡日期为 spunchdate 的记录,
// 使用占位符 ? 来提高 SQL 语句的安全性,防止 SQL 注入攻击。
int num1 = DeptAdminDao.executeUpdate(sql, objects);
// 调用 DeptAdminDao 类的 executeUpdate 方法,执行上述 SQL 删除语句,
// 并将受影响的记录数量赋值给整数变量 num1通过这个数量可以判断删除操作是否成功以及影响的记录数。
System.out.println(num1);
// 在控制台打印受影响的记录数量 num1用于调试目的
// 方便开发人员确认删除 stupunchin 表中对应记录的操作是否成功,以及删除的记录数量是否符合预期。
}
req.getRequestDispatcher("/DeptQueryStuPunchByPageServlet?currentPage=1&rows=7&sname=&sclass=&spunchdate=").forward(req, resp);
// 将请求转发到 /DeptQueryStuPunchByPageServlet 页面,并传递相应的参数,
// 当前页码 currentPage 为 1每页显示行数 rows 为 7学生姓名 sname、学生班级 sclass 和打卡日期 spunchdate 为空。
// 这一步通常是在完成删除操作后,将页面重定向到查询学生打卡信息的页面,以便用户查看更新后的打卡记录列表。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,该方法用于处理客户端发送的 HTTP POST 请求。
// 它接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以应对可能出现的错误情况。
doGet(req, resp);
// 调用 doGet 方法来处理 POST 请求,这意味着对于该 ServletPOST 请求和 GET 请求的处理逻辑是相同的,
// 这样可以避免重复编写相似的代码,提高代码的复用性和可维护性。
}
}
}

@ -1,56 +1,151 @@
package com.controller.deptadmin;
// 声明该类所属的包为 com.controller.deptadmin包的作用是对相关的类进行组织和管理
// 便于代码的维护和查找,同时避免类名冲突,在大型项目中有助于构建清晰的代码结构。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类通常封装了与数据库交互的操作方法,
// 例如执行 SQL 查询、插入数据、更新数据以及删除数据等操作。后续代码会使用该类的方法来操作数据库。
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 类,一般来说,这个类会包含与 JDBCJava Database Connectivity
// 相关的工具方法,比如获取数据库连接、关闭连接等,以简化数据库操作的流程。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在运行过程中出现异常情况时,
// 例如请求处理失败、资源加载错误等,会抛出 ServletException 异常,
// 以便进行相应的异常处理和错误恢复。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,这是 Java EE 中用于将普通 Java 类标记为 Servlet 的注解。
// 通过该注解可以指定 Servlet 的访问路径,使得客户端能够通过特定的 URL 来访问该 Servlet。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本框架和方法。
// 我们定义的 Servlet 类需要继承 HttpServlet 类,从而获得处理 HTTP 请求的能力。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等内容。Servlet 可以通过这个类获取客户端传递的各种数据。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等。Servlet 可以利用这个类来设置并返回给客户端相应的响应数据。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出相关的操作(如网络数据传输、文件读写等)时,
// 如果出现错误,就会抛出 IOException 异常,以便进行相应的错误处理。
import java.sql.ResultSet;
// 导入 ResultSet 类,它用于表示数据库查询结果集。当执行 SQL 查询语句后,
// 数据库返回的数据会被封装在 ResultSet 对象中,通过它可以遍历和获取查询结果的每一行数据。
import java.sql.SQLException;
// 导入 SQL 异常类,当与数据库进行交互(如执行 SQL 语句)过程中出现错误时,
// 例如数据库连接失败、SQL 语句语法错误等,会抛出 SQLException 异常,
// 用于捕获和处理这些与数据库操作相关的异常情况。
import java.util.ArrayList;
// 导入 ArrayList 类,它是 Java 集合框架中的一种动态数组实现。
// 可以用来存储和管理一组对象,并且可以根据需要动态地增加或减少元素数量。
import java.util.Iterator;
// 导入 Iterator 接口,它提供了一种遍历集合元素的通用方式。
// 通过实现 Iterator 接口的方法,可以对集合(如 ArrayList中的元素进行迭代访问。
@WebServlet("/DeptDelSelectedStuServlet")
// 使用 WebServlet 注解将 DeptDelSelectedStuServlet 类标记为一个 Servlet
// 并指定其访问路径为 /DeptDelSelectedStuServlet这样客户端就可以通过这个路径向该 Servlet 发送请求。
public class DeptDelSelectedStuServlet extends HttpServlet {
// 定义一个名为 DeptDelSelectedStuServlet 的类,继承自 HttpServlet 类,
// 使其成为一个可以处理 HTTP 请求的 Servlet能够响应客户端发送的 GET 和 POST 请求。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,该方法用于处理客户端发送的 HTTP GET 请求。
// 方法接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并可能抛出 ServletException 和 IOException 异常,以处理请求过程中可能出现的错误。
req.setCharacterEncoding("utf-8");
// 设置请求的字符编码为 UTF-8确保能够正确处理包含中文等特殊字符的请求参数
// 避免因字符编码问题导致的乱码,保证请求数据的准确解析。
resp.setCharacterEncoding("utf-8");
// 设置响应的字符编码为 UTF-8保证返回给客户端的内容能够正确显示中文等特殊字符
// 确保响应数据的正确呈现,避免客户端显示乱码。
resp.setContentType("text/html;charset=utf-8");
// 设置响应的内容类型为 text/html并指定字符编码为 UTF-8
// 告知客户端返回的是 HTML 格式的内容,以便客户端能够正确解析和显示响应信息。
//获取请求时复选框有选中的状态参数
String[] snos = req.getParameterValues("sno");
// 从 HTTP 请求中获取名为 "sno" 的参数值,由于该参数可能有多个值(对应多个复选框的选中状态),
// 所以使用 getParameterValues 方法,将获取到的值存储在字符串数组 snos 中。这里的 snos 代表多个学生编号。
System.out.println(snos);
// 在控制台打印 snos 数组,用于调试目的,方便开发人员查看接收到的学生编号参数数组。
// 但需注意,直接打印数组会输出数组的内存地址,若要查看具体值,需遍历数组。
if (snos.length > 0 && snos != null) {
// 判断 snos 数组是否为空且长度大于 0如果满足这个条件
// 说明客户端确实选中了一些复选框,有需要处理的学生编号数据,因此可以继续执行后续的删除操作。
//遍历并删除选中的sno,一个一个删除
for (String sno : snos) {
// 使用增强型 for 循环遍历 snos 数组,每次取出一个 sno 元素,
// 该元素代表一个学生编号,接下来针对该学生编号执行删除操作。
if(snos.length > 0 && snos != null){
//遍历并删除选中的sno,y一个一个删除
for (String sno: snos) {
String sql = null;
// 声明一个字符串变量 sql用于存储即将执行的 SQL 语句,初始值设为 null
// 后续会根据业务需求动态地构建和赋值 SQL 语句。
Object[] objects = {sno};
// 创建一个 Object 类型的数组 objects将 sno 作为唯一元素存储在数组中,
// 这个数组将作为参数传递给数据库操作方法,用于绑定 SQL 语句中的占位符。
//删除stupunchin中的该导游信息
sql = "delete from stupunchin where sno = ?";
// 定义一个 SQL 删除语句,用于从 stupunchin 表中删除学生编号为 sno 的记录,
// 使用占位符 ? 来提高 SQL 语句的安全性,防止 SQL 注入攻击。
int num1 = DeptAdminDao.executeUpdate(sql, objects);
// 调用 DeptAdminDao 类的 executeUpdate 方法,执行上述 SQL 删除语句,
// 并将受影响的记录数量赋值给整数变量 num1通过这个数量可以判断删除操作是否成功以及影响的记录数。
System.out.println(num1);
// 在控制台打印受影响的记录数量 num1用于调试目的
// 方便开发人员确认删除 stupunchin 表中对应记录的操作是否成功,以及删除的记录数量是否符合预期。
//删除student表中该导游信息
sql = "delete from student where sno = ?";
// 定义一个 SQL 删除语句,用于从 student 表中删除学生编号为 sno 的记录,
// 同样使用占位符 ? 来确保 SQL 语句的安全性。
int num2 = DeptAdminDao.executeUpdate(sql, objects);
// 调用 DeptAdminDao 类的 executeUpdate 方法,执行上述 SQL 删除语句,
// 并将受影响的记录数量赋值给整数变量 num2用于判断删除 student 表中记录的操作是否成功。
System.out.println(num2);
// 在控制台打印受影响的记录数量 num2用于调试目的
// 方便开发人员确认删除 student 表中对应记录的操作是否成功,以及删除的记录数量是否符合预期。
}
req.getRequestDispatcher("/DeptQueryStuByPageServlet?currentPage=1&rows=7&sname=&sclass=&specialty=").forward(req, resp);
// 将请求转发到 /DeptQueryStuByPageServlet 页面,并传递相应的参数,
// 当前页码 currentPage 为 1每页显示行数 rows 为 7学生姓名 sname、学生班级 sclass 和专业 specialty 为空。
// 这一步通常是在完成删除操作后,将页面重定向到查询学生信息的页面,以便用户查看更新后的学生列表。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,该方法用于处理客户端发送的 HTTP POST 请求。
// 方法接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并可能抛出 ServletException 和 IOException 异常,以处理请求过程中可能出现的错误。
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同,
// 这样可以避免重复编写相似的代码,提高代码的复用性和可维护性。
}
}
}

@ -1,61 +1,143 @@
package com.controller.deptadmin;
// 声明该类所属的包为 com.controller.deptadmin包用于对相关类进行组织管理
// 方便代码的维护和查找,避免类名冲突,构建清晰的项目结构。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类通常包含与数据库交互的方法,
// 如执行 SQL 查询、插入、更新、删除等操作,后续代码将使用这些方法操作数据库。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在运行中出现错误或异常(如请求处理失败、资源加载问题等)时,
// 会抛出 ServletException 异常,以便进行异常处理。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,用于将普通 Java 类标记为 Servlet并指定其访问路径
// 使客户端能够通过特定 URL 访问该 Servlet。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供处理 HTTP 请求的基本框架和方法,
// 我们定义的 Servlet 类需继承它以获得处理 HTTP 请求的能力。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等Servlet 可借此获取客户端数据。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等Servlet 可通过它设置并返回响应数据。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出操作(如网络传输、文件读写等)出现错误时,
// 会抛出 IOException 异常,以便进行错误处理。
@WebServlet("/DeptDelSelectedTeaPunchServlet")
// 使用 WebServlet 注解将 DeptDelSelectedTeaPunchServlet 类标记为 Servlet
// 并指定访问路径为 /DeptDelSelectedTeaPunchServlet客户端可通过此路径发送请求。
public class DeptDelSelectedTeaPunchServlet extends HttpServlet {
// 定义名为 DeptDelSelectedTeaPunchServlet 的类,继承自 HttpServlet 类,
// 使其能处理 HTTP 请求,响应客户端的 GET 和 POST 请求。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,处理客户端的 HTTP GET 请求。
// 接收 HttpServletRequest 和 HttpServletResponse 对象作为参数,
// 可能抛出 ServletException 和 IOException 异常以处理请求中的错误。
req.setCharacterEncoding("utf-8");
// 设置请求的字符编码为 UTF-8确保能正确处理含中文等特殊字符的请求参数
// 避免乱码,保证请求数据准确解析。
resp.setCharacterEncoding("utf-8");
// 设置响应的字符编码为 UTF-8保证返回给客户端的内容能正确显示中文等特殊字符
// 确保响应数据正确呈现。
resp.setContentType("text/html;charset=utf-8");
// 设置响应的内容类型为 text/html并指定字符编码为 UTF-8
// 告知客户端返回的是 HTML 格式内容,以便正确解析和显示。
//获取请求时复选框有选中的状态参数
String[] tnodates = req.getParameterValues("tnodates");
// 从 HTTP 请求中获取名为 "tnodates" 的参数值,因该参数可能有多个值(复选框选中状态),
// 用 getParameterValues 方法,将值存于字符串数组 tnodates 中,可能包含教师编号和打卡日期组合信息。
System.out.println(tnodates);
// 在控制台打印 tnodates 数组,用于调试,查看接收到的参数数组。
// 直接打印数组输出的是内存地址,查看具体值需遍历数组。
if (tnodates.length > 0 && tnodates != null) {
// 判断 tnodates 数组是否为空且长度大于 0满足则说明有选中复选框
// 有需要处理的数据,可继续执行后续删除操作。
if(tnodates.length > 0 && tnodates != null){
//遍历并删除选中的sno,y一个一个删除
for (String tnodate: tnodates) {
for (String tnodate : tnodates) {
// 用增强型 for 循环遍历 tnodates 数组,每次取出一个 tnodate 元素,
// 该元素含教师编号和打卡日期组合信息,进行分离处理。
//分离两个参数
String[] params = tnodate.split(",");
// 用 split 方法将 tnodate 字符串按逗号分隔成字符串数组 params
// 以分离教师编号和打卡日期。
String tno = params[0];
// 将数组 params 的第一个元素赋值给 tno代表教师编号。
String tpunchdate = params[1];
//将数组 params 的第二个元素赋值给 tpunchdate代表教师打卡日期。
System.out.println(tno);
System.out.println(tpunchdate);
// 在控制台分别打印 tno 和 tpunchdate 的值,用于调试,
// 确认分离出的教师编号和打卡日期是否正确。
//字符串转为日期类型
// Date spunchdate1 = new Date(spunchdate);
// 注释掉的代码,原试图将字符串类型打卡日期转换为 Date 类型,
// 但格式不匹配时可能出错,且此处未实际使用。
//或
// SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
// Date spunchdate1 = ft.format(spunchdate);
// 注释掉的代码,提供另一种将字符串按 "yyyy-MM-dd" 格式转换为 Date 类型的方式,
// 同样未实际使用,可能为后续功能预留或无需此转换。
String sql = null;
// 声明字符串变量 sql用于存储 SQL 语句,初始值为 null
// 后续根据业务逻辑动态构建和赋值。
Object[] objects = {tno, tpunchdate};
// 创建 Object 类型数组 objects将 tno 和 tpunchdate 作为元素存储,
// 作为参数传递给数据库操作方法,绑定 SQL 语句中的占位符。
//删除stupunchin中的该信息
sql = "delete from teapunchin where tno = ? and tpunchdate = ?";
// 定义 SQL 删除语句,从 teapunchin 表中删除教师编号为 tno 且打卡日期为 tpunchdate 的记录,
// 用占位符 ? 提高 SQL 语句安全性,防止 SQL 注入攻击。
int num1 = DeptAdminDao.executeUpdate(sql, objects);
// 调用 DeptAdminDao 类的 executeUpdate 方法,执行 SQL 删除语句,
// 将受影响的记录数量赋值给 num1判断删除操作是否成功及影响的记录数。
System.out.println(num1);
// 在控制台打印受影响的记录数量 num1用于调试
// 确认删除 teapunchin 表中对应记录的操作是否成功及记录数量是否符合预期。
}
req.getRequestDispatcher("/DeptQueryTeaPunchByPageServlet?currentPage=1&rows=7&tno=&tname=&tpunchdate=").forward(req, resp);
// 将请求转发到 /DeptQueryTeaPunchByPageServlet 页面,并传递参数,
// 当前页码 currentPage 为 1每页显示行数 rows 为 7教师编号 tno、教师姓名 tname、打卡日期 tpunchdate 为空。
// 完成删除操作后,重定向到查询教师打卡信息页面,让用户查看更新后的打卡记录列表。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,处理客户端的 HTTP POST 请求。
// 接收 HttpServletRequest 和 HttpServletResponse 对象作为参数,
// 可能抛出 ServletException 和 IOException 异常以处理请求中的错误。
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即该 Servlet 的 POST 和 GET 请求处理逻辑相同,
// 避免重复代码,提高代码复用性和可维护性。
}
}
}

@ -1,51 +1,129 @@
package com.controller.deptadmin;
// 声明该类所在的包为 com.controller.deptadmin包机制用于将相关的类组织在一起
// 方便代码的管理和维护,避免不同类之间的命名冲突,也有助于构建清晰的项目结构。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,这个类通常封装了与数据库交互的操作方法,
// 像执行 SQL 查询、插入、更新和删除等操作,后续代码会借助这些方法来操作数据库。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在执行过程中出现异常情况,
// 例如请求处理失败、资源加载错误等,就会抛出 ServletException 异常,用于异常处理。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,它是 Java EE 中用于将普通 Java 类标记为 Servlet 的注解,
// 通过该注解可以指定 Servlet 的访问路径,使客户端能够通过特定的 URL 来访问该 Servlet。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本结构和方法,
// 我们定义的 Servlet 类继承它,从而具备处理 HTTP 请求的能力。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等内容Servlet 可以通过它获取客户端传递的数据。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等Servlet 可以利用它设置并返回响应数据给客户端。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出操作(如网络传输、文件读写等)出现错误时,
// 会抛出 IOException 异常,以便进行相应的错误处理。
@WebServlet("/DeptDelSelectedTeaServlet")
// 使用 WebServlet 注解将 DeptDelSelectedTeaServlet 类标记为一个 Servlet
// 并指定其访问路径为 /DeptDelSelectedTeaServlet客户端可以通过这个路径向该 Servlet 发送请求。
public class DeptDelSelectedTeaServlet extends HttpServlet {
// 定义一个名为 DeptDelSelectedTeaServlet 的类,继承自 HttpServlet 类,
// 使其成为一个能够处理 HTTP 请求的 Servlet可响应客户端的 GET 和 POST 请求。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,用于处理客户端发送的 HTTP GET 请求。
// 该方法接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误。
req.setCharacterEncoding("utf-8");
// 设置请求的字符编码为 UTF - 8确保服务器能够正确处理包含中文等特殊字符的请求参数
// 避免出现乱码问题,保证请求数据的准确解析。
resp.setCharacterEncoding("utf-8");
// 设置响应的字符编码为 UTF - 8保证返回给客户端的内容能够正确显示中文等特殊字符
// 确保响应数据的正确呈现,避免客户端显示乱码。
resp.setContentType("text/html;charset=utf-8");
// 设置响应的内容类型为 text/html并指定字符编码为 UTF - 8
// 告知客户端返回的是 HTML 格式的内容,以便客户端正确解析和显示响应信息。
//获取请求时复选框有选中的状态参数
String[] tnos = req.getParameterValues("tno");
// 从 HTTP 请求中获取名为 "tno" 的参数值,由于该参数可能有多个值(对应多个复选框的选中状态),
// 所以使用 getParameterValues 方法,将获取到的值存储在字符串数组 tnos 中,这里的 tnos 代表多个教师编号。
System.out.println(tnos);
// 在控制台打印 tnos 数组,用于调试目的,方便开发人员查看接收到的教师编号参数数组。
// 不过直接打印数组会输出数组的内存地址,若要查看具体值,需要遍历数组。
if (tnos.length > 0 && tnos != null) {
// 判断 tnos 数组是否为空且长度大于 0如果满足这个条件
// 说明客户端确实选中了一些复选框,有需要处理的教师编号数据,因此可以继续执行后续的删除操作。
if(tnos.length > 0 && tnos != null){
//遍历并删除选中的sno,y一个一个删除
for (String tno: tnos) {
for (String tno : tnos) {
// 使用增强型 for 循环遍历 tnos 数组,每次取出一个 tno 元素,
// 该元素代表一个教师编号,接下来针对该教师编号执行删除操作。
String sql = null;
// 声明一个字符串变量 sql用于存储即将执行的 SQL 语句,初始值设为 null
// 后续会根据业务逻辑动态地构建和赋值 SQL 语句。
Object[] objects = {tno};
// 创建一个 Object 类型的数组 objects将 tno 作为唯一元素存储在数组中,
// 这个数组将作为参数传递给数据库操作方法,用于绑定 SQL 语句中的占位符。
//删除stupunchin中的该导游信息
sql = "delete from teapunchin where tno = ?";
// 定义一个 SQL 删除语句,用于从 teapunchin 表中删除教师编号为 tno 的记录,
// 使用占位符 ? 来提高 SQL 语句的安全性,防止 SQL 注入攻击。
int num1 = DeptAdminDao.executeUpdate(sql, objects);
// 调用 DeptAdminDao 类的 executeUpdate 方法,执行上述 SQL 删除语句,
// 并将受影响的记录数量赋值给整数变量 num1通过这个数量可以判断删除操作是否成功以及影响的记录数。
System.out.println(num1);
// 在控制台打印受影响的记录数量 num1用于调试目的
// 方便开发人员确认删除 teapunchin 表中对应记录的操作是否成功,以及删除的记录数量是否符合预期。
//删除student表中该导游信息
sql = "delete from teacher where tno = ?";
// 定义一个 SQL 删除语句,用于从 teacher 表中删除教师编号为 tno 的记录,
// 同样使用占位符 ? 来确保 SQL 语句的安全性。
int num2 = DeptAdminDao.executeUpdate(sql, objects);
// 调用 DeptAdminDao 类的 executeUpdate 方法,执行上述 SQL 删除语句,
// 并将受影响的记录数量赋值给整数变量 num2用于判断删除 teacher 表中记录的操作是否成功。
System.out.println(num2);
// 在控制台打印受影响的记录数量 num2用于调试目的
// 方便开发人员确认删除 teacher 表中对应记录的操作是否成功,以及删除的记录数量是否符合预期。
}
req.getRequestDispatcher("/DeptQueryTeaByPageServlet?currentPage=1&rows=7&tno=&tname=&tsex=").forward(req, resp);
// 将请求转发到 /DeptQueryTeaByPageServlet 页面,并传递相应的参数,
// 当前页码 currentPage 为 1每页显示行数 rows 为 7教师编号 tno、教师姓名 tname、教师性别 tsex 为空。
// 这一步通常是在完成删除操作后,将页面重定向到查询教师信息的页面,以便用户查看更新后的教师列表。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,用于处理客户端发送的 HTTP POST 请求。
// 该方法接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误。
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同,
// 这样可以避免重复编写相似的代码,提高代码的复用性和可维护性。
}
}
}

@ -1,35 +1,38 @@
package com.controller.deptadmin;
package com.controller.deptadmin;//定义了当前类所在的 Java 包 com.controller.deptadmin表示这是一个与部门管理员相关的控制器类。
import com.dao.DeptAdminDao;
import com.dao.DeptAdminDao;//导入 DeptAdminDao 类,该类通常用于执行数据库操作(如查询、更新、删除等)。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.ServletException;//ServletException用于处理 Servlet 异常。
import javax.servlet.annotation.WebServlet;//WebServlet注解用于将类声明为 Servlet并将其与特定的 URL 路径映射。
//HttpServlet、HttpServletRequest 和 HttpServletResponse用于处理 HTTP 请求和响应。
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.IOException;//IOException用于处理输入输出异常。
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/DeptDeleteStuPunchServlet")
public class DeptDeleteStuPunchServlet extends HttpServlet {
@WebServlet("/DeptDeleteStuPunchServlet")//使用 @WebServlet 注解,将这个 Servlet 映射到 URL 路径 /DeptDeleteStuPunchServlet即当访问该路径时Servlet 会被触发。
public class DeptDeleteStuPunchServlet extends HttpServlet {//定义了一个继承自 HttpServlet 的类 DeptDeleteStuPunchServlet它处理 HTTP 请求,执行删除学生考勤记录的操作。
@Override
@Override//重写 doGet 方法,用于处理 HTTP GET 请求。
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
req.setCharacterEncoding("utf-8");//req.setCharacterEncoding("utf-8"):设置请求的字符编码为 UTF-8。
resp.setCharacterEncoding("utf-8");//resp.setCharacterEncoding("utf-8"):设置响应的字符编码为 UTF-8。
resp.setContentType("text/html;charset=utf-8");//resp.setContentType("text/html;charset=utf-8"):设置响应的内容类型为 HTML并指定字符集为 UTF-8。
//获取请求参数
//从请求中获取参数 snodate这个参数包含了学生学号和考勤日期通常以逗号分隔。
String snodate = req.getParameter("snodate");
System.out.println(snodate);
System.out.println(snodate);//输出获取到的 snodate 参数,便于调试时查看该参数的值。
//分离两个参数,用日期和学号来删除
String[] params = snodate.split(",");
String[] params = snodate.split(",");//将 snodate 字符串按逗号分隔,得到学号和考勤日期两个部分,分别存储在 sno学号和 spunchdate考勤日期变量中。
String sno = params[0];
String spunchdate = params[1];
//输出分离后的学号和考勤日期,便于调试时查看它们的值。
System.out.println(sno);
System.out.println(spunchdate);
@ -39,26 +42,29 @@ public class DeptDeleteStuPunchServlet extends HttpServlet {
// SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
// Date spunchdate1 = ft.format(spunchdate);
//初始化一个 SQL 查询语句的变量 sql并创建一个 Object[] 数组,将学号 sno 和考勤日期 spunchdate 存放到数组中。这个数组将作为 SQL 查询的参数。
String sql = null;
Object[] objects = {sno, spunchdate};
//查询是否存在此人
sql = "select count(*) as num from stupunchin where sno = ? and spunchdate = ?";
sql = "select count(*) as num from stupunchin where sno = ? and spunchdate = ?";//构建一个 SQL 查询语句,查询 stupunchin 表中是否存在该学号和考勤日期的记录。调用 DeptAdminDao.findTotalCount 方法执行查询并返回计数值 count。
int count = DeptAdminDao.findTotalCount(sql, objects);
if (count > 0) { //有则继续操作
//删除stupunchin中的该信息
if (count > 0) { //如果查询结果中存在记录(即 count 大于 0则继续执行删除操作。
//构建一个 SQL 删除语句,从 stupunchin 表中删除指定学号和考勤日期的记录。调用 DeptAdminDao.executeUpdate 方法执行删除操作,并输出受影响的行数 num1以确认是否成功删除。
sql = "delete from stupunchin where sno = ? and spunchdate = ?";
int num1 = DeptAdminDao.executeUpdate(sql, objects);
System.out.println(num1);
//如果删除成功,使用 RequestDispatcher 将请求转发到 /DeptQueryStuPunchByPageServlet并传递一些分页和查询参数如当前页、每页行数、学生姓名、班级、考勤日期等。这将使用户看到更新后的学生考勤记录列表。
req.getRequestDispatcher("/DeptQueryStuPunchByPageServlet?currentPage=1&rows=7&sname=&sclass=&spunchdate=").forward(req, resp);
}else {
req.getRequestDispatcher("/view/alluse/noexistdataofdelete.jsp").forward(req, resp);
req.getRequestDispatcher("/view/alluse/noexistdataofdelete.jsp").forward(req, resp);//如果查询结果中没有找到该记录(即 count 为 0则表示该学号和考勤日期的记录不存在使用 RequestDispatcher 转发请求到一个页面noexistdataofdelete.jsp提示用户该数据不存在。
}
}
}//重写 doPost 方法。因为该 Servlet 处理删除操作时是基于 GET 请求的,所以 doPost 方法直接调用 doGet 方法,这样无论是 GET 请求还是 POST 请求都会执行相同的逻辑。2121212
//重写 doPost 方法。因为该 Servlet 处理删除操作时是基于 GET 请求的,所以 doPost 方法直接调用 doGet 方法,这样无论是 GET 请求还是 POST 请求都会执行相同的逻辑。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);

@ -1,67 +1,106 @@
package com.controller.deptadmin;
// 声明该类所在的包名为 com.controller.deptadmin用于组织和管理代码结构
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类可能包含与数据库交互的方法
import javax.servlet.ServletException;
// 导入 Servlet 异常类,用于处理 Servlet 操作过程中可能出现的异常
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,用于将该类标记为一个 Servlet 并指定其访问路径
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,这是所有 Servlet 类的基类,用于处理 HTTP 请求
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息
import javax.servlet.http.HttpSession;
// 导入 HttpSession 类,用于管理用户会话,存储用户相关的信息
import java.io.IOException;
// 导入 IOException 类,用于处理输入输出操作过程中可能出现的异常
@WebServlet("/DeptDeleteStuPunchServlet1")
// 使用 WebServlet 注解将该类标记为一个 Servlet并指定其访问路径为 /DeptDeleteStuPunchServlet1
public class DeptDeleteStuPunchServlet1 extends HttpServlet {
// 定义一个名为 DeptDeleteStuPunchServlet1 的类,继承自 HttpServlet 类,使其成为一个 Servlet
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,用于处理客户端发送的 GET 请求
req.setCharacterEncoding("utf-8");
// 设置请求的字符编码为 UTF-8确保能够正确处理中文等字符
resp.setCharacterEncoding("utf-8");
// 设置响应的字符编码为 UTF-8确保返回给客户端的内容能够正确显示中文等字符
resp.setContentType("text/html;charset=utf-8");
// 设置响应的内容类型为 text/html并指定字符编码为 UTF-8
//获取请求参数
String sno = req.getParameter("sno");
// 从请求中获取名为 "sno" 的参数值,并将其赋值给字符串变量 sno
String spunchdate = req.getParameter("spunchdate");
// 从请求中获取名为 "spunchdate" 的参数值,并将其赋值给字符串变量 spunchdate
System.out.println(sno);
// 在控制台打印 sno 的值,用于调试
System.out.println(spunchdate);
// 在控制台打印 spunchdate 的值,用于调试
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则创建一个新的会话
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本用于从会话中获取名为 "userName" 的属性值
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本用于从会话中获取名为 "sno" 的属性值
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其赋值给字符串变量 belong
//字符串转为日期类型
// Date spunchdate1 = new Date(spunchdate);
// 注释掉的代码,原本用于将 spunchdate 字符串转换为 Date 类型
//或
// SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
// Date spunchdate1 = ft.format(spunchdate);
// 注释掉的代码,原本用于使用 SimpleDateFormat 将 spunchdate 字符串按照 "yyyy-MM-dd" 格式转换为 Date 类型
String sql = null;
// 声明一个字符串变量 sql用于存储 SQL 语句,初始值为 null
Object[] objects = {sno, spunchdate, belong};
// 创建一个 Object 类型的数组 objects用于存储 SQL 语句中的参数值
//查询是否存在此人
sql = "select count(*) as num from student s,stupunchin sp where s.sno = sp.sno and s.sno = ? and sp.spunchdate = ? and s.sdept = ?";
// 定义一个 SQL 查询语句,用于查询满足条件的记录数量
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,执行 SQL 查询并返回满足条件的记录数量
Object[] objects1 = {sno, spunchdate};
// 创建一个新的 Object 类型的数组 objects1用于存储删除操作的 SQL 语句中的参数值
if (count > 0) { //有则继续操作
// 如果查询结果的记录数量大于 0说明存在满足条件的记录
//删除stupunchin中的该信息
sql = "delete from stupunchin where sno = ? and spunchdate = ?";
// 定义一个 SQL 删除语句,用于删除 stupunchin 表中满足条件的记录
int num1 = DeptAdminDao.executeUpdate(sql, objects1);
// 调用 DeptAdminDao 类的 executeUpdate 方法,执行 SQL 删除操作并返回受影响的记录数量
System.out.println(num1);
// 在控制台打印受影响的记录数量,用于调试
req.getRequestDispatcher("/DeptQueryStuPunchByPageServlet?currentPage=1&rows=7&sname=&sclass=&spunchdate=").forward(req, resp);
// 将请求转发到 /DeptQueryStuPunchByPageServlet 页面,并传递相应的参数
}else {
req.getRequestDispatcher("/view/alluse/noexistdataofdelete.jsp").forward(req, resp);
// 如果查询结果的记录数量为 0说明不存在满足条件的记录将请求转发到 /view/alluse/noexistdataofdelete.jsp 页面
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,用于处理客户端发送的 POST 请求
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即 POST 请求和 GET 请求的处理逻辑相同
}
}
}

@ -1,59 +1,115 @@
package com.controller.deptadmin;
// 声明该类所属的包名为 com.controller.deptadmin包名通常用于组织和管理代码避免命名冲突
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,这个类可能包含了与数据库交互的方法,如查询、插入、更新和删除等操作
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 类,这个类一般用于封装 JDBCJava Database Connectivity操作如数据库连接的获取和关闭等
import javax.servlet.ServletException;
// 导入 Servlet 异常类,用于处理 Servlet 操作过程中可能出现的异常情况
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,用于将当前类标记为一个 Servlet并指定其访问路径
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,用于处理 HTTP 请求
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,包括请求参数、请求头、请求方法等
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,包括响应状态码、响应头、响应体等
import java.io.IOException;
// 导入输入输出异常类,用于处理在输入输出操作(如文件读写、网络传输等)过程中可能出现的异常
import java.sql.ResultSet;
// 导入 ResultSet 类,它用于表示数据库查询结果集,可通过它遍历查询结果中的每一行数据
import java.sql.SQLException;
// 导入 SQL 异常类,用于处理与数据库交互过程中可能出现的 SQL 相关异常
import java.util.ArrayList;
// 导入 ArrayList 类,它是 Java 集合框架中的一种动态数组,可用于存储和操作一组对象
import java.util.Iterator;
// 导入 Iterator 接口,它提供了一种遍历集合元素的方式
@WebServlet("/DeptDeleteStuServlet")
// 使用 WebServlet 注解将该类标记为一个 Servlet并指定其访问路径为 /DeptDeleteStuServlet客户端可以通过该路径访问这个 Servlet
public class DeptDeleteStuServlet extends HttpServlet {
// 定义一个名为 DeptDeleteStuServlet 的类,继承自 HttpServlet 类,使其成为一个 Servlet
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,用于处理客户端发送的 HTTP GET 请求
req.setCharacterEncoding("utf-8");
// 设置请求的字符编码为 UTF-8确保能够正确处理包含中文等特殊字符的请求参数
resp.setCharacterEncoding("utf-8");
// 设置响应的字符编码为 UTF-8确保返回给客户端的内容能够正确显示中文等特殊字符
resp.setContentType("text/html;charset=utf-8");
// 设置响应的内容类型为 text/html并指定字符编码为 UTF-8告诉客户端返回的是 HTML 格式的内容
String sno = req.getParameter("sno");
// 从 HTTP 请求中获取名为 "sno" 的参数值,并将其赋值给字符串变量 snosno 可能代表学生编号
System.out.println(sno);
// 在控制台打印 sno 的值,用于调试目的
String sql = null;
// 声明一个字符串变量 sql用于存储 SQL 语句,初始值为 null
Object[] objects = {sno};
// 创建一个 Object 类型的数组 objects将 sno 作为唯一元素存储在数组中,这个数组将用于 SQL 语句的参数绑定
//查询是否存在此人
sql = "select count(*) as num from student where sno = ?";
// 定义一个 SQL 查询语句,用于查询 student 表中 sno 等于传入参数的记录数量,使用占位符 ? 表示参数
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,执行上述 SQL 查询,并将查询结果(记录数量)赋值给整数变量 count
if (count > 0) { //有则继续操作
// 如果查询到的记录数量大于 0说明数据库中存在该学生的记录
//删除stupunchin中的该导游信息
sql = "delete from stupunchin where sno = ?";
// 定义一个 SQL 删除语句,用于删除 stupunchin 表中 sno 等于传入参数的记录
int num1 = DeptAdminDao.executeUpdate(sql, objects);
// 调用 DeptAdminDao 类的 executeUpdate 方法,执行上述 SQL 删除语句,并将受影响的记录数量赋值给整数变量 num1
System.out.println(num1);
// 在控制台打印受影响的记录数量,用于调试目的
//删除student表中该导游信息
sql = "delete from student where sno = ?";
// 定义一个 SQL 删除语句,用于删除 student 表中 sno 等于传入参数的记录
int num2 = DeptAdminDao.executeUpdate(sql, objects);
// 调用 DeptAdminDao 类的 executeUpdate 方法,执行上述 SQL 删除语句,并将受影响的记录数量赋值给整数变量 num2
System.out.println(num2);
// 在控制台打印受影响的记录数量,用于调试目的
req.getRequestDispatcher("/DeptQueryStuByPageServlet?currentPage=1&rows=7&sname=&sclass=&specialty=").forward(req, resp);
}else {
// 将请求转发到 /DeptQueryStuByPageServlet 页面,并传递相应的参数,用于重新查询学生信息并显示在页面上
} else {
req.getRequestDispatcher("/view/alluse/noexistdataofdelete.jsp").forward(req, resp);
// 如果查询到的记录数量为 0说明数据库中不存在该学生的记录将请求转发到 /view/alluse/noexistdataofdelete.jsp 页面,提示用户无数据可删除
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,用于处理客户端发送的 HTTP POST 请求
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同
}
}
}

@ -1,64 +1,121 @@
package com.controller.deptadmin;
// 声明该类所在的包,用于组织和管理代码,将相关功能的类放在同一个包中,方便维护和查找。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类通常包含与数据库交互的方法,比如查询、插入、更新和删除等操作。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 操作出现异常时会抛出该异常。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,用于将一个类标记为 Servlet 并指定其访问路径。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,用于处理 HTTP 请求。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,例如请求参数、请求头、请求方法等。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,例如响应状态码、响应头、响应体等。
import javax.servlet.http.HttpSession;
// 导入 HttpSession 类,用于管理用户会话,存储用户在一次会话期间的相关信息。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出操作(如文件读写、网络传输等)出现异常时会抛出该异常。
@WebServlet("/DeptDeleteStuServlet1")
// 使用 WebServlet 注解将该类标记为一个 Servlet并指定其访问路径为 /DeptDeleteStuServlet1客户端可以通过这个路径访问该 Servlet。
public class DeptDeleteStuServlet1 extends HttpServlet {
// 定义一个名为 DeptDeleteStuServlet1 的类,继承自 HttpServlet 类,使其成为一个 Servlet。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,用于处理客户端发送的 HTTP GET 请求。
req.setCharacterEncoding("utf-8");
// 设置请求的字符编码为 UTF-8确保能够正确处理包含中文等特殊字符的请求参数。
resp.setCharacterEncoding("utf-8");
// 设置响应的字符编码为 UTF-8确保返回给客户端的内容能够正确显示中文等特殊字符。
resp.setContentType("text/html;charset=utf-8");
// 设置响应的内容类型为 text/html并指定字符编码为 UTF-8告诉客户端返回的是 HTML 格式的内容。
String sno = req.getParameter("sno");
// 从 HTTP 请求中获取名为 "sno" 的参数值,并将其赋值给字符串变量 sno通常 "sno" 可能代表学生编号。
System.out.println(sno);
// 在控制台打印 sno 的值,用于调试目的,方便开发人员查看接收到的参数。
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话。
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本用于从会话中获取名为 "userName" 的属性值。
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本用于从会话中获取名为 "sno" 的属性值,这里注释掉避免与前面已定义的 sno 变量冲突。
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其赋值给字符串变量 belong通常 "belong" 可能代表学生所属的部门。
System.out.println(belong);
// 在控制台打印 belong 的值,用于调试目的,方便开发人员查看从会话中获取的部门信息。
String sql = null;
// 声明一个字符串变量 sql用于存储 SQL 语句,初始值为 null。
Object[] objects = {sno, belong};
// 创建一个 Object 类型的数组 objects将 sno 和 belong 作为元素存储在数组中,这个数组将用于 SQL 语句的参数绑定。
//查询是否存在此人
sql = "select count(*) as num from student where sno = ? and sdept = ?";
// 定义一个 SQL 查询语句,用于查询 student 表中学生编号为 sno 且所属部门为 belong 的记录数量,使用占位符 ? 表示参数。
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,执行上述 SQL 查询,并将查询结果(记录数量)赋值给整数变量 count。
Object[] objects1 = {sno};
// 创建一个新的 Object 类型的数组 objects1只包含 sno 作为元素,用于后续删除操作的 SQL 语句参数绑定。
if (count > 0) { //有则继续操作
// 如果查询到的记录数量大于 0说明数据库中存在符合条件的学生记录。
//删除stupunchin中的该导游信息
sql = "delete from stupunchin where sno = ?";
// 定义一个 SQL 删除语句,用于删除 stupunchin 表中学生编号为 sno 的记录。
int num1 = DeptAdminDao.executeUpdate(sql, objects1);
// 调用 DeptAdminDao 类的 executeUpdate 方法,执行上述 SQL 删除语句,并将受影响的记录数量赋值给整数变量 num1。
System.out.println(num1);
// 在控制台打印受影响的记录数量,用于调试目的,方便开发人员查看删除操作的结果。
//删除student表中该导游信息
sql = "delete from student where sno = ?";
// 定义一个 SQL 删除语句,用于删除 student 表中学生编号为 sno 的记录。
int num2 = DeptAdminDao.executeUpdate(sql, objects1);
// 调用 DeptAdminDao 类的 executeUpdate 方法,执行上述 SQL 删除语句,并将受影响的记录数量赋值给整数变量 num2。
System.out.println(num2);
// 在控制台打印受影响的记录数量,用于调试目的,方便开发人员查看删除操作的结果。
req.getRequestDispatcher("/DeptQueryStuByPageServlet?currentPage=1&rows=7&sname=&sclass=&specialty=").forward(req, resp);
}else {
// 将请求转发到 /DeptQueryStuByPageServlet 页面,并传递相应的参数,用于重新查询学生信息并显示在页面上,实现页面刷新。
} else {
req.getRequestDispatcher("/view/alluse/noexistdataofdelete.jsp").forward(req, resp);
// 如果查询到的记录数量为 0说明数据库中不存在符合条件的学生记录将请求转发到 /view/alluse/noexistdataofdelete.jsp 页面,提示用户无数据可删除。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,用于处理客户端发送的 HTTP POST 请求。
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同。
}
}
}

@ -1,64 +1,113 @@
package com.controller.deptadmin;
// 声明该类所属的包名为 com.controller.deptadmin包用于组织和管理代码使代码结构更清晰便于维护和查找相关类。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类一般封装了与数据库交互的方法,如执行查询、更新、删除等操作,方便在本 Servlet 中进行数据库操作。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 操作过程中出现异常时,会抛出该异常,以便进行异常处理。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,用于将当前类标记为一个 Servlet并指定其访问路径方便客户端通过该路径访问此 Servlet。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本功能和方法。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,包括请求参数、请求头、请求方法等,方便在 Servlet 中获取和处理这些信息。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,如响应状态码、响应头、响应体等,可对响应内容进行设置和输出。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出操作(如网络传输、文件读写等)出现异常时会抛出该异常,以便进行相应处理。
@WebServlet("/DeptDeleteTeaPunchServlet")
// 使用 WebServlet 注解将该类标记为一个 Servlet并指定其访问路径为 /DeptDeleteTeaPunchServlet客户端可通过此路径访问该 Servlet 来执行相应功能。
public class DeptDeleteTeaPunchServlet extends HttpServlet {
// 定义一个名为 DeptDeleteTeaPunchServlet 的类,继承自 HttpServlet 类,使其成为一个 Servlet可处理 HTTP 请求。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,用于处理客户端发送的 HTTP GET 请求。该方法接收 HttpServletRequest 和 HttpServletResponse 对象作为参数,同时可能抛出 ServletException 和 IOException 异常。
req.setCharacterEncoding("utf-8");
// 设置请求的字符编码为 UTF - 8确保能够正确处理包含中文等特殊字符的请求参数。
resp.setCharacterEncoding("utf-8");
// 设置响应的字符编码为 UTF - 8保证返回给客户端的内容能正确显示中文等特殊字符。
resp.setContentType("text/html;charset=utf-8");
// 设置响应的内容类型为 text/html并指定字符编码为 UTF - 8告知客户端返回的是 HTML 格式的内容。
//获取请求参数
String tnodate = req.getParameter("tnodate");
// 从 HTTP 请求中获取名为 "tnodate" 的参数值,并将其赋值给字符串变量 tnodate。该参数可能包含教师编号和打卡日期且两者以逗号分隔。
System.out.println(tnodate);
// 在控制台打印 tnodate 的值,用于调试,方便开发人员查看接收到的参数内容。
//分离两个参数,用日期和学号来删除
String[] params = tnodate.split(",");
// 使用 split 方法将 tnodate 字符串按逗号分隔成一个字符串数组 params方便后续分别获取教师编号和打卡日期。
String tno = params[0];
// 将数组 params 的第一个元素赋值给字符串变量 tno代表教师编号。
String tpunchdate = params[1];
// 将数组 params 的第二个元素赋值给字符串变量 tpunchdate代表教师的打卡日期。
System.out.println(tno);
System.out.println(tpunchdate);
// 在控制台分别打印 tno 和 tpunchdate 的值,用于调试,方便开发人员确认分离后的参数是否正确。
//字符串转为日期类型
// Date spunchdate1 = new Date(spunchdate);
// 注释掉的代码,原本用于将字符串类型的日期转换为 Date 类型,但此处未实际使用。
//或
// SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
// Date spunchdate1 = ft.format(spunchdate);
// 注释掉的代码,提供了另一种将字符串按 "yyyy - MM - dd" 格式转换为 Date 类型的方式,同样未在当前代码中使用。
String sql = null;
// 声明一个字符串变量 sql用于存储 SQL 语句,初始值设为 null。
Object[] objects = {tno, tpunchdate};
// 创建一个 Object 类型的数组 objects将 tno 和 tpunchdate 作为元素存储在数组中,后续用于 SQL 语句的参数绑定。
//查询是否存在此人
sql = "select count(*) as num from teapunchin where tno = ? and tpunchdate = ?";
// 定义一个 SQL 查询语句,用于查询 teapunchin 表中教师编号为 tno 且打卡日期为 tpunchdate 的记录数量,使用占位符 ? 表示参数。
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,执行上述 SQL 查询语句,并将查询结果(符合条件的记录数量)赋值给整数变量 count。
if (count > 0) { //有则继续操作
// 如果查询到的记录数量大于 0说明数据库中存在该教师在指定日期的打卡记录。
//删除stupunchin中的该信息
sql = "delete from teapunchin where tno = ? and tpunchdate = ?";
// 定义一个 SQL 删除语句,用于删除 teapunchin 表中教师编号为 tno 且打卡日期为 tpunchdate 的记录。
int num1 = DeptAdminDao.executeUpdate(sql, objects);
// 调用 DeptAdminDao 类的 executeUpdate 方法,执行上述 SQL 删除语句,并将受影响的记录数量赋值给整数变量 num1。
System.out.println(num1);
// 在控制台打印受影响的记录数量,用于调试,方便开发人员确认删除操作是否成功以及删除的记录数量。
req.getRequestDispatcher("/DeptQueryTeaPunchByPageServlet?currentPage=1&rows=7&tno=&tname=&tpunchdate=").forward(req, resp);
}else {
// 将请求转发到 /DeptQueryTeaPunchByPageServlet 页面,并传递相应的参数,用于重新查询教师打卡信息并显示在页面上,实现页面刷新。
} else {
req.getRequestDispatcher("/view/alluse/noexistdataofdelete.jsp").forward(req, resp);
// 如果查询到的记录数量为 0说明数据库中不存在该教师在指定日期的打卡记录将请求转发到 /view/alluse/noexistdataofdelete.jsp 页面,提示用户无数据可删除。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,用于处理客户端发送的 HTTP POST 请求。
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同。
}
}
}

@ -1,67 +1,124 @@
package com.controller.deptadmin;
// 声明该类所在的包为 com.controller.deptadmin用于对代码进行组织和管理方便维护和查找相关类
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类通常包含与数据库交互的方法,如执行 SQL 查询、插入、更新、删除等操作
import javax.servlet.ServletException;
// 导入 Servlet 异常类,用于处理在 Servlet 操作过程中可能出现的异常情况
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,用于将当前类标记为一个 Servlet并指定其访问路径
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本方法和结构
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,例如请求参数、请求头、请求方法等
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,包括响应状态码、响应头、响应体等
import javax.servlet.http.HttpSession;
// 导入 HttpSession 类,用于管理用户会话,存储用户在会话期间的相关信息,如登录状态、用户信息等
import java.io.IOException;
// 导入输入输出异常类,用于处理在输入输出操作(如文件读写、网络传输等)过程中可能出现的异常情况
@WebServlet("/DeptDeleteTeaPunchServlet1")
// 使用 WebServlet 注解将该类标记为一个 Servlet并指定其访问路径为 /DeptDeleteTeaPunchServlet1客户端可以通过这个路径访问该 Servlet
public class DeptDeleteTeaPunchServlet1 extends HttpServlet {
// 定义一个名为 DeptDeleteTeaPunchServlet1 的类,继承自 HttpServlet 类,使其成为一个能够处理 HTTP 请求的 Servlet
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,用于处理客户端发送的 HTTP GET 请求
req.setCharacterEncoding("utf-8");
// 设置请求的字符编码为 UTF-8确保能够正确处理包含中文等特殊字符的请求参数
resp.setCharacterEncoding("utf-8");
// 设置响应的字符编码为 UTF-8保证返回给客户端的内容能够正确显示中文等特殊字符
resp.setContentType("text/html;charset=utf-8");
// 设置响应的内容类型为 text/html并指定字符编码为 UTF-8告知客户端返回的是 HTML 格式的内容
//获取请求参数
String tno = req.getParameter("tno");
// 从 HTTP 请求中获取名为 "tno" 的参数值,并将其赋值给字符串变量 tno这里 tno 可能代表教师编号
String tpunchdate = req.getParameter("tpunchdate");
// 从 HTTP 请求中获取名为 "tpunchdate" 的参数值,并将其赋值给字符串变量 tpunchdate这里 tpunchdate 可能代表教师打卡日期
System.out.println(tno);
// 在控制台打印 tno 的值,用于调试,方便开发人员查看接收到的教师编号参数
System.out.println(tpunchdate);
// 在控制台打印 tpunchdate 的值,用于调试,方便开发人员查看接收到的教师打卡日期参数
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本用于从会话中获取名为 "userName" 的属性值,这里未使用
// String sno = (String) session.getAttribute("sno");
String belong = (String) session.getAttribute("belong");
// 注释掉的代码,原本用于从会话中获取名为 "sno" 的属性值,这里未使用,且可能与其他变量重复定义有冲突
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其赋值给字符串变量 belong这里 belong 可能代表所属部门等信息
//字符串转为日期类型
// Date spunchdate1 = new Date(spunchdate);
// 注释掉的代码,原本用于将字符串类型的日期转换为 Date 类型,但此处未实际使用
//或
// SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
// Date spunchdate1 = ft.format(spunchdate);
// 注释掉的代码,提供了另一种将字符串按 "yyyy-MM-dd" 格式转换为 Date 类型的方式,同样未在当前代码中使用
String sql = null;
// 声明一个字符串变量 sql用于存储 SQL 语句,初始值设为 null
Object[] objects = {tno, tpunchdate, belong};
// 创建一个 Object 类型的数组 objects将 tno、tpunchdate 和 belong 作为元素存储在数组中,用于后续 SQL 语句的参数绑定
//查询是否存在此人
sql = "select count(*) as num from teacher t,teapunchin tp where t.tno = tp.tno and tp.tno = ? and tp.tpunchdate = ? and t.tdept = ?";
// 定义一个 SQL 查询语句,用于查询 teacher 表和 teapunchin 表中符合条件(教师编号、打卡日期和所属部门)的记录数量,使用占位符? 表示参数
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,执行上述 SQL 查询语句,并将查询结果(符合条件的记录数量)赋值给整数变量 count
Object[] objects1 = {tno, tpunchdate};
// 创建一个新的 Object 类型的数组 objects1只包含 tno 和 tpunchdate 作为元素,用于后续删除操作的 SQL 语句参数绑定
if (count > 0) { //有则继续操作
// 如果查询到的记录数量大于 0说明数据库中存在符合条件的教师打卡记录
//删除stupunchin中的该信息
sql = "delete from teapunchin where tno = ? and tpunchdate = ?";
// 定义一个 SQL 删除语句,用于删除 teapunchin 表中教师编号为 tno 且打卡日期为 tpunchdate 的记录
int num1 = DeptAdminDao.executeUpdate(sql, objects1);
// 调用 DeptAdminDao 类的 executeUpdate 方法,执行上述 SQL 删除语句,并将受影响的记录数量赋值给整数变量 num1
System.out.println(num1);
// 在控制台打印受影响的记录数量,用于调试,方便开发人员确认删除操作是否成功以及删除的记录数量
req.getRequestDispatcher("/DeptQueryTeaPunchByPageServlet?currentPage=1&rows=7&tno=&tname=&tpunchdate=").forward(req, resp);
}else {
// 将请求转发到 /DeptQueryTeaPunchByPageServlet 页面,并传递相应的参数,用于重新查询教师打卡信息并显示在页面上,实现页面刷新
} else {
req.getRequestDispatcher("/view/alluse/noexistdataofdelete.jsp").forward(req, resp);
// 如果查询到的记录数量为 0说明数据库中不存在符合条件的教师打卡记录将请求转发到 /view/alluse/noexistdataofdelete.jsp 页面,提示用户无数据可删除
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,用于处理客户端发送的 HTTP POST 请求
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同
}
}
}

@ -1,54 +1,122 @@
package com.controller.deptadmin;
// 声明该类所在的包为 com.controller.deptadmin包是 Java 中组织代码的一种方式,
// 可以将相关的类放在同一个包下,便于管理和维护,避免命名冲突。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类通常封装了与数据库交互的方法,
// 如查询、插入、更新和删除等操作,在本 Servlet 中会使用这些方法来操作数据库。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在执行过程中出现异常时,会抛出该异常,
// 用于统一处理 Servlet 相关的异常情况。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,这是 Java Servlet 3.0 引入的注解,
// 用于将一个普通的 Java 类标记为 Servlet并指定其访问路径。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,
// 提供了处理 HTTP 请求的基本方法和结构,我们的类继承它以实现 Servlet 功能。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等,方便在 Servlet 中获取和处理这些信息。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等,可以对响应进行设置和输出。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出操作(如网络传输、文件读写等)时,
// 可能会出现异常,使用该类进行异常处理。
@WebServlet("/DeptDeleteTeaServlet")
// 使用 WebServlet 注解将该类标记为一个 Servlet并指定其访问路径为 /DeptDeleteTeaServlet
// 客户端可以通过该路径向此 Servlet 发送请求。
public class DeptDeleteTeaServlet extends HttpServlet {
// 定义一个名为 DeptDeleteTeaServlet 的类,继承自 HttpServlet 类,
// 使其成为一个可以处理 HTTP 请求的 Servlet。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,用于处理客户端发送的 HTTP GET 请求。
// 该方法接收 HttpServletRequest 和 HttpServletResponse 对象作为参数,
// 并可能抛出 ServletException 和 IOException 异常。
req.setCharacterEncoding("utf-8");
// 设置请求的字符编码为 UTF-8确保能够正确处理包含中文等特殊字符的请求参数。
resp.setCharacterEncoding("utf-8");
// 设置响应的字符编码为 UTF-8保证返回给客户端的内容能正确显示中文等特殊字符。
resp.setContentType("text/html;charset=utf-8");
// 设置响应的内容类型为 text/html并指定字符编码为 UTF-8
// 告知客户端返回的是 HTML 格式的内容。
String tno = req.getParameter("tno");
// 从 HTTP 请求中获取名为 "tno" 的参数值,并将其赋值给字符串变量 tno
// 这里 tno 可能代表教师编号。
System.out.println(tno);
// 在控制台打印 tno 的值,用于调试,方便开发人员查看接收到的参数。
String sql = null;
// 声明一个字符串变量 sql用于存储 SQL 语句,初始值设为 null。
Object[] objects = {tno};
// 创建一个 Object 类型的数组 objects将 tno 作为唯一元素存储在数组中,
// 后续会将该数组作为参数传递给数据库操作方法。
//查询是否存在此人
// 查询是否存在此人
sql = "select count(*) as num from teacher where tno = ?";
// 定义一个 SQL 查询语句,用于查询 teacher 表中教师编号为 tno 的记录数量,
// 使用占位符 ? 表示参数,可防止 SQL 注入。
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,执行上述 SQL 查询语句,
// 并将查询结果(符合条件的记录数量)赋值给整数变量 count。
if (count > 0) { // 有则继续操作
// 如果查询到的记录数量大于 0说明数据库中存在该教师的记录。
if (count > 0) { //有则继续操作
//删除stupunchin中的该导游信息
// 删除 teapunchin 中的该教师信息
sql = "delete from teapunchin where tno = ?";
// 定义一个 SQL 删除语句,用于删除 teapunchin 表中教师编号为 tno 的记录。
int num1 = DeptAdminDao.executeUpdate(sql, objects);
// 调用 DeptAdminDao 类的 executeUpdate 方法,执行上述 SQL 删除语句,
// 并将受影响的记录数量赋值给整数变量 num1。
System.out.println(num1);
// 在控制台打印受影响的记录数量,用于调试,查看删除操作是否成功。
//删除student表中该导游信息
// 删除 teacher 表中该教师信息
sql = "delete from teacher where tno = ?";
// 定义一个 SQL 删除语句,用于删除 teacher 表中教师编号为 tno 的记录。
int num2 = DeptAdminDao.executeUpdate(sql, objects);
// 调用 DeptAdminDao 类的 executeUpdate 方法,执行上述 SQL 删除语句,
// 并将受影响的记录数量赋值给整数变量 num2。
System.out.println(num2);
// 在控制台打印受影响的记录数量,用于调试,查看删除操作是否成功。
req.getRequestDispatcher("/DeptQueryTeaByPageServlet?currentPage=1&rows=7&tno=&tname=&tsex=").forward(req, resp);
}else {
// 将请求转发到 /DeptQueryTeaByPageServlet 页面,并传递相应的参数,
// 用于重新查询教师信息并显示在页面上,实现页面刷新。
} else {
req.getRequestDispatcher("/view/alluse/noexistdataofdelete.jsp").forward(req, resp);
// 如果查询到的记录数量为 0说明数据库中不存在该教师的记录
// 将请求转发到 /view/alluse/noexistdataofdelete.jsp 页面,提示用户无数据可删除。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,用于处理客户端发送的 HTTP POST 请求。
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同。
}
}
}

@ -1,65 +1,170 @@
package com.controller.deptadmin;
// 声明该类所在的包为 com.controller.deptadmin包用于对相关类进行组织和管理方便代码的维护和查找
// 同时避免不同类之间的命名冲突,有助于构建清晰的项目结构。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,这个类通常封装了与数据库交互的操作方法,
// 比如执行 SQL 查询语句、插入数据、更新数据以及删除数据等功能,后续代码会使用这些方法来操作数据库。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在运行过程中出现错误或异常情况时,
// 如请求处理失败、资源加载错误等,会抛出 ServletException 异常,以便进行相应的异常处理。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,这是用于将一个普通的 Java 类标记为 Servlet 的注解,
// 通过该注解可以指定 Servlet 的访问路径,方便客户端通过 URL 来访问该 Servlet。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本框架和方法,
// 我们定义的 Servlet 类需要继承 HttpServlet 类才能具备处理 HTTP 请求的能力。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,它用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等内容Servlet 可以通过该类获取客户端的请求数据。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,它用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等Servlet 可以通过该类设置并返回响应数据给客户端。
import javax.servlet.http.HttpSession;
// 导入 HttpSession 类,用于管理用户的会话状态,能够在用户的多次请求之间存储和共享数据,
// 例如用户的登录信息、购物车内容等。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出操作(如文件读写、网络传输等)时,如果出现错误,
// 会抛出 IOException 异常,以便进行异常处理和错误恢复。
@WebServlet("/DeptDeleteTeaServlet1")
// 使用 WebServlet 注解将 DeptDeleteTeaServlet1 类标记为一个 Servlet
// 并指定其访问路径为 /DeptDeleteTeaServlet1客户端可以通过这个路径向该 Servlet 发送请求。
public class DeptDeleteTeaServlet1 extends HttpServlet {
// 定义一个名为 DeptDeleteTeaServlet1 的类,继承自 HttpServlet 类,
// 使其成为一个可以处理 HTTP 请求的 Servlet能够响应客户端的 GET 和 POST 请求。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,该方法用于处理客户端发送的 HTTP GET 请求。
// 方法接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并可能抛出 ServletException 和 IOException 异常,以处理请求过程中可能出现的错误。
req.setCharacterEncoding("utf-8");
// 设置请求的字符编码为 UTF-8确保能够正确处理包含中文等特殊字符的请求参数
// 避免出现乱码问题,保证请求数据的正确解析。
resp.setCharacterEncoding("utf-8");
// 设置响应的字符编码为 UTF-8保证返回给客户端的内容能够正确显示中文等特殊字符
// 确保响应数据的正确呈现。
resp.setContentType("text/html;charset=utf-8");
// 设置响应的内容类型为 text/html并指定字符编码为 UTF-8
// 告知客户端返回的是 HTML 格式的内容,以便客户端正确解析和显示响应。
String tno = req.getParameter("tno");
// 从 HTTP 请求中获取名为 "tno" 的参数值,并将其赋值给字符串变量 tno
// 这里的 tno 可能代表教师的编号,用于后续的数据库操作和业务逻辑处理。
System.out.println(tno);
// 在控制台打印 tno 的值,用于调试目的,方便开发人员查看接收到的教师编号参数是否正确,
// 以便及时发现和解决问题。
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话。
// 通过会话对象可以存储和获取用户在会话期间的相关信息,如用户的登录状态、权限等。
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本用于从会话中获取名为 "userName" 的属性值,
// 但在当前代码中未被使用,可能是根据实际需求进行了调整或暂时不需要该功能。
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本用于从会话中获取名为 "sno" 的属性值,
// 同样在当前代码中未被使用,可能是后续功能的预留或不再需要该属性值。
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其赋值给字符串变量 belong
// 这里的 belong 可能代表教师所属的部门等信息,用于后续的数据库查询条件。
System.out.println(belong);
// 在控制台打印 belong 的值,用于调试目的,方便开发人员查看从会话中获取的部门信息是否正确,
// 帮助进行问题排查和代码调试。
String sql = null;
// 声明一个字符串变量 sql用于存储 SQL 语句,初始值设为 null
// 后续会根据业务需求动态构建和赋值 SQL 语句。
Object[] objects = {tno, belong};
// 创建一个 Object 类型的数组 objects将 tno 和 belong 作为元素存储在数组中,
// 这个数组将作为参数传递给数据库操作方法,用于绑定 SQL 语句中的占位符。
//查询是否存在此人
sql = "select count(*) as num from teacher where tno = ? and tdept = ?";
// 定义一个 SQL 查询语句,用于查询 teacher 表中教师编号为 tno 且所属部门为 belong通过 tdept 字段匹配)的记录数量。
// 使用占位符 ? 表示参数,这种方式可以提高 SQL 语句的安全性,防止 SQL 注入攻击。
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,执行上述 SQL 查询语句,
// 并将查询结果(符合条件的记录数量)赋值给整数变量 count
// 用于判断数据库中是否存在符合条件的教师记录。
Object[] objects1 = {tno};
// 创建一个新的 Object 类型的数组 objects1只包含 tno 作为元素,
// 这个数组将用于后续的删除操作,作为 SQL 语句的参数。
if (count > 0) { //有则继续操作
//删除stupunchin中的该导游信息
// 如果查询到的记录数量 count 大于 0说明数据库中存在符合条件的教师记录
// 可以继续进行后续的删除操作。
//删除teapunchin中的该导游信息
sql = "delete from teapunchin where tno = ?";
// 定义一个 SQL 删除语句,用于删除 teapunchin 表中教师编号为 tno 的记录,
// 这里的 tno 作为删除条件,指定要删除的具体记录。
int num1 = DeptAdminDao.executeUpdate(sql, objects1);
// 调用 DeptAdminDao 类的 executeUpdate 方法,执行上述 SQL 删除语句,
// 并将受影响的记录数量赋值给整数变量 num1
// 用于判断删除操作是否成功以及影响的记录数量。
System.out.println(num1);
// 在控制台打印受影响的记录数量 num1用于调试目的
// 方便开发人员查看删除 teapunchin 表中记录的操作是否成功,
// 以及确认删除的记录数量是否符合预期。
//删除student表中该导游信息
//删除teacher表中该导游信息
sql = "delete from teacher where tno = ?";
// 定义一个 SQL 删除语句,用于删除 teacher 表中教师编号为 tno 的记录,
// 同样以 tno 作为删除条件,将该教师的记录从 teacher 表中移除。
int num2 = DeptAdminDao.executeUpdate(sql, objects1);
// 调用 DeptAdminDao 类的 executeUpdate 方法,执行上述 SQL 删除语句,
// 并将受影响的记录数量赋值给整数变量 num2
// 用于判断删除 teacher 表中记录的操作是否成功。
System.out.println(num2);
// 在控制台打印受影响的记录数量 num2用于调试目的
// 方便开发人员查看删除 teacher 表中记录的操作是否成功,
// 以及确认删除的记录数量是否符合预期。
req.getRequestDispatcher("/DeptQueryTeaByPageServlet?currentPage=1&rows=7&tno=&tname=&tsex=").forward(req, resp);
}else {
// 将请求转发到 /DeptQueryTeaByPageServlet 页面,并传递相应的参数,
// 当前页码 currentPage 为 1每页显示行数 rows 为 7教师编号 tno、教师姓名 tname、教师性别 tsex 为空。
// 这样在删除操作完成后,会跳转到查询教师信息的页面,展示更新后的教师列表。
} else {
req.getRequestDispatcher("/view/alluse/noexistdataofdelete.jsp").forward(req, resp);
// 如果查询到的记录数量 count 不大于 0即数据库中不存在符合条件的教师记录
// 则将请求转发到 /view/alluse/noexistdataofdelete.jsp 页面,
// 该页面用于提示用户没有可删除的数据,给用户一个明确的反馈。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,该方法用于处理客户端发送的 HTTP POST 请求。
// 方法接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并可能抛出 ServletException 和 IOException 异常,以处理请求过程中可能出现的错误。
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同,
// 这样可以避免重复编写相似的代码,提高代码的复用性和可维护性。
}
}
}

@ -1,70 +1,196 @@
package com.controller.deptadmin;
// 声明该类所属的包为 com.controller.deptadmin包机制用于对相关类进行组织管理
// 便于代码的维护和查找,避免类名冲突,同时也有助于构建清晰的项目结构,
// 使得同一包下的类在逻辑上具有相关性。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类通常封装了与数据库交互的各种操作方法,
// 例如执行 SQL 查询语句(如 select、插入数据insert、更新数据update以及删除数据delete等操作。
// 在后续代码中,会使用该类的方法来实现对数据库中数据的查询和修改等功能。
import com.entity.Student;
// 导入自定义的 Student 实体类,该类用于封装学生的相关信息,
// 例如学生编号sno、学生姓名sname、性别ssex等。
// 在本 Servlet 中,会通过从数据库查询到的数据来实例化 Student 对象,并将其传递到后续的页面。
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 工具类,一般来说,这个类会包含与 JDBCJava Database Connectivity
// 相关的通用工具方法,比如获取数据库连接、关闭数据库连接、处理结果集等操作,
// 以简化数据库操作的流程,提高代码的可维护性和复用性。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在运行过程中出现异常情况时,
// 例如请求处理失败、资源加载错误、内部逻辑错误等,会抛出 ServletException 异常,
// 以便进行相应的异常处理和错误恢复,确保系统的稳定性和可靠性。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,它是 Java EE 中用于将普通的 Java 类标记为 Servlet 的注解。
// 通过该注解可以方便地指定 Servlet 的访问路径,使得客户端能够通过特定的 URL 来访问该 Servlet
// 从而实现与服务器的交互。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本框架和方法。
// 我们定义的 Servlet 类需要继承 HttpServlet 类,从而获得处理 HTTP 请求的能力,
// 能够响应客户端发送的 GET 和 POST 请求。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等内容。Servlet 可以通过这个类获取客户端传递的各种数据,
// 以便根据这些数据进行相应的业务逻辑处理。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等。Servlet 可以利用这个类来设置并返回给客户端相应的响应数据,
// 以满足客户端的需求。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出相关的操作(如网络数据传输、文件读写等)时,
// 如果出现错误,就会抛出 IOException 异常,以便进行相应的错误处理,
// 保证系统在面对异常情况时能够做出合理的响应。
import java.sql.ResultSet;
// 导入 ResultSet 类,它用于表示数据库查询结果集。当执行 SQL 查询语句后,
// 数据库返回的数据会被封装在 ResultSet 对象中,通过它可以遍历和获取查询结果的每一行数据,
// 以便进行进一步的处理和分析。
@WebServlet("/DeptQueryStuByIdServlet")
// 使用 WebServlet 注解将 DeptQueryStuByIdServlet 类标记为一个 Servlet
// 并指定其访问路径为 /DeptQueryStuByIdServlet这样客户端就可以通过这个路径向该 Servlet 发送请求,
// 从而触发该 Servlet 中的业务逻辑处理。
public class DeptQueryStuByIdServlet extends HttpServlet {
// 定义一个名为 DeptQueryStuByIdServlet 的类,继承自 HttpServlet 类,
// 使其成为一个可以处理 HTTP 请求的 Servlet能够响应客户端发送的 GET 和 POST 请求,
// 并实现根据学生编号查询学生信息的功能。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,该方法专门用于处理客户端发送的 HTTP GET 请求。
// 它接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误情况。
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");
// 从 HTTP 请求中获取名为 "sno" 的参数值,并将其赋值给字符串变量 sno。
// 这里的 sno 代表学生编号,用于后续根据该编号查询学生的相关信息。
String sql = null;
// 声明一个字符串变量 sql用于存储即将执行的 SQL 语句,初始值设为 null
// 后续会根据业务逻辑动态地构建和赋值 SQL 语句。
Object[] objects = {sno};
// 创建一个 Object 类型的数组 objects将 sno 作为唯一元素存储在数组中,
// 这个数组将作为参数传递给数据库操作方法,用于绑定 SQL 语句中的占位符,
// 以提高 SQL 语句的安全性和灵活性。
//查询是否存在此人
sql = "select count(*) as num from student where sno = ?";
// 定义一个 SQL 查询语句,用于查询 student 表中学生编号为 sno 的记录数量。
// 使用占位符? 来提高 SQL 语句的安全性,防止 SQL 注入攻击,
// 并将查询结果的数量别名为 num。
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,执行上述 SQL 查询语句,
// 并将查询结果(符合条件的记录数量)赋值给整数变量 count
// 通过这个数量可以判断数据库中是否存在该学生的记录。
if (count > 0){ //有则继续操作
// 如果查询到的记录数量 count 大于 0说明数据库中存在该学生的记录
// 可以继续执行后续的查询和处理操作。
sql = "select * from student where sno = ?";
// 定义一个新的 SQL 查询语句,用于查询 student 表中学生编号为 sno 的所有字段信息。
// 同样使用占位符? 来确保 SQL 语句的安全性。
ResultSet resultSet = DeptAdminDao.qureyInfo(sql, objects);
// 调用 DeptAdminDao 类的 qureyInfo 方法,执行上述 SQL 查询语句,
// 并将查询结果存储在 ResultSet 对象 resultSet 中,以便后续遍历和处理。
Student student = new Student();
// 创建一个 Student 对象 student用于存储从数据库中查询到的学生信息。
try {
while (resultSet.next()){
// 遍历 ResultSet 对象,每次移动到下一行数据。
// 如果有数据resultSet.next() 返回 true则将当前行的数据赋值给 student 对象的相应属性。
student.setSno(resultSet.getString("sno"));
// 将查询结果中 "sno" 字段的值(学生编号)设置为 student 对象的 sno 属性。
student.setSname(resultSet.getString("sname"));
// 将查询结果中 "sname" 字段的值(学生姓名)设置为 student 对象的 sname 属性。
student.setSsex(resultSet.getString("ssex"));
// 将查询结果中 "ssex" 字段的值(学生性别)设置为 student 对象的 ssex 属性。
student.setSage(resultSet.getInt("sage"));
// 将查询结果中 "sage" 字段的值(学生年龄)设置为 student 对象的 sage 属性,
// 并将其转换为整数类型。
student.setSclass(resultSet.getString("sclass"));
// 将查询结果中 "sclass" 字段的值(学生班级)设置为 student 对象的 sclass 属性。
student.setSpecialty(resultSet.getString("specialty"));
// 将查询结果中 "specialty" 字段的值(学生专业)设置为 student 对象的 specialty 属性。
student.setSdept(resultSet.getString("sdept"));
// 将查询结果中 "sdept" 字段的值(学生所属系部)设置为 student 对象的 sdept 属性。
student.setSphone(resultSet.getString("sphone"));
// 将查询结果中 "sphone" 字段的值(学生电话号码)设置为 student 对象的 sphone 属性。
student.setSpsw(resultSet.getString("spsw"));
// 将查询结果中 "spsw" 字段的值(学生密码)设置为 student 对象的 spsw 属性。
}
} catch (Exception e) {
e.printStackTrace();
// 如果在遍历和设置属性的过程中出现异常,打印异常堆栈信息,
// 以便开发人员进行调试和错误排查。
}finally {
JDBCUtils.close(resultSet);
// 无论是否发生异常,都要关闭 ResultSet 对象,释放数据库资源,
// 调用 JDBCUtils 类的 close 方法来关闭 resultSet。
}
System.out.println(student.getSsex());
// 在控制台打印 student 对象的 ssex 属性值,用于调试目的,
// 方便开发人员查看查询到的学生性别信息是否正确。
req.setAttribute("student", student);
// 将 student 对象设置为请求的属性,键为 "student"
// 这样在后续的页面中可以通过这个键获取到 student 对象,从而展示学生信息。
req.getRequestDispatcher("/view/deptadmin/alterstu.jsp").forward(req, resp);
// 将请求转发到 /view/deptadmin/alterstu.jsp 页面,
// 并将包含学生信息的 student 对象传递到该页面,以便进行学生信息的修改操作。
}else {
req.getRequestDispatcher("/view/alluse/noexistdataofalter.jsp").forward(req, resp);
// 如果查询到的记录数量 count 不大于 0即数据库中不存在该学生的记录
// 将请求转发到 /view/alluse/noexistdataofalter.jsp 页面,
// 该页面用于提示用户没有可修改的数据,给用户一个明确的反馈。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,该方法用于处理客户端发送的 HTTP POST 请求。
// 它接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误情况。
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同,
// 这样可以避免重复编写相似的代码,提高代码的复用性和可维护性。
}
}
}

@ -1,79 +1,219 @@
package com.controller.deptadmin;
// 声明该类所在的包为 com.controller.deptadmin包用于对相关的类进行组织和管理
// 便于代码的维护和查找,避免类名冲突,在项目中有助于构建清晰的代码结构。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类通常封装了与数据库交互的操作方法,
// 例如执行 SQL 查询、插入、更新和删除等操作。后续代码会使用这些方法来操作数据库,
// 以实现根据学生编号查询学生信息的功能。
import com.entity.Student;
// 导入自定义的 Student 实体类,用于封装学生的各种信息,
// 如学生编号sno、姓名sname、性别ssex等。在后续代码中
// 将从数据库查询到的学生信息存储到 Student 对象中,并传递到其他页面。
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 工具类,一般包含与 JDBCJava Database Connectivity
// 相关的通用方法,如获取数据库连接、关闭连接、处理结果集等,
// 用于简化数据库操作流程,提高代码的可维护性和复用性。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在运行过程中出现异常情况时,
// 如请求处理失败、资源加载错误等,会抛出 ServletException 异常,
// 以便进行相应的异常处理和错误恢复。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,这是 Java EE 中用于将普通 Java 类标记为 Servlet 的注解。
// 通过该注解可以指定 Servlet 的访问路径,使得客户端能够通过特定的 URL 来访问该 Servlet
// 从而实现与服务器的交互。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本框架和方法。
// 我们定义的 Servlet 类继承 HttpServlet 类,从而获得处理 HTTP 请求的能力,
// 能够响应客户端发送的 GET 和 POST 请求。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等内容。Servlet 可以通过这个类获取客户端传递的数据,
// 以便根据这些数据进行相应的业务逻辑处理。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等。Servlet 可以利用这个类来设置并返回给客户端相应的响应数据,
// 以满足客户端的需求。
import javax.servlet.http.HttpSession;
// 导入 HttpSession 类,用于管理用户的会话状态,能够在用户的多次请求之间存储和共享数据,
// 例如用户的登录信息、权限信息等。在本 Servlet 中,将使用它来获取用户所属部门等会话信息。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出相关的操作(如网络数据传输、文件读写等)时,
// 如果出现错误,就会抛出 IOException 异常,以便进行相应的错误处理。
import java.sql.ResultSet;
// 导入 ResultSet 类,用于表示数据库查询结果集。当执行 SQL 查询语句后,
// 数据库返回的数据会被封装在 ResultSet 对象中,通过它可以遍历和获取查询结果的每一行数据,
// 以便进行进一步的处理和分析。
@WebServlet("/DeptQueryStuByIdServlet1")
// 使用 WebServlet 注解将 DeptQueryStuByIdServlet1 类标记为一个 Servlet
// 并指定其访问路径为 /DeptQueryStuByIdServlet1这样客户端就可以通过这个路径向该 Servlet 发送请求,
// 从而触发该 Servlet 中的业务逻辑处理。
public class DeptQueryStuByIdServlet1 extends HttpServlet {
// 定义一个名为 DeptQueryStuByIdServlet1 的类,继承自 HttpServlet 类,
// 使其成为一个可以处理 HTTP 请求的 Servlet能够响应客户端发送的 GET 和 POST 请求,
// 并实现根据学生编号和所属部门查询学生信息的功能。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,该方法专门用于处理客户端发送的 HTTP GET 请求。
// 它接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误情况。
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");
// 从 HTTP 请求中获取名为 "sno" 的参数值,并将其赋值给字符串变量 sno。
// 这里的 sno 代表学生编号,用于后续根据该编号查询学生的相关信息。
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话。
// 通过会话对象可以存储和获取用户在会话期间的相关信息,如用户所属部门等。
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本用于从会话中获取名为 "userName" 的属性值,
// 但在当前代码中未被使用,可能是根据实际需求进行了调整或暂时不需要该功能。
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本用于从会话中获取名为 "sno" 的属性值,
// 这里的变量名与前面获取请求参数的 sno 重复,且在当前代码中未被使用,
// 可能是后续功能的预留或不再需要该属性值。
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其赋值给字符串变量 belong。
// 这里的 belong 可能代表用户所属的部门信息,用于后续的数据库查询条件。
System.out.println(belong);
// 在控制台打印 belong 的值,用于调试目的,方便开发人员查看从会话中获取的部门信息是否正确,
// 帮助进行问题排查和代码调试。
String sql = null;
// 声明一个字符串变量 sql用于存储即将执行的 SQL 语句,初始值设为 null
// 后续会根据业务逻辑动态地构建和赋值 SQL 语句。
Object[] objects = {sno, belong};
// 创建一个 Object 类型的数组 objects将 sno 和 belong 作为元素存储在数组中,
// 这个数组将作为参数传递给数据库操作方法,用于绑定 SQL 语句中的占位符,
// 以提高 SQL 语句的安全性和灵活性。
//查询是否存在此人
sql = "select count(*) as num from student where sno = ? and sdept = ?";
// 定义一个 SQL 查询语句,用于查询 student 表中学生编号为 sno 且所属部门为 belong通过 sdept 字段匹配)的记录数量。
// 使用占位符? 来提高 SQL 语句的安全性,防止 SQL 注入攻击,并将查询结果的数量别名为 num。
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,执行上述 SQL 查询语句,
// 并将查询结果(符合条件的记录数量)赋值给整数变量 count
// 通过这个数量可以判断数据库中是否存在该学生的记录。
if (count > 0){ //有则继续操作
// 如果查询到的记录数量 count 大于 0说明数据库中存在该学生的记录
// 可以继续执行后续的查询和处理操作。
sql = "select * from student where sno = ? and sdept = ?";
// 定义一个新的 SQL 查询语句,用于查询 student 表中学生编号为 sno 且所属部门为 belong 的所有字段信息。
// 同样使用占位符? 来确保 SQL 语句的安全性。
ResultSet resultSet = DeptAdminDao.qureyInfo(sql, objects);
// 调用 DeptAdminDao 类的 qureyInfo 方法,执行上述 SQL 查询语句,
// 并将查询结果存储在 ResultSet 对象 resultSet 中,以便后续遍历和处理。
Student student = new Student();
// 创建一个 Student 对象 student用于存储从数据库中查询到的学生信息。
try {
while (resultSet.next()){
// 遍历 ResultSet 对象,每次移动到下一行数据。
// 如果有数据resultSet.next() 返回 true则将当前行的数据赋值给 student 对象的相应属性。
student.setSno(resultSet.getString("sno"));
// 将查询结果中 "sno" 字段的值(学生编号)设置为 student 对象的 sno 属性。
student.setSname(resultSet.getString("sname"));
// 将查询结果中 "sname" 字段的值(学生姓名)设置为 student 对象的 sname 属性。
student.setSsex(resultSet.getString("ssex"));
// 将查询结果中 "ssex" 字段的值(学生性别)设置为 student 对象的 ssex 属性。
student.setSage(resultSet.getInt("sage"));
// 将查询结果中 "sage" 字段的值(学生年龄)设置为 student 对象的 sage 属性,
// 并将其转换为整数类型。
student.setSclass(resultSet.getString("sclass"));
// 将查询结果中 "sclass" 字段的值(学生班级)设置为 student 对象的 sclass 属性。
student.setSpecialty(resultSet.getString("specialty"));
// 将查询结果中 "specialty" 字段的值(学生专业)设置为 student 对象的 specialty 属性。
student.setSdept(resultSet.getString("sdept"));
// 将查询结果中 "sdept" 字段的值(学生所属系部)设置为 student 对象的 sdept 属性。
student.setSphone(resultSet.getString("sphone"));
// 将查询结果中 "sphone" 字段的值(学生电话号码)设置为 student 对象的 sphone 属性。
student.setSpsw(resultSet.getString("spsw"));
// 将查询结果中 "spsw" 字段的值(学生密码)设置为 student 对象的 spsw 属性。
}
} catch (Exception e) {
e.printStackTrace();
// 如果在遍历和设置属性的过程中出现异常,打印异常堆栈信息,
// 以便开发人员进行调试和错误排查。
}finally {
JDBCUtils.close(resultSet);
// 无论是否发生异常,都要关闭 ResultSet 对象,释放数据库资源,
// 调用 JDBCUtils 类的 close 方法来关闭 resultSet。
}
System.out.println(student.getSsex());
// 在控制台打印 student 对象的 ssex 属性值,用于调试目的,
// 方便开发人员查看查询到的学生性别信息是否正确。
req.setAttribute("student", student);
// 将 student 对象设置为请求的属性,键为 "student"
// 这样在后续的页面中可以通过这个键获取到 student 对象,从而展示学生信息。
req.getRequestDispatcher("/view/deptadmin/alterstu.jsp").forward(req, resp);
// 将请求转发到 /view/deptadmin/alterstu.jsp 页面,
// 并将包含学生信息的 student 对象传递到该页面,以便进行学生信息的修改操作。
}else {
req.getRequestDispatcher("/view/alluse/noexistdataofalter.jsp").forward(req, resp);
// 如果查询到的记录数量 count 不大于 0即数据库中不存在该学生的记录
// 将请求转发到 /view/alluse/noexistdataofalter.jsp 页面,
// 该页面用于提示用户没有可修改的数据,给用户一个明确的反馈。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,该方法用于处理客户端发送的 HTTP POST 请求。
// 它接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误情况。
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同,
// 这样可以避免重复编写相似的代码,提高代码的复用性和可维护性。
}
}
}

@ -1,187 +1,280 @@
package com.controller.deptadmin;
// 声明该类所属的包为 com.controller.deptadmin包机制用于组织和管理相关的类
// 方便代码的维护和复用,避免类名冲突,在项目中有助于构建清晰的代码结构,
// 使同一包下的类在逻辑上具有相关性,便于管理和查找。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类通常封装了与数据库交互的操作方法,
// 例如执行 SQL 查询语句(如 select、插入数据insert、更新数据update以及删除数据delete等操作。
// 在后续代码中,会使用该类的方法来实现对数据库中数据的查询和统计等功能,以支持学生信息的分页查询业务。
import com.dao.StuDao;
// 导入自定义的 StuDao 类,它可能专门用于处理与学生相关的数据访问操作,
// 例如根据特定条件查询学生信息、分页查询学生信息等。在本 Servlet 中,会调用该类的方法来获取学生数据。
import com.entity.PageBean;
// 导入自定义的 PageBean 实体类,用于封装分页相关的信息,
// 例如当前页码、每页显示的记录数、总记录数、总页数以及数据列表等。
// 在本 Servlet 中,将使用 PageBean 对象来管理和传递分页查询的结果。
import com.entity.StuPunch;
// 导入自定义的 StuPunch 实体类,虽然在当前代码中暂未看到对该类的实际使用,
// 但它可能用于封装学生打卡相关的信息,在项目的其他部分可能会有相关的业务逻辑与之关联。
import com.entity.Student;
// 导入自定义的 Student 实体类,用于封装学生的各种信息,
// 如学生编号sno、学生姓名sname、性别ssex、年龄sage、班级sclass
// 专业specialty、所属系部sdept、电话号码sphone、密码spsw等。
// 在本 Servlet 中,将从数据库查询到的学生信息存储到 Student 对象中,并添加到数据列表中。
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 工具类,一般包含与 JDBCJava Database Connectivity
// 相关的通用方法,如获取数据库连接、关闭数据库连接、处理结果集等,
// 用于简化数据库操作流程,提高代码的可维护性和复用性。在本 Servlet 中,
// 会使用该类的方法来关闭数据库查询结果集ResultSet释放数据库资源。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在运行过程中出现异常情况时,
// 例如请求处理失败、资源加载错误、内部逻辑错误等,会抛出 ServletException 异常,
// 以便进行相应的异常处理和错误恢复,确保系统的稳定性和可靠性。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,它是 Java EE 中用于将普通的 Java 类标记为 Servlet 的注解。
// 通过该注解可以方便地指定 Servlet 的访问路径,使得客户端能够通过特定的 URL 来访问该 Servlet
// 从而实现与服务器的交互。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本框架和方法。
// 我们定义的 Servlet 类需要继承 HttpServlet 类,从而获得处理 HTTP 请求的能力,
// 能够响应客户端发送的 GET 和 POST 请求。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等内容。Servlet 可以通过这个类获取客户端传递的各种数据,
// 以便根据这些数据进行相应的业务逻辑处理,如获取学生信息查询的条件参数和分页参数等。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等。Servlet 可以利用这个类来设置并返回给客户端相应的响应数据,
// 以满足客户端的需求,如设置响应的字符编码和内容类型,以及将查询结果页面转发给客户端等。
import javax.servlet.http.HttpSession;
// 导入 HttpSession 类,用于管理用户的会话状态,能够在用户的多次请求之间存储和共享数据,
// 例如用户的登录信息、权限信息、所属部门等。在本 Servlet 中,将使用它来获取用户所属部门等会话信息,
// 作为学生信息查询的条件之一。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出相关的操作(如网络数据传输、文件读写等)时,
// 如果出现错误,就会抛出 IOException 异常,以便进行相应的错误处理,
// 保证系统在面对异常情况时能够做出合理的响应。
import java.net.URL;
// 导入 URL 类用于表示统一资源定位符URL在网络编程中用于定位和访问网络资源。
// 在本 Servlet 中暂未看到对该类的实际使用,可能在项目的其他部分会有相关的功能需求。
import java.net.URLDecoder;
// 导入 URLDecoder 类,用于对 URL 编码的字符串进行解码操作。
// 在本 Servlet 中暂未看到对该类的实际使用,可能在处理含有 URL 编码参数的请求时会用到。
import java.net.URLEncoder;
// 导入 URLEncoder 类,用于对字符串进行 URL 编码操作。
// 在本 Servlet 中暂未看到对该类的实际使用,可能在构建含有参数的 URL 时会用到。
import java.sql.ResultSet;
// 导入 ResultSet 类,用于表示数据库查询结果集。当执行 SQL 查询语句后,
// 数据库返回的数据会被封装在 ResultSet 对象中,通过它可以遍历和获取查询结果的每一行数据,
// 以便进行进一步的处理和分析,如将查询到的学生信息存储到 Student 对象中。
import java.util.ArrayList;
// 导入 ArrayList 类,它是 Java 集合框架中的一种动态数组实现。
// 可以用来存储和管理一组对象,并且可以根据需要动态地增加或减少元素数量。
// 在本 Servlet 中,将使用 ArrayList 来存储从数据库查询到的学生对象Student
import java.util.HashMap;
// 导入 HashMap 类,它是 Java 集合框架中的一种键值对存储结构,
// 用于存储和管理具有映射关系的数据。在本 Servlet 中暂未看到对该类的实际使用,
// 可能在项目的其他部分会有相关的功能需求。
import java.util.Map;
// 导入 Map 接口它定义了一种键值对的映射关系HashMap 等类实现了该接口。
// 在本 Servlet 中暂未看到对该接口的实际使用,可能在处理需要键值对存储和操作的数据时会用到。
@WebServlet("/DeptQueryStuByPageServlet")
// 使用 WebServlet 注解将 DeptQueryStuByPageServlet 类标记为一个 Servlet
//并指定其访问路径为 /DeptQueryStuByPageServlet这样客户端就可以通过这个路径向该 Servlet 发送请求,
//从而触发该 Servlet 中的业务逻辑处理,实现学生信息的分页查询功能。
public class DeptQueryStuByPageServlet extends HttpServlet {
// 定义一个名为 DeptQueryStuByPageServlet 的类,继承自 HttpServlet 类,
// 使其成为一个可以处理 HTTP 请求的 Servlet能够响应客户端发送的 GET 和 POST 请求,
// 并实现根据条件分页查询学生信息的功能。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,该方法专门用于处理客户端发送的 HTTP GET 请求。
// 它接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误情况。
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 sname = req.getParameter("sname");
// 从 HTTP 请求中获取名为 "sname" 的参数值,并将其赋值给字符串变量 sname。
// 这里的 sname 代表学生姓名,用于后续根据学生姓名进行模糊查询学生信息。
String sclass = req.getParameter("sclass");
String specialty = req.getParameter("specialty");
// 从 HTTP 请求中获取名为 "sclass" 的参数值,并将其赋值给字符串变量 sclass。
// 这里的 sclass 代表学生班级,用于后续根据学生班级进行模糊查询学生信息。
String specialty = req.getParameter("specialty");
// 从 HTTP 请求中获取名为 "specialty" 的参数值,并将其赋值给字符串变量 specialty。
// 这里的 specialty 代表学生专业,用于后续根据学生专业进行模糊查询学生信息。
//如果传入的参数为null则置为空字符串
if (sname == null){
sname = "";
}
// 如果获取到的学生姓名参数 sname 为 null则将其设置为空字符串
// 以确保后续的模糊查询能够正常进行,避免空指针异常。
if (sclass == null){
sclass = "";
}
// 如果获取到的学生班级参数 sclass 为 null则将其设置为空字符串
// 以确保后续的模糊查询能够正常进行,避免空指针异常。
if (specialty == null){
specialty = "";
}
// 如果获取到的学生专业参数 specialty 为 null则将其设置为空字符串
// 以确保后续的模糊查询能够正常进行,避免空指针异常。
//变为like查询所需的字符串参数
String sname1 = "%" + sname + "%";
// 将学生姓名参数 sname 转换为适合 SQL 模糊查询LIKE 语句)的字符串格式,
// 在 sname 的前后添加通配符 "%",以便查询包含该姓名片段的学生记录。
String sclass1 = "%" + sclass + "%";
// 将学生班级参数 sclass 转换为适合 SQL 模糊查询LIKE 语句)的字符串格式,
// 在 sclass 的前后添加通配符 "%",以便查询包含该班级片段的学生记录。
String specialty1 = "%" + specialty + "%";
// 将学生专业参数 specialty 转换为适合 SQL 模糊查询LIKE 语句)的字符串格式,
// 在 specialty 的前后添加通配符 "%",以便查询包含该专业片段的学生记录。
//设置请求的属性参数,后面需要用
req.setAttribute("sname",sname);
// 将原始的学生姓名参数 sname 设置为请求的属性,键为 "sname"
// 以便在后续的页面中可以通过这个键获取到该参数值,用于展示查询条件或进行其他操作。
req.setAttribute("sclass", sclass);
// 将原始的学生班级参数 sclass 设置为请求的属性,键为 "sclass"
// 以便在后续的页面中可以通过这个键获取到该参数值,用于展示查询条件或进行其他操作。
req.setAttribute("specialty",specialty);
// 将原始的学生专业参数 specialty 设置为请求的属性,键为 "specialty"
// 以便在后续的页面中可以通过这个键获取到该参数值,用于展示查询条件或进行其他操作。
System.out.println(sname1);
// 在控制台打印转换后的学生姓名模糊查询参数 sname1用于调试目的
// 方便开发人员查看转换后的参数是否正确。
System.out.println(sclass1);
System.out.println(specialty1);
// 在控制台打印转换后的学生班级模糊查询参数 sclass1用于调试目的
// 方便开发人员查看转换后的参数是否正确。
System.out.println(specialty1);
// 在控制台打印转换后的学生专业模糊查询参数 specialty1用于调试目的
// 方便开发人员查看转换后的参数是否正确。
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话。
// 通过会话对象可以存储和获取用户在会话期间的相关信息,如用户所属部门等。
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本用于从会话中获取名为 "userName" 的属性值,
// 但在当前代码中未被使用,可能是根据实际需求进行了调整或暂时不需要该功能。
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本用于从会话中获取名为 "sno" 的属性值,
// 这里的变量名与前面获取请求参数的 sname、sclass、specialty 等不同,
// 且在当前代码中未被使用,可能是后续功能的预留或不再需要该属性值。
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其赋值给字符串变量 belong。
// 这里的 belong 可能代表用户所属的部门信息,用于后续的数据库查询条件,
// 确保查询的学生信息是该部门下的学生。
String sql = null;
// 声明一个字符串变量 sql用于存储即将执行的 SQL 语句,初始值设为 null
// 后续会根据业务逻辑动态地构建和赋值 SQL 语句。
// System.out.println(userName);
// 注释掉的代码,原本用于在控制台打印从会话中获取的用户名 userName
// 但由于该变量未被使用,所以此打印语句也被注释掉。
// System.out.println(sno);
// 注释掉的代码,原本用于在控制台打印从会话中获取的学生编号 sno
// 但由于该变量未被使用,所以此打印语句也被注释掉。
System.out.println(belong);
// 在控制台打印从会话中获取的用户所属部门信息 belong用于调试目的
// 方便开发人员查看获取到的部门信息是否正确。
System.out.println("hdghghjg");
// 在控制台打印字符串 "hdghghjg",可能是开发人员用于调试或标记的输出内容,
// 可以帮助确定代码执行到的位置。
String currentPage = req.getParameter("currentPage");//从请求对象中获取当前页码
// 从 HTTP 请求中获取名为 "currentPage" 的参数值,并将其赋值给字符串变量 currentPage。
// 这里的 currentPage 代表当前页码,用于实现分页查询功能。
String rows = req.getParameter("rows");//从请求获取对象中每页显示的行数
// 从 HTTP 请求中获取名为 "rows" 的参数值,并将其赋值给字符串变量 rows。
// 这里的 rows 代表每页显示的记录数,用于实现分页查询功能。
//如果未设请求参数,此处自动设置参数为第一页
if (currentPage == null || "".equals(currentPage)){
currentPage = "1";
}
// 如果获取到的当前页码参数 currentPage 为 null 或空字符串,则将其设置为 "1"
// 即默认显示第一页的学生信息,确保分页查询的正常进行。
//如果没有设置rows的请求参数此处自动设置
if (rows == null || "".equals(rows)){
rows = "7";
}
// 如果获取到的每页显示行数参数 rows 为 null 或空字符串,则将其设置为 "7"
// 即默认每页显示 7 条学生记录,确保分页查询的正常进行。
//获取条件查询的参数
int currentPage1 = Integer.parseInt(currentPage);
// 将字符串类型的当前页码参数 currentPage 转换为整数类型,并赋值给变量 currentPage1
// 以便后续进行计算和处理。
int rows1 = Integer.parseInt(rows);
// 将字符串类型的每页显示行数参数 rows 转换为整数类型,并赋值给变量 rows1
// 以便后续进行计算和处理。
//如果当前页数小于1则设置当前页数为1
if (currentPage1 <= 0){
currentPage1 = 1;
}
// 如果转换后的当前页码 currentPage1 小于等于 0则将其设置为 1
// 确保当前页码是有效的,避免出现负数或零页码的情况。
//设置StuPunch类的对象类型
PageBean<Student> pageBean = new PageBean<Student>();
//设置当前页码
pageBean.setCurrentPage(currentPage1);
//设置每页的记录数
pageBean.setRows(rows1);
sql = " select count(*) as num from student where sname like ? and sclass like ? and specialty like ? and sdept = ?";
Object[] objects = {sname1, sclass1, specialty1, belong};
/*sql = " select count(*) as num from student where sdept = ?";
Object[] objects = {belong};*/
//计算总记录数,并设置
int totalCount = DeptAdminDao.findTotalCount(sql, objects);
System.out.println(totalCount);
pageBean.setTotalCount(totalCount);
if (totalCount > 0){
//计算总页码,并设置
int totalPage = (totalCount % rows1) == 0 ? totalCount/rows1 : (totalCount/rows1 + 1);
pageBean.setTotalPage(totalPage);
//如果当前页数大于总页数
if (currentPage1 > pageBean.getTotalPage()){
currentPage1 = pageBean.getTotalPage();
//重新设置当前页码
pageBean.setCurrentPage(currentPage1);
}
//计算开始的记录和list对象集合并设置
int start = (currentPage1 - 1) * rows1;
sql = "select * from student where sname like ? and sclass like ? and specialty like ? and sdept = ? limit ?, ?";
Object[] objects1 = {sname1, sclass1, specialty1, belong, start, rows1};
/*sql = "select * from student where sdept = ? limit ?, ?";
Object[] objects1 = {belong, start, rows1};*/
ResultSet resultSet = StuDao.QureyInfoByPage(sql, objects1);
ArrayList stuArrayList = new ArrayList();
try {
while (resultSet.next()){
Student student = new Student();
student.setSno(resultSet.getString("sno"));
student.setSname(resultSet.getString("sname"));
student.setSsex(resultSet.getString("ssex"));
student.setSage(resultSet.getInt("sage"));
student.setSclass(resultSet.getString("sclass"));
student.setSpecialty(resultSet.getString("specialty"));
student.setSdept(resultSet.getString("sdept"));
student.setSphone(resultSet.getString("sphone"));
student.setSpsw(resultSet.getString("spsw"));
stuArrayList.add(student);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.close(resultSet);
}
pageBean.setArrayList(stuArrayList);
System.out.println(stuArrayList);
System.out.println(pageBean);
req.setAttribute("pageBean", pageBean);
req.getRequestDispatcher("/view/deptadmin/stuinfolist.jsp").forward(req, resp);
}else {
req.getRequestDispatcher("/view/alluse/nodata.jsp").forward(req, resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
// 创建一个 PageBean 对象 pageBean泛型类型为 Student用于封装分页查询的相关信息

@ -1,72 +1,192 @@
package com.controller.deptadmin;
// 声明该类所在的包为 com.controller.deptadmin包机制有助于将相关的类组织在一起
// 方便代码的管理和维护,避免类名冲突,同时也能体现项目的逻辑结构。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,这个类通常封装了与数据库交互的操作方法,
// 比如执行 SQL 查询、更新、删除等操作,后续代码会使用该类的方法来查询学生打卡信息。
import com.entity.StuPunch;
// 导入自定义的 StuPunch 实体类,用于封装学生打卡的相关信息,
// 例如打卡日期、是否打卡、体温情况等,在后续代码中会用它来存储从数据库查询到的打卡信息。
import com.entity.Student;
// 导入自定义的 Student 实体类,该类用于封装学生的基本信息,
// 如学生编号、姓名等,虽然在当前代码中没有直接使用该类的对象进行数据操作,
// 但在 SQL 查询语句中会关联该表以获取学生姓名。
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 工具类,一般包含了与 JDBCJava Database Connectivity
// 相关的通用方法,例如获取数据库连接、关闭数据库连接、处理结果集等,
// 用于简化数据库操作的流程,提高代码的可维护性和复用性。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在执行过程中出现异常情况,
// 如请求处理失败、资源加载错误等,会抛出 ServletException 异常,
// 用于在代码中进行异常处理和错误恢复。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,这是 Java EE 中用于将普通 Java 类标记为 Servlet 的注解,
// 通过该注解可以指定 Servlet 的访问路径,使得客户端能够通过特定的 URL 来访问该 Servlet。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本结构和方法。
// 我们定义的 Servlet 类继承它,从而具备处理 HTTP 请求的能力。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等内容Servlet 可以通过它获取客户端传递的数据。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等Servlet 可以利用它设置并返回响应数据给客户端。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出操作(如网络传输、文件读写等)出现错误时,
// 会抛出 IOException 异常,以便进行相应的错误处理。
import java.sql.ResultSet;
// 导入 ResultSet 类,它用于表示数据库查询结果集。当执行 SQL 查询语句后,
// 数据库返回的数据会被封装在 ResultSet 对象中,通过它可以遍历和获取查询结果的每一行数据。
@WebServlet("/DeptQueryStuPunchByIdServlet")
// 使用 WebServlet 注解将 DeptQueryStuPunchByIdServlet 类标记为一个 Servlet
// 并指定其访问路径为 /DeptQueryStuPunchByIdServlet客户端可以通过这个路径向该 Servlet 发送请求。
public class DeptQueryStuPunchByIdServlet extends HttpServlet {
// 定义一个名为 DeptQueryStuPunchByIdServlet 的类,继承自 HttpServlet 类,
// 使其成为一个能够处理 HTTP 请求的 Servlet可响应客户端的 GET 和 POST 请求。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,用于处理客户端发送的 HTTP GET 请求。
// 该方法接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常。
req.setCharacterEncoding("utf-8");
// 设置请求的字符编码为 UTF - 8确保服务器能够正确处理包含中文等特殊字符的请求参数
// 避免出现乱码问题,保证请求数据的准确解析。
resp.setCharacterEncoding("utf-8");
// 设置响应的字符编码为 UTF - 8保证返回给客户端的内容能够正确显示中文等特殊字符
// 确保响应数据的正确呈现,避免客户端显示乱码。
resp.setContentType("text/html;charset=utf-8");
// 设置响应的内容类型为 text/html并指定字符编码为 UTF - 8
// 告知客户端返回的是 HTML 格式的内容,以便客户端正确解析和显示响应信息。
//获取请求参数
String sno = req.getParameter("sno");
// 从 HTTP 请求中获取名为 "sno" 的参数值,该参数代表学生编号,
// 用于后续根据学生编号查询学生打卡信息。
String spunchdate = req.getParameter("spunchdate");
// 从 HTTP 请求中获取名为 "spunchdate" 的参数值,该参数代表学生打卡日期,
// 用于后续根据打卡日期查询学生打卡信息。
String sql = null;
// 声明一个字符串变量 sql用于存储即将执行的 SQL 语句,初始值设为 null
// 后续会根据业务逻辑动态地构建和赋值 SQL 语句。
Object[] objects = {sno, spunchdate};
// 创建一个 Object 类型的数组 objects将 sno 和 spunchdate 作为元素存储在数组中,
// 这个数组将作为参数传递给数据库操作方法,用于绑定 SQL 语句中的占位符。
//查询是否存在此人
sql = "select count(*) as num from stupunchin where sno = ? and spunchdate = ?";
// 定义一个 SQL 查询语句,用于查询 stupunchin 表中,学生编号为 sno 且打卡日期为 spunchdate 的记录数量。
// 使用占位符 ? 来提高 SQL 语句的安全性,防止 SQL 注入攻击,并将查询结果的数量别名为 num。
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,执行上述 SQL 查询语句,
// 并将查询结果(符合条件的记录数量)赋值给整数变量 count
// 通过这个数量可以判断数据库中是否存在该学生在指定日期的打卡记录。
if (count > 0){ //有则继续操作
// 如果查询到的记录数量 count 大于 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 表关联后的信息,
// 选取学生姓名s.sname和 stupunchin 表的所有字段sp.*),条件是学生编号匹配且打卡日期匹配。
// 同样使用占位符 ? 来确保 SQL 语句的安全性。
ResultSet resultSet = DeptAdminDao.qureyInfo(sql, objects);
// 调用 DeptAdminDao 类的 qureyInfo 方法,执行上述 SQL 查询语句,
// 并将查询结果存储在 ResultSet 对象 resultSet 中,以便后续遍历和处理。
StuPunch stuPunch = new StuPunch();
// 创建一个 StuPunch 对象 stuPunch用于存储从数据库中查询到的学生打卡信息。
try {
while (resultSet.next()){
// 遍历 ResultSet 对象,每次移动到下一行数据。
// 如果有数据resultSet.next() 返回 true则将当前行的数据赋值给 stuPunch 对象的相应属性。
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 属性,
// 并将其转换为 java.sql.Date 类型。
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);
// 无论是否发生异常,都要关闭 ResultSet 对象,释放数据库资源,
// 调用 JDBCUtils 类的 close 方法来关闭 resultSet。
}
req.setAttribute("stuPunch", stuPunch);
// 将 stuPunch 对象设置为请求的属性,键为 "stuPunch"
// 这样在后续的页面中可以通过这个键获取到 stuPunch 对象,从而展示学生打卡信息。
req.getRequestDispatcher("/view/deptadmin/alterstupunch.jsp").forward(req, resp);
// 将请求转发到 /view/deptadmin/alterstupunch.jsp 页面,
// 并将包含学生打卡信息的 stuPunch 对象传递到该页面,以便进行学生打卡信息的修改操作。
}else {
req.getRequestDispatcher("/view/alluse/noexistdataofalter.jsp").forward(req, resp);
// 如果查询到的记录数量 count 不大于 0即数据库中不存在该学生在指定日期的打卡记录
// 将请求转发到 /view/alluse/noexistdataofalter.jsp 页面,
// 该页面用于提示用户没有可修改的数据,给用户一个明确的反馈。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,用于处理客户端发送的 HTTP POST 请求。
// 该方法接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常。
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同,
// 这样可以避免重复编写相似的代码,提高代码的复用性和可维护性。
}
}
}

@ -1,80 +1,222 @@
package com.controller.deptadmin;
// 声明该类所属的包为 com.controller.deptadmin包机制用于对相关类进行组织和管理
// 便于代码的维护和查找,避免类名冲突,在项目中有助于构建清晰的代码结构。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类通常封装了与数据库交互的操作方法,
// 例如执行 SQL 查询、插入、更新和删除等操作。后续代码会使用这些方法来查询学生打卡信息。
import com.entity.StuPunch;
// 导入自定义的 StuPunch 实体类,用于封装学生打卡的相关信息,
// 如学生编号、是否打卡、打卡日期、打卡时间、身体状况等信息,后续将从数据库查询结果中填充这些属性。
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 工具类,一般包含与 JDBCJava Database Connectivity
// 相关的通用方法,如获取数据库连接、关闭连接、处理结果集等,
// 用于简化数据库操作流程,提高代码的可维护性和复用性。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在运行过程中出现异常情况时,
// 如请求处理失败、资源加载错误等,会抛出 ServletException 异常,
// 以便进行相应的异常处理和错误恢复。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,这是 Java EE 中用于将普通 Java 类标记为 Servlet 的注解。
// 通过该注解可以指定 Servlet 的访问路径,使得客户端能够通过特定的 URL 来访问该 Servlet
// 从而实现与服务器的交互。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本框架和方法。
// 我们定义的 Servlet 类继承 HttpServlet 类,从而获得处理 HTTP 请求的能力,
// 能够响应客户端发送的 GET 和 POST 请求。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等内容。Servlet 可以通过这个类获取客户端传递的数据,
// 以便根据这些数据进行相应的业务逻辑处理。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等。Servlet 可以利用这个类来设置并返回给客户端相应的响应数据,
// 以满足客户端的需求。
import javax.servlet.http.HttpSession;
// 导入 HttpSession 类,用于管理用户的会话状态,能够在用户的多次请求之间存储和共享数据,
// 例如用户的登录信息、权限信息、所属部门等。在本 Servlet 中,将使用它来获取用户所属部门等会话信息。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出相关的操作(如网络数据传输、文件读写等)时,
// 如果出现错误,就会抛出 IOException 异常,以便进行相应的错误处理。
import java.sql.ResultSet;
// 导入 ResultSet 类,用于表示数据库查询结果集。当执行 SQL 查询语句后,
// 数据库返回的数据会被封装在 ResultSet 对象中,通过它可以遍历和获取查询结果的每一行数据,
// 以便进行进一步的处理和分析。
@WebServlet("/DeptQueryStuPunchByIdServlet1")
// 使用 WebServlet 注解将 DeptQueryStuPunchByIdServlet1 类标记为一个 Servlet
// 并指定其访问路径为 /DeptQueryStuPunchByIdServlet1这样客户端就可以通过这个路径向该 Servlet 发送请求,
// 从而触发该 Servlet 中的业务逻辑处理。
public class DeptQueryStuPunchByIdServlet1 extends HttpServlet {
// 定义一个名为 DeptQueryStuPunchByIdServlet1 的类,继承自 HttpServlet 类,
// 使其成为一个可以处理 HTTP 请求的 Servlet能够响应客户端发送的 GET 和 POST 请求,
// 并实现根据学生编号和打卡日期查询学生打卡信息的功能。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,该方法专门用于处理客户端发送的 HTTP GET 请求。
// 它接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误情况。
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");
// 从 HTTP 请求中获取名为 "sno" 的参数值,并将其赋值给字符串变量 sno。
// 这里的 sno 代表学生编号,用于后续根据该编号查询学生的打卡信息。
String spunchdate = req.getParameter("spunchdate");
// 从 HTTP 请求中获取名为 "spunchdate" 的参数值,并将其赋值给字符串变量 spunchdate。
// 这里的 spunchdate 代表学生打卡日期,用于后续根据该日期查询学生的打卡信息。
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话。
// 通过会话对象可以存储和获取用户在会话期间的相关信息,如用户所属部门等。
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本用于从会话中获取名为 "userName" 的属性值,
// 但在当前代码中未被使用,可能是根据实际需求进行了调整或暂时不需要该功能。
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本用于从会话中获取名为 "sno" 的属性值,
// 这里的变量名与前面获取请求参数的 sno 重复,且在当前代码中未被使用,
// 可能是后续功能的预留或不再需要该属性值。
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其赋值给字符串变量 belong。
// 这里的 belong 可能代表用户所属的部门信息,用于后续的数据库查询条件。
System.out.println(belong);
// 在控制台打印 belong 的值,用于调试目的,方便开发人员查看从会话中获取的部门信息是否正确,
// 帮助进行问题排查和代码调试。
String sql = null;
// 声明一个字符串变量 sql用于存储即将执行的 SQL 语句,初始值设为 null
// 后续会根据业务逻辑动态地构建和赋值 SQL 语句。
Object[] objects = {sno, spunchdate, belong};
// 创建一个 Object 类型的数组 objects将 sno、spunchdate 和 belong 作为元素存储在数组中,
// 这个数组将作为参数传递给数据库操作方法,用于绑定 SQL 语句中的占位符,
// 以提高 SQL 语句的安全性和灵活性。
//查询是否存在此人
sql = "select count(*) as num from student s,stupunchin sp where s.sno = sp.sno and s.sno = ? and sp.spunchdate = ? and s.sdept = ?";
// 定义一个 SQL 查询语句,用于查询 student 表和 stupunchin 表中,学生编号为 sno、打卡日期为 spunchdate 且学生所属部门为 belong 的记录数量。
// 使用占位符? 来提高 SQL 语句的安全性,防止 SQL 注入攻击,并将查询结果的数量别名为 num。
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,执行上述 SQL 查询语句,
// 并将查询结果(符合条件的记录数量)赋值给整数变量 count
// 通过这个数量可以判断数据库中是否存在该学生在指定日期且属于指定部门的打卡记录。
if (count > 0){ //有则继续操作
// 如果查询到的记录数量 count 大于 0说明数据库中存在该学生在指定日期且属于指定部门的打卡记录
// 可以继续执行后续的查询和处理操作。
sql = "select s.sname,sp.* from student s,stupunchin sp where s.sno = sp.sno and sp.sno = ? and sp.spunchdate = ? and sdept = ?";
// 定义一个新的 SQL 查询语句,用于查询 student 表和 stupunchin 表关联后的信息,
// 选取学生姓名s.sname和 stupunchin 表的所有字段sp.*),条件是学生编号匹配、打卡日期匹配且学生所属部门匹配。
// 同样使用占位符? 来确保 SQL 语句的安全性。
ResultSet resultSet = DeptAdminDao.qureyInfo(sql, objects);
// 调用 DeptAdminDao 类的 qureyInfo 方法,执行上述 SQL 查询语句,
// 并将查询结果存储在 ResultSet 对象 resultSet 中,以便后续遍历和处理。
StuPunch stuPunch = new StuPunch();
// 创建一个 StuPunch 对象 stuPunch用于存储从数据库中查询到的学生打卡信息。
try {
while (resultSet.next()){
// 遍历 ResultSet 对象,每次移动到下一行数据。
// 如果有数据resultSet.next() 返回 true则将当前行的数据赋值给 stuPunch 对象的相应属性。
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 属性,
// 并将其转换为 java.sql.Date 类型。
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);
// 无论是否发生异常,都要关闭 ResultSet 对象,释放数据库资源,
// 调用 JDBCUtils 类的 close 方法来关闭 resultSet。
}
req.setAttribute("stuPunch", stuPunch);
// 将 stuPunch 对象设置为请求的属性,键为 "stuPunch"
// 这样在后续的页面中可以通过这个键获取到 stuPunch 对象,从而展示学生打卡信息。
req.getRequestDispatcher("/view/deptadmin/alterstupunch.jsp").forward(req, resp);
// 将请求转发到 /view/deptadmin/alterstupunch.jsp 页面,
// 并将包含学生打卡信息的 stuPunch 对象传递到该页面,以便进行学生打卡信息的修改操作。
}else {
req.getRequestDispatcher("/view/alluse/noexistdataofalter.jsp").forward(req, resp);
// 如果查询到的记录数量 count 不大于 0即数据库中不存在该学生在指定日期且属于指定部门的打卡记录
// 将请求转发到 /view/alluse/noexistdataofalter.jsp 页面,
// 该页面用于提示用户没有可修改的数据,给用户一个明确的反馈。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,该方法用于处理客户端发送的 HTTP POST 请求。
// 它接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误情况。
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同,
// 这样可以避免重复编写相似的代码,提高代码的复用性和可维护性。
}
}
}

@ -1,175 +1,282 @@
package com.controller.deptadmin;
// 声明该类所属的包为 com.controller.deptadmin包用于对相关的类进行组织和管理
// 便于代码的维护和查找,避免类名冲突,在项目中有助于构建清晰的代码结构。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类通常封装了与数据库交互的操作方法,
// 例如执行 SQL 查询、插入、更新和删除等操作。后续代码会使用这些方法来实现对数据库中数据的查询和统计等功能,
// 以支持学生打卡信息的分页查询业务。
import com.dao.StuDao;
// 导入自定义的 StuDao 类,它可能专门用于处理与学生相关的数据访问操作,
// 例如根据特定条件查询学生信息、分页查询学生信息等。在本 Servlet 中,会调用该类的方法来获取学生打卡信息。
import com.entity.PageBean;
// 导入自定义的 PageBean 实体类,用于封装分页相关的信息,
// 例如当前页码、每页显示的记录数、总记录数、总页数以及数据列表等。
// 在本 Servlet 中,将使用 PageBean 对象来管理和传递分页查询的结果。
import com.entity.StuPunch;
// 导入自定义的 StuPunch 实体类,用于封装学生打卡的相关信息,
// 如学生编号、学生姓名、班级、专业、是否打卡、打卡日期、打卡时间、身体状况等信息。
// 在本 Servlet 中,将从数据库查询到的学生打卡信息存储到 StuPunch 对象中,并添加到数据列表中。
import com.entity.Student;
// 导入自定义的 Student 实体类,用于封装学生的基本信息,
// 如学生编号、学生姓名、班级、专业、所属系部等。在本 Servlet 中,会与 StuPunch 表关联查询,
// 以获取更全面的学生打卡相关信息。
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 工具类,一般包含与 JDBCJava Database Connectivity
// 相关的通用方法,如获取数据库连接、关闭数据库连接、处理结果集等,
// 用于简化数据库操作流程,提高代码的可维护性和复用性。在本 Servlet 中,
// 会使用该类的方法来关闭数据库查询结果集ResultSet释放数据库资源。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在运行过程中出现异常情况时,
// 例如请求处理失败、资源加载错误、内部逻辑错误等,会抛出 ServletException 异常,
// 以便进行相应的异常处理和错误恢复,确保系统的稳定性和可靠性。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,它是 Java EE 中用于将普通的 Java 类标记为 Servlet 的注解。
// 通过该注解可以方便地指定 Servlet 的访问路径,使得客户端能够通过特定的 URL 来访问该 Servlet
// 从而实现与服务器的交互。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本框架和方法。
// 我们定义的 Servlet 类需要继承 HttpServlet 类,从而获得处理 HTTP 请求的能力,
// 能够响应客户端发送的 GET 和 POST 请求。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等内容。Servlet 可以通过这个类获取客户端传递的各种数据,
// 以便根据这些数据进行相应的业务逻辑处理,如获取学生打卡信息查询的条件参数和分页参数等。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等。Servlet 可以利用这个类来设置并返回给客户端相应的响应数据,
// 以满足客户端的需求,如设置响应的字符编码和内容类型,以及将查询结果页面转发给客户端等。
import javax.servlet.http.HttpSession;
// 导入 HttpSession 类,用于管理用户的会话状态,能够在用户的多次请求之间存储和共享数据,
// 例如用户的登录信息、权限信息、所属部门等。在本 Servlet 中,将使用它来获取用户所属部门等会话信息,
// 作为学生打卡信息查询的条件之一。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出相关的操作(如网络数据传输、文件读写等)时,
// 如果出现错误,就会抛出 IOException 异常,以便进行相应的错误处理,
// 保证系统在面对异常情况时能够做出合理的响应。
import java.sql.ResultSet;
// 导入 ResultSet 类,用于表示数据库查询结果集。当执行 SQL 查询语句后,
// 数据库返回的数据会被封装在 ResultSet 对象中,通过它可以遍历和获取查询结果的每一行数据,
// 以便进行进一步的处理和分析,如将查询到的学生打卡信息存储到 StuPunch 对象中。
import java.util.ArrayList;
// 导入 ArrayList 类,它是 Java 集合框架中的一种动态数组实现。
// 可以用来存储和管理一组对象,并且可以根据需要动态地增加或减少元素数量。
// 在本 Servlet 中,将使用 ArrayList 来存储从数据库查询到的学生打卡对象StuPunch
@WebServlet("/DeptQueryStuPunchByPageServlet")
// 使用 WebServlet 注解将 DeptQueryStuPunchByPageServlet 类标记为一个 Servlet
// 并指定其访问路径为 /DeptQueryStuPunchByPageServlet这样客户端就可以通过这个路径向该 Servlet 发送请求,
// 从而触发该 Servlet 中的业务逻辑处理,实现学生打卡信息的分页查询功能。
public class DeptQueryStuPunchByPageServlet extends HttpServlet {
// 定义一个名为 DeptQueryStuPunchByPageServlet 的类,继承自 HttpServlet 类,
// 使其成为一个可以处理 HTTP 请求的 Servlet能够响应客户端发送的 GET 和 POST 请求,
// 并实现根据条件分页查询学生打卡信息的功能。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,该方法专门用于处理客户端发送的 HTTP GET 请求。
// 它接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误情况。
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 sname = req.getParameter("sname");
// 从 HTTP 请求中获取名为 "sname" 的参数值,并将其赋值给字符串变量 sname。
// 这里的 sname 代表学生姓名,用于后续根据学生姓名进行模糊查询学生打卡信息。
String sclass = req.getParameter("sclass");
// 从 HTTP 请求中获取名为 "sclass" 的参数值,并将其赋值给字符串变量 sclass。
// 这里的 sclass 代表学生班级,用于后续根据学生班级进行模糊查询学生打卡信息。
String spunchdate = req.getParameter("spunchdate");
// 从 HTTP 请求中获取名为 "spunchdate" 的参数值,并将其赋值给字符串变量 spunchdate。
// 这里的 spunchdate 代表学生打卡日期,用于后续根据学生打卡日期进行模糊查询学生打卡信息。
System.out.println(sname);
// 在控制台打印学生姓名参数 sname用于调试目的
// 方便开发人员查看获取到的参数值是否正确。
System.out.println(sclass);
System.out.println(spunchdate);
// 在控制台打印学生班级参数 sclass用于调试目的
// 方便开发人员查看获取到的参数值是否正确。
System.out.println(spunchdate);
// 在控制台打印学生打卡日期参数 spunchdate用于调试目的
// 方便开发人员查看获取到的参数值是否正确。
//如果传入的参数为null则置为空字符串
if (sname == null){
sname = "";
}
// 如果获取到的学生姓名参数 sname 为 null则将其设置为空字符串
// 以确保后续的模糊查询能够正常进行,避免空指针异常。
if (sclass == null){
sclass = "";
}
// 如果获取到的学生班级参数 sclass 为 null则将其设置为空字符串
// 以确保后续的模糊查询能够正常进行,避免空指针异常。
if (spunchdate == null){
spunchdate = "";
}
// 如果获取到的学生打卡日期参数 spunchdate 为 null则将其设置为空字符串
// 以确保后续的模糊查询能够正常进行,避免空指针异常。
//变为like查询所需的字符串参数
String sname1 = "%" + sname + "%";
// 将学生姓名参数 sname 转换为适合 SQL 模糊查询LIKE 语句)的字符串格式,
// 在 sname 的前后添加通配符 "%",以便查询包含该姓名片段的学生打卡记录。
String sclass1 = "%" + sclass + "%";
// 将学生班级参数 sclass 转换为适合 SQL 模糊查询LIKE 语句)的字符串格式,
// 在 sclass 的前后添加通配符 "%",以便查询包含该班级片段的学生打卡记录。
String spunchdate1 = "%" + spunchdate + "%";
// 将学生打卡日期参数 spunchdate 转换为适合 SQL 模糊查询LIKE 语句)的字符串格式,
// 在 spunchdate 的前后添加通配符 "%",以便查询包含该日期片段的学生打卡记录。
//设置请求的属性参数,后面需要用
req.setAttribute("sname",sname);
// 将原始的学生姓名参数 sname 设置为请求的属性,键为 "sname"
// 以便在后续的页面中可以通过这个键获取到该参数值,用于展示查询条件或进行其他操作。
req.setAttribute("sclass", sclass);
// 将原始的学生班级参数 sclass 设置为请求的属性,键为 "sclass"
// 以便在后续的页面中可以通过这个键获取到该参数值,用于展示查询条件或进行其他操作。
req.setAttribute("spunchdate",spunchdate);
// 将原始的学生打卡日期参数 spunchdate 设置为请求的属性,键为 "spunchdate"
// 以便在后续的页面中可以通过这个键获取到该参数值,用于展示查询条件或进行其他操作。
System.out.println(sname1);
// 在控制台打印转换后的学生姓名模糊查询参数 sname1用于调试目的
// 方便开发人员查看转换后的参数是否正确。
System.out.println(sclass1);
// 在控制台打印转换后的学生班级模糊查询参数 sclass1用于调试目的
// 方便开发人员查看转换后的参数是否正确。
System.out.println(spunchdate1);
// 在控制台打印转换后的学生打卡日期模糊查询参数 spunchdate1用于调试目的
// 方便开发人员查看转换后的参数是否正确。
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话。
// 通过会话对象可以存储和获取用户在会话期间的相关信息,如用户所属部门等。
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本用于从会话中获取名为 "userName" 的属性值,
// 但在当前代码中未被使用,可能是根据实际需求进行了调整或暂时不需要该功能。
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本用于从会话中获取名为 "sno" 的属性值,
// 这里的变量名与前面获取请求参数的 sname、sclass、spunchdate 等不同,
// 且在当前代码中未被使用,可能是后续功能的预留或不再需要该属性值。
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其赋值给字符串变量 belong。
// 这里的 belong 可能代表用户所属的部门信息,用于后续的数据库查询条件,
// 确保查询的学生打卡信息是该部门下的学生的记录。
String sql = null;
// 声明一个字符串变量 sql用于存储即将执行的 SQL 语句,初始值设为 null
// 后续会根据业务逻辑动态地构建和赋值 SQL 语句。
// System.out.println(userName);
// 注释掉的代码,原本用于在控制台打印从会话中获取的用户名 userName
// 但由于该变量未被使用,所以此打印语句也被注释掉。
// System.out.println(sno);
// 注释掉的代码,原本用于在控制台打印从会话中获取的学生编号 sno
// 但由于该变量未被使用,所以此打印语句也被注释掉。
System.out.println(belong);
// 在控制台打印从会话中获取的用户所属部门信息 belong用于调试目的
// 方便开发人员查看获取到的部门信息是否正确。
System.out.println("hdghghjg");
// 在控制台打印字符串 "hdghghjg",可能是开发人员用于调试或标记的输出内容,
// 可以帮助确定代码执行到的位置。
String currentPage = req.getParameter("currentPage");//从请求对象中获取当前页码
// 从 HTTP 请求中获取名为 "currentPage" 的参数值,并将其赋值给字符串变量 currentPage。
// 这里的 currentPage 代表当前页码,用于实现分页查询功能。
String rows = req.getParameter("rows");//从请求获取对象中每页显示的行数
// 从 HTTP 请求中获取名为 "rows" 的参数值,并将其赋值给字符串变量 rows。
// 这里的 rows 代表每页显示的记录数,用于实现分页查询功能。
//如果未设请求参数,此处自动设置参数为第一页
if (currentPage == null || "".equals(currentPage)){
currentPage = "1";
}
// 如果获取到的当前页码参数 currentPage 为 null 或空字符串,则将其设置为 "1"
// 即默认显示第一页的学生打卡信息,确保分页查询的正常进行。
//如果没有设置rows的请求参数此处自动设置
if (rows == null || "".equals(rows)){
rows = "7";
}
// 如果获取到的每页显示行数参数 rows 为 null 或空字符串,则将其设置为 "7"
// 即默认每页显示 7 条学生打卡记录,确保分页查询的正常进行。
//获取条件查询的参数
int currentPage1 = Integer.parseInt(currentPage);
// 将字符串类型的当前页码参数 currentPage 转换为整数类型,并赋值给变量 currentPage1
// 以便后续进行计算和处理。
int rows1 = Integer.parseInt(rows);
// 将字符串类型的每页显示行数参数 rows 转换为整数类型,并赋值给变量 rows1
// 以便后续进行计算和处理。
//如果当前页数小于1则设置当前页数为1
if (currentPage1 <= 0){
currentPage1 = 1;
}
// 如果转换后的当前页码 currentPage1 小于等于 0则将其设置为 1
// 确保当前页码是有效的,避免出现负数或零页码的情况。
//设置StuPunch类的对象类型
PageBean<StuPunch> pageBean = new PageBean<StuPunch>();
// 创建一个 PageBean 对象 pageBean泛型类型为 StuPunch用于封装分页查询学生打卡信息的相关信息
//设置当前页码
pageBean.setCurrentPage(currentPage1);
// 将当前页码 currentPage1 设置到 pageBean 对象中,以便在后续处理中使用。
//设置每页的记录数
pageBean.setRows(rows1);
// 将每页显示的记录数 rows1 设置到 pageBean 对象中,以便在后续处理中使用。
sql = " select count(*) as num from student s, stupunchin sp where s.sno = sp.sno and s.sname like ? and s.sclass like ? and sp.spunchdate like ? and s.sdept = ?";
Object[] objects = {sname1, sclass1, spunchdate1,belong};
//计算总记录数,并设置
int totalCount = DeptAdminDao.findTotalCount(sql, objects);
System.out.println(totalCount);
pageBean.setTotalCount(totalCount);
if (totalCount > 0){
//计算总页码,并设置
int totalPage = (totalCount % rows1) == 0 ? totalCount/rows1 : (totalCount/rows1 + 1);
pageBean.setTotalPage(totalPage);
//如果当前页数大于总页数
if (currentPage1 > pageBean.getTotalPage()){
currentPage1 = pageBean.getTotalPage();
//重新设置当前页码
pageBean.setCurrentPage(currentPage1);
}
//计算开始的记录和list对象集合并设置
int start = (currentPage1 - 1) * rows1;
sql = "select s.sname,s.sclass,s.specialty,sp.* from student s, stupunchin sp where s.sno = sp.sno and s.sname like ? and s.sclass like ? and sp.spunchdate like ? and s.sdept = ? limit ?, ?";
Object[] objects1 = {sname1, sclass1, spunchdate1, belong, start, rows1};
ResultSet resultSet = StuDao.QureyInfoByPage(sql, objects1);
ArrayList stuPunchArrayList = new ArrayList();
try {
while (resultSet.next()){
StuPunch stuPunch = new StuPunch();
stuPunch.setSno(resultSet.getString("sno"));
stuPunch.setSname(resultSet.getString("sname"));
stuPunch.setSclass(resultSet.getString("sclass"));
stuPunch.setSpecialty(resultSet.getString("specialty"));
stuPunch.setSispunch(resultSet.getString("sispunch"));
stuPunch.setSpunchdate(resultSet.getDate("spunchdate"));
stuPunch.setSpunchtime(resultSet.getString("spunchtime"));
stuPunch.setSishot(resultSet.getString("sishot"));
stuPunch.setSiscough(resultSet.getString("siscough"));
stuPunch.setSisseem(resultSet.getString("sisseem"));
stuPunch.setSisdiagnose(resultSet.getString("sisdiagnose"));
stuPunch.setSstatus(resultSet.getString("sstatus"));
stuPunchArrayList.add(stuPunch);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.close(resultSet);
}
pageBean.setArrayList(stuPunchArrayList);
System.out.println(stuPunchArrayList);
System.out.println(pageBean);
req.setAttribute("pageBean", pageBean);
req.getRequestDispatcher("/view/deptadmin/stupunchlist.jsp").forward(req, resp);
}else {
req.getRequestDispatcher("/view/alluse/nodata.jsp").forward(req, resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
// 定义一个 SQL 查询语句,用于查询 student 表和 stupunchin 表中,
// 满足学生编号关联、学生姓名模糊匹配、学生班级模糊

@ -1,73 +1,181 @@
package com.controller.deptadmin;
// 声明该类所在的包为 com.controller.deptadmin包用于组织和管理相关的类
// 有助于避免类名冲突,同时方便代码的维护和查找,体现了项目的逻辑结构。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类通常封装了与数据库交互的操作方法,
// 如执行 SQL 查询、插入、更新、删除等操作,后续会使用它来查询教师信息。
import com.entity.Student;
// 导入自定义的 Student 实体类,不过在当前代码中未使用该类,可能是后续扩展功能预留的。
import com.entity.Teacher;
// 导入自定义的 Teacher 实体类,用于封装教师的相关信息,如教师编号、姓名、性别等,
// 后续会用它来存储从数据库查询到的教师信息。
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 工具类,一般包含了与 JDBCJava Database Connectivity
// 相关的通用方法,例如获取数据库连接、关闭数据库连接、处理结果集等,
// 用于简化数据库操作的流程,提高代码的可维护性和复用性。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在执行过程中出现异常情况,
// 如请求处理失败、资源加载错误等,会抛出 ServletException 异常,
// 用于在代码中进行异常处理和错误恢复。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,这是 Java EE 中用于将普通 Java 类标记为 Servlet 的注解,
// 通过该注解可以指定 Servlet 的访问路径,使得客户端能够通过特定的 URL 来访问该 Servlet。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本结构和方法。
// 我们定义的 Servlet 类继承它,从而具备处理 HTTP 请求的能力。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等内容Servlet 可以通过它获取客户端传递的数据。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等Servlet 可以利用它设置并返回响应数据给客户端。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出操作(如网络传输、文件读写等)出现错误时,
// 会抛出 IOException 异常,以便进行相应的错误处理。
import java.sql.ResultSet;
// 导入 ResultSet 类,它用于表示数据库查询结果集。当执行 SQL 查询语句后,
// 数据库返回的数据会被封装在 ResultSet 对象中,通过它可以遍历和获取查询结果的每一行数据。
@WebServlet("/DeptQueryTeaByIdServlet")
// 使用 WebServlet 注解将 DeptQueryTeaByIdServlet 类标记为一个 Servlet
// 并指定其访问路径为 /DeptQueryTeaByIdServlet客户端可以通过这个路径向该 Servlet 发送请求。
public class DeptQueryTeaByIdServlet extends HttpServlet {
// 定义一个名为 DeptQueryTeaByIdServlet 的类,继承自 HttpServlet 类,
// 使其成为一个能够处理 HTTP 请求的 Servlet可响应客户端的 GET 和 POST 请求。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,用于处理客户端发送的 HTTP GET 请求。
// 该方法接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常。
req.setCharacterEncoding("utf-8");
// 设置请求的字符编码为 UTF - 8确保服务器能够正确处理包含中文等特殊字符的请求参数
// 避免出现乱码问题,保证请求数据的准确解析。
resp.setCharacterEncoding("utf-8");
// 设置响应的字符编码为 UTF - 8保证返回给客户端的内容能够正确显示中文等特殊字符
// 确保响应数据的正确呈现,避免客户端显示乱码。
resp.setContentType("text/html;charset=utf-8");
// 设置响应的内容类型为 text/html并指定字符编码为 UTF - 8
// 告知客户端返回的是 HTML 格式的内容,以便客户端正确解析和显示响应信息。
String tno = req.getParameter("tno");
// 从 HTTP 请求中获取名为 "tno" 的参数值,该参数代表教师编号,
// 用于后续根据教师编号查询教师信息。
String sql = null;
// 声明一个字符串变量 sql用于存储即将执行的 SQL 语句,初始值设为 null
// 后续会根据业务逻辑动态地构建和赋值 SQL 语句。
Object[] objects = {tno};
// 创建一个 Object 类型的数组 objects将 tno 作为元素存储在数组中,
// 这个数组将作为参数传递给数据库操作方法,用于绑定 SQL 语句中的占位符。
System.out.println(tno);
// 在控制台打印获取到的教师编号 tno用于调试目的方便开发人员查看参数值是否正确。
//查询是否存在此人
sql = "select count(*) as num from teacher where tno = ?";
// 定义一个 SQL 查询语句,用于查询 teacher 表中,教师编号为 tno 的记录数量。
// 使用占位符 ? 来提高 SQL 语句的安全性,防止 SQL 注入攻击,并将查询结果的数量别名为 num。
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,执行上述 SQL 查询语句,
// 并将查询结果(符合条件的记录数量)赋值给整数变量 count
// 通过这个数量可以判断数据库中是否存在该教师编号对应的教师记录。
if (count > 0) { //有则继续操作
// 如果查询到的记录数量 count 大于 0说明数据库中存在该教师编号对应的教师记录
// 可以继续执行后续的查询和处理操作。
sql = "select * from teacher where tno = ?";
// 定义一个新的 SQL 查询语句,用于查询 teacher 表中,教师编号为 tno 的所有字段信息。
// 同样使用占位符 ? 来确保 SQL 语句的安全性。
ResultSet resultSet = DeptAdminDao.qureyInfo(sql, objects);
// 调用 DeptAdminDao 类的 qureyInfo 方法,执行上述 SQL 查询语句,
// 并将查询结果存储在 ResultSet 对象 resultSet 中,以便后续遍历和处理。
Teacher teacher = new Teacher();
// 创建一个 Teacher 对象 teacher用于存储从数据库中查询到的教师信息。
try {
while (resultSet.next()){
// 遍历 ResultSet 对象,每次移动到下一行数据。
// 如果有数据resultSet.next() 返回 true则将当前行的数据赋值给 teacher 对象的相应属性。
teacher.setTno(resultSet.getString("tno"));
// 将查询结果中 "tno" 字段的值(教师编号)设置为 teacher 对象的 tno 属性。
teacher.setTname(resultSet.getString("tname"));
// 将查询结果中 "tname" 字段的值(教师姓名)设置为 teacher 对象的 tname 属性。
teacher.setTsex(resultSet.getString("tsex"));
// 将查询结果中 "tsex" 字段的值(教师性别)设置为 teacher 对象的 tsex 属性。
teacher.setTage(resultSet.getInt("tage"));
// 将查询结果中 "tage" 字段的值(教师年龄)设置为 teacher 对象的 tage 属性,
// 并将其转换为整数类型。
teacher.setTdept(resultSet.getString("tdept"));
// 将查询结果中 "tdept" 字段的值(教师所属部门)设置为 teacher 对象的 tdept 属性。
teacher.setTphone(resultSet.getString("tphone"));
// 将查询结果中 "tphone" 字段的值(教师联系电话)设置为 teacher 对象的 tphone 属性。
teacher.setTpsw(resultSet.getString("tpsw"));
// 将查询结果中 "tpsw" 字段的值(教师密码)设置为 teacher 对象的 tpsw 属性。
}
} catch (Exception e) {
e.printStackTrace();
// 如果在遍历和设置属性的过程中出现异常,打印异常堆栈信息,
// 以便开发人员进行调试和错误排查。
}finally {
JDBCUtils.close(resultSet);
// 无论是否发生异常,都要关闭 ResultSet 对象,释放数据库资源,
// 调用 JDBCUtils 类的 close 方法来关闭 resultSet。
}
System.out.println(teacher.getTsex());
// 在控制台打印教师对象的性别属性,用于调试目的,方便开发人员查看查询结果是否正确。
req.setAttribute("teacher", teacher);
// 将 teacher 对象设置为请求的属性,键为 "teacher"
// 这样在后续的页面中可以通过这个键获取到 teacher 对象,从而展示教师信息。
req.getRequestDispatcher("/view/deptadmin/altertea.jsp").forward(req, resp);
// 将请求转发到 /view/deptadmin/altertea.jsp 页面,
// 并将包含教师信息的 teacher 对象传递到该页面,以便进行教师信息的修改操作。
}else {
req.getRequestDispatcher("/view/alluse/noexistdataofalter.jsp").forward(req, resp);
// 如果查询到的记录数量 count 不大于 0即数据库中不存在该教师编号对应的教师记录
// 将请求转发到 /view/alluse/noexistdataofalter.jsp 页面,
// 该页面用于提示用户没有可修改的数据,给用户一个明确的反馈。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,用于处理客户端发送的 HTTP POST 请求。
// 该方法接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常。
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同,
// 这样可以避免重复编写相似的代码,提高代码的复用性和可维护性。
}
}
}

@ -1,81 +1,216 @@
package com.controller.deptadmin;
// 声明该类所在的包为 com.controller.deptadmin包机制用于组织和管理相关的类
// 便于在项目中对代码进行分类管理,避免类名冲突,提高代码的可读性和可维护性。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类通常封装了与数据库交互的操作方法,
// 例如执行 SQL 查询、插入、更新和删除等操作。后续代码会使用该类的方法来查询教师的相关信息。
import com.entity.Teacher;
// 导入自定义的 Teacher 实体类,用于封装教师的各种信息,
// 如教师编号tno、教师姓名tname、性别tsex、年龄tage、所属部门tdept
// 联系电话tphone、密码tpsw等。在后续代码中将从数据库查询到的教师信息存储到该实体类对象中。
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 工具类,一般包含与 JDBCJava Database Connectivity
// 相关的通用方法,如获取数据库连接、关闭连接、处理结果集等,
// 用于简化数据库操作流程,提高代码的可维护性和复用性。在本代码中,会使用该类关闭数据库查询结果集。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在运行过程中出现异常情况,
// 如请求处理失败、资源加载错误、内部逻辑错误等,会抛出 ServletException 异常,
// 以便在代码中进行异常处理,确保程序的稳定性和可靠性。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,这是 Java EE 中用于将普通 Java 类标记为 Servlet 的注解。
// 通过该注解可以指定 Servlet 的访问路径,使得客户端能够通过特定的 URL 来访问该 Servlet
// 从而实现客户端与服务器之间的交互。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本框架和方法。
// 我们定义的 Servlet 类继承 HttpServlet 类,从而获得处理 HTTP 请求的能力,
// 能够响应客户端发送的 GET 和 POST 请求。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等内容。Servlet 可以通过这个类获取客户端传递的数据,
// 以便根据这些数据进行相应的业务逻辑处理。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等。Servlet 可以利用这个类来设置并返回给客户端相应的响应数据,
// 以满足客户端的需求。
import javax.servlet.http.HttpSession;
// 导入 HttpSession 类,用于管理用户的会话状态,能够在用户的多次请求之间存储和共享数据,
// 例如用户的登录信息、权限信息、所属部门等。在本 Servlet 中,将使用它来获取用户所属部门等会话信息。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出相关的操作(如网络数据传输、文件读写等)时,
// 如果出现错误,就会抛出 IOException 异常,以便进行相应的错误处理,保证程序的正常运行。
import java.sql.ResultSet;
// 导入 ResultSet 类,用于表示数据库查询结果集。当执行 SQL 查询语句后,
// 数据库返回的数据会被封装在 ResultSet 对象中,通过它可以遍历和获取查询结果的每一行数据,
// 以便进行进一步的处理和分析。
@WebServlet("/DeptQueryTeaByIdServlet1")
// 使用 WebServlet 注解将 DeptQueryTeaByIdServlet1 类标记为一个 Servlet
// 并指定其访问路径为 /DeptQueryTeaByIdServlet1这样客户端就可以通过这个路径向该 Servlet 发送请求,
// 从而触发该 Servlet 中的业务逻辑处理。
public class DeptQueryTeaByIdServlet1 extends HttpServlet {
// 定义一个名为 DeptQueryTeaByIdServlet1 的类,继承自 HttpServlet 类,
// 使其成为一个可以处理 HTTP 请求的 Servlet能够响应客户端发送的 GET 和 POST 请求,
// 并实现根据教师编号和所属部门查询教师信息的功能。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,该方法专门用于处理客户端发送的 HTTP GET 请求。
// 它接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误情况。
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 tno = req.getParameter("tno");
// 从 HTTP 请求中获取名为 "tno" 的参数值,并将其赋值给字符串变量 tno。
// 这里的 tno 代表教师编号,用于后续根据该编号查询教师的信息。
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话。
// 通过会话对象可以存储和获取用户在会话期间的相关信息,如用户所属部门等。
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本用于从会话中获取名为 "userName" 的属性值,
// 但在当前代码中未被使用,可能是根据实际需求进行了调整或暂时不需要该功能。
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本用于从会话中获取名为 "sno" 的属性值,
// 这里的变量名与前面获取请求参数的 tno 不同,且在当前代码中未被使用,
// 可能是后续功能的预留或不再需要该属性值。
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其赋值给字符串变量 belong。
// 这里的 belong 可能代表用户所属的部门信息,用于后续的数据库查询条件。
System.out.println(belong);
// 在控制台打印 belong 的值,用于调试目的,方便开发人员查看从会话中获取的部门信息是否正确,
// 帮助进行问题排查和代码调试。
String sql = null;
// 声明一个字符串变量 sql用于存储即将执行的 SQL 语句,初始值设为 null
// 后续会根据业务逻辑动态地构建和赋值 SQL 语句。
Object[] objects = {tno, belong};
// 创建一个 Object 类型的数组 objects将 tno 和 belong 作为元素存储在数组中,
// 这个数组将作为参数传递给数据库操作方法,用于绑定 SQL 语句中的占位符,
// 以提高 SQL 语句的安全性和灵活性。
System.out.println(tno);
// 在控制台打印获取到的教师编号 tno用于调试目的方便开发人员查看参数值是否正确。
//查询是否存在此人
sql = "select count(*) as num from teacher where tno = ? and tdept = ?";
// 定义一个 SQL 查询语句,用于查询 teacher 表中,教师编号为 tno 且所属部门为 belong 的记录数量。
// 使用占位符? 来提高 SQL 语句的安全性,防止 SQL 注入攻击,并将查询结果的数量别名为 num。
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,执行上述 SQL 查询语句,
// 并将查询结果(符合条件的记录数量)赋值给整数变量 count
// 通过这个数量可以判断数据库中是否存在该教师在指定部门的记录。
if (count > 0) { //有则继续操作
// 如果查询到的记录数量 count 大于 0说明数据库中存在该教师在指定部门的记录
// 可以继续执行后续的查询和处理操作。
sql = "select * from teacher where tno = ? and tdept = ?";
// 定义一个新的 SQL 查询语句,用于查询 teacher 表中,教师编号为 tno 且所属部门为 belong 的所有字段信息。
// 同样使用占位符? 来确保 SQL 语句的安全性。
ResultSet resultSet = DeptAdminDao.qureyInfo(sql, objects);
// 调用 DeptAdminDao 类的 qureyInfo 方法,执行上述 SQL 查询语句,
// 并将查询结果存储在 ResultSet 对象 resultSet 中,以便后续遍历和处理。
Teacher teacher = new Teacher();
// 创建一个 Teacher 对象 teacher用于存储从数据库中查询到的教师信息。
try {
while (resultSet.next()){
// 遍历 ResultSet 对象,每次移动到下一行数据。
// 如果有数据resultSet.next() 返回 true则将当前行的数据赋值给 teacher 对象的相应属性。
teacher.setTno(resultSet.getString("tno"));
// 将查询结果中 "tno" 字段的值(教师编号)设置为 teacher 对象的 tno 属性。
teacher.setTname(resultSet.getString("tname"));
// 将查询结果中 "tname" 字段的值(教师姓名)设置为 teacher 对象的 tname 属性。
teacher.setTsex(resultSet.getString("tsex"));
// 将查询结果中 "tsex" 字段的值(教师性别)设置为 teacher 对象的 tsex 属性。
teacher.setTage(resultSet.getInt("tage"));
// 将查询结果中 "tage" 字段的值(教师年龄)设置为 teacher 对象的 tage 属性,
// 并将其转换为整数类型。
teacher.setTdept(resultSet.getString("tdept"));
// 将查询结果中 "tdept" 字段的值(教师所属部门)设置为 teacher 对象的 tdept 属性。
teacher.setTphone(resultSet.getString("tphone"));
// 将查询结果中 "tphone" 字段的值(教师联系电话)设置为 teacher 对象的 tphone 属性。
teacher.setTpsw(resultSet.getString("tpsw"));
// 将查询结果中 "tpsw" 字段的值(教师密码)设置为 teacher 对象的 tpsw 属性。
}
} catch (Exception e) {
e.printStackTrace();
// 如果在遍历和设置属性的过程中出现异常,打印异常堆栈信息,
// 以便开发人员进行调试和错误排查。
}finally {
JDBCUtils.close(resultSet);
// 无论是否发生异常,都要关闭 ResultSet 对象,释放数据库资源,
// 调用 JDBCUtils 类的 close 方法来关闭 resultSet。
}
System.out.println(teacher.getTsex());
// 在控制台打印教师对象的性别属性,用于调试目的,方便开发人员查看查询结果是否正确。
req.setAttribute("teacher", teacher);
// 将 teacher 对象设置为请求的属性,键为 "teacher"
// 这样在后续的页面中可以通过这个键获取到 teacher 对象,从而展示教师信息。
req.getRequestDispatcher("/view/deptadmin/altertea.jsp").forward(req, resp);
// 将请求转发到 /view/deptadmin/altertea.jsp 页面,
// 并将包含教师信息的 teacher 对象传递到该页面,以便进行教师信息的修改操作。
}else {
req.getRequestDispatcher("/view/alluse/noexistdataofalter.jsp").forward(req, resp);
// 如果查询到的记录数量 count 不大于 0即数据库中不存在该教师在指定部门的记录
// 将请求转发到 /view/alluse/noexistdataofalter.jsp 页面,
// 该页面用于提示用户没有可修改的数据,给用户一个明确的反馈。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,该方法用于处理客户端发送的 HTTP POST 请求。
// 它接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误情况。
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同,
// 这样可以避免重复编写相似的代码,提高代码的复用性和可维护性。
}
}
}

@ -1,173 +1,285 @@
package com.controller.deptadmin;
// 声明该类所属的包为 com.controller.deptadmin包机制用于组织和管理相关的类
// 便于代码的维护和查找,避免类名冲突,体现项目的逻辑结构。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类通常封装了与数据库交互的操作方法,
// 如执行 SQL 查询、插入、更新和删除等操作。后续代码会使用这些方法来实现对教师信息的查询和统计等功能。
import com.dao.StuDao;
// 导入自定义的 StuDao 类,虽然类名是 StuDao学生数据访问对象
// 但在本代码中用于执行教师信息的分页查询操作(调用了其 QureyInfoByPage 方法),
// 可能该类也包含一些通用的分页查询方法。
import com.entity.PageBean;
// 导入自定义的 PageBean 实体类,用于封装分页相关的信息,
// 如当前页码、每页显示的记录数、总记录数、总页数以及数据列表等,
// 用于管理和传递教师信息分页查询的结果。
import com.entity.Student;
// 导入自定义的 Student 实体类,在当前代码中未使用该类,
// 可能是项目中其他部分会用到,或者是在代码的扩展过程中预留的。
import com.entity.Teacher;
// 导入自定义的 Teacher 实体类,用于封装教师的相关信息,
// 如教师编号、姓名、性别、年龄、所属部门、联系电话、密码等,
// 后续会用它来存储从数据库查询到的教师信息。
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 工具类,一般包含与 JDBCJava Database Connectivity
// 相关的通用方法,如获取数据库连接、关闭数据库连接、处理结果集等,
// 用于简化数据库操作流程,提高代码的可维护性和复用性。在本代码中,
// 会使用该类的方法来关闭数据库查询结果集ResultSet释放数据库资源。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在运行过程中出现异常情况时,
// 如请求处理失败、资源加载错误、内部逻辑错误等,会抛出 ServletException 异常,
// 以便进行相应的异常处理和错误恢复,确保系统的稳定性和可靠性。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,这是 Java EE 中用于将普通 Java 类标记为 Servlet 的注解。
// 通过该注解可以指定 Servlet 的访问路径,使得客户端能够通过特定的 URL 来访问该 Servlet
// 从而实现与服务器的交互。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本框架和方法。
// 我们定义的 Servlet 类继承 HttpServlet 类,从而获得处理 HTTP 请求的能力,
// 能够响应客户端发送的 GET 和 POST 请求。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等内容。Servlet 可以通过这个类获取客户端传递的各种数据,
// 以便根据这些数据进行相应的业务逻辑处理,如获取教师信息查询的条件参数和分页参数等。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等。Servlet 可以利用这个类来设置并返回给客户端相应的响应数据,
// 以满足客户端的需求,如设置响应的字符编码和内容类型,以及将查询结果页面转发给客户端等。
import javax.servlet.http.HttpSession;
// 导入 HttpSession 类,用于管理用户的会话状态,能够在用户的多次请求之间存储和共享数据,
// 例如用户的登录信息、权限信息、所属部门等。在本 Servlet 中,将使用它来获取用户所属部门等会话信息,
// 作为教师信息查询的条件之一。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出相关的操作(如网络数据传输、文件读写等)时,
// 如果出现错误,就会抛出 IOException 异常,以便进行相应的错误处理,
// 保证系统在面对异常情况时能够做出合理的响应。
import java.sql.ResultSet;
// 导入 ResultSet 类,用于表示数据库查询结果集。当执行 SQL 查询语句后,
// 数据库返回的数据会被封装在 ResultSet 对象中,通过它可以遍历和获取查询结果的每一行数据,
// 以便进行进一步的处理和分析,如将查询到的教师信息存储到 Teacher 对象中。
import java.util.ArrayList;
// 导入 ArrayList 类,它是 Java 集合框架中的一种动态数组实现。
// 可以用来存储和管理一组对象,并且可以根据需要动态地增加或减少元素数量。
// 在本 Servlet 中,将使用 ArrayList 来存储从数据库查询到的教师对象Teacher
@WebServlet("/DeptQueryTeaByPageServlet")
// 使用 WebServlet 注解将 DeptQueryTeaByPageServlet 类标记为一个 Servlet
// 并指定其访问路径为 /DeptQueryTeaByPageServlet这样客户端就可以通过这个路径向该 Servlet 发送请求,
// 从而触发该 Servlet 中的业务逻辑处理,实现教师信息的分页查询功能。
public class DeptQueryTeaByPageServlet extends HttpServlet {
// 定义一个名为 DeptQueryTeaByPageServlet 的类,继承自 HttpServlet 类,
// 使其成为一个可以处理 HTTP 请求的 Servlet能够响应客户端发送的 GET 和 POST 请求,
// 并实现根据条件分页查询教师信息的功能。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,该方法专门用于处理客户端发送的 HTTP GET 请求。
// 它接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误情况。
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 tno = req.getParameter("tno");
// 从 HTTP 请求中获取名为 "tno" 的参数值,并将其赋值给字符串变量 tno。
// 这里的 tno 代表教师编号,用于后续根据教师编号进行模糊查询教师信息。
String tname = req.getParameter("tname");
String tsex = req.getParameter("tsex");
// 从 HTTP 请求中获取名为 "tname" 的参数值,并将其赋值给字符串变量 tname。
// 这里的 tname 代表教师姓名,用于后续根据教师姓名进行模糊查询教师信息。
String tsex = req.getParameter("tsex");
// 从 HTTP 请求中获取名为 "tsex" 的参数值,并将其赋值给字符串变量 tsex。
// 这里的 tsex 代表教师性别,用于后续根据教师性别进行模糊查询教师信息。
//如果传入的参数为null则置为空字符串
if (tno == null){
tno = "";
}
// 如果获取到的教师编号参数 tno 为 null则将其设置为空字符串
// 以确保后续的模糊查询能够正常进行,避免空指针异常。
if (tname == null){
tname = "";
}
// 如果获取到的教师姓名参数 tname 为 null则将其设置为空字符串
// 以确保后续的模糊查询能够正常进行,避免空指针异常。
if (tsex == null){
tsex = "";
}
// 如果获取到的教师性别参数 tsex 为 null则将其设置为空字符串
// 以确保后续的模糊查询能够正常进行,避免空指针异常。
//变为like查询所需的字符串参数
String tno1 = "%" + tno + "%";
// 将教师编号参数 tno 转换为适合 SQL 模糊查询LIKE 语句)的字符串格式,
// 在 tno 的前后添加通配符 "%",以便查询包含该编号片段的教师记录。
String tname1 = "%" + tname + "%";
// 将教师姓名参数 tname 转换为适合 SQL 模糊查询LIKE 语句)的字符串格式,
// 在 tname 的前后添加通配符 "%",以便查询包含该姓名片段的教师记录。
String tsex1 = "%" + tsex + "%";
// 将教师性别参数 tsex 转换为适合 SQL 模糊查询LIKE 语句)的字符串格式,
// 在 tsex 的前后添加通配符 "%",以便查询包含该性别片段的教师记录。
//设置请求的属性参数,后面需要用
req.setAttribute("tno",tno);
// 将原始的教师编号参数 tno 设置为请求的属性,键为 "tno"
// 以便在后续的页面中可以通过这个键获取到该参数值,用于展示查询条件或进行其他操作。
req.setAttribute("tname",tname);
// 将原始的教师姓名参数 tname 设置为请求的属性,键为 "tname"
// 以便在后续的页面中可以通过这个键获取到该参数值,用于展示查询条件或进行其他操作。
req.setAttribute("tsex", tsex);
// 将原始的教师性别参数 tsex 设置为请求的属性,键为 "tsex"
// 以便在后续的页面中可以通过这个键获取到该参数值,用于展示查询条件或进行其他操作。
System.out.println(tno1);
// 在控制台打印转换后的教师编号模糊查询参数 tno1用于调试目的
// 方便开发人员查看转换后的参数是否正确。
System.out.println(tname1);
System.out.println(tsex1);
// 在控制台打印转换后的教师姓名模糊查询参数 tname1用于调试目的
// 方便开发人员查看转换后的参数是否正确。
System.out.println(tsex1);
// 在控制台打印转换后的教师性别模糊查询参数 tsex1用于调试目的
// 方便开发人员查看转换后的参数是否正确。
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话。
// 通过会话对象可以存储和获取用户在会话期间的相关信息,如用户所属部门等。
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本用于从会话中获取名为 "userName" 的属性值,
// 但在当前代码中未被使用,可能是根据实际需求进行了调整或暂时不需要该功能。
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本用于从会话中获取名为 "sno" 的属性值,
// 这里的变量名与前面获取请求参数的 tno、tname、tsex 等不同,
// 且在当前代码中未被使用,可能是后续功能的预留或不再需要该属性值。
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其赋值给字符串变量 belong。
// 这里的 belong 可能代表用户所属的部门信息,用于后续的数据库查询条件,
// 确保查询的教师信息是该部门下的教师记录。
String sql = null;
// 声明一个字符串变量 sql用于存储即将执行的 SQL 语句,初始值设为 null
// 后续会根据业务逻辑动态地构建和赋值 SQL 语句。
// System.out.println(userName);
// 注释掉的代码,原本用于在控制台打印从会话中获取的用户名 userName
// 但由于该变量未被使用,所以此打印语句也被注释掉。
// System.out.println(sno);
// 注释掉的代码,原本用于在控制台打印从会话中获取的学生编号 sno
// 但由于该变量未被使用,所以此打印语句也被注释掉。
System.out.println(belong);
// 在控制台打印从会话中获取的用户所属部门信息 belong用于调试目的
// 方便开发人员查看获取到的部门信息是否正确。
System.out.println("hdghghjg");
// 在控制台打印字符串 "hdghghjg",可能是开发人员用于调试或标记的输出内容,
// 可以帮助确定代码执行到的位置。
String currentPage = req.getParameter("currentPage");//从请求对象中获取当前页码
// 从 HTTP 请求中获取名为 "currentPage" 的参数值,并将其赋值给字符串变量 currentPage。
// 这里的 currentPage 代表当前页码,用于实现分页查询功能。
String rows = req.getParameter("rows");//从请求获取对象中每页显示的行数
// 从 HTTP 请求中获取名为 "rows" 的参数值,并将其赋值给字符串变量 rows。
// 这里的 rows 代表每页显示的记录数,用于实现分页查询功能。
//如果未设请求参数,此处自动设置参数为第一页
if (currentPage == null || "".equals(currentPage)){
currentPage = "1";
}
// 如果获取到的当前页码参数 currentPage 为 null 或空字符串,则将其设置为 "1"
// 即默认显示第一页的教师信息,确保分页查询的正常进行。
//如果没有设置rows的请求参数此处自动设置
if (rows == null || "".equals(rows)){
rows = "7";
}
// 如果获取到的每页显示行数参数 rows 为 null 或空字符串,则将其设置为 "7"
// 即默认每页显示 7 条教师记录,确保分页查询的正常进行。
//获取条件查询的参数
int currentPage1 = Integer.parseInt(currentPage);
// 将字符串类型的当前页码参数 currentPage 转换为整数类型,并赋值给变量 currentPage1
// 以便后续进行计算和处理。
int rows1 = Integer.parseInt(rows);
// 将字符串类型的每页显示行数参数 rows 转换为整数类型,并赋值给变量 rows1
// 以便后续进行计算和处理。
//如果当前页数小于1则设置当前页数为1
if (currentPage1 <= 0){
currentPage1 = 1;
}
// 如果转换后的当前页码 currentPage1 小于等于 0则将其设置为 1
// 确保当前页码是有效的,避免出现负数或零页码的情况。
//设置StuPunch类的对象类型
PageBean<Teacher> pageBean = new PageBean<Teacher>();
// 创建一个 PageBean 对象 pageBean泛型类型为 Teacher用于封装分页查询教师信息的相关信息
//设置当前页码
pageBean.setCurrentPage(currentPage1);
// 将当前页码 currentPage1 设置到 pageBean 对象中,以便在后续处理中使用。
//设置每页的记录数
pageBean.setRows(rows1);
// 将每页显示的记录数 rows1 设置到 pageBean 对象中,以便在后续处理中使用。
sql = " select count(*) as num from teacher where tno like ? and tname like ? and tsex like ? and tdept = ?";
// 定义一个 SQL 查询语句,用于查询 teacher 表中,满足教师编号模糊匹配、
// 教师姓名模糊匹配、教师性别模糊匹配且所属部门为 belong 的记录数量。
// 使用占位符? 来提高 SQL 语句的安全性,防止 SQL 注入攻击,并将查询结果的数量别名为 num。
Object[] objects = {tno1, tname1, tsex1, belong};
// 创建一个 Object 类型的数组 objects将转换后的模糊查询参数 tno1、tname1、tsex1
// 和所属部门信息 belong 作为元素存储在数组中,这个数组将作为参数传递给数据库操作方法,
// 用于绑定 SQL 语句中的占位符。
/* sql = " select count(*) as num from teacher where tdept = ?";
Object[] objects = {belong};*/
// 注释掉的代码,原本是一个简单的 SQL 查询语句,用于查询所属部门为 belong 的教师记录数量,
// 可能由于业务需求的变化,现在使用更复杂的带模糊查询条件的语句,所以将其注释掉。
//计算总记录数,并设置
int totalCount = DeptAdminDao.findTotalCount(sql, objects);
System.out.println(totalCount);
pageBean.setTotalCount(totalCount);
if (totalCount > 0){
//计算总页码,并设置
int totalPage = (totalCount % rows1) == 0 ? totalCount/rows1 : (totalCount/rows1 + 1);
pageBean.setTotalPage(totalPage);
//如果当前页数大于总页数
if (currentPage1 > pageBean.getTotalPage()){
currentPage1 = pageBean.getTotalPage();
//重新设置当前页码
pageBean.setCurrentPage(currentPage1);
}
//计算开始的记录和list对象集合并设置
int start = (currentPage1 - 1) * rows1;
sql = "select * from teacher where tno like ? and tname like ? and tsex like ? and tdept = ? limit ?, ?";
Object[] objects1 = {tno1, tname1, tsex1, belong, start, rows1};
/* sql = "select * from teacher where tdept = ? limit ?, ?";
Object[] objects1 = {belong, start, rows1};*/
ResultSet resultSet = StuDao.QureyInfoByPage(sql, objects1);
ArrayList teaArrayList = new ArrayList();
try {
while (resultSet.next()){
Teacher teacher = new Teacher();
teacher.setTno(resultSet.getString("tno"));
teacher.setTname(resultSet.getString("tname"));
teacher.setTsex(resultSet.getString("tsex"));
teacher.setTage(resultSet.getInt("tage"));
teacher.setTdept(resultSet.getString("tdept"));
teacher.setTphone(resultSet.getString("tphone"));
teacher.setTpsw(resultSet.getString("tpsw"));
teaArrayList.add(teacher);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.close(resultSet);
}
pageBean.setArrayList(teaArrayList);
System.out.println(teaArrayList);
System.out.println(pageBean);
req.setAttribute("pageBean", pageBean);
req.getRequestDispatcher("/view/deptadmin/teainfolist.jsp").forward(req, resp);
}else {
req.getRequestDispatcher("/view/alluse/nodata.jsp").forward(req, resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
// 调用 DeptAdminDao 类的 findTotalCount 方法,执行上述 SQL 查询语句,
// 并将查询结果(符合条件的记录数量)赋值给

@ -1,75 +1,198 @@
package com.controller.deptadmin;
// 声明该类所在的包为 com.controller.deptadmin包用于组织和管理相关的类
// 避免类名冲突,同时也方便代码的维护和查找,体现了项目的逻辑结构。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类通常封装了与数据库交互的操作方法,
// 如执行 SQL 查询、插入、更新和删除等操作。后续代码会使用该类的方法来查询教师打卡信息。
import com.entity.StuPunch;
// 导入自定义的 StuPunch 实体类,在当前代码中未使用该类,
// 可能是项目中其他部分会用到,或者是在代码的扩展过程中预留的。
import com.entity.TeaPunch;
// 导入自定义的 TeaPunch 实体类,用于封装教师打卡的相关信息,
// 如教师编号、教师姓名、是否打卡、打卡日期、打卡时间、身体状况等。
// 后续会用它来存储从数据库查询到的教师打卡信息。
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 工具类,一般包含了与 JDBCJava Database Connectivity
// 相关的通用方法,例如获取数据库连接、关闭数据库连接、处理结果集等,
// 用于简化数据库操作的流程,提高代码的可维护性和复用性。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在执行过程中出现异常情况,
// 如请求处理失败、资源加载错误等,会抛出 ServletException 异常,
// 用于在代码中进行异常处理和错误恢复。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,这是 Java EE 中用于将普通 Java 类标记为 Servlet 的注解,
// 通过该注解可以指定 Servlet 的访问路径,使得客户端能够通过特定的 URL 来访问该 Servlet。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本结构和方法。
// 我们定义的 Servlet 类继承它,从而具备处理 HTTP 请求的能力。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等内容Servlet 可以通过它获取客户端传递的数据。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等Servlet 可以利用它设置并返回响应数据给客户端。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出操作(如网络传输、文件读写等)出现错误时,
// 会抛出 IOException 异常,以便进行相应的错误处理。
import java.sql.ResultSet;
// 导入 ResultSet 类,它用于表示数据库查询结果集。当执行 SQL 查询语句后,
// 数据库返回的数据会被封装在 ResultSet 对象中,通过它可以遍历和获取查询结果的每一行数据。
@WebServlet("/DeptQueryTeaPunchByIdServlet")
// 使用 WebServlet 注解将 DeptQueryTeaPunchByIdServlet 类标记为一个 Servlet
// 并指定其访问路径为 /DeptQueryTeaPunchByIdServlet客户端可以通过这个路径向该 Servlet 发送请求。
public class DeptQueryTeaPunchByIdServlet extends HttpServlet {
// 定义一个名为 DeptQueryTeaPunchByIdServlet 的类,继承自 HttpServlet 类,
// 使其成为一个能够处理 HTTP 请求的 Servlet可响应客户端的 GET 和 POST 请求。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,用于处理客户端发送的 HTTP GET 请求。
// 该方法接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常。
req.setCharacterEncoding("utf-8");
// 设置请求的字符编码为 UTF - 8确保服务器能够正确处理包含中文等特殊字符的请求参数
// 避免出现乱码问题,保证请求数据的准确解析。
resp.setCharacterEncoding("utf-8");
// 设置响应的字符编码为 UTF - 8保证返回给客户端的内容能够正确显示中文等特殊字符
// 确保响应数据的正确呈现,避免客户端显示乱码。
resp.setContentType("text/html;charset=utf-8");
// 设置响应的内容类型为 text/html并指定字符编码为 UTF - 8
// 告知客户端返回的是 HTML 格式的内容,以便客户端正确解析和显示响应信息。
//获取请求参数
String tno = req.getParameter("tno");
// 从 HTTP 请求中获取名为 "tno" 的参数值,该参数代表教师编号,
// 用于后续根据教师编号查询教师打卡信息。
String tpunchdate = req.getParameter("tpunchdate");
// 从 HTTP 请求中获取名为 "tpunchdate" 的参数值,该参数代表教师打卡日期,
// 用于后续根据打卡日期查询教师打卡信息。
String sql = null;
// 声明一个字符串变量 sql用于存储即将执行的 SQL 语句,初始值设为 null
// 后续会根据业务逻辑动态地构建和赋值 SQL 语句。
Object[] objects = {tno, tpunchdate};
// 创建一个 Object 类型的数组 objects将 tno 和 tpunchdate 作为元素存储在数组中,
// 这个数组将作为参数传递给数据库操作方法,用于绑定 SQL 语句中的占位符。
//查询是否存在此人
sql = "select count(*) as num from teapunchin where tno = ? and tpunchdate = ?";
// 定义一个 SQL 查询语句,用于查询 teapunchin 表中,教师编号为 tno 且打卡日期为 tpunchdate 的记录数量。
// 使用占位符 ? 来提高 SQL 语句的安全性,防止 SQL 注入攻击,并将查询结果的数量别名为 num。
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,执行上述 SQL 查询语句,
// 并将查询结果(符合条件的记录数量)赋值给整数变量 count
// 通过这个数量可以判断数据库中是否存在该教师在指定日期的打卡记录。
if (count > 0){ //有则继续操作
// 如果查询到的记录数量 count 大于 0说明数据库中存在该教师在指定日期的打卡记录
// 可以继续执行后续的查询和处理操作。
sql = "select t.tname,tp.* from teacher t,teapunchin tp where t.tno = tp.tno and tp.tno = ? and tp.tpunchdate = ?";
// 定义一个新的 SQL 查询语句,用于查询 teacher 表和 teapunchin 表关联后的信息,
// 选取教师姓名t.tname和 teapunchin 表的所有字段tp.*),条件是教师编号匹配且打卡日期匹配。
// 同样使用占位符 ? 来确保 SQL 语句的安全性。
ResultSet resultSet = DeptAdminDao.qureyInfo(sql, objects);
// 调用 DeptAdminDao 类的 qureyInfo 方法,执行上述 SQL 查询语句,
// 并将查询结果存储在 ResultSet 对象 resultSet 中,以便后续遍历和处理。
TeaPunch teaPunch = new TeaPunch();
// 创建一个 TeaPunch 对象 teaPunch用于存储从数据库中查询到的教师打卡信息。
try {
while (resultSet.next()){
// 遍历 ResultSet 对象,每次移动到下一行数据。
// 如果有数据resultSet.next() 返回 true则将当前行的数据赋值给 teaPunch 对象的相应属性。
teaPunch.setTno(resultSet.getString("tno"));
// 将查询结果中 "tno" 字段的值(教师编号)设置为 teaPunch 对象的 tno 属性。
teaPunch.setTname(resultSet.getString("tname"));
// 将查询结果中 "tname" 字段的值(教师姓名)设置为 teaPunch 对象的 tname 属性。
teaPunch.setTispunch(resultSet.getString("tispunch"));
// 将查询结果中 "tispunch" 字段的值(是否打卡)设置为 teaPunch 对象的 tispunch 属性。
teaPunch.setTpunchdate(resultSet.getDate("tpunchdate"));
// 将查询结果中 "tpunchdate" 字段的值(打卡日期)设置为 teaPunch 对象的 tpunchdate 属性,
// 并将其转换为 java.sql.Date 类型。
teaPunch.setTpunchtime(resultSet.getString("tpunchtime"));
// 将查询结果中 "tpunchtime" 字段的值(打卡时间)设置为 teaPunch 对象的 tpunchtime 属性。
teaPunch.setTishot(resultSet.getString("tishot"));
// 将查询结果中 "tishot" 字段的值(是否发热)设置为 teaPunch 对象的 tishot 属性。
teaPunch.setTiscough(resultSet.getString("tiscough"));
// 将查询结果中 "tiscough" 字段的值(是否咳嗽)设置为 teaPunch 对象的 tiscough 属性。
teaPunch.setTisseem(resultSet.getString("tisseem"));
// 将查询结果中 "tisseem" 字段的值(是否有疑似症状)设置为 teaPunch 对象的 tisseem 属性。
teaPunch.setTisdiagnose(resultSet.getString("tisdiagnose"));
// 将查询结果中 "tisdiagnose" 字段的值(是否确诊)设置为 teaPunch 对象的 tisdiagnose 属性。
teaPunch.setTstatus(resultSet.getString("tstatus"));
// 将查询结果中 "tstatus" 字段的值(教师状态)设置为 teaPunch 对象的 tstatus 属性。
}
} catch (Exception e) {
e.printStackTrace();
// 如果在遍历和设置属性的过程中出现异常,打印异常堆栈信息,
// 以便开发人员进行调试和错误排查。
}finally {
JDBCUtils.close(resultSet);
// 无论是否发生异常,都要关闭 ResultSet 对象,释放数据库资源,
// 调用 JDBCUtils 类的 close 方法来关闭 resultSet。
}
System.out.println(teaPunch.getTno());
// 在控制台打印教师打卡对象的教师编号属性,用于调试目的,方便开发人员查看查询结果是否正确。
System.out.println(teaPunch.getTname());
// 在控制台打印教师打卡对象的教师姓名属性,用于调试目的,方便开发人员查看查询结果是否正确。
req.setAttribute("teaPunch", teaPunch);
// 将 teaPunch 对象设置为请求的属性,键为 "teaPunch"
// 这样在后续的页面中可以通过这个键获取到 teaPunch 对象,从而展示教师打卡信息。
req.getRequestDispatcher("/view/deptadmin/alterteapunch.jsp").forward(req, resp);
// 将请求转发到 /view/deptadmin/alterteapunch.jsp 页面,
// 并将包含教师打卡信息的 teaPunch 对象传递到该页面,以便进行教师打卡信息的修改操作。
}else {
req.getRequestDispatcher("/view/alluse/noexistdataofalter.jsp").forward(req, resp);
// 如果查询到的记录数量 count 不大于 0即数据库中不存在该教师在指定日期的打卡记录
// 将请求转发到 /view/alluse/noexistdataofalter.jsp 页面,
// 该页面用于提示用户没有可修改的数据,给用户一个明确的反馈。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,用于处理客户端发送的 HTTP POST 请求。
// 该方法接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常。
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同,
// 这样可以避免重复编写相似的代码,提高代码的复用性和可维护性。
}
}
}

@ -1,83 +1,229 @@
package com.controller.deptadmin;
// 声明该类所属的包为 com.controller.deptadmin包机制用于对相关类进行组织管理
// 方便代码的维护与查找,避免类名冲突,体现项目的逻辑结构层次。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类通常封装了与数据库交互的操作方法,
// 例如执行 SQL 查询、插入、更新和删除等操作。后续代码会利用该类的方法实现对教师打卡信息的数据库查询。
import com.entity.TeaPunch;
// 导入自定义的 TeaPunch 实体类,用于封装教师打卡的相关信息,
// 如教师编号、教师姓名、是否打卡、打卡日期、打卡时间、身体状况等。后续会将从数据库查询到的教师打卡信息存储到该实体类对象中。
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 工具类,一般包含与 JDBCJava Database Connectivity相关的通用方法
// 如获取数据库连接、关闭数据库连接、处理结果集等。用于简化数据库操作流程,提高代码的可维护性和复用性。在本代码中,将使用该类关闭数据库查询结果集。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在运行过程中出现异常情况,
// 如请求处理失败、资源加载错误、内部逻辑错误等,会抛出 ServletException 异常,
// 以便进行相应的异常处理和错误恢复,确保系统的稳定性和可靠性。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,这是 Java EE 中用于将普通 Java 类标记为 Servlet 的注解。
// 通过该注解可以指定 Servlet 的访问路径,使得客户端能够通过特定的 URL 来访问该 Servlet
// 从而实现客户端与服务器之间的交互。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本框架和方法。
// 我们定义的 Servlet 类继承 HttpServlet 类,从而获得处理 HTTP 请求的能力,能够响应客户端发送的 GET 和 POST 请求。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等内容。Servlet 可以通过这个类获取客户端传递的数据,
// 以便根据这些数据进行相应的业务逻辑处理,如获取教师编号和打卡日期等查询参数。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等。Servlet 可以利用这个类来设置并返回给客户端相应的响应数据,
// 以满足客户端的需求,如设置响应的字符编码和内容类型,以及将查询结果页面转发给客户端等。
import javax.servlet.http.HttpSession;
// 导入 HttpSession 类,用于管理用户的会话状态,能够在用户的多次请求之间存储和共享数据,
// 例如用户的登录信息、权限信息、所属部门等。在本 Servlet 中,将使用它来获取用户所属部门等会话信息,作为查询条件之一。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出相关的操作(如网络数据传输、文件读写等)时,
// 如果出现错误,就会抛出 IOException 异常,以便进行相应的错误处理,保证系统在面对异常情况时能够做出合理的响应。
import java.sql.ResultSet;
// 导入 ResultSet 类,用于表示数据库查询结果集。当执行 SQL 查询语句后,
// 数据库返回的数据会被封装在 ResultSet 对象中,通过它可以遍历和获取查询结果的每一行数据,
// 以便进行进一步的处理和分析,如将查询到的教师打卡信息存储到 TeaPunch 对象中。
@WebServlet("/DeptQueryTeaPunchByIdServlet1")
// 使用 WebServlet 注解将 DeptQueryTeaPunchByIdServlet1 类标记为一个 Servlet
// 并指定其访问路径为 /DeptQueryTeaPunchByIdServlet1这样客户端就可以通过这个路径向该 Servlet 发送请求,
// 从而触发该 Servlet 中的业务逻辑处理,实现根据教师编号和打卡日期查询教师打卡信息的功能。
public class DeptQueryTeaPunchByIdServlet1 extends HttpServlet {
// 定义一个名为 DeptQueryTeaPunchByIdServlet1 的类,继承自 HttpServlet 类,
// 使其成为一个可以处理 HTTP 请求的 Servlet能够响应客户端发送的 GET 和 POST 请求,
// 并实现根据教师编号、打卡日期以及所属部门查询教师打卡信息的功能。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,该方法专门用于处理客户端发送的 HTTP GET 请求。
// 它接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误情况。
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 tno = req.getParameter("tno");
// 从 HTTP 请求中获取名为 "tno" 的参数值,并将其赋值给字符串变量 tno。
// 这里的 tno 代表教师编号,用于后续根据该编号查询教师的打卡信息。
String tpunchdate = req.getParameter("tpunchdate");
// 从 HTTP 请求中获取名为 "tpunchdate" 的参数值,并将其赋值给字符串变量 tpunchdate。
// 这里的 tpunchdate 代表教师打卡日期,用于后续根据该日期查询教师的打卡信息。
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话。
// 通过会话对象可以存储和获取用户在会话期间的相关信息,如用户所属部门等。
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本用于从会话中获取名为 "userName" 的属性值,
// 但在当前代码中未被使用,可能是根据实际需求进行了调整或暂时不需要该功能。
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本用于从会话中获取名为 "sno" 的属性值,
// 这里的变量名与前面获取请求参数的 tno 不同,且在当前代码中未被使用,
// 可能是后续功能的预留或不再需要该属性值。
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其赋值给字符串变量 belong。
// 这里的 belong 可能代表用户所属的部门信息,用于后续的数据库查询条件,
// 确保查询的教师打卡信息是该部门下的教师的记录。
System.out.println(belong);
// 在控制台打印 belong 的值,用于调试目的,方便开发人员查看从会话中获取的部门信息是否正确,
// 帮助进行问题排查和代码调试。
String sql = null;
// 声明一个字符串变量 sql用于存储即将执行的 SQL 语句,初始值设为 null
// 后续会根据业务逻辑动态地构建和赋值 SQL 语句。
Object[] objects = {tno, tpunchdate, belong};
// 创建一个 Object 类型的数组 objects将 tno、tpunchdate 和 belong 作为元素存储在数组中,
// 这个数组将作为参数传递给数据库操作方法,用于绑定 SQL 语句中的占位符,
// 以提高 SQL 语句的安全性和灵活性。
//查询是否存在此人
sql = "select count(*) as num from teacher t,teapunchin tp where t.tno = tp.tno and tp.tno = ? and tp.tpunchdate = ? and t.tdept = ?";
// 定义一个 SQL 查询语句,用于查询 teacher 表和 teapunchin 表中,
// 满足教师编号关联、教师编号为 tno、打卡日期为 tpunchdate 且教师所属部门为 belong 的记录数量。
// 使用占位符? 来提高 SQL 语句的安全性,防止 SQL 注入攻击,并将查询结果的数量别名为 num。
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,执行上述 SQL 查询语句,
// 并将查询结果(符合条件的记录数量)赋值给整数变量 count
// 通过这个数量可以判断数据库中是否存在该教师在指定部门、指定日期的打卡记录。
if (count > 0){ //有则继续操作
// 如果查询到的记录数量 count 大于 0说明数据库中存在该教师在指定部门、指定日期的打卡记录
// 可以继续执行后续的查询和处理操作。
sql = "select t.tname,tp.* from teacher t,teapunchin tp where t.tno = tp.tno and tp.tno = ? and tp.tpunchdate = ? and t.tdept = ?";
// 定义一个新的 SQL 查询语句,用于查询 teacher 表和 teapunchin 表关联后的信息,
// 选取教师姓名t.tname和 teapunchin 表的所有字段tp.*
// 条件是教师编号匹配、教师编号为 tno、打卡日期为 tpunchdate 且教师所属部门为 belong。
// 同样使用占位符? 来确保 SQL 语句的安全性。
ResultSet resultSet = DeptAdminDao.qureyInfo(sql, objects);
// 调用 DeptAdminDao 类的 qureyInfo 方法,执行上述 SQL 查询语句,
// 并将查询结果存储在 ResultSet 对象 resultSet 中,以便后续遍历和处理。
TeaPunch teaPunch = new TeaPunch();
// 创建一个 TeaPunch 对象 teaPunch用于存储从数据库中查询到的教师打卡信息。
try {
while (resultSet.next()){
// 遍历 ResultSet 对象,每次移动到下一行数据。
// 如果有数据resultSet.next() 返回 true则将当前行的数据赋值给 teaPunch 对象的相应属性。
teaPunch.setTno(resultSet.getString("tno"));
// 将查询结果中 "tno" 字段的值(教师编号)设置为 teaPunch 对象的 tno 属性。
teaPunch.setTname(resultSet.getString("tname"));
// 将查询结果中 "tname" 字段的值(教师姓名)设置为 teaPunch 对象的 tname 属性。
teaPunch.setTispunch(resultSet.getString("tispunch"));
// 将查询结果中 "tispunch" 字段的值(是否打卡)设置为 teaPunch 对象的 tispunch 属性。
teaPunch.setTpunchdate(resultSet.getDate("tpunchdate"));
// 将查询结果中 "tpunchdate" 字段的值(打卡日期)设置为 teaPunch 对象的 tpunchdate 属性,
// 并将其转换为 java.sql.Date 类型。
teaPunch.setTpunchtime(resultSet.getString("tpunchtime"));
// 将查询结果中 "tpunchtime" 字段的值(打卡时间)设置为 teaPunch 对象的 tpunchtime 属性。
teaPunch.setTishot(resultSet.getString("tishot"));
// 将查询结果中 "tishot" 字段的值(是否发热)设置为 teaPunch 对象的 tishot 属性。
teaPunch.setTiscough(resultSet.getString("tiscough"));
// 将查询结果中 "tiscough" 字段的值(是否咳嗽)设置为 teaPunch 对象的 tiscough 属性。
teaPunch.setTisseem(resultSet.getString("tisseem"));
// 将查询结果中 "tisseem" 字段的值(是否有疑似症状)设置为 teaPunch 对象的 tisseem 属性。
teaPunch.setTisdiagnose(resultSet.getString("tisdiagnose"));
// 将查询结果中 "tisdiagnose" 字段的值(是否确诊)设置为 teaPunch 对象的 tisdiagnose 属性。
teaPunch.setTstatus(resultSet.getString("tstatus"));
// 将查询结果中 "tstatus" 字段的值(教师状态)设置为 teaPunch 对象的 tstatus 属性。
}
} catch (Exception e) {
e.printStackTrace();
// 如果在遍历和设置属性的过程中出现异常,打印异常堆栈信息,
// 以便开发人员进行调试和错误排查。
}finally {
JDBCUtils.close(resultSet);
// 无论是否发生异常,都要关闭 ResultSet 对象,释放数据库资源,
// 调用 JDBCUtils 类的 close 方法来关闭 resultSet。
}
System.out.println(teaPunch.getTno());
// 在控制台打印教师打卡对象的教师编号属性,用于调试目的,方便开发人员查看查询结果是否正确。
System.out.println(teaPunch.getTname());
// 在控制台打印教师打卡对象的教师姓名属性,用于调试目的,方便开发人员查看查询结果是否正确。
req.setAttribute("teaPunch", teaPunch);
// 将 teaPunch 对象设置为请求的属性,键为 "teaPunch"
// 这样在后续的页面中可以通过这个键获取到 teaPunch 对象,从而展示教师打卡信息。
req.getRequestDispatcher("/view/deptadmin/alterteapunch.jsp").forward(req, resp);
// 将请求转发到 /view/deptadmin/alterteapunch.jsp 页面,
// 并将包含教师打卡信息的 teaPunch 对象传递到该页面,以便进行教师打卡信息的修改操作。
}else {
req.getRequestDispatcher("/view/alluse/noexistdataofalter.jsp").forward(req, resp);
// 如果查询到的记录数量 count 不大于 0即数据库中不存在该教师在指定部门、指定日期的打卡记录
// 将请求转发到 /view/alluse/noexistdataofalter.jsp 页面,
// 该页面用于提示用户没有可修改的数据,给用户一个明确的反馈。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,该方法用于处理客户端发送的 HTTP POST 请求。
// 它接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误情况。
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同,
// 这样可以避免重复编写相似的代码,提高代码的复用性和可维护性。
}
}
}

@ -1,174 +1,282 @@
package com.controller.deptadmin;
// 声明该类所在的包为 com.controller.deptadmin包机制用于组织和管理相关的类
// 避免类名冲突,同时方便代码的维护和查找,体现项目的逻辑结构层次。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类通常封装了与数据库交互的操作方法,
// 如执行 SQL 查询、插入、更新、删除等操作。后续代码会使用该类的方法来计算总记录数等数据库操作。
import com.dao.StuDao;
// 导入自定义的 StuDao 类,虽然类名是 StuDao学生数据访问对象
// 但在本代码中用于执行教师打卡信息的分页查询操作(调用了其 QureyInfoByPage 方法),
// 可能该类也包含一些通用的分页查询方法。
import com.entity.PageBean;
// 导入自定义的 PageBean 实体类,用于封装分页相关的信息,
// 如当前页码、每页显示的记录数、总记录数、总页数以及数据列表等,
// 用于管理和传递教师打卡信息分页查询的结果。
import com.entity.StuPunch;
// 导入自定义的 StuPunch 实体类,在当前代码中未使用该类,
// 可能是项目中其他部分会用到,或者是在代码的扩展过程中预留的。
import com.entity.Student;
// 导入自定义的 Student 实体类,在当前代码中未使用该类,
// 可能是项目中其他部分会用到,或者是在代码的扩展过程中预留的。
import com.entity.TeaPunch;
// 导入自定义的 TeaPunch 实体类,用于封装教师打卡的相关信息,
// 如教师编号、教师姓名、是否打卡、打卡日期、打卡时间、身体状况等。
// 后续会用它来存储从数据库查询到的教师打卡信息。
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 工具类,一般包含与 JDBCJava Database Connectivity
// 相关的通用方法,如获取数据库连接、关闭数据库连接、处理结果集等,
// 用于简化数据库操作流程,提高代码的可维护性和复用性。在本代码中,
// 会使用该类的方法来关闭数据库查询结果集ResultSet释放数据库资源。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在运行过程中出现异常情况时,
// 如请求处理失败、资源加载错误、内部逻辑错误等,会抛出 ServletException 异常,
// 以便进行相应的异常处理和错误恢复,确保系统的稳定性和可靠性。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,这是 Java EE 中用于将普通 Java 类标记为 Servlet 的注解。
// 通过该注解可以指定 Servlet 的访问路径,使得客户端能够通过特定的 URL 来访问该 Servlet
// 从而实现客户端与服务器之间的交互。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本框架和方法。
// 我们定义的 Servlet 类继承 HttpServlet 类,从而获得处理 HTTP 请求的能力,
// 能够响应客户端发送的 GET 和 POST 请求。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等内容。Servlet 可以通过这个类获取客户端传递的数据,
// 以便根据这些数据进行相应的业务逻辑处理,如获取教师打卡信息查询的条件参数和分页参数等。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等。Servlet 可以利用这个类来设置并返回给客户端相应的响应数据,
// 以满足客户端的需求,如设置响应的字符编码和内容类型,以及将查询结果页面转发给客户端等。
import javax.servlet.http.HttpSession;
// 导入 HttpSession 类,用于管理用户的会话状态,能够在用户的多次请求之间存储和共享数据,
// 例如用户的登录信息、权限信息、所属部门等。在本 Servlet 中,将使用它来获取用户所属部门等会话信息,
// 作为教师打卡信息查询的条件之一。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出相关的操作(如网络数据传输、文件读写等)时,
// 如果出现错误,就会抛出 IOException 异常,以便进行相应的错误处理,
// 保证系统在面对异常情况时能够做出合理的响应。
import java.sql.ResultSet;
// 导入 ResultSet 类,用于表示数据库查询结果集。当执行 SQL 查询语句后,
// 数据库返回的数据会被封装在 ResultSet 对象中,通过它可以遍历和获取查询结果的每一行数据,
// 以便进行进一步的处理和分析,如将查询到的教师打卡信息存储到 TeaPunch 对象中。
import java.util.ArrayList;
// 导入 ArrayList 类,它是 Java 集合框架中的一种动态数组实现。
// 可以用来存储和管理一组对象,并且可以根据需要动态地增加或减少元素数量。
// 在本 Servlet 中,将使用 ArrayList 来存储从数据库查询到的教师打卡对象TeaPunch
@WebServlet("/DeptQueryTeaPunchByPageServlet")
// 使用 WebServlet 注解将 DeptQueryTeaPunchByPageServlet 类标记为一个 Servlet
// 并指定其访问路径为 /DeptQueryTeaPunchByPageServlet这样客户端就可以通过这个路径向该 Servlet 发送请求,
// 从而触发该 Servlet 中的业务逻辑处理,实现教师打卡信息的分页查询功能。
public class DeptQueryTeaPunchByPageServlet extends HttpServlet {
// 定义一个名为 DeptQueryTeaPunchByPageServlet 的类,继承自 HttpServlet 类,
// 使其成为一个可以处理 HTTP 请求的 Servlet能够响应客户端发送的 GET 和 POST 请求,
// 并实现根据条件分页查询教师打卡信息的功能。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,该方法专门用于处理客户端发送的 HTTP GET 请求。
// 它接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误情况。
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 tno = req.getParameter("tno");
// 从 HTTP 请求中获取名为 "tno" 的参数值,并将其赋值给字符串变量 tno。
// 这里的 tno 代表教师编号,用于后续根据教师编号进行模糊查询教师打卡信息。
String tname = req.getParameter("tname");
// 从 HTTP 请求中获取名为 "tname" 的参数值,并将其赋值给字符串变量 tname。
// 这里的 tname 代表教师姓名,用于后续根据教师姓名进行模糊查询教师打卡信息。
String tpunchdate = req.getParameter("tpunchdate");
// 从 HTTP 请求中获取名为 "tpunchdate" 的参数值,并将其赋值给字符串变量 tpunchdate。
// 这里的 tpunchdate 代表教师打卡日期,用于后续根据打卡日期进行模糊查询教师打卡信息。
System.out.println(tno);
// 在控制台打印获取到的教师编号参数 tno用于调试目的方便开发人员查看参数值是否正确。
System.out.println(tname);
System.out.println(tpunchdate);
// 在控制台打印获取到的教师姓名参数 tname用于调试目的方便开发人员查看参数值是否正确。
System.out.println(tpunchdate);
// 在控制台打印获取到的教师打卡日期参数 tpunchdate用于调试目的方便开发人员查看参数值是否正确。
//如果传入的参数为null则置为空字符串
if (tno == null){
tno = "";
}
// 如果获取到的教师编号参数 tno 为 null则将其设置为空字符串
// 以确保后续的模糊查询能够正常进行,避免空指针异常。
if (tname == null){
tname = "";
}
// 如果获取到的教师姓名参数 tname 为 null则将其设置为空字符串
// 以确保后续的模糊查询能够正常进行,避免空指针异常。
if (tpunchdate == null){
tpunchdate = "";
}
// 如果获取到的教师打卡日期参数 tpunchdate 为 null则将其设置为空字符串
// 以确保后续的模糊查询能够正常进行,避免空指针异常。
//变为like查询所需的字符串参数
String tno1 = "%" + tno + "%";
// 将教师编号参数 tno 转换为适合 SQL 模糊查询LIKE 语句)的字符串格式,
// 在 tno 的前后添加通配符 "%",以便查询包含该编号片段的教师打卡记录。
String tname1 = "%" + tname + "%";
// 将教师姓名参数 tname 转换为适合 SQL 模糊查询LIKE 语句)的字符串格式,
// 在 tname 的前后添加通配符 "%",以便查询包含该姓名片段的教师打卡记录。
String tpunchdate1 = "%" + tpunchdate + "%";
// 将教师打卡日期参数 tpunchdate 转换为适合 SQL 模糊查询LIKE 语句)的字符串格式,
// 在 tpunchdate 的前后添加通配符 "%",以便查询包含该日期片段的教师打卡记录。
//设置请求的属性参数,后面需要用
req.setAttribute("tno", tno);
// 将原始的教师编号参数 tno 设置为请求的属性,键为 "tno"
// 以便在后续的页面中可以通过这个键获取到该参数值,用于展示查询条件或进行其他操作。
req.setAttribute("tname",tname);
// 将原始的教师姓名参数 tname 设置为请求的属性,键为 "tname"
// 以便在后续的页面中可以通过这个键获取到该参数值,用于展示查询条件或进行其他操作。
req.setAttribute("tpunchdate",tpunchdate);
// 将原始的教师打卡日期参数 tpunchdate 设置为请求的属性,键为 "tpunchdate"
// 以便在后续的页面中可以通过这个键获取到该参数值,用于展示查询条件或进行其他操作。
System.out.println(tno1);
// 在控制台打印转换后的教师编号模糊查询参数 tno1用于调试目的
// 方便开发人员查看转换后的参数是否正确。
System.out.println(tname1);
// 在控制台打印转换后的教师姓名模糊查询参数 tname1用于调试目的
// 方便开发人员查看转换后的参数是否正确。
System.out.println(tpunchdate1);
// 在控制台打印转换后的教师打卡日期模糊查询参数 tpunchdate1用于调试目的
// 方便开发人员查看转换后的参数是否正确。
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话。
// 通过会话对象可以存储和获取用户在会话期间的相关信息,如用户所属部门等。
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本用于从会话中获取名为 "userName" 的属性值,
// 但在当前代码中未被使用,可能是根据实际需求进行了调整或暂时不需要该功能。
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本用于从会话中获取名为 "sno" 的属性值,
// 这里的变量名与前面获取请求参数的 tno、tname、tpunchdate 等不同,
// 且在当前代码中未被使用,可能是后续功能的预留或不再需要该属性值。
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其赋值给字符串变量 belong。
// 这里的 belong 可能代表用户所属的部门信息,用于后续的数据库查询条件,
// 确保查询的教师打卡信息是该部门下的教师的记录。
String sql = null;
// 声明一个字符串变量 sql用于存储即将执行的 SQL 语句,初始值设为 null
// 后续会根据业务逻辑动态地构建和赋值 SQL 语句。
// System.out.println(userName);
// 注释掉的代码,原本用于在控制台打印从会话中获取的用户名 userName
// 但由于该变量未被使用,所以此打印语句也被注释掉。
// System.out.println(sno);
// 注释掉的代码,原本用于在控制台打印从会话中获取的学生编号 sno
// 但由于该变量未被使用,所以此打印语句也被注释掉。
System.out.println(belong);
// 在控制台打印从会话中获取的用户所属部门信息 belong用于调试目的
// 方便开发人员查看获取到的部门信息是否正确。
System.out.println("hdghghjg");
// 在控制台打印字符串 "hdghghjg",可能是开发人员用于调试或标记的输出内容,
// 可以帮助确定代码执行到的位置。
String currentPage = req.getParameter("currentPage");//从请求对象中获取当前页码
// 从 HTTP 请求中获取名为 "currentPage" 的参数值,并将其赋值给字符串变量 currentPage。
// 这里的 currentPage 代表当前页码,用于实现分页查询功能。
String rows = req.getParameter("rows");//从请求获取对象中每页显示的行数
// 从 HTTP 请求中获取名为 "rows" 的参数值,并将其赋值给字符串变量 rows。
// 这里的 rows 代表每页显示的记录数,用于实现分页查询功能。
//如果未设请求参数,此处自动设置参数为第一页
if (currentPage == null || "".equals(currentPage)){
currentPage = "1";
}
// 如果获取到的当前页码参数 currentPage 为 null 或空字符串,则将其设置为 "1"
// 即默认显示第一页的教师打卡信息,确保分页查询的正常进行。
//如果没有设置rows的请求参数此处自动设置
if (rows == null || "".equals(rows)){
rows = "8";
}
// 如果获取到的每页显示行数参数 rows 为 null 或空字符串,则将其设置为 "8"
// 即默认每页显示 8 条教师打卡记录,确保分页查询的正常进行。
//获取条件查询的参数
int currentPage1 = Integer.parseInt(currentPage);
// 将字符串类型的当前页码参数 currentPage 转换为整数类型,并赋值给变量 currentPage1
// 以便后续进行计算和处理。
int rows1 = Integer.parseInt(rows);
// 将字符串类型的每页显示行数参数 rows 转换为整数类型,并赋值给变量 rows1
// 以便后续进行计算和处理。
//如果当前页数小于1则设置当前页数为1
if (currentPage1 <= 0){
currentPage1 = 1;
}
// 如果转换后的当前页码 currentPage1 小于等于 0则将其设置为 1
// 确保当前页码是有效的,避免出现负数或零页码的情况。
//设置StuPunch类的对象类型
PageBean<TeaPunch> pageBean = new PageBean<TeaPunch>();
// 创建一个 PageBean 对象 pageBean泛型类型为 TeaPunch用于封装分页查询教师打卡信息的相关信息。
//设置当前页码
pageBean.setCurrentPage(currentPage1);
// 将当前页码 currentPage1 设置到 pageBean 对象中,以便在后续处理中使用。
//设置每页的记录数
pageBean.setRows(rows1);
// 将每页显示的记录数 rows1 设置到 pageBean 对象中,以便在后续处理中使用。
sql = " select count(*) as num from teacher t, teapunchin tp where t.tno = tp.tno and t.tno like ? and t.tname like ? and tp.tpunchdate like ? and t.tdept = ?";
Object[] objects = {tno1, tname1, tpunchdate1, belong};
//计算总记录数,并设置
int totalCount = DeptAdminDao.findTotalCount(sql, objects);
System.out.println(totalCount);
pageBean.setTotalCount(totalCount);
if (totalCount > 0){
//计算总页码,并设置
int totalPage = (totalCount % rows1) == 0 ? totalCount/rows1 : (totalCount/rows1 + 1);
pageBean.setTotalPage(totalPage);
//如果当前页数大于总页数
if (currentPage1 > pageBean.getTotalPage()){
currentPage1 = pageBean.getTotalPage();
//重新设置当前页码
pageBean.setCurrentPage(currentPage1);
}
//计算开始的记录和list对象集合并设置
int start = (currentPage1 - 1) * rows1;
sql = "select t.tname, tp.* from teacher t, teapunchin tp where t.tno = tp.tno and t.tno like ? and t.tname like ? and tp.tpunchdate like ? and t.tdept = ? limit ?, ?";
Object[] objects1 = {tno1, tname1, tpunchdate1, belong, start, rows1};
ResultSet resultSet = StuDao.QureyInfoByPage(sql, objects1);
ArrayList teaPunchArrayList = new ArrayList();
try {
while (resultSet.next()){
TeaPunch teaPunch = new TeaPunch();
teaPunch.setTno(resultSet.getString("tno"));
teaPunch.setTname(resultSet.getString("tname"));
teaPunch.setTispunch(resultSet.getString("tispunch"));
teaPunch.setTpunchdate(resultSet.getDate("tpunchdate"));
teaPunch.setTpunchtime(resultSet.getString("tpunchtime"));
teaPunch.setTishot(resultSet.getString("tishot"));
teaPunch.setTiscough(resultSet.getString("tiscough"));
teaPunch.setTisseem(resultSet.getString("tisseem"));
teaPunch.setTisdiagnose(resultSet.getString("tisdiagnose"));
teaPunch.setTstatus(resultSet.getString("tstatus"));
teaPunchArrayList.add(teaPunch);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.close(resultSet);
}
pageBean.setArrayList(teaPunchArrayList);
System.out.println(teaPunchArrayList);
System.out.println(pageBean);
req.setAttribute("pageBean", pageBean);
req.getRequestDispatcher("/view/deptadmin/teapunchlist.jsp").forward(req, resp);
}else {
req.getRequestDispatcher("/view/alluse/nodata.jsp").forward(req, resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
// 定义一个 SQL 查询语句,用于查询 teacher 表和 teapunchin 表中,
// 满足教师编号关联、教师编号模糊匹配、教师姓名模糊匹配、打卡日期模糊匹配且教师所属部门为 belong 的记录数量。

@ -1,167 +1,317 @@
package com.controller.schoadmin;
// 声明该类所属的包为 com.controller.schoadmin用于组织和管理与学校管理员相关的控制器类
import com.dao.DeptAdminDao;
// 导入 DeptAdminDao 类,该类通常封装了与部门管理相关的数据访问方法,用于执行数据库操作,如查询记录总数等
import com.dao.StuDao;
// 导入 StuDao 类,它是用于学生数据访问的类,可执行与学生信息相关的数据库查询操作
import com.entity.PageBean;
// 导入 PageBean 类,这是一个自定义的分页信息封装类,用于存储分页相关的信息,如当前页码、每页记录数、总记录数等
import com.entity.Student;
// 导入 Student 类,这是学生实体类,用于封装学生的各种属性,如学号、姓名、性别等
import com.utils.JDBCUtils;
// 导入 JDBCUtils 类,它是一个工具类,通常包含了与 JDBCJava Database Connectivity操作相关的工具方法如获取数据库连接、关闭连接、处理结果集等
import javax.servlet.ServletException;
// 导入 ServletException 类,用于处理 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 javax.servlet.http.HttpSession;
// 导入 HttpSession 接口,用于管理用户会话,存储用户在一次会话期间的相关信息,如用户登录状态、用户信息等
import java.io.IOException;
// 导入 IOException 类,用于处理输入输出操作中可能出现的异常情况,如网络传输异常等
import java.sql.ResultSet;
// 导入 ResultSet 接口,用于表示数据库查询的结果集,通过该接口可以遍历和获取查询结果中的每一行数据
import java.util.ArrayList;
// 导入 ArrayList 类,它是一个动态数组,用于存储和管理多个对象,这里用于存储查询到的学生信息
@WebServlet("/SchoQueryStuByPageServlet")
// 使用 WebServlet 注解将当前类标记为一个 Servlet并指定其访问路径为 /SchoQueryStuByPageServlet客户端可以通过该路径访问该 Servlet
public class SchoQueryStuByPageServlet extends HttpServlet {
// 定义一个公共类 SchoQueryStuByPageServlet继承自 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 sname = req.getParameter("sname");
// 从请求中获取名为 "sname" 的参数值,该参数可能表示学生姓名,存储在字符串变量 sname 中
String sclass = req.getParameter("sclass");
String sdept = req.getParameter("sdept");
// 从请求中获取名为 "sclass" 的参数值,该参数可能表示学生班级,存储在字符串变量 sclass 中
String sdept = req.getParameter("sdept");
// 从请求中获取名为 "sdept" 的参数值,该参数可能表示学生所在部门,存储在字符串变量 sdept 中
//如果传入的参数为null则置为空字符串
if (sname == null){
sname = "";
}
// 如果 sname 参数为 null将其设置为空字符串避免后续操作出现空指针异常
if (sclass == null){
sclass = "";
}
// 如果 sclass 参数为 null将其设置为空字符串避免后续操作出现空指针异常
if (sdept == null){
sdept = "";
}
// 如果 sdept 参数为 null将其设置为空字符串避免后续操作出现空指针异常
//变为like查询所需的字符串参数
String sname1 = "%" + sname + "%";
// 在 sname 前后添加 % 符号,用于模糊查询,匹配包含 sname 字符串的学生姓名
String sclass1 = "%" + sclass + "%";
// 在 sclass 前后添加 % 符号,用于模糊查询,匹配包含 sclass 字符串的学生班级
String sdept1 = "%" + sdept + "%";
// 在 sdept 前后添加 % 符号,用于模糊查询,匹配包含 sdept 字符串的学生所在部门
//设置请求的属性参数,后面需要用
req.setAttribute("sname",sname);
// 将 sname 参数设置为请求的属性,方便后续页面或其他处理使用
req.setAttribute("sclass", sclass);
// 将 sclass 参数设置为请求的属性,方便后续页面或其他处理使用
req.setAttribute("sdept",sdept);
// 将 sdept 参数设置为请求的属性,方便后续页面或其他处理使用
System.out.println(sname1);
// 将 sname1 的值输出到控制台,用于调试目的,查看模糊查询的学生姓名参数
System.out.println(sclass1);
// 将 sclass1 的值输出到控制台,用于调试目的,查看模糊查询的学生班级参数
System.out.println(sdept1);
// 将 sdept1 的值输出到控制台,用于调试目的,查看模糊查询的学生所在部门参数
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本是从会话中获取名为 "userName" 的属性值,并将其转换为字符串类型存储在 userName 变量中
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本是从会话中获取名为 "sno" 的属性值,并将其转换为字符串类型存储在 sno 变量中
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其转换为字符串类型存储在 belong 变量中,该属性可能表示用户所属的部门或角色等信息
String sql = null;
// 声明一个字符串变量 sql用于存储 SQL 查询语句,初始值为 null
// System.out.println(userName);
// 注释掉的代码,原本是将 userName 的值输出到控制台,用于调试目的
// System.out.println(sno);
// 注释掉的代码,原本是将 sno 的值输出到控制台,用于调试目的
System.out.println(belong);
// 将 belong 的值输出到控制台,用于调试目的
System.out.println("hdghghjg");
// 输出一个调试信息,用于确认代码执行到此处
String currentPage = req.getParameter("currentPage");//从请求对象中获取当前页码
// 从请求中获取名为 "currentPage" 的参数值,该参数表示当前页码
String rows = req.getParameter("rows");//从请求获取对象中每页显示的行数
// 从请求中获取名为 "rows" 的参数值,该参数表示每页显示的记录数
//如果未设请求参数,此处自动设置参数为第一页
if (currentPage == null || "".equals(currentPage)){
currentPage = "1";
}
// 如果当前页码参数为空或未设置,将当前页码设置为 1
//如果没有设置rows的请求参数此处自动设置
if (rows == null || "".equals(rows)){
rows = "7";
}
// 如果每页显示的记录数参数为空或未设置,将每页显示的记录数设置为 7
//获取条件查询的参数
int currentPage1 = Integer.parseInt(currentPage);
// 将当前页码字符串转换为整数类型
int rows1 = Integer.parseInt(rows);
// 将每页显示的记录数字符串转换为整数类型
//如果当前页数小于1则设置当前页数为1
if (currentPage1 <= 0){
currentPage1 = 1;
}
// 如果当前页码小于等于 0将当前页码设置为 1
//设置StuPunch类的对象类型
PageBean<Student> pageBean = new PageBean<Student>();
// 创建一个 PageBean 类的对象 pageBean泛型指定为 Student 类型,用于存储学生信息的分页数据
//设置当前页码
pageBean.setCurrentPage(currentPage1);
// 将当前页码设置到 pageBean 对象中
//设置每页的记录数
pageBean.setRows(rows1);
// 将每页显示的记录数设置到 pageBean 对象中
sql = " select count(*) as num from student where sname like ? and sclass like ? and sdept like ?";
// 定义一个 SQL 查询语句,用于查询满足条件(学生姓名、班级、部门模糊匹配)的学生记录总数
Object[] objects = {sname1, sclass1, sdept1};
// 创建一个 Object 类型的数组 objects将模糊查询所需的参数放入数组中
//计算总记录数,并设置
int totalCount = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,传入 SQL 查询语句和查询参数数组,执行查询并返回满足条件的记录总数
System.out.println(totalCount);
// 将总记录数输出到控制台,用于调试目的
pageBean.setTotalCount(totalCount);
// 将总记录数设置到 pageBean 对象中
if (totalCount > 0){
// 如果总记录数大于 0说明存在满足条件的记录
//计算总页码,并设置
int totalPage = (totalCount % rows1) == 0 ? totalCount/rows1 : (totalCount/rows1 + 1);
// 根据总记录数和每页显示的记录数计算总页码,如果总记录数能被每页记录数整除,则总页码为总记录数除以每页记录数;否则,总页码为总记录数除以每页记录数加 1
pageBean.setTotalPage(totalPage);
// 将总页码设置到 pageBean 对象中
//如果当前页数大于总页数
if (currentPage1 > pageBean.getTotalPage()){
currentPage1 = pageBean.getTotalPage();
// 如果当前页码大于总页码,将当前页码设置为总页码
//重新设置当前页码
pageBean.setCurrentPage(currentPage1);
// 将更新后的当前页码重新设置到 pageBean 对象中
}
//计算开始的记录和list对象集合并设置
int start = (currentPage1 - 1) * rows1;
// 根据当前页码和每页显示的记录数计算当前页的起始记录索引
sql = "select * from student where sname like ? and sclass like ? and sdept like ? limit ?, ?";
// 定义一个 SQL 查询语句,用于查询当前页的学生信息,使用 limit 关键字进行分页查询
Object[] objects1 = {sname1, sclass1, sdept1, start, rows1};
// 创建一个 Object 类型的数组 objects1将模糊查询所需的参数和分页参数放入数组中
ResultSet resultSet = StuDao.QureyInfoByPage(sql, objects1);
// 调用 StuDao 类的 QureyInfoByPage 方法,传入 SQL 查询语句和查询参数数组,执行查询并返回结果集
ArrayList stuArrayList = new ArrayList();
// 创建一个 ArrayList 对象,用于存储查询到的学生信息
try {
while (resultSet.next()){
// 遍历结果集,每次循环处理结果集中的一行数据
Student student = new Student();
// 创建一个 Student 类的对象,用于存储当前行的学生信息
student.setSno(resultSet.getString("sno"));
// 从结果集中获取名为 "sno" 的列的值,并将其设置到 student 对象的 sno 属性中
student.setSname(resultSet.getString("sname"));
// 从结果集中获取名为 "sname" 的列的值,并将其设置到 student 对象的 sname 属性中
student.setSsex(resultSet.getString("ssex"));
// 从结果集中获取名为 "ssex" 的列的值,并将其设置到 student 对象的 ssex 属性中
student.setSage(resultSet.getInt("sage"));
// 从结果集中获取名为 "sage" 的列的值,并将其设置到 student 对象的 sage 属性中
student.setSclass(resultSet.getString("sclass"));
// 从结果集中获取名为 "sclass" 的列的值,并将其设置到 student 对象的 sclass 属性中
student.setSpecialty(resultSet.getString("specialty"));
// 从结果集中获取名为 "specialty" 的列的值,并将其设置到 student 对象的 specialty 属性中
student.setSdept(resultSet.getString("sdept"));
// 从结果集中获取名为 "sdept" 的列的值,并将其设置到 student 对象的 sdept 属性中
student.setSphone(resultSet.getString("sphone"));
// 从结果集中获取名为 "sphone" 的列的值,并将其设置到 student 对象的 sphone 属性中
student.setSpsw(resultSet.getString("spsw"));
// 从结果集中获取名为 "spsw" 的列的值,并将其设置到 student 对象的 spsw 属性中
stuArrayList.add(student);
// 将存储了当前行学生信息的 student 对象添加到 stuArrayList 中
}
} catch (Exception e) {
e.printStackTrace();
// 捕获并处理可能出现的异常,将异常的堆栈跟踪信息输出到控制台,方便调试
}finally {
JDBCUtils.close(resultSet);
// 无论是否发生异常,最终都调用 JDBCUtils 类的 close 方法关闭结果集,释放相关资源
}
pageBean.setArrayList(stuArrayList);
// 将存储学生信息的 ArrayList 设置到 pageBean 对象中
System.out.println(stuArrayList);
// 将 stuArrayList 输出到控制台,用于调试目的
System.out.println(pageBean);
// 将 pageBean 输出到控制台,用于调试目的
req.setAttribute("pageBean", pageBean);
// 将 pageBean 对象作为属性添加到请求对象中,属性名为 "pageBean",以便在后续的 JSP 页面中可以获取该对象
req.getRequestDispatcher("/view/schoadmin/stuinfolist.jsp").forward(req, resp);
// 获取请求转发器,将请求和响应对象转发到 /view/schoadmin/stuinfolist.jsp 页面,让该页面继续处理请求并显示学生信息
}else {
req.getRequestDispatcher("/view/alluse/nodata.jsp").forward(req, resp);
// 如果总记录数为 0说明不存在满足条件的记录将请求和响应对象转发到 /view/alluse/nodata.jsp 页面,提示用户没有相关数据
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,用于处理客户端发送的 POST 请求
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同
}
}
}

@ -1,71 +1,147 @@
package com.controller.schoadmin;
// 声明该类所在的包名为 com.controller.schoadmin通常用于组织与学校管理员相关的控制器类
import com.dao.DeptAdminDao;
// 导入自定义的数据访问对象类 DeptAdminDao该类可能包含了用于执行数据库查询等操作的方法
import com.entity.StuPunch;
// 导入自定义的实体类 StuPunch用于封装学生打卡的相关信息例如学生编号、姓名、打卡状态等
import com.utils.JDBCUtils;
// 导入自定义的工具类 JDBCUtils该类可能提供了与 JDBCJava 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 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同
}
}
}

@ -1,80 +1,166 @@
package com.controller.schoadmin;
// 声明该类所在的包为 com.controller.schoadmin用于组织和管理与学校管理员相关的控制器类
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类可能封装了与数据库交互的方法,用于执行数据库查询等操作
import com.entity.StuPunch;
// 导入自定义的 StuPunch 实体类,用于封装学生打卡的相关信息,如学生编号、姓名、打卡状态等
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 类,通常包含与 JDBCJava Database Connectivity操作相关的工具方法如获取数据库连接、关闭连接、处理结果集等
import javax.servlet.ServletException;
// 导入 Servlet 异常类,用于处理 Servlet 执行过程中可能出现的异常情况
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,用于将一个普通的 Java 类标记为 Servlet并指定其访问路径
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,所有的 HTTP Servlet 都需要继承该类,并重写相应方法来处理 HTTP 请求
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 接口,用于封装客户端发送的 HTTP 请求信息,如请求参数、请求头、请求方法等
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 接口,用于封装服务器返回给客户端的 HTTP 响应信息,如响应状态码、响应头、响应内容等
import javax.servlet.http.HttpSession;
// 导入 HttpSession 接口,用于管理用户会话,存储用户在一次会话期间的相关信息,如用户登录状态、用户信息等
import java.io.IOException;
// 导入 IOException 类,用于处理输入输出操作中可能出现的异常情况,如网络传输异常等
import java.sql.ResultSet;
// 导入 ResultSet 接口,用于表示数据库查询结果集,通过该接口可以遍历查询结果中的每一行数据
@WebServlet("/SchoQueryStuPunchByIdServlet1")
// 使用 WebServlet 注解将当前类标记为一个 Servlet并指定其访问路径为 /SchoQueryStuPunchByIdServlet1客户端可通过该路径访问该 Servlet
public class SchoQueryStuPunchByIdServlet1 extends HttpServlet {
// 定义一个公共类 SchoQueryStuPunchByIdServlet1继承自 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 中
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本是从会话中获取名为 "userName" 的属性值,并将其转换为字符串类型存储在 userName 变量中
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本是从会话中获取名为 "sno" 的属性值,并将其转换为字符串类型存储在 sno 变量中
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其转换为字符串类型存储在 belong 变量中,该属性可能表示用户所属的部门或角色等信息
System.out.println(belong);
// 将 belong 变量的值输出到控制台,用于调试目的
String sql = null;
// 声明一个字符串变量 sql用于存储 SQL 查询语句,初始值为 null
Object[] objects = {sno, spunchdate};
// 创建一个 Object 类型的数组 objects将 sno 和 spunchdate 作为数组元素,用于后续的 SQL 查询参数传递
//查询是否存在此人
sql = "select count(*) as num from student s,stupunchin sp where s.sno = sp.sno and s.sno = ? and sp.spunchdate = ?";
// 定义一个 SQL 查询语句,用于查询 student 表和 stupunchin 表中,学生编号为 sno 且打卡日期为 spunchdate 的记录数量,并将结果列命名为 num
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,传入 SQL 查询语句和查询参数数组,执行查询并返回满足条件的记录数量,将结果存储在整数变量 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 查询语句和查询参数数组,执行查询并返回结果集,将结果存储在 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 对象作为属性添加到请求对象中,属性名为 "stuPunch",以便在后续的 JSP 页面中可以获取该对象
req.getRequestDispatcher("/view/schoadmin/alterstupunch.jsp").forward(req, resp);
// 获取请求转发器,将请求和响应对象转发到 /view/schoadmin/alterstupunch.jsp 页面,让该页面继续处理请求并显示学生的打卡信息用于修改
}else {
req.getRequestDispatcher("/view/alluse/noexistdataofalter.jsp").forward(req, resp);
// 如果查询到的记录数量为 0说明不存在该学生在指定日期的打卡记录则将请求和响应对象转发到 /view/alluse/noexistdataofalter.jsp 页面,提示用户没有相关数据可修改
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,用于处理客户端发送的 POST 请求
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同
}
}
}

@ -1,182 +1,319 @@
package com.controller.schoadmin;
// 声明该类所在的包为 com.controller.schoadmin用于组织和管理与学校管理员相关的控制器类
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类可能封装了与数据库交互的方法,如执行 SQL 查询、获取记录总数等操作
import com.dao.StuDao;
// 导入自定义的 StuDao 类,用于执行与学生相关的数据查询操作,如查询学生打卡信息等
import com.entity.PageBean;
// 导入自定义的 PageBean 类,用于封装分页相关的信息,如当前页码、每页记录数、总记录数、数据列表等
import com.entity.StuPunch;
// 导入自定义的 StuPunch 类,这是一个实体类,用于封装学生打卡的相关信息,如学生编号、姓名、班级、打卡状态等
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 类,通常包含与 JDBCJava Database Connectivity操作相关的工具方法如获取数据库连接、关闭连接、处理结果集等
import javax.servlet.ServletException;
// 导入 Servlet 异常类,用于处理 Servlet 执行过程中可能出现的异常情况
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,用于将一个普通的 Java 类标记为 Servlet并指定其访问路径
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,所有的 HTTP Servlet 都需要继承该类,并重写相应的方法来处理 HTTP 请求
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 接口,用于封装客户端发送的 HTTP 请求信息,如请求参数、请求头、请求方法等
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 接口,用于封装服务器返回给客户端的 HTTP 响应信息,如响应状态码、响应头、响应内容等
import javax.servlet.http.HttpSession;
// 导入 HttpSession 接口,用于管理用户会话,存储用户在一次会话期间的相关信息,如用户登录状态、用户信息等
import java.io.IOException;
// 导入 IOException 类,用于处理输入输出操作中可能出现的异常情况,如文件读取、网络传输等异常
import java.sql.ResultSet;
// 导入 ResultSet 接口,用于表示数据库查询结果集,通过该接口可以遍历和获取查询结果中的每一行数据
import java.util.ArrayList;
// 导入 ArrayList 类,用于存储和操作动态数组,这里用于存储查询到的学生打卡信息
@WebServlet("/SchoQueryStuPunchByPageServlet")
// 使用 WebServlet 注解将当前类标记为一个 Servlet并指定其访问路径为 /SchoQueryStuPunchByPageServlet客户端可以通过该路径访问该 Servlet
public class SchoQueryStuPunchByPageServlet extends HttpServlet {
// 定义一个公共类 SchoQueryStuPunchByPageServlet继承自 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 sname = req.getParameter("sname");
// 从请求中获取名为 "sname" 的参数值,该参数可能表示学生姓名,存储在字符串变量 sname 中
String sclass = req.getParameter("sclass");
// 从请求中获取名为 "sclass" 的参数值,该参数可能表示学生班级,存储在字符串变量 sclass 中
String sdept = req.getParameter("sdept");
// 从请求中获取名为 "sdept" 的参数值,该参数可能表示学生所在部门,存储在字符串变量 sdept 中
String spunchdate = req.getParameter("spunchdate");
// 从请求中获取名为 "spunchdate" 的参数值,该参数可能表示学生打卡日期,存储在字符串变量 spunchdate 中
System.out.println(sname);
// 将 sname 的值输出到控制台,用于调试目的,查看获取的学生姓名参数值
System.out.println(sclass);
// 将 sclass 的值输出到控制台,用于调试目的,查看获取的学生班级参数值
System.out.println(sdept);
System.out.println(spunchdate);
// 将 sdept 的值输出到控制台,用于调试目的,查看获取的学生所在部门参数值
System.out.println(spunchdate);
// 将 spunchdate 的值输出到控制台,用于调试目的,查看获取的学生打卡日期参数值
//如果传入的参数为null则置为空字符串
if (sname == null){
sname = "";
}
// 如果 sname 参数为 null将其设置为空字符串避免后续操作出现空指针异常
if (sclass == null){
sclass = "";
}
// 如果 sclass 参数为 null将其设置为空字符串避免后续操作出现空指针异常
if (sdept == null){
sdept = "";
}
// 如果 sdept 参数为 null将其设置为空字符串避免后续操作出现空指针异常
if (spunchdate == null){
spunchdate = "";
}
// 如果 spunchdate 参数为 null将其设置为空字符串避免后续操作出现空指针异常
//变为like查询所需的字符串参数
String sname1 = "%" + sname + "%";
// 在 sname 前后添加 % 符号,用于模糊查询,匹配包含 sname 字符串的学生姓名
String sclass1 = "%" + sclass + "%";
// 在 sclass 前后添加 % 符号,用于模糊查询,匹配包含 sclass 字符串的学生班级
String sdept1 = "%" + sdept + "%";
// 在 sdept 前后添加 % 符号,用于模糊查询,匹配包含 sdept 字符串的学生所在部门
String spunchdate1 = "%" + spunchdate + "%";
// 在 spunchdate 前后添加 % 符号,用于模糊查询,匹配包含 spunchdate 字符串的学生打卡日期
//设置请求的属性参数,后面需要用
req.setAttribute("sname",sname);
// 将 sname 参数设置为请求的属性,方便后续页面或其他处理使用
req.setAttribute("sclass", sclass);
// 将 sclass 参数设置为请求的属性,方便后续页面或其他处理使用
req.setAttribute("sdept", sdept);
// 将 sdept 参数设置为请求的属性,方便后续页面或其他处理使用
req.setAttribute("spunchdate",spunchdate);
// 将 spunchdate 参数设置为请求的属性,方便后续页面或其他处理使用
System.out.println(sname1);
// 将 sname1 的值输出到控制台,用于调试目的,查看模糊查询的学生姓名参数
System.out.println(sclass1);
// 将 sclass1 的值输出到控制台,用于调试目的,查看模糊查询的学生班级参数
System.out.println(sdept1);
// 将 sdept1 的值输出到控制台,用于调试目的,查看模糊查询的学生所在部门参数
System.out.println(spunchdate1);
// 将 spunchdate1 的值输出到控制台,用于调试目的,查看模糊查询的学生打卡日期参数
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本是从会话中获取名为 "userName" 的属性值,并将其转换为字符串类型存储在 userName 变量中
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本是从会话中获取名为 "sno" 的属性值,并将其转换为字符串类型存储在 sno 变量中
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其转换为字符串类型存储在 belong 变量中,该属性可能表示用户所属的部门或角色等信息
String sql = null;
// 声明一个字符串变量 sql用于存储 SQL 查询语句,初始值为 null
// System.out.println(userName);
// 注释掉的代码,原本是将 userName 的值输出到控制台,用于调试目的
// System.out.println(sno);
// 注释掉的代码,原本是将 sno 的值输出到控制台,用于调试目的
System.out.println(belong);
// 将 belong 的值输出到控制台,用于调试目的
System.out.println("hdghghjg");
// 输出一个调试信息,用于确认代码执行到此处
String currentPage = req.getParameter("currentPage");//从请求对象中获取当前页码
// 从请求中获取名为 "currentPage" 的参数值,该参数表示当前页码
String rows = req.getParameter("rows");//从请求获取对象中每页显示的行数
// 从请求中获取名为 "rows" 的参数值,该参数表示每页显示的记录数
//如果未设请求参数,此处自动设置参数为第一页
if (currentPage == null || "".equals(currentPage)){
currentPage = "1";
}
// 如果当前页码参数为空或未设置,将当前页码设置为 1
//如果没有设置rows的请求参数此处自动设置
if (rows == null || "".equals(rows)){
rows = "7";
}
// 如果每页显示的记录数参数为空或未设置,将每页显示的记录数设置为 7
//获取条件查询的参数
int currentPage1 = Integer.parseInt(currentPage);
// 将当前页码字符串转换为整数类型
int rows1 = Integer.parseInt(rows);
// 将每页显示的记录数字符串转换为整数类型
//如果当前页数小于1则设置当前页数为1
if (currentPage1 <= 0){
currentPage1 = 1;
}
// 如果当前页码小于等于 0将当前页码设置为 1
//设置StuPunch类的对象类型
PageBean<StuPunch> pageBean = new PageBean<StuPunch>();
// 创建一个 PageBean 类的对象 pageBean泛型指定为 StuPunch 类型,用于存储学生打卡信息的分页数据
//设置当前页码
pageBean.setCurrentPage(currentPage1);
// 将当前页码设置到 pageBean 对象中
//设置每页的记录数
pageBean.setRows(rows1);
// 将每页显示的记录数设置到 pageBean 对象中
sql = " select count(*) as num from student s, stupunchin sp where s.sno = sp.sno and s.sname like ? and s.sclass like ? and s.sdept like ? and sp.spunchdate like ?";
// 定义一个 SQL 查询语句,用于查询满足条件(学生姓名、班级、部门、打卡日期模糊匹配)的学生打卡记录总数,通过关联 student 表和 stupunchin 表
Object[] objects = {sname1, sclass1, sdept1, spunchdate1};
// 创建一个 Object 类型的数组 objects将模糊查询所需的参数放入数组中
//计算总记录数,并设置
int totalCount = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,传入 SQL 查询语句和查询参数数组,执行查询并返回满足条件的记录总数
System.out.println(totalCount);
// 将总记录数输出到控制台,用于调试目的
pageBean.setTotalCount(totalCount);
// 将总记录数设置到 pageBean 对象中
if (totalCount > 0){
// 如果总记录数大于 0说明存在满足条件的记录
//计算总页码,并设置
int totalPage = (totalCount % rows1) == 0 ? totalCount/rows1 : (totalCount/rows1 + 1);
// 根据总记录数和每页显示的记录数计算总页码,如果总记录数能被每页记录数整除,则总页码为总记录数除以每页记录数;否则,总页码为总记录数除以每页记录数加 1
pageBean.setTotalPage(totalPage);
// 将总页码设置到 pageBean 对象中
//如果当前页数大于总页数
if (currentPage1 > pageBean.getTotalPage()){
currentPage1 = pageBean.getTotalPage();
// 如果当前页码大于总页码,将当前页码设置为总页码
//重新设置当前页码
pageBean.setCurrentPage(currentPage1);
// 将更新后的当前页码重新设置到 pageBean 对象中
}
//计算开始的记录和list对象集合并设置
int start = (currentPage1 - 1) * rows1;
// 根据当前页码和每页显示的记录数计算当前页的起始记录索引
sql = "select s.sname,s.sclass,s.sdept,sp.* from student s, stupunchin sp where s.sno = sp.sno and s.sname like ? and s.sclass like ? and s.sdept like ? and sp.spunchdate like ? limit ?, ?";
// 定义一个 SQL 查询语句,用于查询当前页的学生打卡信息,使用 limit 关键字进行分页查询,通过关联 student 表和 stupunchin 表
Object[] objects1 = {sname1, sclass1, sdept1, spunchdate1, start, rows1};
// 创建一个 Object 类型的数组 objects1将模糊查询所需的参数和分页参数放入数组中
ResultSet resultSet = StuDao.QureyInfoByPage(sql, objects1);
// 调用 StuDao 类的 QureyInfoByPage 方法,传入 SQL 查询语句和查询参数数组,执行查询并返回结果集
ArrayList stuPunchArrayList = new ArrayList();
// 创建一个 ArrayList 对象,用于存储查询到的学生打卡信息
try {
while (resultSet.next()){
// 遍历结果集,每次循环处理结果集中的一行数据
StuPunch stuPunch = new StuPunch();
// 创建一个 StuPunch 类的对象,用于存储当前行的学生打卡信息
stuPunch.setSno(resultSet.getString("sno"));
// 从结果集中获取名为 "sno" 的列的值,并将其设置到 stuPunch 对象的 sno 属性中
stuPunch.setSname(resultSet.getString("sname"));
// 从结果集中获取名为 "sname" 的列的值,并将其设置到 stuPunch 对象的 sname 属性中
stuPunch.setSclass(resultSet.getString("sclass"));
// 从结果集中获取名为 "sclass" 的列的值,并将其设置到 stuPunch 对象的 sclass 属性中
stuPunch.setSdept(resultSet.getString("sdept"));
// 从结果集中获取名为 "sdept" 的列的值,并将其设置到 stuPunch 对象的 sdept 属性中
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 属性中
stuPunchArrayList.add(stuPunch);
// 将存储了当前行学生打卡信息的 stuPunch 对象添加到 stuPunchArrayList 中
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.close(resultSet);
}
pageBean.setArrayList(stuPunchArrayList);
System.out.println(stuPunchArrayList);
System.out.println(pageBean);
req.setAttribute("pageBean", pageBean);
req.getRequestDispatcher("/view/schoadmin/stupunchlist.jsp").forward(req, resp);
}else {
req.getRequestDispatcher("/view/alluse/nodata.jsp").forward(req, resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
} catch (Exception e)

@ -1,72 +1,141 @@
package com.controller.schoadmin;
// 声明该类所属的包为 com.controller.schoadmin通常用于组织和管理与学校管理员相关的控制器类
import com.dao.DeptAdminDao;
// 导入自定义的数据访问对象类 DeptAdminDao该类可能包含了与数据库交互的方法比如执行 SQL 查询等操作
import com.entity.Teacher;
// 导入自定义的实体类 Teacher用于封装教师的相关信息例如教师编号、姓名、性别等属性
import com.utils.JDBCUtils;
// 导入自定义的工具类 JDBCUtils该类可能提供了与 JDBCJava 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("/SchoQueryTeaByIdServlet")
// 使用 WebServlet 注解将当前类标记为一个 Servlet并指定其访问路径为 /SchoQueryTeaByIdServlet客户端可以通过这个路径来访问该 Servlet
public class SchoQueryTeaByIdServlet extends HttpServlet {
// 定义一个公共类 SchoQueryTeaByIdServlet它继承自 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 tno = req.getParameter("tno");
// 从请求中获取名为 "tno" 的参数值,这个参数可能表示教师的编号,将其存储在字符串变量 tno 中
String sql = null;
// 声明一个字符串变量 sql用于存储 SQL 查询语句,初始值设为 null
Object[] objects = {tno};
// 创建一个 Object 类型的数组 objects将 tno 作为数组的元素,用于后续的 SQL 查询参数传递
System.out.println(tno);
// 将 tno 的值输出到控制台,主要用于调试目的,方便查看获取到的教师编号
//查询是否存在此人
sql = "select count(*) as num from teacher where tno = ?";
// 定义一个 SQL 查询语句,用于查询 teacher 表中教师编号tno等于传入参数 tno 的记录数量,并将结果列命名为 num
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,传入 SQL 查询语句和查询参数数组 objects执行查询操作并返回满足条件的记录数量将结果存储在整数变量 count 中
if (count > 0) { //有则继续操作
// 如果查询到的记录数量大于 0说明存在对应的教师记录则继续后续的操作
sql = "select * from teacher where tno = ?";
// 定义一个新的 SQL 查询语句,用于查询 teacher 表中教师编号为 tno 的教师的详细信息(所有列)
ResultSet resultSet = DeptAdminDao.qureyInfo(sql, objects);
// 调用 DeptAdminDao 类的 qureyInfo 方法,传入 SQL 查询语句和查询参数数组 objects执行查询操作并返回结果集将结果存储在 ResultSet 对象 resultSet 中
Teacher teacher = new Teacher();
// 创建一个 Teacher 类的对象 teacher用于存储从数据库查询到的教师信息
try {
while (resultSet.next()){
// 遍历结果集,每次循环处理结果集中的一行数据
teacher.setTno(resultSet.getString("tno"));
// 从结果集中获取名为 "tno" 的列的值,并将其设置到 teacher 对象的 tno 属性中
teacher.setTname(resultSet.getString("tname"));
// 从结果集中获取名为 "tname" 的列的值,并将其设置到 teacher 对象的 tname 属性中
teacher.setTsex(resultSet.getString("tsex"));
// 从结果集中获取名为 "tsex" 的列的值,并将其设置到 teacher 对象的 tsex 属性中
teacher.setTage(resultSet.getInt("tage"));
// 从结果集中获取名为 "tage" 的列的值,并将其设置到 teacher 对象的 tage 属性中
teacher.setTdept(resultSet.getString("tdept"));
// 从结果集中获取名为 "tdept" 的列的值,并将其设置到 teacher 对象的 tdept 属性中
teacher.setTphone(resultSet.getString("tphone"));
// 从结果集中获取名为 "tphone" 的列的值,并将其设置到 teacher 对象的 tphone 属性中
teacher.setTpsw(resultSet.getString("tpsw"));
// 从结果集中获取名为 "tpsw" 的列的值,并将其设置到 teacher 对象的 tpsw 属性中
}
} catch (Exception e) {
e.printStackTrace();
// 捕获并处理可能出现的异常情况,将异常的堆栈跟踪信息输出到控制台,方便进行调试
}finally {
JDBCUtils.close(resultSet);
// 无论是否发生异常,最终都调用 JDBCUtils 类的 close 方法关闭结果集,释放相关的数据库资源
}
System.out.println(teacher.getTsex());
// 将 teacher 对象的 tsex 属性值输出到控制台,用于调试目的,查看获取到的教师性别信息
req.setAttribute("teacher", teacher);
// 将 teacher 对象作为属性添加到请求对象 req 中,属性名为 "teacher",以便后续的 JSP 页面可以获取到该教师信息
req.getRequestDispatcher("/view/schoadmin/altertea.jsp").forward(req, resp);
// 获取请求转发器,将请求 req 和响应 resp 转发到 /view/schoadmin/altertea.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 请求,即对于这个 ServletPOST 请求和 GET 请求的处理逻辑是相同的
}
}
}

@ -1,81 +1,160 @@
package com.controller.schoadmin;
// 声明该类所在的包为 com.controller.schoadmin用于组织和管理与学校管理员相关的控制器类
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类可能封装了与数据库交互的操作方法,用于执行数据库查询等操作
import com.entity.Teacher;
// 导入自定义的 Teacher 实体类,用于封装教师的相关信息,如教师编号、姓名、性别、年龄等
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 类,通常包含与 JDBCJava Database Connectivity相关的工具方法如获取数据库连接、关闭连接、处理结果集等
import javax.servlet.ServletException;
// 导入 Servlet 异常类,用于处理 Servlet 执行过程中可能出现的异常情况
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,用于将一个普通的 Java 类标记为 Servlet并指定其访问路径
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,所有的 HTTP Servlet 都需要继承该类,并重写相应方法来处理 HTTP 请求
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 接口,用于封装客户端发送的 HTTP 请求信息,如请求参数、请求头、请求方法等
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 接口,用于封装服务器返回给客户端的 HTTP 响应信息,如响应状态码、响应头、响应内容等
import javax.servlet.http.HttpSession;
// 导入 HttpSession 接口,用于管理用户会话,存储用户在一次会话期间的相关信息,如用户登录状态、用户信息等
import java.io.IOException;
// 导入 IOException 类,用于处理输入输出操作中可能出现的异常情况,如网络传输异常等
import java.sql.ResultSet;
// 导入 ResultSet 接口,用于表示数据库查询结果集,通过该接口可以遍历查询结果中的每一行数据
@WebServlet("/SchoQueryTeaByIdServlet1")
// 使用 WebServlet 注解将当前类标记为一个 Servlet并指定其访问路径为 /SchoQueryTeaByIdServlet1客户端可通过该路径访问该 Servlet
public class SchoQueryTeaByIdServlet1 extends HttpServlet {
// 定义一个公共类 SchoQueryTeaByIdServlet1继承自 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 tno = req.getParameter("tno");
// 从请求中获取名为 "tno" 的参数值,该参数可能表示教师编号,将其存储在字符串变量 tno 中
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本是从会话中获取名为 "userName" 的属性值,并将其转换为字符串类型存储在 userName 变量中
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本是从会话中获取名为 "sno" 的属性值,并将其转换为字符串类型存储在 sno 变量中
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其转换为字符串类型存储在 belong 变量中,该属性可能表示用户所属的部门或角色等信息
System.out.println(belong);
// 将 belong 变量的值输出到控制台,用于调试目的
String sql = null;
// 声明一个字符串变量 sql用于存储 SQL 查询语句,初始值为 null
Object[] objects = {tno};
// 创建一个 Object 类型的数组 objects将 tno 作为数组元素,用于后续的 SQL 查询参数传递
System.out.println(tno);
// 将 tno 变量的值输出到控制台,用于调试目的
//查询是否存在此人
sql = "select count(*) as num from teacher where tno = ?";
// 定义一个 SQL 查询语句,用于查询教师表中教师编号为 tno 的记录数量,并将结果列命名为 num
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,传入 SQL 查询语句和查询参数数组,执行查询并返回满足条件的记录数量,将结果存储在整数变量 count 中
if (count > 0) { //有则继续操作
// 如果查询到的记录数量大于 0说明存在该教师编号对应的教师记录则继续后续操作
sql = "select * from teacher where tno = ?";
// 定义一个新的 SQL 查询语句,用于查询教师表中教师编号为 tno 的教师的详细信息
ResultSet resultSet = DeptAdminDao.qureyInfo(sql, objects);
// 调用 DeptAdminDao 类的 qureyInfo 方法,传入 SQL 查询语句和查询参数数组,执行查询并返回结果集,将结果存储在 ResultSet 对象 resultSet 中
Teacher teacher = new Teacher();
// 创建一个 Teacher 类的对象 teacher用于存储查询到的教师信息
try {
while (resultSet.next()){
// 遍历结果集,每次循环处理结果集中的一行数据
teacher.setTno(resultSet.getString("tno"));
// 从结果集中获取名为 "tno" 的列的值,并将其设置到 teacher 对象的 tno 属性中
teacher.setTname(resultSet.getString("tname"));
// 从结果集中获取名为 "tname" 的列的值,并将其设置到 teacher 对象的 tname 属性中
teacher.setTsex(resultSet.getString("tsex"));
// 从结果集中获取名为 "tsex" 的列的值,并将其设置到 teacher 对象的 tsex 属性中
teacher.setTage(resultSet.getInt("tage"));
// 从结果集中获取名为 "tage" 的列的值,并将其设置到 teacher 对象的 tage 属性中
teacher.setTdept(resultSet.getString("tdept"));
// 从结果集中获取名为 "tdept" 的列的值,并将其设置到 teacher 对象的 tdept 属性中
teacher.setTphone(resultSet.getString("tphone"));
// 从结果集中获取名为 "tphone" 的列的值,并将其设置到 teacher 对象的 tphone 属性中
teacher.setTpsw(resultSet.getString("tpsw"));
// 从结果集中获取名为 "tpsw" 的列的值,并将其设置到 teacher 对象的 tpsw 属性中
}
} catch (Exception e) {
e.printStackTrace();
// 捕获并处理可能出现的异常,将异常的堆栈跟踪信息输出到控制台,方便调试
}finally {
JDBCUtils.close(resultSet);
// 无论是否发生异常,最终都调用 JDBCUtils 类的 close 方法关闭结果集,释放相关资源
}
System.out.println(teacher.getTsex());
// 将 teacher 对象的 tsex 属性值输出到控制台,用于调试目的
req.setAttribute("teacher", teacher);
// 将 teacher 对象作为属性添加到请求对象中,属性名为 "teacher",以便在后续的 JSP 页面中可以获取该对象
req.getRequestDispatcher("/view/schoadmin/altertea.jsp").forward(req, resp);
// 获取请求转发器,将请求和响应对象转发到 /view/schoadmin/altertea.jsp 页面,让该页面继续处理请求并显示教师的详细信息用于修改
}else {
req.getRequestDispatcher("/view/alluse/noexistdataofalter.jsp").forward(req, resp);
// 如果查询到的记录数量为 0说明不存在该教师编号对应的教师记录则将请求和响应对象转发到 /view/alluse/noexistdataofalter.jsp 页面,提示用户没有相关数据可修改
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,用于处理客户端发送的 POST 请求
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同
}
}
}

@ -1,165 +1,310 @@
package com.controller.schoadmin;
// 声明该类所在的包,用于组织和管理与学校管理员相关的控制器类
import com.dao.DeptAdminDao;
// 导入部门管理员数据访问对象类,用于与数据库进行交互,执行与部门管理相关的数据库操作
import com.dao.StuDao;
// 导入学生数据访问对象类,用于执行与学生数据相关的数据库操作
import com.entity.PageBean;
// 导入分页信息封装类,用于存储分页相关的数据,如当前页码、每页记录数、总记录数等
import com.entity.Teacher;
// 导入教师实体类,用于封装教师的相关信息,如教师编号、姓名、性别等
import com.utils.JDBCUtils;
// 导入 JDBC 工具类,该类提供了与 JDBC 操作相关的工具方法,如数据库连接的获取和关闭等
import javax.servlet.ServletException;
// 导入 Servlet 异常类,用于处理 Servlet 执行过程中可能出现的异常情况
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,用于将一个普通的 Java 类标记为 Servlet并指定其访问路径
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,所有的 HTTP Servlet 都需要继承该类,并重写相应的方法来处理 HTTP 请求
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 接口,用于封装客户端发送的 HTTP 请求信息,如请求参数、请求头、请求方法等
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 接口,用于封装服务器返回给客户端的 HTTP 响应信息,如响应状态码、响应头、响应内容等
import javax.servlet.http.HttpSession;
// 导入 HttpSession 接口,用于管理用户会话,存储用户在一次会话期间的相关信息,如用户登录状态、用户信息等
import java.io.IOException;
// 导入 IOException 类,用于处理输入输出操作中可能出现的异常情况
import java.sql.ResultSet;
// 导入 ResultSet 接口,用于表示数据库查询结果集,通过该接口可以遍历查询结果中的每一行数据
import java.util.ArrayList;
// 导入 ArrayList 类,用于存储和操作动态数组,这里用于存储查询到的教师信息
@WebServlet("/SchoQueryTeaByPageServlet")
// 使用 WebServlet 注解将当前类标记为一个 Servlet并指定其访问路径为 /SchoQueryTeaByPageServlet客户端可以通过该路径访问该 Servlet
public class SchoQueryTeaByPageServlet extends HttpServlet {
// 定义一个公共类 SchoQueryTeaByPageServlet继承自 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 tno = req.getParameter("tno");
// 从请求中获取名为 "tno" 的参数值,该参数可能表示教师编号
String tname = req.getParameter("tname");
String tdept = req.getParameter("tdept");
// 从请求中获取名为 "tname" 的参数值,该参数可能表示教师姓名
String tdept = req.getParameter("tdept");
// 从请求中获取名为 "tdept" 的参数值,该参数可能表示教师所在部门
//如果传入的参数为null则置为空字符串
if (tno == null){
tno = "";
}
// 如果 tno 参数为 null则将其设置为空字符串避免后续操作出现空指针异常
if (tname == null){
tname = "";
}
// 如果 tname 参数为 null则将其设置为空字符串避免后续操作出现空指针异常
if (tdept == null){
tdept = "";
}
// 如果 tdept 参数为 null则将其设置为空字符串避免后续操作出现空指针异常
//变为like查询所需的字符串参数
String tno1 = "%" + tno + "%";
// 在 tno 前后添加 % 符号,用于模糊查询,匹配包含 tno 字符串的教师编号
String tname1 = "%" + tname + "%";
// 在 tname 前后添加 % 符号,用于模糊查询,匹配包含 tname 字符串的教师姓名
String tdept1 = "%" + tdept + "%";
// 在 tdept 前后添加 % 符号,用于模糊查询,匹配包含 tdept 字符串的教师所在部门
//设置请求的属性参数,后面需要用
req.setAttribute("tno", tno);
// 将 tno 参数设置为请求的属性,方便后续页面或其他处理使用
req.setAttribute("tname",tname);
// 将 tname 参数设置为请求的属性,方便后续页面或其他处理使用
req.setAttribute("tdept",tdept);
// 将 tdept 参数设置为请求的属性,方便后续页面或其他处理使用
System.out.println(tno1);
// 将 tno1 的值输出到控制台,用于调试目的
System.out.println(tname1);
// 将 tname1 的值输出到控制台,用于调试目的
System.out.println(tdept1);
// 将 tdept1 的值输出到控制台,用于调试目的
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本是从会话中获取名为 "userName" 的属性值,并将其转换为字符串类型存储在 userName 变量中
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本是从会话中获取名为 "sno" 的属性值,并将其转换为字符串类型存储在 sno 变量中
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其转换为字符串类型存储在 belong 变量中,该属性可能表示用户所属的部门或角色等信息
String sql = null;
// 声明一个字符串变量 sql用于存储 SQL 查询语句,初始值为 null
// System.out.println(userName);
// 注释掉的代码,原本是将 userName 的值输出到控制台,用于调试目的
// System.out.println(sno);
// 注释掉的代码,原本是将 sno 的值输出到控制台,用于调试目的
System.out.println(belong);
// 将 belong 的值输出到控制台,用于调试目的
System.out.println("hdghghjg");
// 输出一个调试信息,用于确认代码执行到此处
String currentPage = req.getParameter("currentPage");//从请求对象中获取当前页码
// 从请求中获取名为 "currentPage" 的参数值,该参数表示当前页码
String rows = req.getParameter("rows");//从请求获取对象中每页显示的行数
// 从请求中获取名为 "rows" 的参数值,该参数表示每页显示的记录数
//如果未设请求参数,此处自动设置参数为第一页
if (currentPage == null || "".equals(currentPage)){
currentPage = "1";
}
// 如果当前页码参数为空或未设置,则将当前页码设置为 1
//如果没有设置rows的请求参数此处自动设置
if (rows == null || "".equals(rows)){
rows = "7";
}
// 如果每页显示的记录数参数为空或未设置,则将每页显示的记录数设置为 7
//获取条件查询的参数
int currentPage1 = Integer.parseInt(currentPage);
// 将当前页码字符串转换为整数类型
int rows1 = Integer.parseInt(rows);
// 将每页显示的记录数字符串转换为整数类型
//如果当前页数小于1则设置当前页数为1
if (currentPage1 <= 0){
currentPage1 = 1;
}
// 如果当前页码小于等于 0则将当前页码设置为 1
//设置StuPunch类的对象类型
PageBean<Teacher> pageBean = new PageBean<Teacher>();
// 创建一个 PageBean 类的对象 pageBean用于存储分页相关的信息泛型指定为 Teacher 类型,表示存储的是教师信息
//设置当前页码
pageBean.setCurrentPage(currentPage1);
// 将当前页码设置到 pageBean 对象中
//设置每页的记录数
pageBean.setRows(rows1);
// 将每页显示的记录数设置到 pageBean 对象中
sql = " select count(*) as num from teacher where tno like ? and tname like ? and tdept like ?";
// 定义一个 SQL 查询语句,用于查询满足条件(教师编号、姓名、部门模糊匹配)的记录总数
Object[] objects = {tno1, tname1, tdept1};
// 创建一个 Object 类型的数组 objects将模糊查询所需的参数放入数组中
//计算总记录数,并设置
int totalCount = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,传入 SQL 查询语句和查询参数数组,执行查询并返回满足条件的记录总数
System.out.println(totalCount);
// 将总记录数输出到控制台,用于调试目的
pageBean.setTotalCount(totalCount);
// 将总记录数设置到 pageBean 对象中
if (totalCount > 0){
// 如果总记录数大于 0说明存在满足条件的记录
//计算总页码,并设置
int totalPage = (totalCount % rows1) == 0 ? totalCount/rows1 : (totalCount/rows1 + 1);
// 根据总记录数和每页显示的记录数计算总页码,如果总记录数能被每页记录数整除,则总页码为总记录数除以每页记录数;否则,总页码为总记录数除以每页记录数加 1
pageBean.setTotalPage(totalPage);
// 将总页码设置到 pageBean 对象中
//如果当前页数大于总页数
if (currentPage1 > pageBean.getTotalPage()){
currentPage1 = pageBean.getTotalPage();
// 如果当前页码大于总页码,则将当前页码设置为总页码
//重新设置当前页码
pageBean.setCurrentPage(currentPage1);
// 将更新后的当前页码重新设置到 pageBean 对象中
}
//计算开始的记录和list对象集合并设置
int start = (currentPage1 - 1) * rows1;
// 根据当前页码和每页显示的记录数计算当前页的起始记录索引
sql = "select * from teacher where tno like ? and tname like ? and tdept like ? limit ?, ?";
// 定义一个 SQL 查询语句,用于查询当前页的教师信息,使用 limit 关键字进行分页查询
Object[] objects1 = {tno1, tname1, tdept1, start, rows1};
// 创建一个 Object 类型的数组 objects1将模糊查询所需的参数和分页参数放入数组中
ResultSet resultSet = StuDao.QureyInfoByPage(sql, objects1);
// 调用 StuDao 类的 QureyInfoByPage 方法,传入 SQL 查询语句和查询参数数组,执行查询并返回结果集
ArrayList teaArrayList = new ArrayList();
// 创建一个 ArrayList 对象,用于存储查询到的教师信息
try {
while (resultSet.next()){
// 遍历结果集,每次循环处理结果集中的一行数据
Teacher teacher = new Teacher();
// 创建一个 Teacher 类的对象,用于存储当前行的教师信息
teacher.setTno(resultSet.getString("tno"));
// 从结果集中获取名为 "tno" 的列的值,并将其设置到 teacher 对象的 tno 属性中
teacher.setTname(resultSet.getString("tname"));
// 从结果集中获取名为 "tname" 的列的值,并将其设置到 teacher 对象的 tname 属性中
teacher.setTsex(resultSet.getString("tsex"));
// 从结果集中获取名为 "tsex" 的列的值,并将其设置到 teacher 对象的 tsex 属性中
teacher.setTage(resultSet.getInt("tage"));
// 从结果集中获取名为 "tage" 的列的值,并将其设置到 teacher 对象的 tage 属性中
teacher.setTdept(resultSet.getString("tdept"));
// 从结果集中获取名为 "tdept" 的列的值,并将其设置到 teacher 对象的 tdept 属性中
teacher.setTphone(resultSet.getString("tphone"));
// 从结果集中获取名为 "tphone" 的列的值,并将其设置到 teacher 对象的 tphone 属性中
teacher.setTpsw(resultSet.getString("tpsw"));
// 从结果集中获取名为 "tpsw" 的列的值,并将其设置到 teacher 对象的 tpsw 属性中
teaArrayList.add(teacher);
// 将存储了当前行教师信息的 teacher 对象添加到 teaArrayList 中
}
} catch (Exception e) {
e.printStackTrace();
// 捕获并处理可能出现的异常,将异常的堆栈跟踪信息输出到控制台,方便调试
}finally {
JDBCUtils.close(resultSet);
// 无论是否发生异常,最终都调用 JDBCUtils 类的 close 方法关闭结果集,释放资源
}
pageBean.setArrayList(teaArrayList);
// 将存储了当前页教师信息的 teaArrayList 设置到 pageBean 对象中
System.out.println(teaArrayList);
// 将 teaArrayList 输出到控制台,用于调试目的
System.out.println(pageBean);
// 将 pageBean 输出到控制台,用于调试目的
req.setAttribute("pageBean", pageBean);
// 将 pageBean 对象作为属性添加到请求对象中,属性名为 "pageBean",以便在后续的 JSP 页面中可以获取该对象
req.getRequestDispatcher("/view/schoadmin/teainfolist.jsp").forward(req, resp);
// 获取请求转发器,将请求和响应对象转发到 /view/schoadmin/teainfolist.jsp 页面,让该页面继续处理请求并显示当前页的教师信息
}else {
req.getRequestDispatcher("/view/alluse/nodata.jsp").forward(req, resp);
// 如果总记录数为 0说明不存在满足条件的记录则将请求和响应对象转发到 /view/alluse/nodata.jsp 页面,提示用户没有相关数据
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,用于处理客户端发送的 POST 请求
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同
}
}
}

@ -1,74 +1,153 @@
package com.controller.schoadmin;
// 声明该类所在的包名为 com.controller.schoadmin通常用于存放与学校管理员相关的控制器类。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类可能封装了与数据库交互的方法,如查询、插入、更新等操作。
import com.entity.TeaPunch;
// 导入自定义的 TeaPunch 类,这是一个实体类,用于封装教师打卡的相关信息,比如教师编号、打卡日期、打卡状态等。
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 类,该类一般包含了与 JDBCJava Database Connectivity操作相关的工具方法例如数据库连接的获取和关闭等。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,用于处理 Servlet 执行过程中可能出现的异常情况。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,此注解可将一个普通的 Java 类标记为 Servlet并指定其访问路径。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,这是 Java Servlet API 中的核心类,所有的 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("/SchoQueryTeaPunchByIdServlet")
// 使用 WebServlet 注解将当前类标记为一个 Servlet并指定其访问路径为 /SchoQueryTeaPunchByIdServlet客户端可以通过该路径访问该 Servlet。
public class SchoQueryTeaPunchByIdServlet extends HttpServlet {
// 定义一个公共类 SchoQueryTeaPunchByIdServlet继承自 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 tno = req.getParameter("tno");
// 从请求中获取名为 "tno" 的参数值,并将其存储在字符串变量 tno 中,这个参数可能代表教师编号。
String tpunchdate = req.getParameter("tpunchdate");
// 从请求中获取名为 "tpunchdate" 的参数值,并将其存储在字符串变量 tpunchdate 中,该参数可能表示教师打卡的日期。
String sql = null;
// 声明一个字符串变量 sql用于存储 SQL 查询语句,初始值设为 null。
Object[] objects = {tno, tpunchdate};
// 创建一个 Object 类型的数组 objects将 tno 和 tpunchdate 作为数组元素,用于后续的 SQL 查询参数传递。
//查询是否存在此人
sql = "select count(*) as num from teapunchin where tno = ? and tpunchdate = ?";
// 定义一个 SQL 查询语句,用于查询满足条件(教师编号为 tno 且打卡日期为 tpunchdate的记录数量并将结果列命名为 num。
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,传入 SQL 查询语句和查询参数数组,执行查询并返回满足条件的记录数量,将结果存储在整数变量 count 中。
if (count > 0){ //有则继续操作
// 如果查询到的记录数量大于 0说明存在满足条件的教师打卡记录继续后续操作。
sql = "select t.tname,tp.* from teacher t,teapunchin tp where t.tno = tp.tno and tp.tno = ? and tp.tpunchdate = ?";
// 定义一个新的 SQL 查询语句,用于查询满足条件的教师姓名和打卡记录的详细信息,通过关联 teacher 表和 teapunchin 表来获取数据。
ResultSet resultSet = DeptAdminDao.qureyInfo(sql, objects);
// 调用 DeptAdminDao 类的 qureyInfo 方法,传入 SQL 查询语句和查询参数数组,执行查询并返回结果集,将结果存储在 ResultSet 对象 resultSet 中。
TeaPunch teaPunch = new TeaPunch();
// 创建一个 TeaPunch 类的对象 teaPunch用于存储查询到的教师打卡信息。
try {
while (resultSet.next()){
// 遍历结果集,每次循环处理结果集中的一行数据。
teaPunch.setTno(resultSet.getString("tno"));
// 从结果集中获取名为 "tno" 的列的值,并将其设置到 teaPunch 对象的 tno 属性中。
teaPunch.setTname(resultSet.getString("tname"));
// 从结果集中获取名为 "tname" 的列的值,并将其设置到 teaPunch 对象的 tname 属性中。
teaPunch.setTispunch(resultSet.getString("tispunch"));
// 从结果集中获取名为 "tispunch" 的列的值,并将其设置到 teaPunch 对象的 tispunch 属性中。
teaPunch.setTpunchdate(resultSet.getDate("tpunchdate"));
// 从结果集中获取名为 "tpunchdate" 的列的值,并将其设置到 teaPunch 对象的 tpunchdate 属性中。
teaPunch.setTpunchtime(resultSet.getString("tpunchtime"));
// 从结果集中获取名为 "tpunchtime" 的列的值,并将其设置到 teaPunch 对象的 tpunchtime 属性中。
teaPunch.setTishot(resultSet.getString("tishot"));
// 从结果集中获取名为 "tishot" 的列的值,并将其设置到 teaPunch 对象的 tishot 属性中。
teaPunch.setTiscough(resultSet.getString("tiscough"));
// 从结果集中获取名为 "tiscough" 的列的值,并将其设置到 teaPunch 对象的 tiscough 属性中。
teaPunch.setTisseem(resultSet.getString("tisseem"));
// 从结果集中获取名为 "tisseem" 的列的值,并将其设置到 teaPunch 对象的 tisseem 属性中。
teaPunch.setTisdiagnose(resultSet.getString("tisdiagnose"));
// 从结果集中获取名为 "tisdiagnose" 的列的值,并将其设置到 teaPunch 对象的 tisdiagnose 属性中。
teaPunch.setTstatus(resultSet.getString("tstatus"));
// 从结果集中获取名为 "tstatus" 的列的值,并将其设置到 teaPunch 对象的 tstatus 属性中。
}
} catch (Exception e) {
e.printStackTrace();
// 捕获并处理可能出现的异常,将异常的堆栈跟踪信息输出到控制台,方便调试。
}finally {
JDBCUtils.close(resultSet);
// 无论是否发生异常,最终都调用 JDBCUtils 类的 close 方法关闭结果集,释放相关资源。
}
System.out.println(teaPunch.getTno());
// 将 teaPunch 对象的 tno 属性值输出到控制台,用于调试目的。
System.out.println(teaPunch.getTname());
// 将 teaPunch 对象的 tname 属性值输出到控制台,用于调试目的。
req.setAttribute("teaPunch", teaPunch);
// 将 teaPunch 对象作为属性添加到请求对象中,属性名为 "teaPunch",以便在后续的 JSP 页面中可以获取该对象。
req.getRequestDispatcher("/view/schoadmin/alterteapunch.jsp").forward(req, resp);
// 获取请求转发器,将请求和响应对象转发到 /view/schoadmin/alterteapunch.jsp 页面,让该页面继续处理请求并显示相关信息。
}else {
req.getRequestDispatcher("/view/alluse/noexistdataofalter.jsp").forward(req, resp);
// 如果查询到的记录数量为 0说明不存在满足条件的教师打卡记录则将请求和响应对象转发到 /view/alluse/noexistdataofalter.jsp 页面,提示用户没有相关数据。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,该方法用于处理客户端发送的 POST 请求。
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同。
}
}
}

@ -1,83 +1,172 @@
package com.controller.schoadmin;
// 声明该类所在的包为 com.controller.schoadmin用于组织和管理相关的控制器类通常与学校管理员的功能相关。
import com.dao.DeptAdminDao;
// 导入自定义的 DeptAdminDao 类,该类可能封装了与数据库交互的操作,用于处理部门管理员相关的数据访问逻辑。
import com.entity.TeaPunch;
// 导入自定义的 TeaPunch 类,这是一个实体类,用于封装教师打卡相关的信息,如教师编号、打卡日期、打卡状态等。
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 类,该类通常包含了与 JDBCJava Database Connectivity操作相关的工具方法如数据库连接、关闭资源等。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,用于处理 Servlet 执行过程中可能出现的异常情况。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,用于将一个普通的 Java 类标记为 Servlet并指定其访问路径。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,这是 Java Servlet API 中的一个抽象类,所有的 HTTP Servlet 都需要继承该类,并重写相应的方法来处理 HTTP 请求。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 接口,用于封装客户端发送的 HTTP 请求信息,如请求参数、请求头、请求方法等。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 接口,用于封装服务器返回给客户端的 HTTP 响应信息,如响应状态码、响应头、响应内容等。
import javax.servlet.http.HttpSession;
// 导入 HttpSession 接口,用于管理用户会话,存储用户在一次会话期间的相关信息,如用户登录状态、用户信息等。
import java.io.IOException;
// 导入 IOException 类,用于处理输入输出操作中可能出现的异常情况。
import java.sql.ResultSet;
// 导入 ResultSet 接口,用于表示数据库查询结果集,通过该接口可以遍历查询结果中的每一行数据。
@WebServlet("/SchoQueryTeaPunchByIdServlet1")
// 使用 WebServlet 注解将当前类标记为一个 Servlet并指定其访问路径为 /SchoQueryTeaPunchByIdServlet1客户端可以通过该路径访问该 Servlet。
public class SchoQueryTeaPunchByIdServlet1 extends HttpServlet {
// 定义一个公共类 SchoQueryTeaPunchByIdServlet1继承自 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 tno = req.getParameter("tno");
// 从请求中获取名为 "tno" 的参数值,并将其存储在字符串变量 tno 中,该参数可能表示教师编号。
String tpunchdate = req.getParameter("tpunchdate");
// 从请求中获取名为 "tpunchdate" 的参数值,并将其存储在字符串变量 tpunchdate 中,该参数可能表示教师打卡日期。
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话。
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本是从会话中获取名为 "userName" 的属性值,并将其转换为字符串类型存储在 userName 变量中。
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本是从会话中获取名为 "sno" 的属性值,并将其转换为字符串类型存储在 sno 变量中。
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其转换为字符串类型存储在 belong 变量中,该属性可能表示用户所属的部门或角色等信息。
System.out.println(belong);
// 将 belong 变量的值输出到控制台,用于调试目的。
String sql = null;
// 声明一个字符串变量 sql用于存储 SQL 查询语句,初始值为 null。
Object[] objects = {tno, tpunchdate};
// 创建一个 Object 类型的数组 objects将 tno 和 tpunchdate 作为数组元素,用于后续的 SQL 查询参数传递。
//查询是否存在此人
sql = "select count(*) as num from teacher t,teapunchin tp where t.tno = tp.tno and tp.tno = ? and tp.tpunchdate = ?";
// 定义一个 SQL 查询语句,用于查询满足条件(教师编号为 tno 且打卡日期为 tpunchdate的记录数量并将结果列命名为 num。
int count = DeptAdminDao.findTotalCount(sql, objects);
// 调用 DeptAdminDao 类的 findTotalCount 方法,传入 SQL 查询语句和查询参数数组,执行查询并返回满足条件的记录数量,存储在整数变量 count 中。
if (count > 0){ //有则继续操作
// 如果查询到的记录数量大于 0说明存在满足条件的教师打卡记录则继续后续操作。
sql = "select t.tname,tp.* from teacher t,teapunchin tp where t.tno = tp.tno and tp.tno = ? and tp.tpunchdate = ?";
// 定义一个新的 SQL 查询语句,用于查询满足条件的教师姓名和打卡记录的详细信息。
ResultSet resultSet = DeptAdminDao.qureyInfo(sql, objects);
// 调用 DeptAdminDao 类的 qureyInfo 方法,传入 SQL 查询语句和查询参数数组,执行查询并返回结果集,存储在 ResultSet 对象 resultSet 中。
TeaPunch teaPunch = new TeaPunch();
// 创建一个 TeaPunch 类的对象 teaPunch用于存储查询到的教师打卡信息。
try {
while (resultSet.next()){
// 遍历结果集,每次循环处理结果集中的一行数据。
teaPunch.setTno(resultSet.getString("tno"));
// 从结果集中获取名为 "tno" 的列的值,并将其设置到 teaPunch 对象的 tno 属性中。
teaPunch.setTname(resultSet.getString("tname"));
// 从结果集中获取名为 "tname" 的列的值,并将其设置到 teaPunch 对象的 tname 属性中。
teaPunch.setTispunch(resultSet.getString("tispunch"));
// 从结果集中获取名为 "tispunch" 的列的值,并将其设置到 teaPunch 对象的 tispunch 属性中。
teaPunch.setTpunchdate(resultSet.getDate("tpunchdate"));
// 从结果集中获取名为 "tpunchdate" 的列的值,并将其设置到 teaPunch 对象的 tpunchdate 属性中。
teaPunch.setTpunchtime(resultSet.getString("tpunchtime"));
// 从结果集中获取名为 "tpunchtime" 的列的值,并将其设置到 teaPunch 对象的 tpunchtime 属性中。
teaPunch.setTishot(resultSet.getString("tishot"));
// 从结果集中获取名为 "tishot" 的列的值,并将其设置到 teaPunch 对象的 tishot 属性中。
teaPunch.setTiscough(resultSet.getString("tiscough"));
// 从结果集中获取名为 "tiscough" 的列的值,并将其设置到 teaPunch 对象的 tiscough 属性中。
teaPunch.setTisseem(resultSet.getString("tisseem"));
// 从结果集中获取名为 "tisseem" 的列的值,并将其设置到 teaPunch 对象的 tisseem 属性中。
teaPunch.setTisdiagnose(resultSet.getString("tisdiagnose"));
// 从结果集中获取名为 "tisdiagnose" 的列的值,并将其设置到 teaPunch 对象的 tisdiagnose 属性中。
teaPunch.setTstatus(resultSet.getString("tstatus"));
// 从结果集中获取名为 "tstatus" 的列的值,并将其设置到 teaPunch 对象的 tstatus 属性中。
}
} catch (Exception e) {
e.printStackTrace();
// 捕获并处理可能出现的异常,将异常的堆栈跟踪信息输出到控制台,方便调试。
}finally {
JDBCUtils.close(resultSet);
// 无论是否发生异常,最终都调用 JDBCUtils 类的 close 方法关闭结果集,释放资源。
}
System.out.println(teaPunch.getTno());
// 将 teaPunch 对象的 tno 属性值输出到控制台,用于调试目的。
System.out.println(teaPunch.getTname());
// 将 teaPunch 对象的 tname 属性值输出到控制台,用于调试目的。
req.setAttribute("teaPunch", teaPunch);
// 将 teaPunch 对象作为属性添加到请求对象中,属性名为 "teaPunch",以便在后续的 JSP 页面中可以获取该对象。
req.getRequestDispatcher("/view/schoadmin/alterteapunch.jsp").forward(req, resp);
// 获取请求转发器,将请求和响应对象转发到 /view/schoadmin/alterteapunch.jsp 页面,让该页面继续处理请求并显示相关信息。
}else {
req.getRequestDispatcher("/view/alluse/noexistdataofalter.jsp").forward(req, resp);
// 如果查询到的记录数量为 0说明不存在满足条件的教师打卡记录则将请求和响应对象转发到 /view/alluse/noexistdataofalter.jsp 页面,提示用户没有相关数据。
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doPost 方法,用于处理客户端发送的 POST 请求。
doGet(req, resp);
// 调用 doGet 方法处理 POST 请求,即对于该 ServletPOST 请求和 GET 请求的处理逻辑相同。
}
}
}

@ -1,181 +1,284 @@
package com.controller.schoadmin;
// 声明该类所在的包为 com.controller.schoadmin通过包的组织
// 可以将相关功能的类集中管理,避免类名冲突,方便代码的维护和查找,体现了项目的逻辑结构。
import com.dao.DeptAdminDao;
// 导入自定义的数据访问对象类 DeptAdminDao该类通常封装了与数据库交互的方法
// 如执行 SQL 查询、插入、更新、删除等操作。在本代码中,会使用该类的方法来计算满足条件的记录总数。
import com.dao.StuDao;
// 导入自定义的数据访问对象类 StuDao虽然类名包含“Stu”可能暗示与学生相关
// 但在本代码中用于执行分页查询教师打卡信息的操作(调用了其 QureyInfoByPage 方法),
// 推测该类可能包含一些通用的分页查询数据库的方法。
import com.entity.PageBean;
// 导入自定义的 PageBean 实体类,用于封装分页相关的信息,
// 例如当前页码、每页显示的记录数、总记录数、总页数以及数据列表等。
// 这里用于管理和传递教师打卡信息的分页查询结果。
import com.entity.TeaPunch;
// 导入自定义的 TeaPunch 实体类,用于封装教师打卡的相关信息,
// 包括教师编号、教师姓名、所属部门、是否打卡、打卡日期、打卡时间、身体状况等信息。
// 后续会用它来存储从数据库查询到的教师打卡记录。
import com.utils.JDBCUtils;
// 导入自定义的 JDBCUtils 工具类,该类一般包含与 JDBCJava Database Connectivity
// 相关的通用方法,如获取数据库连接、关闭数据库连接、处理结果集等操作。
// 在本代码中将使用该类的方法来关闭数据库查询结果集ResultSet释放数据库资源。
import javax.servlet.ServletException;
// 导入 Servlet 异常类,当 Servlet 在运行过程中出现异常情况,
// 如请求处理失败、资源加载错误、内部逻辑错误等,会抛出 ServletException 异常,
// 以便在代码中进行异常处理,保证程序的稳定性和可靠性。
import javax.servlet.annotation.WebServlet;
// 导入 WebServlet 注解,这是 Java EE 中用于将普通 Java 类标记为 Servlet 的注解。
// 通过该注解可以指定 Servlet 的访问路径,使得客户端能够通过特定的 URL 来访问该 Servlet
// 从而实现客户端与服务器之间的交互。
import javax.servlet.http.HttpServlet;
// 导入 HttpServlet 类,它是所有 Servlet 类的基类,提供了处理 HTTP 请求的基本框架和方法。
// 我们定义的 Servlet 类继承 HttpServlet 类,从而获得处理 HTTP 请求的能力,
// 能够响应客户端发送的 GET 和 POST 请求。
import javax.servlet.http.HttpServletRequest;
// 导入 HttpServletRequest 类,用于封装客户端发送的 HTTP 请求信息,
// 包括请求参数、请求头、请求方法等内容。Servlet 可以通过这个类获取客户端传递的数据,
// 以便根据这些数据进行相应的业务逻辑处理,如获取教师打卡信息查询的条件参数和分页参数等。
import javax.servlet.http.HttpServletResponse;
// 导入 HttpServletResponse 类,用于封装服务器返回给客户端的 HTTP 响应信息,
// 如响应状态码、响应头、响应体等。Servlet 可以利用这个类来设置并返回给客户端相应的响应数据,
// 以满足客户端的需求,如设置响应的字符编码和内容类型,以及将查询结果页面转发给客户端等。
import javax.servlet.http.HttpSession;
// 导入 HttpSession 类,用于管理用户的会话状态,能够在用户的多次请求之间存储和共享数据,
// 例如用户的登录信息、权限信息、所属部门等。在本 Servlet 中,将使用它来获取用户所属部门等会话信息,
// 作为教师打卡信息查询的条件之一。
import java.io.IOException;
// 导入输入输出异常类,当进行输入输出相关的操作(如网络数据传输、文件读写等)时,
// 如果出现错误,就会抛出 IOException 异常,以便进行相应的错误处理,
// 保证系统在面对异常情况时能够做出合理的响应。
import java.sql.ResultSet;
// 导入 ResultSet 类,用于表示数据库查询结果集。当执行 SQL 查询语句后,
// 数据库返回的数据会被封装在 ResultSet 对象中,通过它可以遍历和获取查询结果的每一行数据,
// 以便进行进一步的处理和分析,如将查询到的教师打卡信息存储到 TeaPunch 对象中。
import java.util.ArrayList;
// 导入 ArrayList 类,它是 Java 集合框架中的一种动态数组实现。
// 可以用来存储和管理一组对象,并且可以根据需要动态地增加或减少元素数量。
// 在本 Servlet 中,将使用 ArrayList 来存储从数据库查询到的教师打卡对象TeaPunch
@WebServlet("/SchoQueryTeaPunchByPageServlet")
// 使用 WebServlet 注解将 SchoQueryTeaPunchByPageServlet 类标记为一个 Servlet
// 并指定其访问路径为 /SchoQueryTeaPunchByPageServlet这样客户端就可以通过这个路径向该 Servlet 发送请求,
// 从而触发该 Servlet 中的业务逻辑处理,实现教师打卡信息的分页查询功能。
public class SchoQueryTeaPunchByPageServlet extends HttpServlet {
// 定义一个名为 SchoQueryTeaPunchByPageServlet 的类,继承自 HttpServlet 类,
// 使其成为一个可以处理 HTTP 请求的 Servlet能够响应客户端发送的 GET 和 POST 请求,
// 并实现根据条件分页查询教师打卡信息的功能。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重写 HttpServlet 类的 doGet 方法,该方法专门用于处理客户端发送的 HTTP GET 请求。
// 它接收 HttpServletRequest 对象 req 和 HttpServletResponse 对象 resp 作为参数,
// 并且在执行过程中可能会抛出 ServletException 和 IOException 异常,以处理可能出现的错误情况。
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 tno = req.getParameter("tno");
// 从 HTTP 请求中获取名为 "tno" 的参数值,并将其赋值给字符串变量 tno。
// 这里的 tno 代表教师编号,用于后续根据教师编号进行模糊查询教师打卡信息。
String tname = req.getParameter("tname");
// 从 HTTP 请求中获取名为 "tname" 的参数值,并将其赋值给字符串变量 tname。
// 这里的 tname 代表教师姓名,用于后续根据教师姓名进行模糊查询教师打卡信息。
String tdept = req.getParameter("tdept");
// 从 HTTP 请求中获取名为 "tdept" 的参数值,并将其赋值给字符串变量 tdept。
// 这里的 tdept 代表教师所属部门,用于后续根据部门进行模糊查询教师打卡信息。
String tpunchdate = req.getParameter("tpunchdate");
// 从 HTTP 请求中获取名为 "tpunchdate" 的参数值,并将其赋值给字符串变量 tpunchdate。
// 这里的 tpunchdate 代表教师打卡日期,用于后续根据打卡日期进行模糊查询教师打卡信息。
System.out.println(tno);
// 在控制台打印获取到的教师编号参数 tno用于调试目的方便开发人员查看参数值是否正确。
System.out.println(tname);
// 在控制台打印获取到的教师姓名参数 tname用于调试目的方便开发人员查看参数值是否正确。
System.out.println(tdept);
System.out.println(tpunchdate);
// 在控制台打印获取到的教师所属部门参数 tdept用于调试目的方便开发人员查看参数值是否正确。
System.out.println(tpunchdate);
// 在控制台打印获取到的教师打卡日期参数 tpunchdate用于调试目的方便开发人员查看参数值是否正确。
//如果传入的参数为null则置为空字符串
if (tno == null){
tno = "";
}
// 如果获取到的教师编号参数 tno 为 null则将其设置为空字符串
// 以确保后续的模糊查询能够正常进行,避免空指针异常。
if (tname == null){
tname = "";
}
// 如果获取到的教师姓名参数 tname 为 null则将其设置为空字符串
// 以确保后续的模糊查询能够正常进行,避免空指针异常。
if (tdept == null){
tdept = "";
}
// 如果获取到的教师所属部门参数 tdept 为 null则将其设置为空字符串
// 以确保后续的模糊查询能够正常进行,避免空指针异常。
if (tpunchdate == null){
tpunchdate = "";
}
// 如果获取到的教师打卡日期参数 tpunchdate 为 null则将其设置为空字符串
// 以确保后续的模糊查询能够正常进行,避免空指针异常。
//变为like查询所需的字符串参数
String tno1 = "%" + tno + "%";
// 将教师编号参数 tno 转换为适合 SQL 模糊查询LIKE 语句)的字符串格式,
// 在 tno 的前后添加通配符 "%",以便查询包含该编号片段的教师打卡记录。
String tname1 = "%" + tname + "%";
// 将教师姓名参数 tname 转换为适合 SQL 模糊查询LIKE 语句)的字符串格式,
// 在 tname 的前后添加通配符 "%",以便查询包含该姓名片段的教师打卡记录。
String tdept1 = "%" + tdept + "%";
// 将教师所属部门参数 tdept 转换为适合 SQL 模糊查询LIKE 语句)的字符串格式,
// 在 tdept 的前后添加通配符 "%",以便查询包含该部门片段的教师打卡记录。
String tpunchdate1 = "%" + tpunchdate + "%";
// 将教师打卡日期参数 tpunchdate 转换为适合 SQL 模糊查询LIKE 语句)的字符串格式,
// 在 tpunchdate 的前后添加通配符 "%",以便查询包含该日期片段的教师打卡记录。
//设置请求的属性参数,后面需要用
req.setAttribute("tno", tno);
// 将原始的教师编号参数 tno 设置为请求的属性,键为 "tno"
// 以便在后续的页面中可以通过这个键获取到该参数值,用于展示查询条件或进行其他操作。
req.setAttribute("tname",tname);
// 将原始的教师姓名参数 tname 设置为请求的属性,键为 "tname"
// 以便在后续的页面中可以通过这个键获取到该参数值,用于展示查询条件或进行其他操作。
req.setAttribute("tdept", tdept);
// 将原始的教师所属部门参数 tdept 设置为请求的属性,键为 "tdept"
// 以便在后续的页面中可以通过这个键获取到该参数值,用于展示查询条件或进行其他操作。
req.setAttribute("tpunchdate",tpunchdate);
// 将原始的教师打卡日期参数 tpunchdate 设置为请求的属性,键为 "tpunchdate"
// 以便在后续的页面中可以通过这个键获取到该参数值,用于展示查询条件或进行其他操作。
System.out.println(tno1);
// 在控制台打印转换后的教师编号模糊查询参数 tno1用于调试目的
// 方便开发人员查看转换后的参数是否正确。
System.out.println(tname1);
// 在控制台打印转换后的教师姓名模糊查询参数 tname1用于调试目的
// 方便开发人员查看转换后的参数是否正确。
System.out.println(tdept1);
// 在控制台打印转换后的教师所属部门模糊查询参数 tdept1用于调试目的
// 方便开发人员查看转换后的参数是否正确。
System.out.println(tpunchdate1);
// 在控制台打印转换后的教师打卡日期模糊查询参数 tpunchdate1用于调试目的
// 方便开发人员查看转换后的参数是否正确。
//获取登录时的session会话对象
HttpSession session = req.getSession();
// 获取当前请求对应的 HttpSession 对象,如果会话不存在则会创建一个新的会话。
// 通过会话对象可以存储和获取用户在会话期间的相关信息,如用户所属部门等。
// String userName = (String) session.getAttribute("userName");
// 注释掉的代码,原本用于从会话中获取名为 "userName" 的属性值,
// 但在当前代码中未被使用,可能是根据实际需求进行了调整或暂时不需要该功能。
// String sno = (String) session.getAttribute("sno");
// 注释掉的代码,原本用于从会话中获取名为 "sno" 的属性值,
// 这里的变量名与前面获取请求参数的 tno、tname、tdept、tpunchdate 等不同,
// 且在当前代码中未被使用,可能是后续功能的预留或不再需要该属性值。
String belong = (String) session.getAttribute("belong");
// 从会话中获取名为 "belong" 的属性值,并将其赋值给字符串变量 belong。
// 这里的 belong 可能代表用户所属的部门信息,用于后续的数据库查询条件,
// 确保查询的教师打卡信息与用户所属部门相关。
String sql = null;
// 声明一个字符串变量 sql用于存储即将执行的 SQL 语句,初始值设为 null
// 后续会根据业务逻辑动态地构建和赋值 SQL 语句。
// System.out.println(userName);
// 注释掉的代码,原本用于在控制台打印从会话中获取的用户名 userName
// 但由于该变量未被使用,所以此打印语句也被注释掉。
// System.out.println(sno);
// 注释掉的代码,原本用于在控制台打印从会话中获取的学生编号 sno
// 但由于该变量未被使用,所以此打印语句也被注释掉。
System.out.println(belong);
// 在控制台打印从会话中获取的用户所属部门信息 belong用于调试目的
// 方便开发人员查看获取到的部门信息是否正确。
System.out.println("hdghghjg");
// 在控制台打印字符串 "hdghghjg",可能是开发人员用于调试或标记的输出内容,
// 可以帮助确定代码执行到的位置。
String currentPage = req.getParameter("currentPage");//从请求对象中获取当前页码
// 从 HTTP 请求中获取名为 "currentPage" 的参数值,并将其赋值给字符串变量 currentPage。
// 这里的 currentPage 代表当前页码,用于实现分页查询功能。
String rows = req.getParameter("rows");//从请求获取对象中每页显示的行数
// 从 HTTP 请求中获取名为 "rows" 的参数值,并将其赋值给字符串变量 rows。
// 这里的 rows 代表每页显示的记录数,用于实现分页查询功能。
//如果未设请求参数,此处自动设置参数为第一页
if (currentPage == null || "".equals(currentPage)){
currentPage = "1";
}
// 如果获取到的当前页码参数 currentPage 为 null 或空字符串,则将其设置为 "1"
// 即默认显示第一页的教师打卡信息,确保分页查询的正常进行。
//如果没有设置rows的请求参数此处自动设置
if (rows == null || "".equals(rows)){
rows = "7";
}
// 如果获取到的每页显示行数参数 rows 为 null 或空字符串,则将其设置为 "7"
// 即默认每页显示 7 条教师打卡记录,确保分页查询的正常进行。
//获取条件查询的参数
int currentPage1 = Integer.parseInt(currentPage);
// 将字符串类型的当前页码参数 currentPage 转换为整数类型,并赋值给变量 currentPage1
// 以便后续进行计算和处理。
int rows1 = Integer.parseInt(rows);
// 将字符串类型的每页显示行数参数 rows 转换为整数类型,并赋值给变量 rows1
// 以便后续进行计算和处理。
//如果当前页数小于1则设置当前页数为1
if (currentPage1 <= 0){
currentPage1 = 1;
}
// 如果转换后的当前页码 currentPage1 小于等于 0则将其设置为 1
// 确保当前页码是有效的,避免出现负数或零页码的情况。
//设置StuPunch类的对象类型
PageBean<TeaPunch> pageBean = new PageBean<TeaPunch>();
//设置当前页码
pageBean.setCurrentPage(currentPage1);
//设置每页的记录数
pageBean.setRows(rows1);
sql = " select count(*) as num from teacher t, teapunchin tp where t.tno = tp.tno and t.tno like ? and t.tname like ? and t.tdept like ? and tp.tpunchdate like ?";
Object[] objects = {tno1, tname1, tdept1, tpunchdate1};
//计算总记录数,并设置
int totalCount = DeptAdminDao.findTotalCount(sql, objects);
System.out.println(totalCount);
pageBean.setTotalCount(totalCount);
if (totalCount > 0){
//计算总页码,并设置
int totalPage = (totalCount % rows1) == 0 ? totalCount/rows1 : (totalCount/rows1 + 1);
pageBean.setTotalPage(totalPage);
//如果当前页数大于总页数
if (currentPage1 > pageBean.getTotalPage()){
currentPage1 = pageBean.getTotalPage();
//重新设置当前页码
pageBean.setCurrentPage(currentPage1);
}
//计算开始的记录和list对象集合并设置
int start = (currentPage1 - 1) * rows1;
sql = "select t.tname,t.tdept, tp.* from teacher t, teapunchin tp where t.tno = tp.tno and t.tno like ? and t.tname like ? and t.tdept like ? and tp.tpunchdate like ? limit ?, ?";
Object[] objects1 = {tno1, tname1, tdept1, tpunchdate1, start, rows1};
ResultSet resultSet = StuDao.QureyInfoByPage(sql, objects1);
ArrayList teaPunchArrayList = new ArrayList();
try {
while (resultSet.next()){
TeaPunch teaPunch = new TeaPunch();
teaPunch.setTno(resultSet.getString("tno"));
teaPunch.setTname(resultSet.getString("tname"));
teaPunch.setTdept(resultSet.getString("tdept"));
teaPunch.setTispunch(resultSet.getString("tispunch"));
teaPunch.setTpunchdate(resultSet.getDate("tpunchdate"));
teaPunch.setTpunchtime(resultSet.getString("tpunchtime"));
teaPunch.setTishot(resultSet.getString("tishot"));
teaPunch.setTiscough(resultSet.getString("tiscough"));
teaPunch.setTisseem(resultSet.getString("tisseem"));
teaPunch.setTisdiagnose(resultSet.getString("tisdiagnose"));
teaPunch.setTstatus(resultSet.getString("tstatus"));
teaPunchArrayList.add(teaPunch);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.close(resultSet);
}
pageBean.setArrayList(teaPunchArrayList);
System.out.println(teaPunchArrayList);
System.out.println(pageBean);
req.setAttribute("pageBean", pageBean);
req.getRequestDispatcher("/view/schoadmin/teapunchlist.jsp").forward(req, resp);
}else {
req.getRequestDispatcher("/view/alluse/nodata.jsp").forward(req, resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
//设置St

@ -11,7 +11,7 @@ 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.HttpSession;//不急不急
import java.io.IOException;
import java.sql.ResultSet;
import java.util.ArrayList;

3821
zp.txt

File diff suppressed because it is too large Load Diff

@ -0,0 +1,3 @@
韩强龙总代码行数6931行
刘嘉成总代码行数4500行
邹鹏总代码行数 3800行
Loading…
Cancel
Save