创建一个简单的后台教务管理系统,包含动态增删改查学生,年级和课程信息及查看登录日志等功能,包含表单验证.

一.显示页面

新建一个登录页面,即login.jsp

<%--Created by IntelliJ IDEA.User: 云Date: 2021/3/31Time: 10:37To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>登录中...</title><script src="js/jquery.1.8.3.min.js"></script><style type="text/css"></style>
</head>
<body background="img/向日葵.jpg" style="background-repeat: no-repeat ;background-size: 100% 100%">
<%--当登录账号或密码错误时出现提示语句--%>
<%String mess = (String) request.getAttribute("message");out.print(mess);
%>
<%String account = "";String password = "";Cookie[] cookies = request.getCookies();if (cookies != null) {for (Cookie cookies1 : cookies) {if (cookies1.getName().equals("accck")) {account = cookies1.getValue();}if (cookies1.getName().equals("pswck")) {password = cookies1.getValue();}}}
%>
<%--创建登录表单--%>
<form action="login" method="post"style="height: 400px;width: 400px;background: aliceblue;opacity: 0.7; border-color: cadetblue;border-bottom-style: solid;border-width: 1px;margin-top: 160px;margin-left: 650px; font-size: 25px"><%--提交的表单中的数据量较大用post--%><div style="padding: 15px;margin-top: 5px">账号:<input type="text" name="account" value="<% out.print(account); %>"><br></div><div style="margin: 15px">密码:<input type="password" name="password" value="<% out.print(password); %>"><br></div><div style="margin: 15px">您想要记住密码吗?<input type="checkbox" value="ck" name="ck"/><br></div><div style="margin: 15px"><input type="submit" value="提交"/></div>
</form>
</body>
</html>

在这里插入图片描述

新建一个登录成功页面,即success.jsp

<%--Created by IntelliJ IDEA.User: 云Date: 2021/3/31Time: 11:39To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>Title</title><script type="text/javascript">function back() {var res = confirm("您确定要退出吗?")if (res) {location.replace("login")}}</script></head>
<body>
<div style="background-image: url(img/向日葵.jpg); background-repeat: no-repeat ;background-size: 100% 100%;"><table border="1" style="font-size: 25px"><tr><td colspan="2" height="100%" width="80%"><h2>欢迎<%--<%String account = (String) session.getAttribute("account");out.print(account);%>--%>${admine.account}登录成功!</h2><input type="button" value="安全退出" onclick="back()"></td></tr><tr><td height="800px" width="200px">操作菜单<br><a href="student?mark=list" target="workspace">学生管理系统</a><br><a href="course?mark=list" target="workspace">课程管理系统</a><br><a href="grade?mark=list" target="workspace">年级管理系统</a><br><a href="logging?mark=query" target="workspace">登录日志</a></td><td height="800px" width="1200px"><iframe src="" name="workspace" width="100%" height="100%" frameborder="0"></iframe></td></tr></table>
</div>
</body>
</html>

在这里插入图片描述

新建一个出错后的跳转页面,500.jsp

<%--Created by IntelliJ IDEA.User: 云Date: 2021/4/9Time: 20:30To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h3>出错了...</h3>
</body>
</html>

新建点击"学生管理系统"后出现的页面,list.jsp

<%--Created by IntelliJ IDEA.User: 云Date: 2021/4/9Time: 15:24To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head><title>Title</title><%--list.jsp和jquery.1.8.3.min.js架包所在的js目录不在同一级中,因此要用"../"向后回退一步--%><%--<script src="../js/jquery.1.8.3.min.js"></script>--%><script src="js/jquery.1.8.3.min.js"></script><script type="text/javascript">//增加数据function toadd() {//location.assign(url)方法会触发窗口加载并显示指定的URL的内容。location.assign("student?mark=toadd");}//删除某条数据function delStudent(id) {if (confirm("您确定要删除吗?" + id)) {location.assign("student?mark=del&id=" + id);}}//批量删除function delBatchStudent() {//验证至少选中一条数据var ck = $("input[name='stuid']:checked");//获得选中的复选框if (ck.length == 0) {alert("请至少删除一项删除");return;//终止}if (confirm("您要删除吗?")) {var ids = "";$("input[name='stuid']:checked").each(function (i, e) {ids += e.value + ",";});// alert(ids);测试要删除项的是否正确location.assign("student?mark=del&id=" + ids);}}//总框:全选和全不选function AllOrNotAll() {if ($(":checkbox").attr("checked") != "checked") {$(":checkbox").attr("checked", false);}if ($(":checkbox").attr("checked") == "checked") {$(":checkbox").attr("checked", true);}}//单个框,在全选状态下,有一个框不被选中时全选框也应该自动变为不选function notAll() {var objs = $(".check[checked='checked']");if (objs.length < 5) {$("#boxx").attr("checked", false);}}</script>
</head>
<body>
<table border="1" width="100%"><input type="button" value="新增" onclick="toadd()"><input type="button" value="批量删除" onclick="delBatchStudent()"><tr><td>序号</td><td><input type="checkbox" id="boxx" onclick="AllOrNotAll()"></td><td>学号</td><td>姓名</td><td>性别</td><td>地址</td><td>生日</td><td> 电话</td><td> 年级</td><td>课程</td><td> 登录人</td><td> 操作时间</td><td>操作</td></tr><c:forEach items="${studentList}" var="stu" varStatus="s"><tr><td>${s.count}</td><td><input type="checkbox" name="stuid" value="${stu.id}" onclick="notAll()"></td><td>${stu.num}</td><%--  <td>${stu.id}</td>--%><td>${stu.name}</td><td>${stu.sex}</td><td>${stu.address}</td><td>${stu.birthday}</td><td>${stu.phone}</td><td>${stu.gname}</td><td>${stu.cname}</td><td>${stu.account}</td><td><fmt:formatDate value="${stu.oper_time}" pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate></td><td><a href="">查看信息</a><%--修改学生信息,跳转到修改页面,传入id,找到唯一一个学生--%><a href="student?mark=toupdate&id=${stu.id}">修改</a><a href="javaScript:void(0)" onclick="delStudent(${stu.id})">删除</a></td></tr></c:forEach>
</table>
</body>
</html>

新建点击"新增"后的add.jsp

