在之前的基础上
[简易的网站登录注册,注销退出操作]
添加了登录失效拦截,(在session中存入登录用户的信息,若存储信息的当前session被销毁,则拦截请求,强制跳转到登录页面)
会话销毁有三种情况:
(1) 服务器关闭时,session对象销毁;
(2)在客户端长时间没有与服务器发生交互时,服务器会自动销毁session对象;
Tomcat服务器默认30分钟自动销毁session对象;
(3)需要安全退出;调用 invalidate( )方法;强制销毁session对象.
加入了字符过滤器,不用再每个servlet中写字符编码了;
对于一张学生表进行了简易的增删改查;也有部分的输入框失焦验证事件;
基本数据库
CREATE DATABASE IF NOT EXISTS`day20219_24_test_db` DEFAULT CHARACTER SET utf8mb4
USE `day20219_24_test_db`;
/*Table structure for table `t_grade` */
CREATE TABLE `t_grade` (
`gid` int NOT NULL AUTO_INCREMENT COMMENT '班级表Id标识',
`gname` varchar(5) NOT NULL COMMENT '班级名',
PRIMARY KEY (`gid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*Data for the table `t_grade` */
insert into `t_grade`(`gid`,`gname`) values
(1,'大一'),
(2,'大二'),
(3,'大三'),
(4,'大四');
/*Table structure for table `t_student` */
CREATE TABLE `t_student` (
`sid` int NOT NULL AUTO_INCREMENT COMMENT '学生表Id标识',
`sno` int NOT NULL COMMENT '学号',
`sname` varchar(10) NOT NULL COMMENT '姓名',
`ssex` char(1) NOT NULL COMMENT '性别',
`gradeid` int NOT NULL COMMENT '班级号',
`phone` char(11) NOT NULL COMMENT '手机号',
`address` varchar(20) NOT NULL COMMENT '地址',
`option_userid` int NOT NULL COMMENT '操作人Id',
`option_time` datetime NOT NULL COMMENT '操作时间',
PRIMARY KEY (`sid`),
UNIQUE KEY `sno` (`sno`),
KEY `fk_gradeid` (`gradeid`),
KEY `fk_userid` (`option_userid`),
CONSTRAINT `fk_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `t_grade` (`gid`),
CONSTRAINT `fk_userid` FOREIGN KEY (`option_userid`) REFERENCES `t_user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*Data for the table `t_student` */
insert into `t_student`(`sid`,`sno`,`sname`,`ssex`,`gradeid`,`phone`,`address`,`option_userid`,`option_time`) values
(1,1809064001,'修改1号','女',2,'1263636','12314',1,'2021-10-10 15:45:05'),
(2,1809064002,'阿发','男',4,'13698685555','陕西西安',2,'2021-11-04 18:33:23'),
(5,1809064003,'asdad','男',3,'11234545654','hanzho',3,'2021-10-09 23:29:35'),
(6,1809064004,'修改信息','女',4,'123654','汉中',1,'2021-10-10 11:39:05'),
(8,100,'123131','男',2,'12313','31311',1,'2021-10-10 09:22:26'),
(10,123,'123132','女',3,'311231','31131',1,'2021-10-10 09:27:54'),
(12,124,'12312','男',1,'12313','311231',3,'2021-10-10 09:31:59'),
(13,12345,'1231','男',4,'123132131','123131',1,'2021-10-10 11:39:38'),
(15,112,'31231','女',4,'131','211131231',3,'2021-10-10 13:45:31'),
(18,180654,'q2','女',3,'12324321','西安',4,'2021-10-10 15:48:55'),
(19,1806544,'q1','女',2,'12343432341','汉中',1,'2021-10-10 15:48:57');
/*Table structure for table `t_user` */
CREATE TABLE `t_user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'ID号标识',
`account` varchar(20) NOT NULL COMMENT '账户名',
`password` varchar(6) NOT NULL DEFAULT '000000' COMMENT '密码',
`create_time` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*Data for the table `t_user` */
insert into `t_user`(`id`,`account`,`password`,`create_time`) values
(1,'小智','123456','2021-09-25 00:08:58'),
(2,'张三','adada','2021-09-25 11:40:22'),
(3,'张三','123456','2021-09-25 11:41:21'),
(4,'杰哥','123632','2021-09-27 00:06:45'),
(5,'awqeq','123','2021-09-27 19:23:38'),
(16,'小智RE3','123456','2021-09-30 23:04:56'),
(24,'张三4','123456','2021-10-17 20:28:37');
使用到的jquery工具包
jquery.1.8.3.min.js
用到的jar工具包
数据库连接mysql-connector-java-8.0.16.jar
servletapiservlet-api.jar
json转换gson-2.1.jar
基本放置
登录,注册;
前端页面;
登录
login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>登录首页</title>
<!-- 样式表修饰 ,引入外部的样式表-->
<link type="text/css" rel="stylesheet" href="css/login.css?" />
<!--部署JQuery-->
<script src="js/jquery.1.8.3.min.js" type="text/javascript"></script>
<!-- JS事件 -->
<script type="text/javascript">
function toLogin(){
/* 先取到账户框和密码框的值 */
var accountVal = $("#accountId").val();
var passwordVal = $("#passwordId").val();
if((accountVal.trim()).length===0){
//console.log((accountVal.trim()).length==0) 测试使用;
$("#outbox_form_account_error").html("用户名不能为空!");
}
else if((passwordVal.trim()).length === 0 ){
$("#outbox_form_password_error").html("密码不能为空!");
}
else if((passwordVal.trim()).length > 6){
$("#outbox_form_password_error").html("密码要六位数哦!");
}
else{
/*参数1,url地址,参数2:表单的数据转为键值对的形式,参数3:触发的回调函数(函数参数:响应值),参数4,可指定返回的类型*/
$.post("back/login",$("#formId").serialize(),function (data){
//JSON转JS;
var obj= $.parseJSON(data);
//判断是否存在;注意用的是用JS对象进行判断;
if(obj.id !=null){
// alert(data);测试时使用;
//用 JSON格式 存入会话;
window.sessionStorage.setItem("user",data);
//replace方法 加载一个新页面取代当前页面;
alert("登录成功!")
location.replace("success.html");
//不存在就提示;
}else if(data == 1){
$("#outbox_form_account_error").html( "注意是不是账号密码错了呢");
}else{
alert("啊这,服务器异常!!!")
}
});
}
}
/* 考虑到提示信息持久性的不能消失;就让输入框,密码框的聚焦事件去清除 */
function reAcErr(){
$("#outbox_form_account_error").html("");
}
function rePassErr(){
$("#outbox_form_password_error").html("");
}
</script>
</head>
<body style="background-image: url(./img/pc.gif);background-size: cover; ">
<!-- 包裹注册栏的大盒子 -->
<div id="outbox">
<div id="outbox_welcome">
欢迎登录
</div>
<!-- 填写的表单 -->
<div id="outbox_form">
<form id="formId">
<!-- 账户框以及提示信息弹出位置 -->
<div id="outbox_form_account">
<div id="outbox_form_account_char">账户:</div>
<div id="outbox_form_account_in">
<input id="accountId" type="text" name="account" placeholder="请输入账户名:" onfocus="reAcErr()"/>
</div>
<!-- 提示信息框,在页面中配合javascript事件使用 -->
<div id="outbox_form_account_error"></div>
</div>
<!-- 密码框以及提示信息弹出位置 -->
<div id="outbox_form_password">
<div id="outbox_form_password_char">密码:</div>
<div id="outbox_form_password_in" >
<input id="passwordId" type="password" name="password" placeholder="请输入密码:" onfocus="rePassErr()"/>
</div>
<!-- 提示信息框,在页面中配合javascript事件使用 -->
<div id="outbox_form_password_error"></div>
</div>
<!-- 登录按钮位置 -->
<div id="outbox_form_loginbtn">
<input id="loginbtn" type="button" value="登录" onclick="toLogin()" />
</div>
</form>
</div>
<!-- 跳转注册 -->
<div id="outbox_bottom">
<div id="outbox_bottom_char">还没有账号?</div>
<div id="outbox_bottom_toresign"><a href="register.html">立即注册</a></div>
</div>
</div>
</body>
</html>
注册
register.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>注册首页</title>
<!-- 外部样式表修饰 -->
<link type="text/css" rel="stylesheet" href="css/login.css?">
<!--部署Js-->
<script src="js/jquery.1.8.3.min.js" type="text/javascript"></script>
<!-- JS事件 -->
<script type="text/javascript">
/*移出账号的输入框时,就去和数据库交互检查*/
function checkAcc(acc) {
//定义一个标记变量;
var result = false;
/*注意只用账号去查询交互*/
$.ajax({
url: "back/register",
type: "get",
//关闭异步;
async: false,
//发出数据;
data: {account: acc},
//返回响应数据;
success: function (data) {
//alert(data);
if (data == 0) {
$("#outbox_form_account_error").css("color", "red");
$("#outbox_form_account_error").html("用户已存在,请换个账户名");
result = false;
} else if (data == 1) {
//这里还要排除用户输入空值;
if ((acc.trim()).length === 0) {
$("#outbox_form_account_error").css("color", "red");
$("#outbox_form_account_error").html("别忘了写用户名");
result = false;
} else {
$("#outbox_form_account_error").css({"color": "green", "font-weight": "bold"});
$("#outbox_form_account_error").html("OK,继续操作.");
result = true;
}
} else if (data == 2) {
$("#outbox_form_account_error").html("服务器出异常了呢");
result = false;
}
}
});
//返回标记值;
return result;
}
function toRes() {
var accountVal = $("#accountId").val();
var passwordVal = $("#passwordId").val();
if ((accountVal.trim()).length === 0) {
$("#outbox_form_account_error").html("用户名不能为空!");
} else if ((passwordVal.trim()).length === 0) {
$("#outbox_form_password_error").html("密码不能为空!");
} else if ((passwordVal.trim()).length > 6) {
$("#outbox_form_password_error").html("密码要六位数哦!");
} else {
//再次与数据库交互查询是否存在,避免多用户操作出现紊乱; 先得到标记值;
var res = checkAcc(accountVal);
//测试控制台查看输出标记值;
console.log("当前注册时的标记判断值==>"+res);
//没有问题,再去提交注册请求;
if (res) {
//由于在输入框失去焦点时就已经判断了;这里直接就去保存;
$.post("back/register", $("#formId").serialize(), function (data) {
if (data == 1) {
//$("#outbox_form_password_error").html("注册成功了,试试去登录吧.");
alert("注册成功了,试试去登录吧");
location.replace("login.html");
} else {
$("#outbox_form_password_error").html("服务器异常了");
}
});
}
}
}
/* 考虑到提示信息持久性的不能消失;就让输入框,密码框的聚焦事件去清除 */
function reAcErr() {
$("#outbox_form_account_error").html("");
}
function rePassErr() {
$("#outbox_form_password_error").html("");
}
</script>
</head>
<body style="background-image: url(./img/bz.png);background-size: cover; ">
<!-- 包裹注册栏的盒子 -->
<div id="outbox">
<div id="outbox_welcome">
欢迎注册
</div>
<!-- 填写的表单 -->
<div id="outbox_form">
<form id="formId">
<!-- 账户框以及提示信息弹出位置 -->
<div id="outbox_form_account">
<div id="outbox_form_account_char">账户:</div>
<div id="outbox_form_account_in">
<input id="accountId" type="text" name="account" placeholder="请输入账户名:" onfocusout="checkAcc(this.value)"
onfocus="reAcErr()"/>
</div>
<!-- 提示信息框,在页面中配合javascript事件使用 -->
<div id="outbox_form_account_error"></div>
</div>
<!-- 密码框以及提示信息弹出位置 -->
<div id="outbox_form_password">
<div id="outbox_form_password_char">密码:</div>
<div id="outbox_form_password_in">
<input id="passwordId" type="password" name="password" placeholder="请输入密码:" onfocus="rePassErr()"/>
</div>
<!-- 提示信息框,在页面中配合javascript事件使用 -->
<div id="outbox_form_password_error"></div>
</div>
<!-- 登录按钮位置 -->
<div id="outbox_form_loginbtn">
<input id="loginbtn" type="button" value="注册" onclick="toRes()"/>
</div>
</form>
</div>
<!-- 跳转注册 -->
<div id="outbox_bottom">
<div id="outbox_bottom_char">注册好了?</div>
<div id="outbox_bottom_toresign"><a href="login.html">立即登录</a></div>
</div>
</div>
</body>
</html>
css样式表
login.css
/* 先取掉浏览器的默认效果 */
*{
margin: 0px;
padding: 0px;
}
/* 去除超链接下划线 */
a{
text-decoration: none;
}
/* 图片转块标签 */
img{
display: block;
}
/* 背景图 */
/*body{
background-image: url(/img/bz.png);
}*/
/* 注册栏的大盒子 */
#outbox{
/* 基本要素 宽,高,背景 */
width: 480px;
height: 350px;
background-color: #F1F0F3;
/* 边框设置 */
border-radius: 30px;
/* 设置透明度 */
opacity: 0.8;
/* 开启绝对定位 */
position: absolute;
top: 50%;
left: 50%;
/* 设置外边距 使得居中 */
margin-top: -175px;
margin-left: -240px;
}
/* 修饰欢迎登录字体 */
#outbox_welcome{
width: 480px;
height: 50px;
/* 使得文字居中 */
text-align: center;
line-height: 50px;
font-size: 30px;
font-weight: bold;
}
/* 欢迎登录字体移入有效果 */
#outbox_welcome:hover{
color: #FF8000;
}
/* 表单整体修饰 */
#outbox_form{
width: 480px;
height: 250px;
}
/* 账户框,密码框以及提示信息弹出位置 */
#outbox_form_account,#outbox_form_password{
width: 480px;
height: 100px;
/* 开相对定位 */
position:relative;
}
/* 账号,密码文字 的位置 */
#outbox_form_account_char,#outbox_form_password_char{
width: 80px;
height: 50px;
/* 使得字体居中 */
text-align: center;
line-height: 50px;
font-size: 20px;
/* 开绝对定位 */
position: absolute;
left: 30px;
}
/* 输入框,密码框的位置 */
#outbox_form_account_in,#outbox_form_password_in{
width: 400px;
height: 50px;
/* 开绝对定位 */
position: absolute;
left: 150px;
line-height: 50px;
}
/* 输入框,密码框 */
#accountId,#passwordId{
width: 250px;
height: 40px;
font-size: 20px;
/* 边框修饰 */
border: skyblue solid 3px;
border-radius: 5px;
/* 清除浏览器的默认边框 */
outline: none;
}
/* 输入框,密码框聚焦事件 */
#accountId:focus{
border-color: greenyellow;
}
#passwordId:focus{
border-color: greenyellow;
}
/* 弹出信息框修饰 */
#outbox_form_account_error,#outbox_form_password_error{
width: 250px;
height: 50px;
color: red;
/* 文字居中 */
line-height: 50px;
font-size: 20px;
/* 定位 */
position: absolute;
top: 50px;
left: 150px;
}
/* 登录按钮盒子设置 */
#outbox_form_loginbtn{
width: 480px;
height: 50px;
line-height: 50px;
text-align: center;
/* 开启相对定位 */
position: relative;
}
/* 登录按钮 */
#loginbtn{
width: 300px;
height: 40px;
border-radius:20px;
font-size: 20px;
background-color: aqua;
/* 绝对定位 */
position: absolute;
left: 90px;
}
/* 底部跳转的小盒子 */
#outbox_bottom{
width: 480px;
height: 50px;
/* 开相对定位 */
position: relative;
}
/* 提示信息文字 */
#outbox_bottom_char{
width: 120px;
height: 40px;
font-size: 20px;
/* 开绝对定位 */
position: absolute;
top: 10px;
left: 120px;
}
/* 跳转链接修饰 */
#outbox_bottom_toresign{
width: 120px;
height: 40px;
font-size: 20px;
/* 绝对定位 */
position: absolute;
top: 10px;
left: 240px;
}
登录成功的主页success.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>主页</title>
<script src="js/jquery.1.8.3.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
//调用时间显示函数;==>更新加载
setInterval("isTime()",1000);
//先取出在会话中的存储JSON;
var obj = window.sessionStorage.getItem("user");
//若不登录就访问,跳到登录页;
if (obj == null) {
location.replace("login.html")
return;
}
//JSON转为 JS;
var user = $.parseJSON(obj);
//$("#reminder").html(user.account + "::" + user.create_time);
$("#reminder").html(user.account);
});
//安全退出;
function toExit() {
if (confirm("您确定退出?")) {
//销毁前端的session;
window.sessionStorage.removeItem("user");
//只是发送请求测试,没有提交的数据;
$.get("back/login", function (data) {
});
//跳转到登录页面;
location.replace("login.html");
}
}
//简易的时间显示;
function isTime(){
//获取到div的对象;
var divObj=document.getElementById("watchDiv");
//将当前的年月日,时分秒获取到;
var year=new Date().getFullYear();
//注意月份是 0-11;
var month=new Date().getMonth()+1;
var date=new Date().getDate();
var hour=new Date().getHours();
var minute=new Date().getMinutes();
var seconds=new Date().getSeconds();
//对于星期;由于 getDay() 返回一周中的某一天 输出为数字(0 ~ 6);
var day=new Date().getDay();
//可用数组安排;0~6对应周天到周六;
var array=["星期天","星期一","星期二","星期三","星期四","星期五","星期六"];
var week=array[day];
divObj.innerHTML=year+"年"+month+"月"+date+"日"+week+""+hour+ "时" +minute+ "分"+seconds+" 秒";
}
</script>
</head>
<body>
<table width="100%" height="700" border="1" cellspacing="0" >
<tr>
<td colspan="2" height="100px">
你好 ,管理员
<span id="reminder"></span>
现在是 <div id="watchDiv" style="width: 400px"></div><br/>
<input type="button" value="点击此处安全退出" onclick="toExit()">
</td>
</tr>
<tr>
<td valign="top" width="100px">
操作选项<br/>
<!--指向内联框架-->
<a href="./student/studentlist.html" target="workspace" style="font-weight: bold">学生管理</a>
</td>
<td>
<iframe width="100%" height="100%" frameborder="0" name="workspace"></iframe>
</td>
</tr>
</table>
</body>
</html>
基本效果
用到的背景图片
实体类
User
import java.util.Date;
/**
* @author by CSDN@小智RE0
*/
//用户类 ;对应数据库的用户表;
public class User {
//用户属性
private int id;
private String account;
private String password;
private Date create_time;
//初始化构造方法;
public User() {
}
public User(String account, String password) {
this.account = account;
this.password = password;
}
//getter,setter方法;
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;
}
public Date getCreate_time() {
return create_time;
}
public void setCreate_time(Date create_time) {
this.create_time = create_time;
}
}
登录及注册时的用户dao层处理
UserDao接口
import java.sql.SQLException;
import java.util.List;
/**
* @author by CSDN@小智RE0
*/
//持久层定义接口;
public interface UserDao {
//根据账户名查询用户信息;
User findUserByAcc(String account)throws SQLException, ClassNotFoundException;
//根据账户与密码查询用户信息;
User findUserByAccPass(String account,String password) throws SQLException, ClassNotFoundException;
//根据账户和密码查询用户是否存在;===>该方法暂时未使用
boolean isContains(String account,String password) throws SQLException, ClassNotFoundException;
//查询所有用户;===>该方法暂时未使用;
List<User> finUser() throws SQLException, ClassNotFoundException;
//注册添加用户;
void addUser(User user) throws ClassNotFoundException, SQLException;
}
具体的实现类UserDaoImpl
import java.sql.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author by CSDN@小智RE0
*/
public class UserDaoImpl implements UserDao{
/**
* 根据账户名查询用户信息;
* @param account 账户
*/
@Override
public User findUserByAcc(String account) throws SQLException, ClassNotFoundException {
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
User user=null;
try {
//加载驱动;
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接;
String url="jdbc:mysql://127.0.0.1:3306/day20219_24_test_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
connection = DriverManager.getConnection(url,"root","123456");
//定义Sql语句;
String sql="SELECT id,account,create_time FROM t_user where account=?";
//预编译;
preparedStatement=connection.prepareStatement(sql);
//占位符赋值;
preparedStatement.setString(1,account);
//返回结果集;
resultSet = preparedStatement.executeQuery();
//取结果;
if (resultSet.next()){
//取出结果,把值存储给对象;
user =new User();
user.setId(resultSet.getInt("id"));
user.setAccount(resultSet.getString("account"));
user.setCreate_time(resultSet.getTimestamp("create_time"));
}
}
finally {
//关闭资源;
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}if(connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
return user;
}
/**
* 根据账户与密码查询用户信息;
* @param account 账户
* @param password 密码
*/
@Override
public User findUserByAccPass(String account, String password) throws SQLException, ClassNotFoundException {
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
User user=null;
try {
//加载驱动;
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接;
String url="jdbc:mysql://127.0.0.1:3306/day20219_24_test_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
connection = DriverManager.getConnection(url,"root","123456");
//定义Sql语句;
String sql="SELECT id,account,create_time FROM t_user where account=? and password=?";
//预编译;
preparedStatement=connection.prepareStatement(sql);
//占位符赋值;
preparedStatement.setString(1,account);
preparedStatement.setString(2,password);
//返回结果集;
resultSet = preparedStatement.executeQuery();
//取结果;
if (resultSet.next()){
//取出结果,把值发给对象;
user =new User();
user.setId(resultSet.getInt("id"));
user.setAccount(resultSet.getString("account"));
user.setCreate_time(resultSet.getTimestamp("create_time"));
}
}
finally {
//关闭资源;
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}if(connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
return user;
}
/**
* 根据账户和密码查询用户是否存在; ===>该方法暂时未使用
* @param account 账户
* @param password 密码
* @return true -->用户存在 ; false-->用户不存在
*/
@Override
public boolean isContains(String account, String password) throws SQLException, ClassNotFoundException {
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
User user=null;
try {
//加载驱动;
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接;
String url="jdbc:mysql://127.0.0.1:3306/day20219_24_test_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
connection = DriverManager.getConnection(url,"root","123456");
//定义Sql语句;
String sql="SELECT id,account,password,create_time FROM t_user where account=? and password=?";
//预编译;
preparedStatement=connection.prepareStatement(sql);
//占位符赋值;
preparedStatement.setString(1,account);
preparedStatement.setString(2,password);
//返回结果集;
resultSet = preparedStatement.executeQuery();
//取结果;
if(resultSet.next()){
//取出结果,把值赋值给对象;
user =new User();
//user.setId(resultSet.getInt("id"));
user.setAccount(resultSet.getString("account"));
user.setPassword(resultSet.getString("password"));
}
//先判空!!!
if(user!=null) {
//对查询到的用户进行判断;
if (account.equals(user.getAccount()) && password.equals(user.getPassword())) {
return true;
} else {
return false;
}
}else {
return false;
}
}
finally {
//关闭资源;
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}if(connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
/**
* 查询所有用户
* @return 用户列表 ;===>该方法暂时未使用
*/
@Override
public List<User> finUser() throws SQLException, ClassNotFoundException {
List<User> list=new ArrayList<>();
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
try {
//加载驱动;
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接;
String url="jdbc:mysql://127.0.0.1:3306/day20219_24_test_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
String root="root";
String password="123456";
connection = DriverManager.getConnection(url,root,password);
//定义Sql语句;
String sql="SELECT id,account,password,create_time FROM t_user";
//预编译;
preparedStatement=connection.prepareStatement(sql);
//由于没用占位符;直接取结果;
resultSet = preparedStatement.executeQuery();
//取结果;
while (resultSet.next()){
//每次都取出结果,把值村给对象;
User user =new User();
user.setId(resultSet.getInt("id"));
user.setAccount(resultSet.getString("account"));
user.setPassword(resultSet.getString("password"));
user.setCreate_time(resultSet.getTimestamp("create_time"));
//结果存入集合;
list.add(user);
}
} finally {
//关闭资源;
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}if(connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
return list;
}
/**
* 添加用户;
* @param user 新用户对象
*/
@Override
public void addUser(User user) throws ClassNotFoundException, SQLException {
Connection connection=null;
PreparedStatement preparedStatement=null;
try {
//加载驱动;
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接;
String url="jdbc:mysql://127.0.0.1:3306/day20219_24_test_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
String root="root";
String password="123456";
connection = DriverManager.getConnection(url,root,password);
//定义Sql语句;
String sql="insert into t_user (account,password,create_time) values(?,?,?)";
//预编译;
preparedStatement=connection.prepareStatement(sql);
//占位符赋值;
preparedStatement.setString(1,user.getAccount());
preparedStatement.setString(2, user.getPassword());
preparedStatement.setTimestamp(3, new Timestamp(new Date().getTime()));
//执行sql;
preparedStatement.execute();
} finally {
//关闭资源;
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}if(connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
}
servlet处理
登录LoginServlet
import com.google.gson.Gson;
import javax.servlet.ServletException;
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.io.PrintWriter;
/**
* @author by CSDN@小智RE0
* 登录表单处理;
*/
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
PrintWriter out = null;
try {
//设置响应的字符编码格式;
resp.setContentType("text/html;charset=utf-8");
//设置请求的字符解码;-->在过滤器已处理;
//req.setCharacterEncoding("utf-8");
//获取用户名和密码;
String account = req.getParameter("account");
String password = req.getParameter("password");
UserDao userDao = new UserDaoImpl();
//调用根据用户名和密码查询用户的方法;
User userByAccPass = userDao.findUserByAccPass(account, password);
//获取Session对象;
HttpSession session = req.getSession();
//将查找到的对象信息存入Session会话中;
session.setAttribute("user",userByAccPass);
out = resp.getWriter();
if(userByAccPass!=null){
//Java对象转为Json格式的字符串;
Gson gson = new Gson();
String s = gson.toJson(userByAccPass);
out.print(s);// --->发出查询的用户对象;
}else {
out.print(1);// 1 --->查询失败;
}
} catch (Exception e) {
e.printStackTrace();
out.print(2);// 2 --> 出现异常;
}
}
//处理主页安全退出的请求;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理编码;
resp.setContentType("text/html;charset=utf-8");
//收到Session会话存储的信息;
HttpSession session = req.getSession();
//看看session中存入的信息;
User user = (User) session.getAttribute("user");
//销毁session;
session.invalidate();
}
}
在web.xml
中配置
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.fivelzq.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/back/login</url-pattern>
</servlet-mapping>
注册RegisterServlet
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author by CSDN@小智RE0
* 注册表单处理;
*/
public class RegisterServlet extends HttpServlet {
//处理注册时输入框失去焦点的请求;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = null;
try{
//设置响应的字符编码格式;
resp.setContentType("text/html;charset=utf-8");
//获取用户名;
String account = req.getParameter("account");
UserDao userDao=new UserDaoImpl();
out = resp.getWriter();
//在登录框失去焦点时,就把前端输入的账号拿过来进行快速比对;
//所以去给数据库添加个按账户名查信息的方法;
User userByAcc = userDao.findUserByAcc(account);
if(userByAcc!=null){
out.print(0); //---> 存在,不可以注册
}else{
out.print(1);//--->不存在,提示;
}
}catch (Exception e){
e.printStackTrace();
out.print(2);//2 -->服务器异常;
}
}
//处理==>注册按钮点击时使用;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = null;
try{
//设置响应的字符编码格式;
resp.setContentType("text/html;charset=utf-8");
//获取用户名和密码;
String account = req.getParameter("account");
String password = req.getParameter("password");
UserDao userDao=new UserDaoImpl();
out = resp.getWriter();
//直接存储注册;
userDao.addUser(new User(account,password));
out.print(1);
}catch (Exception e){
e.printStackTrace();
out.print(2);//2 -->服务器异常;
}
}
}
在web.xml
中配置
<!--注册-->
<servlet>
<servlet-name>register</servlet-name>
<servlet-class>com.fivelzq.servlet.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>register</servlet-name>
<url-pattern>/back/register</url-pattern>
</servlet-mapping>
简易的字符编码过滤,登录过滤,以及简易状态监听控制台打印.
基础的字符编码过滤
EncodeFilter
import javax.servlet.*;
import java.io.IOException;
/**
* @author by CSDN@小智RE0
* @Date: 2021/10/03/10:01
*/
public class EncodeFilter implements Filter {
String encode;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("字符编码过滤初始化");
//可在web.xml的初始化参数处配置;避免修改时需要重置编译;
encode = filterConfig.getInitParameter("encode");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("字符编码过滤中.......................");
servletRequest.setCharacterEncoding(encode);
//传递;
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
System.out.println("字符编码过滤销毁");
}
}
在web.xml中配置
<!--字符编码过滤-->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.fivelzq.filter.EncodeFilter</filter-class>
<init-param>
<!--可在初始化参数处配置-->
<param-name>encode</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/back/*</url-pattern>
</filter-mapping>
登录验证过滤
IsLoginFilter
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author by CSDN@小智RE0
* @Date: 2021/10/03/11:05
*/
//验证是否登录;
public class IsLoginFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("正在验证是否为登录状态................");
//由于HttpServletRequest继承servletRequest;需要向下转型;
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpSession session = httpServletRequest.getSession();
User user = (User) session.getAttribute("user");
//判断管理员信息是否存在;
if(user==null){
PrintWriter out = servletResponse.getWriter();
out.print(369);
}else {
//过滤链向下执行;
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
在web.xml
中配置
<!--配置验证是否登录过滤-->
<filter>
<filter-name>isLogin</filter-name>
<filter-class>com.fivelzq.filter.IsLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>isLogin</filter-name>
<!--可配置多个地址-->
<url-pattern>/back/student</url-pattern>
</filter-mapping>
session销毁失效时,发出的请求会被验证拦截;
简易的监听器ServletObjectListener
import javax.servlet.*;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* @author by CSDN@小智RE0
* @Date: 2021/10/03/12:04
*/
public class ServletObjectListener implements ServletContextListener, ServletRequestListener, HttpSessionListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Context创建---------->");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("Context销毁---------->");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("Request创建---------->");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("Request销毁---------->");
}
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Session创建---------->");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Session销毁---------->");
}
}
在web.xml
中配置
<!--监听器配置-->
<listener>
<listener-class>com.fivelzq.listener.ServletObjectListener</listener-class>
</listener>
对于学生表的增删改查
班级类
Grade
/**
* @author by CSDN@小智RE0
* @Date: 2021/10/03/19:46
*/
public class Grade {
private int gid;
private String gname;
public Grade() {
}
public int getGid() {
return gid;
}
public void setGid(int gid) {
this.gid = gid;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
}
学生类
Student
package com.fivelzq.pojo;
import java.util.Date;
/**
* @author by CSDN@小智RE0
* @Date: 2021/10/03/16:32
*/
public class Student {
private int sid;
private int sno;
private String sname;
private String ssex;
private String gname;
private String phone;
private String address;
private String account;
private Date option_time;
private int gradeid;
public Student() {
}
public int getGradeid() {
return gradeid;
}
public void setGradeid(int gradeid) {
this.gradeid = gradeid;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSsex() {
return ssex;
}
public void setSsex(String ssex) {
this.ssex = ssex;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public Date getOption_time() {
return option_time;
}
public void setOption_time(Date option_time) {
this.option_time = option_time;
}
}
班级类的dao处理
接口GradeDao
import java.sql.SQLException;
import java.util.List;
/**
* @author by CSDN@小智RE0
* @Date: 2021/10/03/19:48
*/
public interface GradeDao {
//查询所有班级;
List<Grade> getAllGrade() throws ClassNotFoundException, SQLException;
}
具体实现类GradeDaoImpl
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author by CSDN@小智RE0
* @Date: 2021/10/03/19:49
*/
public class GradeDaoImpl implements GradeDao{
//查询班级;
@Override
public List<Grade> getAllGrade() throws ClassNotFoundException, SQLException {
Connection connection =null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
//查询到的结果;
List<Grade> list = new ArrayList<>();
try{
//加载驱动;
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql://127.0.0.1:3306/day20219_24_test_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
//获取连接;
connection = DriverManager.getConnection(url,"root","123456");
//预编译Sql;
String sql="SELECT gid,gname FROM t_grade";
preparedStatement = connection.prepareStatement(sql);
//没有占位符;
resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
Grade grade = new Grade();
grade.setGid(resultSet.getInt("gid"));
grade.setGname(resultSet.getString("gname"));
list.add(grade);
}
}finally {
//关闭资源;
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}if(connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
return list;
}
}
学生类的dao处理
接口StudentDao
import java.sql.SQLException;
import java.util.List;
/**
* @author by CSDN@小智RE0
* @Date: 2021/10/03/16:30
*/
public interface StudentDao {
//查询所有学生;
List<Student> getAllStudent() throws ClassNotFoundException, SQLException;
//添加学生;
void addStudent(String sno,String sname,String ssex,String gradeId,String phone,String address,int uid) throws ClassNotFoundException, SQLException;
//先根据学生表的标识Id获取学生信息;
Student getStudentById(String sid) throws ClassNotFoundException, SQLException;
//根据学号信息查询学生;
Student getStudentBySno(int sno) throws SQLException, ClassNotFoundException;
//根据ID号删除学生信息;
void delStudentById(String sid) throws ClassNotFoundException, SQLException;
//根据学生Id 修改学生信息;
void updateStuById(String sid, String sname, String ssex, String gradeId, String phone, String address, int uid) throws SQLException, ClassNotFoundException;
}
具体的实现类
StudentDaoImpl
import java.sql.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author by CSDN@小智RE0
* @Date: 2021/10/03/16:36
*/
public class StudentDaoImpl implements StudentDao{
//查询到所有学生;
@Override
public List<Student> getAllStudent() throws ClassNotFoundException, SQLException {
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
//定义存储返回结果;
List<Student> list = new ArrayList<>();
try {
//加载驱动;
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接;
String url="jdbc:mysql://127.0.0.1:3306/day20219_24_test_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
connection = DriverManager.getConnection(url,"root","123456");
//定义Sql语句;
String sql=" SELECT\n" +
" s.`sid`,\n" +
" s.`sno`,\n" +
" s.`sname`,\n" +
" s.`ssex`,\n" +
" g.`gname`,\n" +
" s.`phone`,\n" +
" s.`address`,\n" +
" u.`account`,\n" +
" s.`option_time`\n" +
" FROM t_student AS s LEFT JOIN t_grade AS g ON g.`gid`=s.`gradeid`\n" +
" LEFT JOIN t_user AS u ON u.`id`=s.`option_userid`";
//预编译;
preparedStatement=connection.prepareStatement(sql);
//返回结果集;
resultSet = preparedStatement.executeQuery();
//取结果;
while (resultSet.next()){
Student student = new Student();
student.setSid(resultSet.getInt("sid"));
student.setSno(resultSet.getInt("sno"));
student.setSname(resultSet.getString("sname"));
student.setSsex(resultSet.getString("ssex"));
student.setGname(resultSet.getString("gname"));
student.setPhone(resultSet.getString("phone"));
student.setAddress(resultSet.getString("address"));
student.setAccount(resultSet.getString("account"));
student.setOption_time(resultSet.getTimestamp("option_time"));
list.add(student);
}
}
finally {
//关闭资源;
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}if(connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
return list;
}
//添加学生;
@Override
public void addStudent(String sno, String sname, String ssex,
String gradeId, String phone, String address, int uid) throws ClassNotFoundException, SQLException {
Connection connection=null;
PreparedStatement preparedStatement=null;
try {
//加载驱动;
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接;
String url="jdbc:mysql://127.0.0.1:3306/day20219_24_test_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
connection = DriverManager.getConnection(url,"root","123456");
//定义Sql语句;
String sql="insert into t_student(sno,sname,ssex,gradeid,phone,address,option_userid,option_time)" +
"values(?,?,?,?,?,?,?,?)";
//预编译;
preparedStatement=connection.prepareStatement(sql);
//为占位符赋值;
preparedStatement.setInt(1, Integer.parseInt(sno));
preparedStatement.setString(2,sname);
preparedStatement.setString(3,ssex);
preparedStatement.setInt(4, Integer.parseInt(gradeId));
preparedStatement.setString(5,phone);
preparedStatement.setString(6,address);
preparedStatement.setInt(7,uid);
preparedStatement.setTimestamp(8,new Timestamp(new Date().getTime()));
//执行;
preparedStatement.execute();
}
finally {
//关闭资源;
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}if(connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
//根据学号查询学生信息;
@Override
public Student getStudentBySno(int sno) throws SQLException, ClassNotFoundException {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
Student student = null;
try {
//加载驱动;
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/day20219_24_test_db?characterEncoding=utf8&useSSl=false&serverTimezone=Asia/Shanghai";
//获取连接;
connection = DriverManager.getConnection(url,"root","123456");
String sql="select sno,sname,ssex,gradeid,phone,address from t_student where sno=?";
//预编译sql语句;
preparedStatement = connection.prepareStatement(sql);
//向占位符赋值;
preparedStatement.setInt(1,sno);
//得到结果;
resultSet = preparedStatement.executeQuery();
//仅有单个数据;
while (resultSet.next()){
student = new Student();
student.setSno(resultSet.getInt("sno"));
student.setSname(resultSet.getString("sname"));
student.setSsex(resultSet.getString("ssex"));
student.setGname(resultSet.getString("gradeid"));
student.setPhone(resultSet.getString("phone"));
student.setAddress(resultSet.getString("address"));
}
} finally {
if(resultSet!=null){
resultSet.close();
}else if(preparedStatement!=null){
preparedStatement.close();
}else if(connection!=null){
connection.close();
}
}
return student;
}
//根据Id删除;
@Override
public void delStudentById(String sid) throws ClassNotFoundException, SQLException {
Connection connection=null;
PreparedStatement preparedStatement=null;
try {
//加载驱动;
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接;
String url="jdbc:mysql://127.0.0.1:3306/day20219_24_test_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
connection = DriverManager.getConnection(url,"root","123456");
//定义Sql语句;
String sql="delete from t_student where sid=?";
//预编译;
preparedStatement=connection.prepareStatement(sql);
//为占位符赋值;
preparedStatement.setInt(1, Integer.parseInt(sid));
//执行sql;
preparedStatement.executeUpdate();
}
finally {
//关闭资源;
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}else if(connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
//根据id获取学生;
@Override
public Student getStudentById(String sid) throws ClassNotFoundException, SQLException {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
Student student = null;
try {
//加载驱动;
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/day20219_24_test_db?characterEncoding=utf8&useSSl=false&serverTimezone=Asia/Shanghai";
//获取连接;
connection = DriverManager.getConnection(url,"root","123456");
String sql="SELECT\n" +
" s.`sid`,\n" +
" s.`sno`,\n" +
" s.`sname`,\n" +
" s.`ssex`,\n" +
" s.`gradeid`,\n" +
" s.`phone`,\n" +
" s.`address`\n" +
" FROM t_student AS s " +
"WHERE s.`sid`=? ";
//预编译sql语句;
preparedStatement = connection.prepareStatement(sql);
//向占位符赋值;
preparedStatement.setObject(1,sid);
//得到结果;
resultSet = preparedStatement.executeQuery();
//仅有单个数据;
while (resultSet.next()){
student = new Student();
student.setSid(resultSet.getInt("sid"));
student.setSno(resultSet.getInt("sno"));
student.setSname(resultSet.getString("sname"));
student.setSsex(resultSet.getString("ssex"));
student.setGradeid(resultSet.getInt("gradeid"));
student.setPhone(resultSet.getString("phone"));
student.setAddress(resultSet.getString("address"));
}
/* System.out.println("这里输入的id==>" +sid);
System.out.println("这里查询到的用户==>"+student.toString());*/
} finally {
if(resultSet!=null){
resultSet.close();
}else if(preparedStatement!=null){
preparedStatement.close();
}else if(connection!=null){
connection.close();
}
}
return student;
}
//根据ID修改学生的信息;
@Override
public void updateStuById(String sid, String sname, String ssex,
String gradeId, String phone, String address, int uid) throws SQLException, ClassNotFoundException {
Connection connection=null;
PreparedStatement preparedStatement=null;
try {
//加载驱动;
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接;
String url="jdbc:mysql://127.0.0.1:3306/day20219_24_test_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
connection = DriverManager.getConnection(url,"root","123456");
//定义Sql语句;
String sql="update t_student set sname=?,ssex=?,gradeid=?,phone=?,address=?," +
"option_userid=?,option_time=? where sid=?";
//预编译;
preparedStatement=connection.prepareStatement(sql);
//为占位符赋值;
preparedStatement.setString(1,sname);
preparedStatement.setString(2,ssex);
preparedStatement.setObject(3, gradeId);
preparedStatement.setString(4,phone);
preparedStatement.setString(5,address);
preparedStatement.setInt(6,uid);
preparedStatement.setTimestamp(7,new Timestamp(new Date().getTime()));
preparedStatement.setObject(8,sid);
//执行;
preparedStatement.executeUpdate();
}
finally {
//关闭资源;
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}if(connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
}
学生列表显示studentlist.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生列表</title>
<script type="text/javascript" src="../js/jquery.1.8.3.min.js"></script>
<script type="text/javascript">
//加载页面后就显示信息;
$(function (){
//用标记 mark 区分不同的请求;
$.get("../back/student",{mark:"list"},function (data){
//过滤器返回的值;
if(data==369){
alert("登录信息失效");
//关闭的是外层页面;
window.parent.location.replace("../login.html");
}else if(data == 500){
alert("服务器错误");
}else{
//将响应的数据拼接进去;
var str="";
for (var i = 0; i < data.length; i++) {
str+="<tr align='center'>";
str+="<td>"+(i+1)+"</td>";
str+="<td>"+data[i].sno+"</td>";
str+="<td>"+data[i].sname+"</td>";
str+="<td>"+data[i].ssex+"</td>";
str+="<td>"+data[i].phone+"</td>";
str+="<td>"+data[i].address+"</td>";
str+="<td>"+data[i].gname+"</td>";
str+="<td>"+data[i].account+"</td>";
/*日期转为本地时间字符串*/
str+="<td>"+(new Date(data[i].option_time).toLocaleString())+"</td>";
str+="<td><a href='javaScript:void(0)' οnclick='toUpdate("+data[i].sid+")'>修改</a>"
+" <a href='javaScript:void(0)' οnclick='toDel("+data[i].sid+")'>删除</a></td>";
str+="</tr>";
}
$("#table").append(str);
}
},"json");
});
//点击新增按钮触发;跳转至新增页面;
function toAdd(){
location.replace("addStudent.html");
}
//点击修改链接时触发;考虑需要携带此学生的学号/id;
function toUpdate(sid){
//alert(sid);
//在转出页面前就把要更新的ID号存入session;
window.sessionStorage.setItem("sid",sid);
//跳转到更新页面;
location.replace("updateStudent.html");
}
//点击删除链接,触发执行;
function toDel(sid){
if(confirm("您确定删除嘛???")){
$.get("../back/student",{sid:sid,mark:"delStu"},function (data){
if(data==200){
alert("删除成功!");
//刷新当前页面;
location.reload();
}else {
alert("删除失败!!")
}
});
}
}
</script>
</head>
<body>
学生列表<input type="button" value="添加新同学" onclick="toAdd()">
<table id="table" width="100%" height="100%" border="1" cellspacing="0">
<tr align="center">
<th>序号</th>
<th>学号</th>
<th>姓名</th>
<th>性别</th>
<th>电话</th>
<th>地址</th>
<th>班级</th>
<th>操作人</th>
<th>操作时间</th>
<th>操作</th>
</tr>
</table>
</body>
</html>
添加学生页面;addStudent.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加学生</title>
<!--部署Jquery-->
<script src="../js/jquery.1.8.3.min.js" type="text/javascript"></script>
<script type="text/javascript">
//页面加载时,班级信息就动态查询出来;然后添加到下拉框的选项中;
$(function () {
$.get("../back/student", {mark: "GradeList"}, function (data) {
if (data == 500) {
alert("服务器异常");
} else {
var str = "";
//注意;显示的是年级名,但是服务器得到的是年级Id号;存入学生表;
for (var i = 0; i < data.length; i++) {
str += "<option value='" + data[i].gid + "'>" + data[i].gname + "</option>";
}
$("#gradeId").append(str);
}
}, "json");
});
//失去焦点验证 ==>学号信息是否唯一;
function regexSno(snoval) {
//定义标记值;
var result = false;
if ((snoval.trim()).length == 0) {
$("#snoError").html("学号填上");
} else {
//同步验证; async = false;
$.ajax({
url: "../back/student",
type: "get",
data: {sno: snoval, mark: "checkSno"},
async: false,
success: function (data) {
if (data == 0) {
$("#snoError").html("学号已存在,换个学号");
result = false;
} else if (data == 1) {
$("#snoError").html("OK,继续操作");
result = true;
} else if ((snoval.trim()) > "2147483647") {
$("#snoError").html("超出最大设置!!!");
result = false;
} else {
$("#snoError").html("啊这,服务器异常");
result = false;
}
}
});
}
return result;
}
//提交保存;
function toAdd() {
//先判断一下填写表单了没有;
var snoVal = $("#snoId").val();
var snameVal = $("#snameId").val();
var phoneVal = $("#phoneId").val();
var addressVal = $("#addressId").val();
var gradeVal = $("#gradeId").val();
//alert(gradeVal);
if ((snoVal.trim()).length == 0) {
$("#snoError").html("学号填上");
} else if ((snameVal.trim()).length == 0) {
$("#snameError").html("姓名填上");
} else if ((phoneVal.trim()).length == 0) {
$("#phoneError").html("手机填上");
} else if ((addressVal.trim()).length == 0) {
$("#addressError").html("地址填上");
} else if (gradeVal == 0) {
$("#gradeError").html("别忘了选择年级");
}
//然后再去和后端请求;
else {
//再次验证学号唯一性;
var result = regexSno(snoVal);
//测试标记值是否变动;
console.log("当前标记值判断=>" + result);
//确认学号唯一;然后再进行添加操作;
if (result) {
$.post("../back/student", $("#formId").serialize(), function (data) {
if (data == 500) {
alert("服务器异常");
}
//判断登录信息是否失效;
else if (data == 369) {
alert("登录信息失效,添加信息失败");
//关闭的是外层页面;
window.parent.location.replace("../login.html");
} else {
alert("保存成功");
location.replace("studentlist.html");
}
});
}
}
}
//取消新增操作;==>点击回到列表页面;
function noAdd() {
location.replace("studentlist.html");
}
//这些输入框获得焦点,提示信息就"消失";
function toRemoveSno() {
$("#snoError").html("");
}
function toRemoveSname() {
$("#snameError").html("");
}
function toRemovePhone() {
$("#phoneError").html("")
}
function toRemoveAddress() {
$("#addressError").html("");
}
function toRemoveGrade() {
$("#gradeError").html("");
}
</script>
</head>
<body>
这是添加学生的页面;
<!--表单使用 autocomplete="off"属性,可避免浏览器记忆输入记录-->
<form autocomplete="off" id="formId">
<table width="100%" height="100%" border="1" cellspacing="0">
<!--隐藏放入标记值mark,和更新时进行区分-->
<input type="hidden" name="mark" value="addStudent"/>
<tr>
<td>学号:</td>
<td>
<!--可添加学号失去焦点事件;保障学号唯一性-->
<input type="text" id="snoId" name="sno" onfocus="toRemoveSno()" onfocusout="regexSno(this.value)">
<span id="snoError" style="color: red"></span>
</td>
</tr>
<tr>
<td>姓名:</td>
<td>
<input type="text" id="snameId" name="sname" onfocus="toRemoveSname()">
<span id="snameError" style="color: red"></span>
</td>
</tr>
<tr>
<td>性别:</td>
<td>
<input type="radio" name="ssex" value="男" checked>男
<input type="radio" name="ssex" value="女">女
</td>
</tr>
<tr>
<td>手机:</td>
<td>
<input type="text" id="phoneId" name="phone" onfocus="toRemovePhone()">
<span id="phoneError" style="color: red"></span>
</td>
</tr>
<tr>
<td>地址:</td>
<td>
<input type="text" id="addressId" name="address" onfocus="toRemoveAddress()">
<span id="addressError" style="color: red"></span>
</td>
</tr>
<tr>
<td>年级:</td>
<td>
<select id="gradeId" name="gradeId" onfocus="toRemoveGrade()">
<option value="0">请选择:</option>
</select>
<span id="gradeError" style="color: red"></span>
</td>
</tr>
<tr>
<td colspan="2">
<input type="button" value="提交" onclick="toAdd()">
<input type="button" value="取消" onclick="noAdd()">
</td>
</tr>
</table>
</form>
</body>
</html>
页面显示
如果说,同时在添加同一个学号的学生时;
例如,同时添加学号为156的学生;刚开始在学号的失焦事件验证得出都可以继续操作;
然后,其中一个操作的速度比较快,快速填好了信息,并且提交表单,保存了学号为156的学生信息;但是另一个还在填写表单的内容,但是他还不知道学号为156的学生现在其实已经存在了;
这个比较慢的人,在点击提交表单时就不会去发出提交表单的请求了,因为得到了验证学号的返回值为false而停止
更新学生页面
updateStudent.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>更新学生信息</title>
<!--部署Jquery-->
<script src="../js/jquery.1.8.3.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function (){
//页面加载时,班级信息就动态查询出来;==>且添加到下拉框的选项中;
$.get("../back/student",{mark:"GradeList"},function (data){
if(data==500){
alert("服务器异常");
}else {
var str="";
//注意;显示的是年级名,但是服务器得到的是年级Id号;存入学生表;
for (var i = 0; i < data.length; i++) {
str+="<option value='"+data[i].gid+"'>"+data[i].gname+"</option>";
}
$("#gradeId").append(str);
}
},"json");
//先从session中获得点击要 更新的Id号==>sid;
var upsid = window.sessionStorage.getItem("sid");
//更新前的所有信息也要被查询到此页面;
$.get("../back/student", {upsid: upsid, mark: "selUpdate"}, function (data) {
//先测试;OK,已经获取到了;
//console.log(data)
$("#sid").val(data.sid);
//将获取到的数据放入输入框;
$("#snoId").html(data.sno);
$("#snameId").val(data.sname);
data.ssex == '男' ? $("input[value='男']").attr("checked", true)
: $("input[value='女']").attr("checked", true);
$("#phoneId").val(data.phone);
$("#addressId").val(data.address);
//按照查询到的班级信息自动选择;
$("option[value='" + data.gradeid + "']").attr("selected", true);
}, "json");
});
//提交保存更新;
function canUpdate(){
//先判断一下填写表单了没有;
var snameVal=$("#snameId").val();
var phoneVal =$("#phoneId").val();
var addressVal =$("#addressId").val();
var gradeVal =$("#gradeId").val();
//alert(gradeVal);
if((snameVal.trim()).length==0){
$("#snameError").html("姓名填上");
}else if((phoneVal.trim()).length==0){
$("#phoneError").html("手机填上");
}else if((addressVal.trim()).length==0){
$("#addressError").html("地址填上");
}else if(gradeVal==0){
$("#gradeError").html("别忘了选择年级");
}
//然后再去和后端请求;
else {
$.post("../back/student",$("#formId").serialize(),function (data){
if(data==500){
alert("服务器异常");
}
//判断登录信息是否失效;
else if(data==369){
alert("登录失效,修改信息失效");
//关闭的是外层页面;
window.parent.location.replace("../login.html");
}
else {
alert("修改成功");
//修改后跳转页面;
location.replace("studentlist.html");
}
});
}
}
//取消更新操作;==>点击回到列表页面;
function noUpdate(){
location.replace("studentlist.html");
}
//移出事件; 移出这些输出框,提示信息就"消失";
function toRemoveSname(){
$("#snameError").html("");
}
function toRemovePhone(){
$("#phoneError").html("")
}
function toRemoveAddress(){
$("#addressError").html("");
}
function toRemoveGrade(){
$("#gradeError").html("");
}
</script>
</head>
<body>
这是更新学生的页面;
<!--表单使用 autocomplete="off"属性,可避免浏览器记忆输入记录-->
<form autocomplete="off" id="formId">
<table width="100%" height="100%" border="1" cellspacing="0">
<!--隐藏标记值mark,和添加操作进行区分-->
<input type="hidden" name="mark" value="updateStudent"/>
<!--隐藏id显示,提交时需要使用;-->
<input type="hidden" name="sid" id="sid"/>
<tr>
<td>学号:</td>
<td id="snoId">
<!--学号不进行修改;仅显示-->
<!--<input type="text" id="snoId" name="sno" οnblur="toRemoveSno()">
<span id="snoError" style="color: red"></span>-->
</td>
</tr>
<tr>
<td>姓名:</td>
<td>
<input type="text" id="snameId" name="sname" onblur="toRemoveSname()">
<span id="snameError" style="color: red"></span>
</td>
</tr>
<tr>
<td>性别:</td>
<td>
<input type="radio" name="ssex" value="男" >男
<input type="radio" name="ssex" value="女" >女
</td>
</tr>
<tr>
<td>手机:</td>
<td>
<input type="text" id="phoneId" name="phone" onblur="toRemovePhone()">
<span id="phoneError" style="color: red"></span>
</td>
</tr>
<tr>
<td>地址:</td>
<td>
<input type="text" id="addressId" name="address" onblur="toRemoveAddress()">
<span id="addressError" style="color: red"></span>
</td>
</tr>
<tr>
<td>年级:</td>
<td>
<select id="gradeId" name="gradeId" onblur="toRemoveGrade()">
<option value="0">请选择:</option>
</select>
<span id="gradeError" style="color: red"></span>
</td>
</tr>
<tr>
<td colspan="2">
<input type="button" value="提交" onclick="canUpdate()">
<input type="button" value="取消" onclick="noUpdate()">
</td>
</tr>
</table>
</form>
</body>
</html>
页面加载时,信息显示
学生类管理的servlet处理StudentServlet
import com.google.gson.Gson;
import javax.servlet.ServletException;
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.io.PrintWriter;
import java.util.List;
/**
* @author by CSDN@小智RE0
* @Date: 2021/10/03/16:09
*/
public class StudentServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = null;
//获得发出get请求的携带标记值mark;
String mark = req.getParameter("mark");
//查学生表;
if(mark.equals("list")){
try{
//设置响应字符编码;
resp.setContentType("text/html;charset=utf-8");
out = resp.getWriter();
StudentDao studentDao = new StudentDaoImpl();
List<Student> allStudent = studentDao.getAllStudent();
out.print(new Gson().toJson(allStudent));
}catch (Exception e){
e.printStackTrace();
out.print(500);//==>服务器异常;
}
}
//查循班级信息;
else if(mark.equals("GradeList")){
try{
//设置响应字符编码;
resp.setContentType("text/html;charset=utf-8");
out = resp.getWriter();
GradeDao gradeDao = new GradeDaoImpl();
List<Grade> allGrade = gradeDao.getAllGrade();
//响应返回班级集合;
out.print(new Gson().toJson(allGrade));
}catch (Exception e){
e.printStackTrace();
out.print(500);//==>服务器异常;
}
}
//验证学号;
else if(mark.equals("checkSno")){
try{
//设置响应字符编码;
resp.setContentType("text/html;charset=utf-8");
out = resp.getWriter();
//取得提交过来的学号;
String sno = req.getParameter("sno");
//解析为数字;
int i = Integer.parseInt(sno);
//调用根据学号查询;
StudentDao studentDao = new StudentDaoImpl();
Student studentBySno = studentDao.getStudentBySno(i);
if(studentBySno!=null){
out.print(0);//0, 表示当前学号的学生已存在;
}else {
out.print(1);//1 表示当前学号的学生未存在,可进行添加;
}
}catch (Exception e){
e.printStackTrace();
out.print(500);//服务器异常;
}
}
//按照Id删除;
else if(mark.equals("delStu")){
try {
//设置响应字符编码;
resp.setContentType("text/html;charset=utf-8");
out= resp.getWriter();
//取得提交过来的id号;
String sid = req.getParameter("sid");
//调用按照id删除;
StudentDao studentDao = new StudentDaoImpl();
studentDao.delStudentById(sid);
out.print(200);//--> 删除成功;
} catch (Exception e) {
e.printStackTrace();
out.print(500);//--->服务器异常;
}
}
else if(mark.equals("selUpdate")){
try{
//设置响应字符编码;
resp.setContentType("text/html;charset=utf-8");
out= resp.getWriter();
//先获取要更新的学生的id号;
String upsid = req.getParameter("upsid");
//根据Id查询学生的信息;
StudentDao studentDao = new StudentDaoImpl();
Student studentById = studentDao.getStudentById(upsid);
//System.out.println(studentById);
//转为JSON格式;
out.print(new Gson().toJson(studentById));
}catch (Exception e){
e.printStackTrace();
out.print("服务器异常");//-->服务器异常;
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//取得post请求中的mark标记;
String mark = req.getParameter("mark");
//以流的方式返回;
PrintWriter out = null;
//从session中获取之前存的user;-->得到管理员的Id;
HttpSession session = req.getSession();
User user = (User) session.getAttribute("user");
int uid = user.getId();
//新增学生提交;
if(mark.equals("addStudent")) {
try {
//设置响应字符编码;
resp.setContentType("text/html;charset=utf-8");
out = resp.getWriter();
String sno = req.getParameter("sno");
String sname = req.getParameter("sname");
String ssex = req.getParameter("ssex");
String gradeId = req.getParameter("gradeId");
String phone = req.getParameter("phone");
String address = req.getParameter("address");
StudentDao studentDao = new StudentDaoImpl();
//添加学生;注意还有上面获取的管理员ID;
studentDao.addStudent(sno, sname, ssex, gradeId, phone, address, uid);
out.print(1);//==>添加成功;
} catch (Exception e) {
e.printStackTrace();
out.print(500);
}
}
//更新学生提交;
else if(mark.equals("updateStudent")){
try{
//设置字符编码;
resp.setContentType("text/html;charset=utf-8");
out = resp.getWriter();
//从前端表单获取提交参数;
String sid = req.getParameter("sid");
String sname=req.getParameter("sname");
String ssex =req.getParameter("ssex");
String gradeId = req.getParameter("gradeId");
String phone =req.getParameter("phone");
String address = req.getParameter("address");
//根据学生Id修改部分属性; 注意还有获取的管理员ID
StudentDao studentDao = new StudentDaoImpl();
studentDao.updateStuById(sid,sname,ssex,gradeId,phone,address,uid);
out.print(1);//==>更新信息成功;
}catch (Exception e){
e.printStackTrace();
out.print(500);
}
}
}
}
在web.xml
中配置
<!--学生管理-->
<servlet>
<servlet-name>student</servlet-name>
<servlet-class>com.fivelzq.servlet.StudentServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>student</servlet-name>
<url-pattern>/back/student</url-pattern>
</servlet-mapping>