初级web---完成一个基础的学生表增删改查

在之前的基础上
[简易的网站登录注册,注销退出操作]

添加了登录失效拦截,(在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>
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小智RE0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值