<%--Created by IntelliJ IDEA.User: 云Date: 2021/4/9Time: 16:40To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html>
<head><title>Title</title><%--<script src="js/jquery.1.8.3.min.js"></script>--%><script src="${path}/js/jquery.1.8.3.min.js"></script><script type="text/javascript">function checkForm() {//验证学号不为空if ($("#num").val().length == 0) {$("#span1").text("请输入账号");return false;} else {$("#span1").text("");}//验证学号是否为规定格式if ($("#num").val().length != 3) {$("#span1").text("请输入正确的学号");return false;} else {$("#span1").text("");}//验证性别必须选择一个if (!$("input[name='sex']").is(":checked")) {$("#span3").text("请选择性别");return false;} else {$("#span3").text("");}//手机号开头必须为1,共11位var phone = $("#phone").val();var phonereg = /^1[0-9]{10}$/;//验证手机号是否为规定格式if ($("#phone").val().length != 11) {$("#span2").text("请输入正确长度的手机号");return false;} else if (!phonereg.test(phone)) {$("#span2").text("请输入正确格式的手机号");return false;} else {$("#span2").text("");}//复选框的验证if ($("input[name='course']:checked").length == 0) {$("#span4").text("请至少选择一门课程");return false;}return true;}</script>
</head>
<body>
<form action="student" method="post" onsubmit="return checkForm()"><%--type="hidden" 在提交表单时会提交单不会显示出来--%><input type="hidden" name="mark" value="save"><table border="1" style="width: 400px;height: 500px;font-size: 25px;"><tr><td>学号</td><td><input type="text" name="num" id="num" value=""><span id="span1"></span></td></tr><tr><td>姓名</td><td><input type="text" name="name"></td></tr><tr><td>性别</td><td><input type="radio" name="sex" value="男"><input type="radio" name="sex" value="女"><span id="span3"></span></td></tr><tr><td>生日</td><td><input type="text" name="birthday"></td></tr><tr><td>电话</td><td><input type="text" name="phone" id="phone"><span id="span2"></span></td></tr><tr><td>地址</td><td><input type="text" name="address"></td></tr><tr><td>年级</td><td><select name="gradeId"><%--下拉框的表单提交--%><c:forEach items="${gradeList}" var="grade"><option value="${grade.id}">${grade.name}</option></c:forEach></select></td></tr><tr><td>课程</td><td><c:forEach items="${courseList}" var="cour"><%--复选框的表单提示--%><input type="checkbox" name="course" value="${cour.id}">${cour.name}</c:forEach><span id="span4"></span></td></tr><tr><td colspan="2"><input type="submit" value="提交"><%--提交表单的两种方式:1.button2.submmit--%><a href="student?mark=list">返回</a><%--点击返回退回到初始的seccess页面--%></td></tr></table>
</form>
</body>
</html>

新建点击"修改"后的update.jsp

<%--Created by IntelliJ IDEA.User: 云Date: 2021/4/9Time: 16:40To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html>
<head><title>Title</title><script src="js/jquery.1.8.3.min.js"></script><script type="text/javascript">function checkForm() {//验证学号不为空if ($("#num").val().length == 0) {$("#span1").text("请输入账号");return false;} else {$("#span1").text("");}//验证学号是否为规定格式if ($("#num").val().length != 3) {$("#span1").text("请输入正确的学号");return false;} else {$("#span1").text("");}//验证性别必须选择一个if (!$("input[name='sex']").is(":checked")) {$("#span3").text("请选择性别");return false;} else {$("#span3").text("");}//手机号开头必须为1,共11位var phone = $("#phone").val();var phonereg = /^1[0-9]{10}$/;//验证手机号是否为规定格式if ($("#phone").val().length != 11) {$("#span2").text("请输入正确长度的手机号");return false;} else if (!phonereg.test(phone)) {$("#span2").text("请输入正确格式的手机号");return false;} else {$("#span2").text("");}//复选框的验证if ($("input[name='course']:checked").length == 0) {$("#span4").text("请至少选择一门课程");return false;}return true;}</script>
</head>
<body>
<form action="student" method="post" onsubmit="return checkForm()"><%--type="hidden" 在提交表单时会提交单不会显示出来--%><input type="hidden" name="mark" value="save"><input type="hidden" name="id" value="${student.id}"><table border="1" style="width: 400px;height: 500px;font-size: 25px;"><tr><td>学号</td><td><%--类中的属性--%><%--disable禁用组件,在提交表单时不会提交readonly 只读,但是会提交--%><input type="text" name="num" id="num" value="${student.num}" disabled><span id="span1"></span></td></tr><tr><td>姓名</td><td><input type="text" name="name" value="${student.name}"></td></tr><tr><td>性别</td><td><input type="radio" name="sex" value="男" ${student.sex=='男'?'checked':''}><input type="radio" name="sex" value="女" <c:if test="${student.sex=='女'}">checked</c:if>><span id="span3"></span></td></tr><tr><td>生日</td><td><input type="text" name="birthday" value="${student.birthday}"></td></tr><tr><td>电话</td><td><input type="text" name="phone" id="phone" value="${student.phone}"><span id="span2"></span></td></tr><tr><td>地址</td><td><input type="text" name="address" value="${student.address}"></td></tr><tr><td>年级</td><td><select name="gradeId"><%--下拉框的表单提交--%><c:forEach items="${gradeList}" var="grade"><option value="${grade.id}" ${student.gradeid==grade.id?'selected':''}>${grade.name}</option></c:forEach></select></td></tr><tr><td>课程</td><td><c:forEach items="${courseList}" var="cour"><%--复选框的表单提示--%><input type="checkbox" name="course" value="${cour.id}"<c:forTokens items="${student.ckCourseId}" delims="," var="ckid">${cour.id==ckid? 'checked' : ''}</c:forTokens>>${cour.name}</c:forEach><span id="span4"></span></td></tr><tr><td colspan="2"><input type="submit" value="提交"><%--提交表单的两种方式:1.button2.submmit--%><a href="student?mark=list">返回</a><%--点击返回退回到初始的seccess页面--%></td></tr></table>
</form>
</body>
</html>

新建list.jsp,即点击课程管理系统后出现的页面

<%--Created by IntelliJ IDEA.User: 云Date: 2021/4/9Time: 15:24To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head><title>Title</title><%--list.jsp和jquery.1.8.3.min.js架包所在的js目录不在同一级中,因此要用"../"向后回退一步--%>
<%--<script src="../js/jquery.1.8.3.min.js"></script>
--%><script src="js/jquery.1.8.3.min.js"></script><script type="text/javascript">//增加年级function toadd() {//location.assign(url)方法会触发窗口加载并显示指定的URL的内容。location.assign("course?mark=toadd");}//删除某个年级function delCourse(id){if(confirm("您确定要删除吗?")){location.assign("course?mark=del&id="+id);}}//批量删除年级function  delBatchCourse(){//验证至少选中一条数据var ck =$("input[name='courseid']:checked");//获得选中的复选框if(ck.length==0){alert("请至少删除一项删除");return;//终止}if(confirm("您要删除吗?")){var ids="";$("input[name='courseid']:checked").each(function (i,e){ids+=e.value+",";});// alert(ids);测试要删除项的是否正确location.assign("course?mark=del&id="+ids);}}//总框:全选和全不选function AllOrNotAll() {if ($(":checkbox").attr("checked") != "checked") {$(":checkbox").attr("checked", false);}if ($(":checkbox").attr("checked") == "checked") {$(":checkbox").attr("checked", true);}}//单个框,在全选状态下,有一个框不被选中时全选框也应该自动变为不选function notAll() {var objs = $(".check[checked='checked']");if (objs.length < 5) {$("#boxx").attr("checked", false);}}</script>
</head>
<body>
<table border="1" width="100%"><input type="button" value="新增" onclick="toadd()"><input type="button" value="批量删除" onclick="delBatchCourse()"><tr><td>序号</td><td><input type="checkbox" id="boxx" onclick="AllOrNotAll()"></td><td>id</td><td>课程名</td><td>操作</td></tr><c:forEach items="${courseList}" var="course" varStatus="c"><tr><td>${c.count}</td><td><input type="checkbox" name="courseid" value="${course.id}" onclick="notAll()"></td><td>${course.id}</td><td>${course.name}</td><td><a href="">查看信息</a><a href="">修改</a><a href="javaScript:void(0)" onclick="delCourse(${course.id})">删除</a></td></tr></c:forEach>
</table>
</body>
</html>

新建add.jsp,即点击新增后出现的页面

<%--Created by IntelliJ IDEA.User: 云Date: 2021/4/9Time: 16:40To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html>
<head><title>Title</title><script src="js/jquery.1.8.3.min.js"></script>
</head>
<body>
<form action="course" method="post"><%--type="hidden" 在提交表单时会提交单不会显示出来--%><input type="hidden" name="mark" value="save"><table border="1"><tr><td>课程id</td><td><input type="text" name="id"></td><tr><tr><td>课程</td><td><input type="text" name="name"></td></tr><tr><td colspan="2" align="2"><input type="submit" value="提交"><%--提交表单的两种方式:1.button2.submmit--%><a href="course?mark=list">返回</a><%--点击返回退回到初始的seccess页面--%></td></tr></table>
</form>
</body>
</html>


新建list.jsp,即点击年级管理系统后出现的页面

<%--Created by IntelliJ IDEA.User: 云Date: 2021/4/9Time: 15:24To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head><title>Title</title><%--list.jsp和jquery.1.8.3.min.js架包所在的js目录不在同一级中,因此要用"../"向后回退一步--%><%--<script src="../js/jquery.1.8.3.min.js"></script>--%><script src="js/jquery.1.8.3.min.js"></script><script type="text/javascript">//增加年级function toadd() {//location.assign(url)方法会触发窗口加载并显示指定的URL的内容。location.assign("grade?mark=toadd");}//删除某个年级function delGrade(id) {if (confirm("您确定要删除吗?")) {location.assign("grade?mark=del&id=" + id);}}//批量删除年级function delBatchGrade() {//验证至少选中一条数据var ck = $("input[name='gradeid']:checked");//获得选中的复选框if (ck.length == 0) {alert("请至少删除一项删除");return;//终止}if (confirm("您要删除吗?")) {var ids = "";$("input[name='gradeid']:checked").each(function (i, e) {ids += e.value + ",";});// alert(ids);测试要删除项的是否正确location.assign("grade?mark=del&id=" + ids);}}//总框:全选和全不选function AllOrNotAll() {if ($(":checkbox").attr("checked") != "checked") {$(":checkbox").attr("checked", false);}if ($(":checkbox").attr("checked") == "checked") {$(":checkbox").attr("checked", true);}}//单个框,在全选状态下,有一个框不被选中时全选框也应该自动变为不选function notAll() {var objs = $(".check[checked='checked']");if (objs.length < 5) {$("#boxx").attr("checked", false);}}</script>
</head>
<body>
<table border="1" width="100%"><input type="button" value="新增" onclick="toadd()"><input type="button" value="批量删除" onclick="delBatchGrade()"><tr><td>序号</td><td><input type="checkbox" id="boxx" onclick="AllOrNotAll()"></td><td>id</td><td>年级</td><td>操作</td></tr><c:forEach items="${gradeList}" var="grade" varStatus="g"><tr><td>${g.count}</td><td><input type="checkbox" name="gradeid" value="${grade.id}" onclick="notAll()"></td><td>${grade.id}</td><td>${grade.name}</td><td><a href="">查看信息</a><a href="">修改</a><a href="javaScript:void(0)" onclick="delGrade(${grade.id})">删除</a></td></tr></c:forEach>
</table>
</body>
</html>


新建add.jsp,即点击新增后出现的页面

<%--Created by IntelliJ IDEA.User: 云Date: 2021/4/9Time: 16:40To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html>
<head><title>Title</title><script src="js/jquery.1.8.3.min.js"></script>
</head>
<body>
<form action="grade" method="post" onsubmit="return checkForm()"><%--type="hidden" 在提交表单时会提交单不会显示出来--%><input type="hidden" name="mark" value="save"><table border="1"><tr><td>年级id</td><td><input type="text" name="id"></td><tr><tr><td>年级</td><td><input type="text" name="name"></td></tr><tr><td colspan="2" align="2"><input type="submit" value="提交"><%--提交表单的两种方式:1.button2.submmit--%><a href="grade?mark=list">返回</a><%--点击返回退回到初始的seccess页面--%></td></tr></table>
</form>
</body>
</html>


新建list.jsp,即点击登录日志后出现的页面

<%--Created by IntelliJ IDEA.User: 云Date: 2021/4/14Time: 21:02To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head><title>Title</title>
</head>
<body>
<table border="1" ><tr><td>序号</td><td>操作人账号</td><td>操作ip</td><td>登录时间</td></tr><c:forEach items="${loginList}" var="log" varStatus="l"><tr><td>${l.count}</td><td>${log.account}</td><td>${log.ip}</td><td><fmt:formatDate value="${log.login_time}" pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate></td></tr></c:forEach>
</table>
</body>
</html>

新建JDBCUtil

package util;import java.sql.*;public class JDBCUtil {//在web项目中记录一次,在使用时直接多次调用static {try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}}public static Connection getConnection() throws SQLException {String url = "jdbc:mysql://127.0.0.1:3306/db_student?characterEncoding=utf8&serverTimezone=Asia/Shanghai";Connection connection = DriverManager.getConnection(url, "root", "13579");return connection;}public static void closeAll(Connection connection, PreparedStatement ps, ResultSet rs) throws SQLException {if (connection != null) {connection.close();}if (ps != null) {ps.close();}if (rs != null) {rs.close();}}//用于执行新增,修改和删除public static void executeUpdateSql(PreparedStatement ps, Object[] objs) throws SQLException {if (objs != null) {for (int i = 0; i < objs.length; i++) {ps.setObject(i + 1, objs[i]);//数组从0开始,ps从1开始.在ps的第一个位置存放数组objs[0]}}ps.executeUpdate();}//用于新增并返回主键public static int executeUpdateSqlReturnKey(PreparedStatement ps, Object[] objs) throws SQLException {if (objs != null) {for (int i = 0; i < objs.length; i++) {ps.setObject(i + 1, objs[i]);//数组从0开始,ps从1开始.在ps的第一个位置存放数组objs[0]}}ps.executeUpdate();ResultSet rs = ps.getGeneratedKeys();int id = 0;while (rs.next()) {//rs只有一个结果id = rs.getInt(1);}rs.close();return id;}
}

二.新建bean目录

新建学生类

package bean;import java.util.Date;public class Student {private int id;private String name;private int num;;private String cid;private String sex;private Date birthday;private String phone;private String address;private int gradeid;private int admineId;private Date oper_time;private String cname;private String gname;private int account;private String ckCourseId;public String getCkCourseId() {return ckCourseId;}public void setCkCourseId(String ckCourseId) {this.ckCourseId = ckCourseId;}public String getCid() {return cid;}public void setCid(String cid) {this.cid = cid;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public int getAccount() {return account;}public void setAccount(int account) {this.account = account;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}public String getGname() {return gname;}public void setGname(String gname) {this.gname = gname;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public int getGradeid() {return gradeid;}public void setGradeid(int gradeid) {this.gradeid = gradeid;}public int getAdmineId() {return admineId;}public void setAdmineId(int admineId) {this.admineId = admineId;}public Date getOper_time() {return oper_time;}public void setOper_time(Date oper_time) {this.oper_time = oper_time;}
}

新建课程类

package bean;public class Course {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

新建年级类

package bean;public class Grade {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

新建管理员类

package bean;public class Admine {private int id;private  String account;private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

新建登录日志类

package bean;import java.util.Date;public class Login {private String account;private String ip;private Date login_time;public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getIp() {return ip;}public void setIp(String ip) {this.ip = ip;}public Date getLogin_time() {return login_time;}public void setLogin_time(Date login_time) {this.login_time = login_time;}
}

三.dao层

LoginDao

package dao;import bean.Admine;
import util.JDBCUtil;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;import static util.JDBCUtil.getConnection;public class LoginDao {public Admine checkLogin(String account, String password) throws SQLException {Connection connection = null;PreparedStatement ps = null;ResultSet rs = null;Admine admine = null;try {connection = JDBCUtil.getConnection();String sql = "SELECT * from admine where account=? and password=?";ps = connection.prepareStatement(sql);ps.setString(1, account);ps.setString(2, password);rs = ps.executeQuery();while (rs.next()) {admine = new Admine();admine.setId(rs.getInt("id"));admine.setAccount(rs.getString("account"));}} finally {JDBCUtil.closeAll(connection, ps, rs);}return admine;}public static void saveLogin(String account, String ip, String login_time) throws SQLException {Connection connection = null;PreparedStatement ps = null;ResultSet rs = null;try {connection = JDBCUtil.getConnection();//jdbc中默认是执行完后自动事务提交connection.setAutoCommit(false);//保存操作人信息到login表String sql = "INSERT INTO login (account,ip,login_time) " +"VALUES(?,?,?) ";//执行后返回主键ps = connection.prepareStatement(sql);Object[] objs = {account, ip, login_time};//更新login表JDBCUtil.executeUpdateSql(ps, objs);connection.commit();//在整个事务结束后提交} finally {JDBCUtil.closeAll(connection, ps, null);}}
}

StudentDao

package dao;import bean.Admine;
import bean.Course;
import bean.Grade;
import bean.Student;
import util.JDBCUtil;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class StudentDao {Connection connection = null;PreparedStatement ps = null;public List<Student> findStudentList() throws SQLException {ResultSet rs = null;List<Student> list = new ArrayList<>();try {connection = JDBCUtil.getConnection();connection.setAutoCommit(false);//防止数据库中的原子性被破坏,将自动提交设置为falseString sql = "SELECT\n" +"stu.id,\n" +"  stu.num,\n" +"  stu.Sname sname,\n" +"  stu.sex,\n" +"  stu.birthday,\n" +"  stu.phone,\n" +"  stu.address,\n" +"  stu.oper_time,\n" +"  g.name gname,\n" +"  GROUP_CONCAT(co.name) cname,\n" +"  a.account\n" +"FROM\n" +"  student stu\n" +"  LEFT JOIN grade g\n" +"    ON stu.gradeId = g.id\n" +"  LEFT JOIN student_course sc\n" +"    ON stu.id = sc.SId\n" +"  LEFT JOIN course co\n" +"    ON sc.CId = co.id\n" +"  LEFT JOIN admine a\n" +"    ON stu.admineId = a.id\n" +"GROUP BY stu.id,stu.num, stu.Sname,\n" +"  stu.sex,\n" +"  stu.birthday,\n" +"  stu.phone,\n" +"  stu.address,\n" +"  stu.oper_time,\n" +"  g.name,\n" +"  a.account";ps = connection.prepareStatement(sql);rs = ps.executeQuery();while (rs.next()) {Student student = new Student();student.setId(rs.getInt("id"));student.setNum(rs.getInt("num"));student.setName(rs.getString("Sname"));student.setSex(rs.getString("sex"));student.setBirthday(rs.getDate("birthday"));student.setPhone(rs.getString("phone"));student.setCname(rs.getString("cname"));student.setGname(rs.getString("gname"));student.setAddress(rs.getString("address"));student.setAccount(rs.getInt("account"));student.setOper_time(rs.getTimestamp("oper_time"));list.add(student);}} finally {JDBCUtil.closeAll(connection, ps, rs);}return list;}public List<Course> findCourseList() throws SQLException {Connection connection = null;PreparedStatement ps = null;ResultSet rs = null;List<Course> list = new ArrayList<>();try {connection = JDBCUtil.getConnection();String sql = "SELECT * from course";ps = connection.prepareStatement(sql);rs = ps.executeQuery();while (rs.next()) {Course course = new Course();course.setId(rs.getInt("id"));course.setName(rs.getString("name"));list.add(course);}} finally {JDBCUtil.closeAll(connection, ps, rs);}return list;}public List<Grade> findGradeList() throws SQLException {Connection connection = null;PreparedStatement ps = null;ResultSet rs = null;List<Grade> list = new ArrayList<>();try {connection = JDBCUtil.getConnection();String sql = "SELECT * from grade ";ps = connection.prepareStatement(sql);rs = ps.executeQuery();while (rs.next()) {Grade grade = new Grade();grade.setId(rs.getInt("id"));grade.setName(rs.getString("name"));list.add(grade);}} finally {JDBCUtil.closeAll(connection, ps, rs);}return list;}//public List<Admine> adminList() throws SQLException {//jdbc默认是执行完成后自动事务提交,数据库只有在事务提交结束后才会真正的执行sqlConnection connection = null;PreparedStatement ps = null;ResultSet rs = null;List<Admine> list = new ArrayList<>();try {connection.setAutoCommit(false);//设置为手动提交connection = JDBCUtil.getConnection();String sql = "SELECT * from admine";ps = connection.prepareStatement(sql);rs = ps.executeQuery();while (rs.next()) {Admine admine = new Admine();admine.setId(rs.getInt("id"));admine.setAccount(rs.getString("account"));admine.setPassword(rs.getString("password"));}connection.commit();//当这一次中所有的操作都没有问题后自动提交事务} finally {JDBCUtil.closeAll(connection, ps, rs);}return list;}public void saveStudent(String num, String name, String sex, String birthday, String phone, String address,String gradeId, String[] course, int id) throws SQLException {Connection connection = null;PreparedStatement ps = null;ResultSet rs = null;try {connection = JDBCUtil.getConnection();//jdbc中默认是执行完后自动事务提交connection.setAutoCommit(false);//保存学生信息到学生表String sql = "INSERT INTO student (Sname,sex,birthday,phone,address,oper_time,gradeId,num,admineId) " +"VALUES(?,?,?,?,?,?,?,?,?) ";//执行后返回主键ps = connection.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);Object[] objs = {name, sex, birthday, phone, address, new Date(), gradeId, num, id};//获得刚刚保存的学生idint stuid = JDBCUtil.executeUpdateSqlReturnKey(ps, objs);// 保存学生和课程的关系sql = "insert into student_course(SId,CId)" + " values(?,?)";ps = connection.prepareStatement(sql);for (String courseId : course) {Object[] objs1 = {stuid, courseId};JDBCUtil.executeUpdateSql(ps, objs1);}connection.commit();//在整个事务结束后提交} finally {JDBCUtil.closeAll(connection, ps, null);}}public void deleteStudent(String ids) throws SQLException {Connection connection = null;PreparedStatement ps = null;String [] idarray = ids.split(",");try {connection = JDBCUtil.getConnection();//jdbc中默认是执行完后自动事务提交connection.setAutoCommit(false);for(String id:idarray){//先删除学生课程关系,在删除学生String sql = "  DELETE FROM student_course WHERE SId=?";Object[] obj = {id};ps = connection.prepareStatement(sql);JDBCUtil.executeUpdateSql(ps, obj);//删除学生sql = "delete from student where id=?";ps = connection.prepareStatement(sql);JDBCUtil.executeUpdateSql(ps, obj);}connection.commit();//在整个事务结束后提交} finally {JDBCUtil.closeAll(connection, ps, null);}}//查询所有的学生信息public Student getStudentById(String id) throws SQLException {Student student = new Student();ResultSet rs = null;try {connection = JDBCUtil.getConnection();connection.setAutoCommit(false);//防止数据库中的原子性被破坏,将自动提交设置为falseString sql = "SELECT\n" +"   stu.id,\n" +"   stu.num,\n" +"   stu.Sname,\n" +"   stu.sex,\n" +"   stu.birthday,\n" +"   stu.phone,\n" +"   stu.address,\n" +"   stu.gradeId,\n" +"  GROUP_CONCAT(sc.CId) ckCourseId\n" +"FROM\n" +"  student stu\n" +"  LEFT JOIN student_course sc\n" +"    ON stu.id = sc.SId\n" +"WHERE stu.id=? ";ps = connection.prepareStatement(sql);ps.setObject(1,id);rs = ps.executeQuery();while (rs.next()) {student.setId(rs.getInt("id"));student.setNum(rs.getInt("num"));student.setName(rs.getString("Sname"));student.setSex(rs.getString("sex"));student.setBirthday(rs.getDate("birthday"));student.setPhone(rs.getString("phone"));student.setAddress(rs.getString("address"));student.setGradeid(rs.getInt("gradeid"));student.setCkCourseId(rs.getString("ckCourseId"));System.out.println(rs.getInt("gradeid"));System.out.println(rs.getString("ckCourseId"));}connection.commit();//在整个事务结束后提交} finally {JDBCUtil.closeAll(connection, ps, null);}return student;}public void updateStudent(String id, String name, String sex, String birthday, String phone,String address, String gradeId, String[] course, int admineId) throws SQLException {Connection connection = null;PreparedStatement ps = null;ResultSet rs = null;try {connection = JDBCUtil.getConnection();//jdbc中默认是执行完后自动事务提交connection.setAutoCommit(false);//修改学生表信息String sql = "UPDATE\n" +"  student\n" +"SET\n" +"  Sname = ?,\n" +"  sex = ?,\n" +"  birthday = ?,\n" +"  phone = ?,\n" +"  address = ?,\n" +"  oper_time = ?,\n" +"  admineId= ?,\n" +"  gradeId = ?\n" +"WHERE id = ?";ps = connection.prepareStatement(sql);Object [] objects={name,sex,birthday,phone,address,new Date(),admineId,gradeId,id};JDBCUtil.executeUpdateSql(ps,objects);//先把学生选课记录删除sql="delete from student_course where SId=?";Object [] objects1 = {id};ps=connection.prepareStatement(sql);JDBCUtil.executeUpdateSql(ps,objects1);//重新添加选课记录sql = "insert into student_course(SId,CId)" + " values(?,?)";ps = connection.prepareStatement(sql);for (String courseId : course) {Object[] objs1 = {id, courseId};JDBCUtil.executeUpdateSql(ps, objs1);}connection.commit();//在整个事务结束后提交} finally {JDBCUtil.closeAll(connection, ps, null);}}
}

CourseDao

package dao;import bean.Course;
import bean.Grade;
import util.JDBCUtil;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;public class CourseDao {static Connection connection = null;static PreparedStatement ps = null;public static List<Course> findCourseList() throws SQLException {ResultSet rs = null;List<Course> list = new ArrayList<>();try {connection = JDBCUtil.getConnection();connection.setAutoCommit(false);//防止数据库中的原子性被破坏,将自动提交设置为falseString sql = "SELECT * FROM course ";ps = connection.prepareStatement(sql);rs = ps.executeQuery();while (rs.next()) {Course course = new Course();course.setId(rs.getInt("id"));course.setName(rs.getString("name"));list.add(course);}} finally {JDBCUtil.closeAll(connection, ps, rs);}return list;}public void saveCourse(String id, String name) throws SQLException {// System.out.println(name);Connection connection = null;PreparedStatement ps = null;ResultSet rs = null;try {connection = JDBCUtil.getConnection();//jdbc中默认是执行完后自动事务提交connection.setAutoCommit(false);//保存学生信息到学生表String sql = "INSERT INTO course (id,name) " +"VALUES(?,?) ";ps = connection.prepareStatement(sql);Object[] objs1 = {id, name};JDBCUtil.executeUpdateSql(ps, objs1);connection.commit();//在整个事务结束后提交} finally {JDBCUtil.closeAll(connection, ps, null);}}public void deleteCourse(String ids) throws SQLException {Connection connection = null;PreparedStatement ps = null;String[] idarray = ids.split(",");try {connection = JDBCUtil.getConnection();//jdbc中默认是执行完后自动事务提交connection.setAutoCommit(false);for (String id : idarray) {//先删除学生课程关系,在删除学生String sql = "  DELETE FROM course WHERE Id=?";Object[] obj = {id};ps = connection.prepareStatement(sql);JDBCUtil.executeUpdateSql(ps, obj);}connection.commit();//在整个事务结束后提交} finally {JDBCUtil.closeAll(connection, ps, null);}}
}

GradeDao

package dao;import bean.Admine;
import bean.Course;
import bean.Grade;
import bean.Student;
import util.JDBCUtil;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class GradeDao {static Connection connection = null;static PreparedStatement ps = null;public static List<Grade> findGradeList() throws SQLException {ResultSet rs = null;List<Grade> list = new ArrayList<>();try {connection = JDBCUtil.getConnection();connection.setAutoCommit(false);//防止数据库中的原子性被破坏,将自动提交设置为falseString sql = "SELECT * FROM grade ";ps = connection.prepareStatement(sql);rs = ps.executeQuery();while (rs.next()) {Grade grade = new Grade();grade.setId(rs.getInt("id"));grade.setName(rs.getString("name"));list.add(grade);}} finally {JDBCUtil.closeAll(connection, ps, rs);}return list;}public void saveGrade(String id, String name) throws SQLException {// System.out.println(name);Connection connection = null;PreparedStatement ps = null;ResultSet rs = null;try {connection = JDBCUtil.getConnection();//jdbc中默认是执行完后自动事务提交connection.setAutoCommit(false);//保存学生信息到学生表String sql = "INSERT INTO grade (id,name) " +"VALUES(?,?) ";ps = connection.prepareStatement(sql);Object[] objs1 = {id, name};JDBCUtil.executeUpdateSql(ps, objs1);connection.commit();//在整个事务结束后提交} finally {JDBCUtil.closeAll(connection, ps, null);}}public void deleteGrade(String ids) throws SQLException {Connection connection = null;PreparedStatement ps = null;String[] idarray = ids.split(",");try {connection = JDBCUtil.getConnection();//jdbc中默认是执行完后自动事务提交connection.setAutoCommit(false);for (String id : idarray) {//先删除学生课程关系,在删除学生String sql = "  DELETE FROM grade WHERE Id=?";Object[] obj = {id};ps = connection.prepareStatement(sql);JDBCUtil.executeUpdateSql(ps, obj);}connection.commit();//在整个事务结束后提交} finally {JDBCUtil.closeAll(connection, ps, null);}}
}

LoggingQueryDao

package dao;import bean.*;
import util.JDBCUtil;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class LoggingQueryDao {Connection connection = null;PreparedStatement ps = null;public List<Login> findLoginList() throws SQLException {ResultSet rs = null;List<Login> list = new ArrayList<>();try {connection = JDBCUtil.getConnection();connection.setAutoCommit(false);//防止数据库中的原子性被破坏,将自动提交设置为falseString sql = "\n" +"  SELECT* FROM login";ps = connection.prepareStatement(sql);rs = ps.executeQuery();while (rs.next()) {Login login = new Login();login.setAccount(rs.getString("account"));login.setIp(rs.getString("ip"));login.setLogin_time(rs.getTimestamp("login_time"));list.add(login);}} finally {JDBCUtil.closeAll(connection, ps, rs);}return list;}
}

四.servlet

loginServlet

package webPro2;
import bean.Admine;
import dao.LoginDao;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.getSession().invalidate();resp.sendRedirect("login.jsp");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setHeader("content-Type", "text/html;charset=utf-8");String account = req.getParameter("account");String password = req.getParameter("password");String ck = req.getParameter("ck");//是否记住密码的标记PrintWriter out = resp.getWriter();String sql = "select* from users where user_account=? and user_password=?";PreparedStatement ps = null;try {/* ps.setString(1, account);ps.setString(2, password);*/LoginDao loginDao = new LoginDao();Admine admine = loginDao.checkLogin(account,password);/* ResultSet rs = ps.executeQuery();if (rs.next()) {*/if (admine!=null){//创建cookie,封装数据 在tomcat9之后,可以直接存储中文if (ck != null) {Cookie accck = new Cookie("accck", account);Cookie pswck = new Cookie("pswck", password);//为cookie设置生存时间为一周accck.setMaxAge(3600 * 24 * 7);pswck.setMaxAge(3600 * 24 * 7);//添加响应对象resp.addCookie(accck);resp.addCookie(pswck);}HttpSession session = req.getSession();//从请求对象中获得与之对应的session对象//当操作人登录成功要跳转到success.jsp时需要向数据库中插入登录人信息String ip = req.getRemoteAddr();Date date = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String time = simpleDateFormat.format(date);LoginDao.saveLogin(account,ip,time);//登陆成功 ,请求转发//session.setAttribute("account", account);session.setAttribute("admine", admine);resp.sendRedirect("success.jsp");} else {req.setAttribute("message", "账号或密码错误");RequestDispatcher requestDispatcher = req.getRequestDispatcher("login.jsp");requestDispatcher.forward(req, resp);}} catch (SQLException throwables) {throwables.printStackTrace();}}
}

StudentServlet

package webPro2;import bean.Admine;
import bean.Course;
import bean.Grade;
import bean.Student;
import dao.StudentDao;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;import static com.sun.javafx.fxml.expression.Expression.add;@WebServlet(name = "student", urlPatterns = "/student")
public class StudentServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String mark = req.getParameter("mark");if (mark.equals("list")) {findStudent(req, resp);}if (mark.equals("toadd")) {toAdd(req, resp);}if (mark.equals("del")) {delStudent(req, resp);}if (mark.equals("toupdate")) {toUpdateStudent(req, resp);}}//跳转到学生修改页面private void toUpdateStudent(HttpServletRequest req, HttpServletResponse resp) throws IOException {try {StudentDao studentDao = new StudentDao();//接受学生idString id = req.getParameter("id");Student student = studentDao.getStudentById(id);List<Course> courseList = studentDao.findCourseList();List<Grade> gradeList = studentDao.findGradeList();System.out.println(courseList);System.out.println(gradeList);req.setAttribute("courseList", courseList);req.setAttribute("gradeList", gradeList);req.setAttribute("student", student);//跳转到新增页面req.getRequestDispatcher("student/update.jsp").forward(req, resp);} catch (Exception e) {e.printStackTrace();resp.sendRedirect("500.jsp");}}//删除学习private void delStudent(HttpServletRequest req, HttpServletResponse resp) throws IOException {try {//接受删除学生idString id = req.getParameter("id");StudentDao studentDao = new StudentDao();studentDao.deleteStudent(id);//响应查询学生列表findStudent(req, resp);} catch (Exception e) {e.printStackTrace();resp.sendRedirect("500.jsp");}}protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String mark = req.getParameter("mark");if (mark.equals("save")) {saveStudent(req, resp);}}//新增-保存学生信息private void saveStudent(HttpServletRequest req, HttpServletResponse resp) throws IOException {try {//接受保存学生String id = req.getParameter("id");String num = (String) req.getParameter("num");String name = (String) req.getParameter("name");String sex = (String) req.getParameter("sex");String birthday = (String) req.getParameter("birthday");String phone = (String) req.getParameter("phone");String address = (String) req.getParameter("address");String gradeId = (String) req.getParameter("gradeId");String[] course = (String[]) req.getParameterValues("course");System.out.println(sex);//操作人idHttpSession session = req.getSession();Admine admine = (Admine) session.getAttribute("admine");//调用 dao保存学生StudentDao studentDao = new StudentDao();if (id == null) {//新增studentDao.saveStudent(num, name, sex, birthday, phone, address, gradeId, course, admine.getId());} else {//更新studentDao.updateStudent(id, name, sex, birthday, phone, address, gradeId, course, admine.getId());}//响应findStudent(req, resp);//回到信息查询页面} catch (Exception e) {e.printStackTrace();resp.sendRedirect("500.jsp");}}private void toAdd(HttpServletRequest req, HttpServletResponse resp) throws IOException {//查询年级,课程try {StudentDao studentDao = new StudentDao();List<Course> courseList = studentDao.findCourseList();List<Grade> gradeList = studentDao.findGradeList();//跳转到新增页面req.setAttribute("courseList", courseList);req.setAttribute("gradeList", gradeList);req.getRequestDispatcher("student/add.jsp").forward(req, resp);} catch (Exception e) {e.printStackTrace();resp.sendRedirect("500.jsp");}}//查询学生的所有信息private void findStudent(HttpServletRequest req, HttpServletResponse resp) throws IOException {try {StudentDao studentDao = new StudentDao();List<Student> studentList = studentDao.findStudentList();req.setAttribute("studentList", studentList);req.getRequestDispatcher("student/list.jsp").forward(req, resp);} catch (Exception e) {e.printStackTrace();resp.sendRedirect("500.jsp");}}
}

CourseServlet

package webPro2;import bean.Course;
import bean.Grade;
import dao.CourseDao;
import dao.GradeDao;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;@WebServlet(name = "course", urlPatterns = "/course")
public class CourseServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String mark = req.getParameter("mark");if (mark.equals("list")) {findCourse(req, resp);}if (mark.equals("toadd")) {toAdd(req, resp);}if (mark.equals("del")) {delCourse(req, resp);}}//查询课程private void findCourse(HttpServletRequest req, HttpServletResponse resp) throws IOException {try {CourseDao courseDao = new CourseDao();List<Course> courseList = courseDao.findCourseList();//跳转到list页面req.setAttribute("courseList", courseList);req.getRequestDispatcher("course/list.jsp").forward(req, resp);} catch (Exception e) {e.printStackTrace();resp.sendRedirect("500.jsp");}}//删除课程private void delCourse(HttpServletRequest req, HttpServletResponse resp) throws IOException {try {//接受删除课程idString id = req.getParameter("id");CourseDao courseDao = new CourseDao();courseDao.deleteCourse(id);//响应查询课程列表findCourse(req, resp);} catch (Exception e) {e.printStackTrace();resp.sendRedirect("500.jsp");}}protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String mark = req.getParameter("mark");if (mark.equals("save")) {saveCourse(req, resp);}}private void toAdd(HttpServletRequest req, HttpServletResponse resp) throws IOException {//跳转到可添加课程页面try {req.getRequestDispatcher("course/add.jsp").forward(req, resp);} catch (Exception e) {e.printStackTrace();resp.sendRedirect("500.jsp");}}//保存新增的课程private void saveCourse(HttpServletRequest req, HttpServletResponse resp) throws IOException {try {//接受保存年级String id = (String) req.getParameter("id");String name = (String) req.getParameter("name");//调用 dao保存课程到数据库CourseDao courseDao = new CourseDao();courseDao.saveCourse(id, name);//响应findCourse(req, resp);//回到信息查询页面} catch (Exception e) {e.printStackTrace();resp.sendRedirect("500.jsp");}}
}

GradeServlet

package webPro2;import bean.Admine;
import bean.Course;
import bean.Grade;
import bean.Student;
import dao.GradeDao;
import dao.StudentDao;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;@WebServlet(name = "grade", urlPatterns = "/grade")
public class GradeServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String mark = req.getParameter("mark");if (mark.equals("list")) {findGrade(req, resp);}if (mark.equals("toadd")) {toAdd(req, resp);}if (mark.equals("del")) {delGrade(req, resp);}}//查询年级private void findGrade(HttpServletRequest req, HttpServletResponse resp) throws IOException {try {GradeDao gradeDao = new GradeDao();List<Grade> gradeList = gradeDao.findGradeList();//跳转到list页面req.setAttribute("gradeList", gradeList);req.getRequestDispatcher("Grade/list.jsp").forward(req, resp);} catch (Exception e) {e.printStackTrace();resp.sendRedirect("500.jsp");}}//删除年级private void delGrade(HttpServletRequest req, HttpServletResponse resp) throws IOException {try {//接受删除学生idString id = req.getParameter("id");GradeDao gradeDao = new GradeDao();gradeDao.deleteGrade(id);//响应查询学生列表findGrade(req, resp);} catch (Exception e) {e.printStackTrace();resp.sendRedirect("500.jsp");}}protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String mark = req.getParameter("mark");if (mark.equals("save")) {saveGrade(req, resp);}}private void toAdd(HttpServletRequest req, HttpServletResponse resp) throws IOException {//查询年级,课程try {/*GradeDao gradeDao = new GradeDao();List<Grade> gradeList = gradeDao.findGradeList();//跳转到新增页面req.setAttribute("gradeList",gradeList);*/req.getRequestDispatcher("Grade/add.jsp").forward(req, resp);} catch (Exception e) {e.printStackTrace();resp.sendRedirect("500.jsp");}}//保存新增的年级private void saveGrade(HttpServletRequest req, HttpServletResponse resp) throws IOException {try {//接受保存年级String id = (String) req.getParameter("id");String name = (String) req.getParameter("name");/* //操作人idHttpSession session = req.getSession();Admine admine = (Admine) session.getAttribute("admine");*///调用 dao保存学生GradeDao gradeDao = new GradeDao();gradeDao.saveGrade(id, name);//响应findGrade(req, resp);//回到信息查询页面} catch (Exception e) {e.printStackTrace();resp.sendRedirect("500.jsp");}}
}

LoggingQueryServlet

package webPro2;import bean.*;
import dao.LoggingQueryDao;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;@WebServlet(name = "logging", urlPatterns = "/logging")
public class LoggingQueryServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String mark = req.getParameter("mark");if (mark.equals("query")) {loggingQuery(req, resp);}}//查询所有登录日志private void loggingQuery(HttpServletRequest req, HttpServletResponse resp) throws IOException {try {LoggingQueryDao loggingQueryDao = new LoggingQueryDao();List<Login> loginList = loggingQueryDao.findLoginList();req.setAttribute("loginList", loginList);req.getRequestDispatcher("logging/list.jsp").forward(req, resp);} catch (Exception e) {e.printStackTrace();resp.sendRedirect("500.jsp");}}
}

配置过滤器

是否登录过滤器

package filter;import bean.Admine;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class IsLoginFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;/*String name = (String) request.getSession().getAttribute("account");*/Admine admine = (Admine) request.getSession().getAttribute("admine");if (admine == null) {HttpServletResponse response = (HttpServletResponse) servletResponse;// System.out.println("Is't LoginFilter?");response.sendRedirect("login.jsp");} else {filterChain.doFilter(servletRequest, servletResponse);}}
}

编码过滤器

package filter;import javax.servlet.*;
import java.io.IOException;public class EncodingFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//System.out.println("Encoding Filter");servletRequest.setCharacterEncoding("utf-8");filterChain.doFilter(servletRequest, servletResponse);}
}

配置监听器

监听器1

package Listener;import javax.servlet.*;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.Date;public class ContextListener implements ServletContextListener, HttpSessionListener, ServletRequestListener {long s;@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("创建ContextListener");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("销毁ContextListener");}@Overridepublic void requestDestroyed(ServletRequestEvent sre) {s = System.currentTimeMillis();System.out.println("创建ServletRequest");ServletContext context= sre.getServletContext();context.setAttribute("name",111);//增加属性context.setAttribute("name",222);//修改属性context.removeAttribute("name");//删除属性}@Overridepublic void requestInitialized(ServletRequestEvent sre) {System.out.println("销毁ServletRequest");System.out.println(sre.getServletRequest().getRemoteAddr()+"::"+(new Date().getTime()-s));}@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("创建HttpSession");}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {System.out.println("销毁HttpSession");}
}

监听器2

package Listener;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/*
获得文件路径
1.相对路径
2.绝对路径
3.request.getContextPath() 动态获取项目根目录名
4.监听器*/
public class ObjectLister implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {ServletContext context= sce.getServletContext();context.setAttribute("path",context.getContextPath());}
}

.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!-- 配置servlet--><servlet><servlet-name>login</servlet-name><servlet-class>webPro2.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>login</servlet-name><url-pattern>/login</url-pattern></servlet-mapping><!--配置过滤器--><!--是否登录过滤器--><filter><filter-name>isLoginFilter</filter-name><filter-class>filter.IsLoginFilter</filter-class></filter><filter-mapping><filter-name>isLoginFilter</filter-name><url-pattern>/success.jsp</url-pattern><!--若直接访问登录页面需要进入是否登录过滤器--></filter-mapping><!--编码过滤器--><filter><filter-name>encodingFilter</filter-name><filter-class>filter.EncodingFilter</filter-class></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--配置监听器--><!-- <listener><listener-class>Listeners.PerviewServletContext</listener-class></listener>--><listener><listener-class>Listener.ObjectLister</listener-class></listener></web-app>

数据库中的表

新建的管理员表

首先在数据库中存入管理员账号和密码,在login.jsp页面中输入正确的账号和密码才可登录成功,即会跳转到success.jsp界面,否则会刷新该login.jsp页面.

新建的学生表和点击新增后存入的数据

新建的课程表和点击新增后存入的数据

新建的年级表和点击新增后存入的数据

新建的登录日志表和管理员登录后的日志信息

数据库中表的树状图

web中的树状图

创建一个简单的后台教务管理系统,包含动态增删改查学生,年级和课程信息及查看登录日志等功能,包含表单验证.相关推荐

  1. 一篇文章教会你创建vue项目和使用vue.js实现数据增删改查

    简介:一篇文章教会你创建vue项目和使用vue.js实现数据增删改查 [一.项目背景] 在管理员的一些后台页面里,数据列表中都会对这些数据进行增删改查的操作,例如管理员添加商品.修改商品价格.删除商品 ...

  2. list vue 添加数据方法_一篇文章教会你创建vue项目和使用vue.js实现数据增删改查...

    简介:一篇文章教会你创建vue项目和使用vue.js实现数据增删改查 [一.项目背景] 在管理员的一些后台页面里,数据列表中都会对这些数据进行增删改查的操作,例如管理员添加商品.修改商品价格.删除商品 ...

  3. servlet+javabean+jdbc+mysql基于MVC模式的课件管理系统,有三个表的增删改查和课件搜索、课件上传、课件下载功能, 具体功能请看界面上的导航条

    源码支持在idea.eclipse.myeclipse运行,数据库采用MySQL数据库,项目采用mvc设计模式开发,页面采用jsp+html+css+js完成. servlet+javabean+jd ...

  4. 商品品牌信息的增删改查操作步骤_图书信息管理系统

    不仅仅是图书信息管理系统 基于双链表,采用面向对象编程方法制作的图书管理系统 来源微信公众号: 不仅仅是图书信息管理系统​mp.weixin.qq.com 效果演示 框架结构 数据层:双链表管理 核心 ...

  5. JDBC实现学生信息管理系统(仅增删改查)

    思路:将程序简单的分为了一个主要的菜单类和其他的五个功能类,实现对数据库的信息的增删改查. 缺点:写了大量重复代码,实现的功能却不多,将每个类的界面和功能都写到了一个方法里,类与类之间完全分开,没有一 ...

  6. php登陆页面修改密码的功能,使用bootstrap创建登录注册页面并实现表单验证功能...

    本篇文章给大家介绍一下使用bootstrap创建登录注册页面并实现单验证功能的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 用bootstrap做登入注册页面,使用valid ...

  7. AngularJS 实现管理系统中的增删改查

      前 言 AngularJS 在一个管理系统中,不外乎都是增删改查. 现在有如下图书管理系统,实现简单的增删改查. 需要用到bootstrap.css .angular.js和angular-rou ...

  8. jQuery库的简单使用:jQuery中的 DOM 操作,增删改查,复制,替换,包裹,属性和样式操作

    jQuery中的 DOM 操作 查 查找属性节点: 通过 jQuery 选择器完成. 操作属性节点: 查找到所需要的元素之后, 可以调用 jQuery 对象的 attr() 方法来获取它的各种属性值 ...

  9. java创建mysql驱动,JDBC之Java连接mysql实现增删改查

    使用软件:mysql.eclipse 链接步骤: 1.注册驱动 2.创建一个连接对象 3.写sql语句 4.执行sql语句并返回一个结果或者结果集 5.关闭链接(一般就是connection.stat ...

最新文章

  1. 不安全的食品,如何“安全地”上了货架?
  2. 发个上海英雄会聚会沙龙的公告 希望和大家一起见面交流探讨
  3. 真我闪博,闪靓自我!
  4. c#图片base64去转义字符_C#实现字符串与图片的Base64编码转换操作示例
  5. Java必会的基础知识(3)
  6. 关于Mac设置alias别名访问服务器
  7. .NET工程师的书单
  8. mysql 阿里云 版本_关于阿里云centos版本,mysql5.7的一些注意事项
  9. angular路由传递参数_Angular路由——在路由时候传递数据
  10. Facebook产品经理的三年叙事与协作思考
  11. 线上环境 Linux 系统调用追踪
  12. python下载安装requests库
  13. 【科研学习】Demo3D2015安装包以及图文安装步骤
  14. sd卡写保护解除工具_SD卡在电脑里无法格式化怎么办?
  15. kafka7 探索生产者同步or异步发送消息
  16. cmd命令行怎样运行python,在CMD命令行中运行python脚本的方法
  17. 基于R语言进行栅格数据统计及Raster包简介
  18. java 生成banner 服务 字体
  19. inet_addr()和IN_ADDR
  20. 已阻止跨源请求:同源策略禁止读取位于

热门文章

  1. srs源码分析3-srs的启动
  2. jstl依赖_[JSTL表达式]
  3. 多功能手持读数仪VH03如何连接手机蓝牙
  4. 网页认证上网服务器无响应,portal认证失败,网络故障或者portal服务器没有响应排查方法...
  5. 文件上传页面出现400错误的问题
  6. Kruskal算法(克鲁斯卡尔)最小生成树
  7. xpath获取不包含某一子标签的a标签
  8. 艾比森发布新一代高端Micro LED微间距显示产品
  9. mac svn 服务器及客户端
  10. 了解第四次工业革命带来的“机遇与挑战”