Day69补 前后端分离思想

news2024/11/13 14:44:31

ajax前后端分离

前后端分离处理:前端------(数据)-----服务端----(数据)-----前端-----动态改变页面的内容

1.json

1、JSON:由于JSON易读以及纯文本格式的特性,可以非常容易地与其他程序进行沟通与数据交换。

2、JSON的数据结构通过大括号、中括号、逗号和冒号来组织数据,
冒号(键:值):
一个键值(key)对应一个值(value),字符串部分要用双引号来表示
“姓名”:“小陈” 、 “英文”:75 、 “数学”:80

大括号(对象):
对象代表的是一系列“键:值”的集合,注意点:“键”一定要声明成字符串,也就是一定要加上“双引号”
{“姓名”:”小陈”,”英文”:75,”数学”:80}

中括号(数组):
数组内可以存放数字、文字、布尔值、数组、对象等变量,无论是同时存放同一种性质的变量,以逗号隔开每个变量。

4、JSON字符串转换为JSON对象
var obj = eval(’(’ + str + ‘)’);或者:var obj = JSON.parseObject(str); (常用)

5、JSON对象转JSON字符串
JSON.toJSONString(student)

2.AJAX

2.1 原生JS

Ajax(异步JavaScript和XML)

如果仔细观察一个Form表单的提交,你就会发现,一旦用户点击“Submit”按钮,表单开始提交,浏览器就会刷新页面,然后在新页面里告诉你操作是成功了还是失败了。如果不幸由于网络太慢或者其他原因,就会得到一个404页面。

这就是Web的运作原理:一次HTTP请求对应一个页面。

如果要让用户留在当前页面中,同时发出新的HTTP请求,就必须用JavaScript发送这个新请求,接收到数据后,再用JavaScript更新页面,这样一来,用户就感觉自己仍然停留在当前页面,但是数据却可以不断地更新

向服务器请求额外的数据而无须卸载页面(即刷新),会带来更好的用户体验

GET和POST

1.在Ajax使用的过程中,GET的使用频率要比POST高

2.GET 请求是最常见的请求类型,最常用于向服务器查询某些信息。必要时,可以将查询字符串参数追加到URL的末尾,以便提交给服务器 (GET:通过URL地址栏中使用?后面的内容用&连接产生,显示出来)
通过 URL 后的问号给服务器传递键值对数据,服务器接收到返回响应数据。

3.POST 请求可以包含非常多的数据,我们在使用表单提交的时候,很多就是使用的 POST 传输方式,而发送 POST 请求的数据,不会跟在 URL 的尾巴上,而是通过 send()方法向服务器提交数据。

xmlHttp.send("username=abc&password=123");

PS:从性能上来讲 POST 请求比 GET 请求消耗更多一些,用相同数据比较,GET 最多 比 POST 快两倍。

注意:async 异步 默认值是true
当使用同步时,可以不用侦听通信事件,直接在send后调用就可以,但是因为同步的原因如果一旦出现加载异常或者加载失败,将会报错,因此在ajax通信中尽量不要使用同步

send():发送请求,如果该请求是异步模式(默认),该方法会立刻返回;相反,如果请求是同步模式,则直到请求的响应完全接受以后,该方法才会返回

注意: 所有相关的事件绑定必须在调用send()方法之前进行readystatechange事件

基于原生JS实现AJAX
<script>
    //1. 创建核心对象
    var xhttp;
    if (window.XMLHttpRequest) {
        xhttp = new XMLHttpRequest();
    } else {
        xhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    
     //2. 获取响应(监听AJAX状态改变,获取响应信息)
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            alert(this.responseText);
        }
    };
    
    //3. 发送请求
    xhttp.open("GET", "http://localhost:8080/ajax-demo/ajaxServlet");
    //括号中传递的内容就是请求主体的内容
    xhttp.send();


</script>
</body>
</html>

注意

全局刷新

在非完全前后端的项目中,前端开发只需要完成页面的制作,并且把一些基础的人机交互效果使用js完成即可,页面中需要动态呈现内容的部分,都是交给后台开发工程师做数据绑定和基于服务器进行渲染的(服务器端渲染)

局部刷新

目前市场上大部分项目都是前后端完全分离的项目,页面中需要动态绑定的数据是交给客户端完成渲染的

  1. 向服务器端发送AJAX请求
  2. 把从服务器端获取的数据解析处理,拼接成我们需要展示的HTML字符串
  3. 把拼接好的字符串替换页面中的某一部分内容(局部刷新),页面不需要整体重新加载,局部渲染即可

3.MVC

3.1 MVC

最典型的MVC就是JSP + servlet + javabean的模式

基本的概念:MVC = Model View Controller = 模型-视图-控制器

传统web开发在没有应用Ajax技术的时候,往往页面是用jsp,而这也让我们看到MVC的不足,视图与控制器间的过于紧密的连接,每次请求必须经过“控制器->模型->视图”这个流程,当java脚本 + 各种表达式 + html代码 +javascript代码混杂一块的时候,代码可读性十分差,而且给后面维护和修改代码的人带来很大阻碍

3.2 前后端分离

在传统的java web项目中,Jsp想做的事太多,既有后台数据的处理手法,也要承担视图展现的职能,Java代码、Html、CSS、Javascript、各种表达式、发送请求、接收数据、页面跳转…,让本该分工明确个的各单位糅杂在一起,给开发也带来了一些麻烦

使用Ajax,才真正有点分离的感觉,至少我们知道html、CSS、Js是属于前端版块,后台专注于业务逻辑和数据处理,让前台拿到结果,然后填充内容或者进行局部动态更新,渲染一下页面效果,前后端真正的交互在于这个json数据的请求和返回,而json的本质是 JS 对象的字符串表示法,以键值对呈现。后台有一个对象转化为json的过程,反过来,json传递到前端后,应该有一个内容解析的过程,要知道哪个键对应的值是代表什么含义,该怎么处理

前后端完全分离:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

【优势】

1.我们可以根据需求,任意修改页面中的某一部分内容(例如实时刷新),整体页面不刷新,性能好,体验好(所有表单验证,需要实时刷新的需求都要基于AJAX实现)

2.有利于开发,提高开发效率

3.前后端的完全分离,后台不需要考虑前端如何实现,前端也不需要考虑后台用什么技术,真正意义上实现了技术的划分

4.可以同时进行开发:项目开发开始,首先制定前后端数据交互的接口文档(文档中包含了,调取哪个接口或者哪些数据等协议规范),后台把接口先写好,客户端按照接口调取即可,后台再去实现接口功能即可

【弊端】

1.不利于SEO( 搜索引擎优化 )优化:第一次从服务器端获取的内容不包含需要动态绑定的数据,所以页面的源代码中没有这些内容,不利于SEO收录,后期通过JS添加到页面中的内容,并不会写在页面的源代码中(是源代码不是页面结构)

2.交由客户端渲染,首先需要把页面呈现,然后在通过JS的异步AJAX请求获取数据,在进行数据绑定,浏览器再把动态增加的部分重新渲染,无形中浪费了一些时间,没有服务器端渲染页面呈现速度快

2.2 JQuery操作ajax

导入jQuery包

jQuery 对 AJAX 操作进行了封装,使用Jquery进行ajax操作的具体方法如下:

注意:表单是二进制liu数据还是纯文本数据

  $(function(){       
      //请求参数       
      var list = {};        
      //        
      $.ajax({            
          //请求方式           
          type : "POST",            
          //请求的媒体类型            
          contentType: "application/json;charset=UTF-8", 
          // contentType:json,
          //请求地址            
          url : "http://127.0.0.1/admin/list/",   //"user?action=doLogin"         
          //数据,发送给服务器的数据          
          data : $("#loginForm").serialize(), 
          //是否异步
          async:true,  
          //请求成功            
          success : function(data) {                
              console.log(result);            
          },            
          //请求失败,包含具体的错误信息            
          error : function(e){               
              console.log(e.status);                
              console.log(e.responseText);            
          }        
      });   
  });

4.使用jQuery版本的Ajax实现学生管理系统MVC版本

下面以Spring MVC + Ajax + jsp示例(这里的ajax采用jQuery写法,原生js写法相较繁琐一点)

开发周期:2.5天
开发环境:IDEA、navicat
项目功能:
使用jQuery版本的Ajax实现学生管理系统MVC版本的所有功能
以组长牵头,带领组员实现业务

1.开会讨论出业务的方案 – 业务文档
2.编写接口文档 – https://lbsyun.baidu.com/faq/api?title=webapi/guide/webservice-placeapi/polygon
3.数据库搭建
注意:2、3可同时执行
4.项目搭建 –
前端 – HTML、CSS、JS、jQuery(Ajax)、BootStrap
后端 – utils、pojo、dto

5.mapper
6.service
7.controller
8.测试

相关业务如下:(省略版)

4.1 注册功能

注册功能因为有文件上传,属于二进制流数据,不能用传统方法解决

event.preventDefault(); 是 JavaScript 中用于阻止默认事件行为的方法。

processData:处理数据(有上传文件时使用)

默认情况下,processData 的值是 true,以对象的形式上传的数据都会被转换为字符串的形式上传。而当上传文件的时候,则不需要把其转换为字符串,因此要改成false

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <h1>注册页面</h1>

    //这里添加了一个id属性
    <form id="registerForm" method="post" enctype="multipart/form-data">

        账号:<input type="text" name="username" id="username"/><span id="usernameInfo"></span><br/>
        密码:<input type="password" name="password"/><br/>
        姓名:<input type="text" name="name"/><br/>
        年龄:<input type="text" name="age"/><br/>
        性别:
        <input type="radio" name="sex" value="man" checked="checked"/>男
        <input type="radio" name="sex" value="woman"/>女
        <br/>
        爱好:
        <input type="checkbox" name="hobbies" value="football"/>足球
        <input type="checkbox" name="hobbies" value="basketball"/>篮球
        <input type="checkbox" name="hobbies" value="shop"/>购物
        <br/>
        上传头像:<input type="file" name="photo"/><br/>
        籍贯:
            <select id="province" name="province">
                <option value="xxx">-- 请选择 --</option>
            </select>省
            <select id="city" name="city">
                <option value="xxx">-- 请选择 --</option>
            </select>市
            <br/>

        <input type="submit" value="注册"/>
        <input type="button" value="返回" οnclick="goWelcome()"/>
    </form>

    <script src="js/jquery-1.8.2.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript">
        function goWelcome() {
            window.location = "welcome.html";
        }

        $(function (){

            //给表单绑定一个提交事件
            $("#registerForm").submit(function (event){

                //阻止默认事件行为的发生
                event.preventDefault();

                //创建一个FormData对象
                let formData = new FormData(this);

                $.ajax(
                    {
                        type:"post",
                        url:"student?action=doRegister",
                        
                        processData:false,//不设置处理数据,因为使用了FormData对象
                        contentType:false,//不设置内容类型,表单上设置了multipart/form-data
                        //Ajax中的 data 属性就是 formdata
                        data:formData,
                        async:true,
                        success:function (data){
                            if (data == "1"){
                                alert("注册成功");
                            }else if (data == "-1"){
                                alert("注册失败");
                            }
                        }
                        
                    }
                )

            })
         
    </script>
</body>
</html>

StudentController

//是否注册成功
public void doRegister(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
    boolean register = studentService.register(request, response);
    String code;
    if(register){
        code = "1";
    }else{
        code = "-1";
    }
    response.getWriter().write(code);
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.2 登录功能

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<h1>登录页面</h1>

<!--action="user?action=doLogin" method="post" -->
<form id="loginForm">

    账号:<input type="text" name="username"/><br/>
    密码:<input type="password" name="password"/><br/> <!-- src="user?action=doDrawCode" -->
    验证码:<input type="text" name="userCode"/><img id="drawCode" width="120px" height="30px"><a href="#" id="reDrawCode">刷新</a><br/>
    记住我:<input type="checkbox" name="rememberMe"/><br/>
    角色:
    <select name="role">
        <option value="student">学生</option>
        <option value="teacher">老师</option>
        <option value="admin">管理员</option>
    </select>
    <br/>
    <input id="loginBtn" type="button" value="登录"/>
    <input type="button" value="返回" οnclick="goWelcome()"/>
</form>

<script src="js/jquery-1.8.2.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
    function goWelcome() {
        window.location = "welcome.html";
    }

    img = document.getElementsByTagName("img")[0];

    $(function () {
        //登录功能
        $("#loginBtn").click(function () {
                $.ajax({
                    type: "post",
                    url: "user?action=doLogin",
                    data: $("#loginForm").serialize(),//所有表单带name属性的都传给后端
                    async: true,
                    success: function (data) {
                        if (data == "1") {
                            window.location = "index.jsp";

                        } else if (data == "-1") {
                            alert("登录失败 -- 账号或密码错误");
                        } else if (data == "-2") {
                            alert("登录失败 -- 验证码错误");
                        }
                    }
                    
                })
            }
        )

        //验证码功能
        function showDrawCode() {
            $.ajax({
                type: "post",
                url: "user?action=doDrawCode",
                async: true,
                success: function () {
                    //刷新验证码
                    $("#drawCode").attr("src", "user?action=doDrawCode&" + new Date());
                }
            });
        }

        //页面加载时显示验证码
        showDrawCode();

        //点击验证码图片时刷新验证码
        $("#drawCode" ).click(function () {
            showDrawCode();
        })

        //点击刷新按钮时刷新验证码
        $("#reDrawCode" ).click(function () {
            showDrawCode();
        })
    })


</script>
</body>
</html>

UserController

@WebServlet("/user")
public class UserController extends BaseServlet {

    private UserSevice userSevice = new UserServiceImpl();

    //绘制验证码功能
    public void doDrawCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
        userSevice.drawCode(request,response);
    }

    //登录功能
    public void doLogin(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException {
        
        //注意:表单传过来的数据,可以不做处理,userSevice.login也可以直接获取的到
        
        String login = userSevice.login(request, response);

        response.getWriter().write(login);
    }

}

UserServiceImpl

public class UserServiceImpl implements UserSevice {

    private StudentMapper studentMapper = new StudentMapperImpl();
    private TeacherMapper teacherMapper = new TeacherMapperImpl();
    private AdminMapper adminMapper = new AdminMapperImpl();


    @Override
    public void drawCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //设置宽高的变量
        int width = 120;
        int height = 30;

        //创建画布
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        //获取画笔
        Graphics graphics = image.getGraphics();

        //设置背景色 -- 填充矩形
        graphics.setColor(Color.BLUE);
        graphics.fillRect(0, 0, width, height);

        //设置验证码
        Random random = new Random();//随机函数
        String[] codes = {"A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
        Color[] colors = {Color.CYAN, Color.BLACK, Color.GREEN, Color.PINK, Color.WHITE, Color.RED, Color.ORANGE};

        StringBuffer sb = new StringBuffer();

        for (int i = 0; i < 4; i++) {
            String randomCode = codes[random.nextInt(codes.length)];//设置随机验证码
            Color randomColor = colors[random.nextInt(colors.length)];//设置随机颜色

            graphics.setColor(randomColor);//绘制随机颜色
            graphics.setFont(new Font("宋体", Font.BOLD, 20 + random.nextInt(10)));//设置字体(字体,样式,大小)
            graphics.drawString(randomCode, 20 + i * 25, 15 + random.nextInt(10));//设置单个验证码
            sb.append(randomCode);//拼接单个验证码,组成完整的验证码
        }

        //将系统验证码设置到Session对象中(会话对象)
        HttpSession session = request.getSession();//获取请求里的JSESSIONID(客户端Cookie里的数据),如果没有就创建Session对象,如果有就从Session容器中获取会话对象
        session.setAttribute("sysCode", sb.toString());

        //设置干扰线
        graphics.setColor(Color.YELLOW);
        for (int i = 0; i < 3; i++) {
            graphics.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height));//绘制直线(x1,y1,x2,y2)->两点为一线
        }

        //将画布以jpg形式的文件传出给客户端
        ImageIO.write(image, "jpg", response.getOutputStream());
    }

    @Override
    public String login(HttpServletRequest request, HttpServletResponse response) {
        //获取请求中的数据
        //拿到的是前端data: $("#loginForm").serialize()
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String userCode = request.getParameter("userCode");
        String rememberMe = request.getParameter("rememberMe");
        String role = request.getParameter("role");

        //从Session对象中获取系统的验证码
        String sysCode = (String) request.getSession().getAttribute("sysCode");
        if (sysCode.equalsIgnoreCase(userCode)) {//验证码正确

            User user = null;
            if ("student".equals(role)) {
                user = studentMapper.getStudent(username, password);
            } else if ("teacher".equals(role)) {
                user = teacherMapper.getTeacher(username, password);
            } else if ("admin".equals(role)) {
                user = adminMapper.getAdmin(username, password);
            }

            if (user != null) {//登录成功

                //判断是否记住我
                if (rememberMe != null) {
                    rememberMe(response, user.getUsername(), user.getName(), role, user.getPhoto());

                }

                //将数据存储到Session中
                HttpSession session = request.getSession();
                session.setAttribute("user", user);
                session.setAttribute("role", role);

                return "1";
            } else {//登录失败 -- 账号或密码错误
                return "-1";
            }

        } else {//登录失败 - 验证码错误
            return "-2";
        }
    }
   
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.3 修改密码

index.jsp

直接跳转到jsp页面

<a href="resetPassword.jsp">修改密码</a>

resetPassword.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <!--action="user?action=doResetPassword" method="post"  -->
    <form id="resetPasswordForm"> //添加一个id

        <!--隐藏域,为了让修改页面拿到账号-->
        <input type="hidden" name="username" id="username"/>
        <input type="hidden" name="role" id="role" />

		<%-- ${username},账号是直接展示的 --%>
        账号:<span id="usernameInfo" ></span><br>
        原密码:<input type="password" name="password"/><br>
        新密码:<input type="password" name="newPassword"/><br>

		//改变提交按钮,设置一个id
        <input id="resetPasswordBtn" type="button" value="修改"/>
        <input type="button" value="返回" οnclick="goIndex()"/>

    </form>

    <script src="js/jquery-1.8.2.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript">
        function goIndex(){
            window.location = "index.jsp";
        }

    $(function (){
		//给提交按钮绑定一个点击事件
        $("#resetPasswordBtn").click(function(){
            $.ajax({
                url:"user?action=doResetPassword",
                type:"post",
                data:$("#resetPasswordForm").serialize(),
                dataType:"text",
                async:true,
                success:function(data){
                    alert(data)
                    if (data=="true"){
                        alert("密码修改成功,请重新登录");
                        window.location="login.jsp";

                    }else if(data =="false"){
                        alert("修改失败,原密码不正确");
                        window.location="resetPassword.jsp";
                    }
                }
            })
        })

        //为了表单有数据而设置的
        $.post(
            "user",
            {"action":"getUser"},
            function(data){
                let user=eval("("+data+")").user;
                let role=eval("("+data+")").role;

                let username=user.username;

                //展示页面上的账号信息
                $("#usernameInfo").html(username);
                //给隐藏域赋值
                $("#username").val(username);
                $("#role").val(role);
            }
        )

    })

    </script>

</body>
</html>

UserController

//修改密码功能
    public void doResetPassword(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        boolean resetPassword = userSevice.resetPassword(request, response);

        String username = request.getParameter("username");

        response.getWriter().write(String.valueOf(resetPassword));

    }

    //详情页面、修改密码页面得到数据
    public void getUser(HttpServletRequest request,HttpServletResponse response) throws IOException {
        User user = (User) request.getSession().getAttribute("user");
        String userJSONStr = JSON.toJSONString(user);

        String username = user.getUsername();
        String role = (String) request.getSession().getAttribute("role");

        String jsonStr = "{'role':'" + role + "','user':" + userJSONStr + "}";

        response.getWriter().write(jsonStr);
    }

UserServiceImpl

UserService接口省略

@Override
    public boolean resetPassword(HttpServletRequest request, HttpServletResponse response) {

        //获取请求的数据
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String newPassword = request.getParameter("newPassword");
        String role = request.getParameter("role");

        System.out.println(username+"--"+password);
        System.out.println(role+"1");
        //声明一个User对象
        User user = null;
        //判断角色是否为student
        if ("student".equals(role)) {
            System.out.println(role+"2");
            //根据用户名和密码查询学生表中的数据
            user = studentMapper.getStudent(username,password);
            System.out.println(user+"1");
            //判断角色是否为teacher
        } else if ("teacher".equals(role)) {
            //根据用户名和密码查询教师表中的数据
            user = teacherMapper.getTeacher(username, password);
        } else if ("admin".equals(role)) {
            //根据用户名和密码查询管理员表中的数据
            user = adminMapper.getAdmin(username, password);
        }

        //判断查询结果是否为空
        if (user != null) {
            //判断角色是否为student
            if ("student".equals(role)) {

                //更新学生表中的密码
                studentMapper.update(username, newPassword);
                System.out.println(role+"3");
                return true;
                //判断角色是否为teacher
            } else if ("teacher".equals(role)) {
                //更新教师表中的密码
                teacherMapper.update(username, newPassword);
                return true;
            } else if ("admin".equals(role)) {
                //更新管理员表中的密码
                adminMapper.update(username, newPassword);
                return true;
            }
        } else {
            //设置修改失败的信息
            //request.setAttribute("msg","修改失败,原密码不正确");
            return false;
        }

        return false;
    }

4.4 查看所有学科

index.jsp

使用前后端分离,直接链接给一个jsp或者html就可以了

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <c:if test="${role eq 'admin'}">
        <a href="teacher?action=doGetTeachers&curPage=1">查看所有教师</a>
        <a href="student?action=doGetStudents&curPage=1">查看所有学生</a>

        <a href="courseList.jsp">查看所有学科</a>
    </c:if>

</body>
</html>

courseList.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<button οnclick="goIndex()">返回</button>
<button οnclick="goAdd()">添加</button>

<h1>课程列表页面</h1>

<table border="1" width="600px" id="courseList"> //给表格设置一个id

    <tr>
        <th>课程编号</th>
        <th>课程名称</th>
        <th>操作</th>
    </tr>


</table>


<script src="js/jquery-1.8.2.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
    function goIndex() {
        window.location = "index.jsp";
    }
    function goAdd() {
        window.location = "courseAdd.jsp";
    }


    $(function () {
        $.ajax({
            url: "course?action=doGetCourses",
            type: "post",
            dataType: "json",
            success: function (data) {//后端传回来的是JSON字符串(一个数组,直接遍历使用)
                var html = "";
                //遍历数据,进行拼接
                for (var i = 0; i < data.length; i++) {
                    html += "<tr>" +
                        "<td>" + data[i].id + "</td>" +
                        "<td>" + data[i].name + "</td>" +
                        "<td><a href='courseInfo.jsp?courseId=" + data[i].id + "'>修改</a> <a href='course?action=doDelete'>删除</a> </td>" +
                        "</tr>";

                }
				//将数据写在表格中
                $("#courseList").html(html);
            }
        })
    })


</script>

</body>
</html>

data:{id: 1, name: ‘xxx’},{id: 2, name: ‘Python’},{id: 3, name: ‘HTML’},{id: 13, name: ‘数学’}

CourseController

JSON.toJSONString 是将对象转化为Json字符串

@WebServlet("/course")
public class CourseController extends BaseServlet {

    private CourseService courseService = new CourseServiceImpl();

    public void doGetCourses(HttpServletRequest request, HttpServletResponse response) throws  IOException {
        List<Course> courses = courseService.getCourses(request, response);
        //将对象转化为Json字符串 
        response.getWriter().write(JSON.toJSONString(courses));
    }

}

CourseServiceImpl

返回一个List集合

public class CourseServiceImpl implements CourseService {

    private CourseMapper courseMapper = new CourseMapperImpl();

    @Override
    public List<Course> getCourses(HttpServletRequest request, HttpServletResponse response) {

        List<Course> courses = courseMapper.getCourses();
        return courses;
    }

}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.5 老师功能

4.5.1 查看所有老师

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

详情页index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>Title</title>
</head>
<body>


    <c:if test="${role eq 'admin'}">
<%--        <a href="teacher?action=doGetTeachers&curPage=1">查看所有教师</a>--%>
        
        <a href="teaList.jsp">查看所有教师</a>
        
        <a href="student?action=doGetStudents&curPage=1">查看所有学生</a>
        <a href="courseList.jsp">查看所有学科</a>

    </c:if>
//...省略
</body>
</html>

教师列表页面 teaList.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <button οnclick="goIndex()">返回</button>
    <button οnclick="goAdd()">添加</button>

    <h1>教师列表页面</h1>

    <table id="teaListTable" border="1" width="600px"> //添加一个id属性,方便插入数据

        <tr>
            <th>账号</th>
            <th>姓名</th>
            <th>性别</th>
            <th>年龄</th>
            <th>省份</th>
            <th>城市</th>
            <th>课程</th>
            <th>操作</th>
            <th>操作</th>
        </tr>

    </table>

    <script src="https://code.jquery.com/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript">
        function goIndex() {
            window.location = "index.jsp";
        }
        function goAdd() {
            window.location = "teaAdd.jsp";
        }


        //拿到数据
        $(function () {

            $.ajax({
                url: "teacher?action=doGetTeachers",
                type: "get",
                dataType: "json",
                success: function (data) {
                    createTable(data);
                },
                error: function (error) {
                    console.log("Error: ", error);
                }
            })
        })

        //插入到表中
        function createTable(data) {
            let table = $("#teaListTable");

            for (let i = 0; i < data.length; i++) {
                let row = $("<tr></tr>");
                row.append($("<td></td>").text(data[i].teacher.username));
                row.append($("<td></td>").text(data[i].teacher.name));
                row.append($("<td></td>").text(data[i].teacher.sex));
                row.append($("<td></td>").text(data[i].teacher.age));
                row.append($("<td></td>").text(data[i].teacher.province));
                row.append($("<td></td>").text(data[i].teacher.city));
                row.append($("<td></td>").text(data[i].teacher.courseId));
                row.append($("<td></td>").html("<button class='delete-btn' data-username='" + data[i].teacher.username + "'>删除</button>"));
                row.append($("<td></td>").html("<button class='modify-btn' data-username='" + data[i].teacher.username + "'>修改</button>"));
                table.append(row);
            }

            }


    </script>

</body>
</html>

老师的控制器层 TeacherController

package com.zhj.controller;

@WebServlet("/teacher")
public class TeacherController extends BaseServlet {

    private TeacherService teacherService = new TeacherServiceImpl();

    public void doGetTeachers(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<TeacherDto> teachersList = teacherService.getTeachersList(request, response);
        String teaJSONStr = JSON.toJSONString(teachersList);
        System.out.println(teaJSONStr);
        response.getWriter().write(teaJSONStr);
    }

}

TeacherServiceImpl拿到老师的列表集合,TeacherService接口省略

package com.zhj.service.impl;

public class TeacherServiceImpl implements TeacherService {

    @Override
    public List<TeacherDto> getTeachersList(HttpServletRequest request, HttpServletResponse response) {

        //从数据库获取老师集合
        List<Teacher> teachers = teacherMapper.getTeachers(0,15);

        //处理教师集合
        List<TeacherDto> teacherDtos = DtoUtils.teacherDtoListHandler(teachers);

        return teacherDtos;
    }

}

TeacherMapperImpl,如何从数据库中拿到老师集合

package com.zhj.mapper.impl;

public class TeacherMapperImpl implements TeacherMapper {

    @Override
    public List<Teacher> getTeachers(int offset, int count) {

        List<Teacher> teachers = null;
        try {
            teachers = DBUtils.commonQueryList(Teacher.class, "select * from teacher limit ?,?", offset, count);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        return teachers;
    }


    @Override
    public String getProvince(String code) {
        String province = null;
        try {
            Connection connection = DBUtils.getConnection();
            String sql = "select name from provinces where code=?";
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setString(1,code);
            ResultSet resultSet = statement.executeQuery();
            if (resultSet.next()){
                province = resultSet.getString("name");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        return province;
    }

    @Override
    public String getCity(String code) {
        String city =null;
        try {
            Connection connection = DBUtils.getConnection();
            String sql = "select name from provinces where code=?";
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setString(1,code);
            ResultSet resultSet = statement.executeQuery();
            if (resultSet.next()){
                city = resultSet.getString("name");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return city;
    }
}

TeacherDto,处理列表中性别为man转成男,转成中文的

package com.zhj.dto;

public class TeacherDto {

    private Teacher teacher;
    private String sex;

    private String province;
    private String city;
    //有参构造,无参构造,get,set,toString省略
}

工具类,省份城市太多了,省略不写

package com.zhj.utils;

public class DtoUtils {

    public static TeacherDto teacherDtoHandler(Teacher teacher){

        //处理老师的性别数据
        String sex = teacher.getSex();
        if ("man".equals(sex)){
            sex = "男";
        }else if ("woman".equals(sex)){
            sex = "女";
        }

        TeacherMapper teacherMapper = new TeacherMapperImpl();
        String provinceCode = teacher.getProvince();
        String province = teacherMapper.getProvince(provinceCode);

        String cityCode = teacher.getCity();
        String city = teacherMapper.getCity(cityCode);

        TeacherDto teacherDto = new TeacherDto(teacher,sex,province,city);

        return teacherDto;

    }

    public static List<TeacherDto> teacherDtoListHandler(List<Teacher> teachers){

        List<TeacherDto> teacherDtos = new ArrayList<>();

        for (Teacher teacher : teachers) {
            TeacherDto teacherDto = teacherDtoHandler(teacher);
            teacherDtos.add(teacherDto);
        }
        return teacherDtos;
    }


}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.5.2 添加老师功能

teaList.jsp 点击添加按钮,跳转到添加页面

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <button οnclick="goIndex()">返回</button>
    
    <button οnclick="goAdd()">添加</button>

    <h1>教师列表页面</h1>

    <table id="teaListTable" border="1" width="600px"> //添加一个id属性,方便插入数据

        <tr>
            <th>账号</th>
            <th>姓名</th>
            <th>性别</th>
            <th>年龄</th>
            <th>省份</th>
            <th>城市</th>
            <th>课程</th>
            <th>操作</th>
            <th>操作</th>
        </tr>

    </table>

    <script src="https://code.jquery.com/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript">
        function goIndex() {
            window.location = "index.jsp";
        }
        function goAdd() {
            window.location = "teaAdd.jsp";
        }


  //...省略
    </script>

</body>
</html>

添加页面 teaAdd.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <h1>添加页面</h1>
    <%--二进制数据--%>
    <form id="addForm"> //添加一个id属性

        账号:<input type="text" name="username"/><br/>
        密码:<input type="password" name="password"/><br/>
        姓名:<input type="text" name="name"/><br/>
        年龄:<input type="text" name="age"/><br/>
        性别:
        <input type="radio" name="sex" value="man" checked="checked"/>男
        <input type="radio" name="sex" value="woman"/>女
        <br/>
        课程:
        <select>
            <option value="1">JavaEE</option>
            <option value="2">Python</option>
            <option value="3">HTML</option>
        </select>
        <br/>
        上传头像:<input type="file" name="photo"/><br/>

        籍贯:
        <select id="province" name="province">
            <option value="xxx">-- 请选择 --</option>
        </select>省
        <select id="city" name="city">
            <option value="xxx">-- 请选择 --</option>
        </select>市
        <br/>

        <input type="submit" value="添加"/>
        <input type="button" value="返回" οnclick="goBack()"/>

    </form>

    <script src="js/jquery-1.8.2.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript">

        function goBack(){
            window.location = "teacher?action=doGetTeachers&curPage=1";
        }

        $("#addForm").submit(function (event){
            event.preventDefault();
            let formData= new FormData(this);
            $.ajax({
                type:"post",
                url:"teacher?action=doAdd", //提交到后台的地址
                processData:false,
                contentType:false,

                data:formData,
                success:function (data){
                    if (data == "1"){
                        alert("添加成功");
                        window.location = "teaList.jsp";
                    }else {
                        alert("添加失败");
                        window.location="teaAdd.jsp";
                    }
                }
            })
        })

        function showProvince(){
            $.get(
                "province",
                {"action":"getProvinces"},
                function (data){
                    let provinceArr = eval(data);
                    for (let i = 0;i<provinceArr.length;i++){
                        let code = provinceArr[i].code;
                        let name = provinceArr[i].name;
                        let option = $("<option></option>");
                        $(option).val(code);
                        $(option).text(name)
                        $("#province").append(option)
                    }
                }
            )
        }

        showProvince();

        $("#province").change(function (){
            let v = $(this).val();
            if (v == "xxx"){
                $("#city").html("<option value='xxx'>-- 请选择 --</option>");
            }else{
                $.get(
                    "province",
                    {"action":"getCities","code":v},
                    function (data){
                        //先清空城市列表
                        $("#city").html("");

                        //解析json数据
                        let cityArr = eval(data);
                        for (let i = 0;i<cityArr.length;i++){
                            let code = cityArr[i].code;
                            let name = cityArr[i].name;
                            let option = $("<option></option>");
                            $(option).val(code);
                            $(option).html(name);
                            $("#city").append(option);
                        }
                    }
                )
            }
        })

    </script>
</body>
</html>

TeacherController

package com.zhj.controller;

@WebServlet("/teacher")
public class TeacherController extends BaseServlet {

    private TeacherService teacherService = new TeacherServiceImpl();

    public void doAdd(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        boolean add = teacherService.add(request, response);
        String code;
        if (add) {
            code = "1";
        }else {
            code = "-1";
        }
        response.getWriter().write(code);
    }

}

TeacherServiceImpl添加功能的具体实现,TeacherService接口省略

package com.zhj.service.impl;

public class TeacherServiceImpl implements TeacherService {

    private TeacherMapper teacherMapper = new TeacherMapperImpl();
    private CourseService courseService = new CourseServiceImpl();

    @Override
    public boolean isAdd(String username) {

        //获取请求的数据
        //从数据库中获取教师对象
        Teacher teacher = teacherMapper.getTeacher(username);
        if (teacher == null){
            return true;
        }
        return false;
    }

    @Override
    public boolean add(HttpServletRequest request, HttpServletResponse response) {

        ParseRequestData<Teacher> parseRequestData = ParseRequestDataUtils.parseRequest(request, Teacher.class, "upload\\teacher");
        Teacher tea = parseRequestData.getT();
        InputStream in = parseRequestData.getIn();
        OutputStream out = parseRequestData.getOut();

        //判断账号是否已添加
        boolean add = isAdd(tea.getUsername());
        if (add){
            //将数据插入到教师表中
            teacherMapper.add(tea.getUsername(),tea.getPassword(),tea.getName(),tea.getSex(),tea.getAge(),tea.getCourseId(),tea.getProvince(),tea.getCity(),tea.getPhoto());
            //将头像存储到本地磁盘
            try {
                IOUtils.copy(in, out);
                in.close();
                out.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            return true;
        }else {
            try {
                in.close();
                out.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            request.setAttribute("msg","添加失败 -- 账号已被添加");
            return false;
        }
    }

}

TeacherMapperImpl 从数据库添加一个老师,TeacherMapper接口省略

package com.zhj.mapper.impl;

public class TeacherMapperImpl implements TeacherMapper {
    @Override
    public void add(String username, String password, String name, String sex, int age, int courseId, String province,String city,String photo) {
        try {
            DBUtils.commonInsert("insert into teacher(username,password,name,sex,age,courseId,province,city,photo) values(?,?,?,?,?,?,?,?,?)",username,password,name,sex,age, courseId,province,city,photo);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

}


运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.5.3 修改老师

教师列表页面点击修改按钮

localStorage.setItem(‘username’, username):把数据存储在本地,另外一个页面可以取

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <h1>教师列表页面</h1>

    <script src="https://code.jquery.com/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript">

        // 修改学生信息
        $("#teaListTable").on("click", ".modify-btn", function () {
            let username = $(this).data("username");
            localStorage.setItem('username', username);
            // 处理响应
            window.location = "teaInfo.jsp";

        })


        function createTable(data) {
            let table = $("#teaListTable");

            for (let i = 0; i < data.length; i++) {
                let row = $("<tr></tr>");
                row.append($("<td></td>").text(data[i].teacher.username));
                row.append($("<td></td>").text(data[i].teacher.name));
                row.append($("<td></td>").text(data[i].teacher.sex));
                row.append($("<td></td>").text(data[i].teacher.age));
                row.append($("<td></td>").text(data[i].teacher.province));
                row.append($("<td></td>").text(data[i].teacher.city));
                row.append($("<td></td>").text(data[i].teacher.courseId));
                row.append($("<td></td>").html("<button class='delete-btn' data-username='" + data[i].teacher.username + "'>删除</button>"));
                row.append($("<td></td>").html("<button class='modify-btn' data-username='" + data[i].teacher.username + "'>修改</button>"));
                table.append(row);
            }

            }

    </script>


</body>
</html>

教师信息修改页面teaInfo.jsp

let username = localStorage.getItem(‘username’):老师列表页面传过来的本地数据,取出来

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <h1>教师信息修改页面</h1>

    <form id="teaInfoForm">

        <!--隐藏域,用于传递教师账号-->
        <input type="hidden" name="username" id="username"/>

        <!--显示教师账号-->
        账号:<span id="usernameInfo"></span><br/>
        <!--显示教师姓名,并允许修改-->
        姓名:<input type="text" name="name" /><br/>
        <!--显示教师年龄,并允许修改-->
        年龄:<input type="text" name="age"/><br/>
        <!--显示教师性别,并允许修改-->
        性别:
        <input type="radio" name="sex" value="man" }/>男
        <input type="radio" name="sex" value="woman" }/>女
        <br/>
        <!--显示教师学科,并允许修改-->
        学科:
        <select name="course" id="course">
            </select>
        <br/>
        上传头像:<input type="file" name="photo"/><span id="photoInfo"></span><br/>
        籍贯:
        <select id="province" name="province">
            <option value="xxx">-- 请选择 --</option>
        </select>省
        <select id="city" name="city">
            <option value="xxx">-- 请选择 --</option>
        </select>市
        <br>

        <!--提交按钮,用于提交修改后的教师信息-->
        <input type="submit" value="修改"/>
        <!--返回按钮,用于返回首页-->
        <input type="button" value="返回" οnclick="goIndex()"/>

    </form>

    <script src="https://code.jquery.com/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript">

        let username = localStorage.getItem('username');

        $(function () {
            function showCourse() {
                $.get(
                    "course",
                    {"action": "doGetCourses"},
                    function (data) {
                        let course = eval(data);
                        for (let i = 0; i < course.length; i++) {
                            let id = course[i].id;
                            let name = course[i].name;
                            let option = $("<option></option>");
                            $(option).val(id);
                            $(option).text(name);
                            $("#course").append(option);
                        }
                    }
                )
            }

        showCourse();

        //返回首页的函数
        function goIndex(){
            window.location = "index.jsp";
        }

        // 显示老师信息
        function showInfo() {
            $.post(
                "teacher?action=doInitModify",
                {"username": username},
                function (data) {
                    let teacher = eval("(" + data + ")");
                    $("#usernameInfo").text(teacher.username);
                    $("#username").val(teacher.username);
                    $("input[name='name']").attr("placeholder", teacher.name);
                    $("input[name='age']").attr("placeholder", teacher.age);
                    teacher.sex === "man" ? $("input[value='man']").attr("checked", true) : $("input[value='woman']").attr("checked", true);

                    // 显示学科
                    let id = teacher.courseId;
                    if ($("#course").val(id) == id) {
                        $(this).attr("selected", true);
                    }
                    //头像
                    $("#photoInfo").text(teacher.photo)
                    //
                    let code = teacher.province;
                    if ($("#province".val(code)) == code) {
                        $(this).attr("selected", true);
                    }

                }
            );
        }

        // 显示老师信息
        showInfo();

        function showProvince() {
            $.get(
                "province",
                {"action": "getProvinces"},
                function (data) {
                    let provinceArr = eval(data);
                    for (let i = 0; i < provinceArr.length; i++) {
                        let code = provinceArr[i].code;
                        let name = provinceArr[i].name;
                        let option = $("<option></option>");
                        $(option).val(code);
                        $(option).text(name)
                        $("#province").append(option)
                    }
                }
            )
        }

        showProvince();

        $("#province").change(function () {
            let v = $(this).val();
            if (v == "xxx") {
                $("#city").html("<option value='xxx'>-- 请选择 --</option>");
            } else {
                $.get(
                    "province",
                    {"action": "getCities", "code": v},
                    function (data) {
                        //先清空城市列表
                        $("#city").html("");

                        //解析json数据
                        let cityArr = eval(data);
                        for (let i = 0; i < cityArr.length; i++) {
                            let code = cityArr[i].code;
                            let name = cityArr[i].name;
                            let option = $("<option></option>");
                            $(option).val(code);
                            $(option).html(name);
                            $("#city").append(option);
                        }
                    }
                )
            }
        })
        })
        // 提交表单
        $("#teaInfoForm").submit(function (event) {
            event.preventDefault(); // 阻止表单默认提交行为

            let formData = new FormData(this);// 序列化表单数据

            $.ajax({
                type: "POST",
                url: "teacher?action=doModify",
                processData: false,
                contentType: false,
                data: formData,
                async: true,
                success: function (data) {
                    if (data == "1") {
                        alert("修改成功");
                        window.location = "teaList.jsp";
                    } else if (data == "-1") {
                        alert("修改失败");
                        window.location = "teaInfo.jsp";
                    }
                }
            });
        });

    </script>
</body>
</html>

CourseController先修改老师页面传递一个课程列表

package com.zhj.controller;

@WebServlet("/course")
public class CourseController extends BaseServlet {

    private CourseService courseService = new CourseServiceImpl();
    
    public void doGetCourses(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Course> courses = courseService.getCourses(request, response);
        String couJSONStr = JSON.toJSONString(courses);
        response.getWriter().write(couJSONStr);
    }

}

CourseServiceImpl

   @Override
    public List<Course> getCourses(HttpServletRequest request, HttpServletResponse response) {
        List<Course> courses = courseMapper.getCourses();
        return courses;
    }

TeacherController

package com.zhj.controller;

@WebServlet("/teacher")
public class TeacherController extends BaseServlet {

    private TeacherService teacherService = new TeacherServiceImpl();

    public void doInitModify(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Teacher teacher = teacherService.initModify(request, response);
        String jsonStr = JSON.toJSONString(teacher);
        response.getWriter().write(jsonStr);
    }

    public void doModify(HttpServletRequest request, HttpServletResponse response) throws IOException {

        boolean modify = teacherService.modify(request, response);

        String code;
        if(modify){
            code = "1";
        }else{
            code = "-1";
        }
        response.getWriter().write(code);
    }

}

TeacherServiceImpl

package com.zhj.service.impl;

public class TeacherServiceImpl implements TeacherService {

    private TeacherMapper teacherMapper = new TeacherMapperImpl();
    private CourseService courseService = new CourseServiceImpl();
    
    @Override
    public Teacher initModify(HttpServletRequest request, HttpServletResponse response) {
        //获取请求的数据
        String username = request.getParameter("username");
        //从数据库中获取教师对象
        Teacher teacher = teacherMapper.getTeacher(username);
//        request.setAttribute("teacher", teacher);
//        courseService.getCourses(request, response);
        return teacher;
    }

    @Override
    public boolean modify(HttpServletRequest request, HttpServletResponse response) {
        ParseRequestData<Teacher> parseRequestData = ParseRequestDataUtils.parseRequest(request, Teacher.class, "upload\\teacher");
        Teacher tea = parseRequestData.getT();
        InputStream in = parseRequestData.getIn();
        OutputStream out = parseRequestData.getOut();
        Teacher tea1 = teacherMapper.getTeacher(tea.getUsername());//老数据

        try {
            if (tea.getPhoto() != null){//说明用户修改头像
                teacherMapper.update(tea.getUsername(),tea.getName(),tea.getSex(),tea.getAge(),tea.getCourseId(),tea.getProvince(),tea.getCity(),tea.getPhoto());
                IOUtils.copy(in,out);
            }else{
                teacherMapper.update(tea.getUsername(),tea.getName(),tea.getSex(),tea.getAge(),tea.getCourseId(),tea.getProvince(),tea.getCity());
            }
            if (in != null){
                in.close();
            }
            if (out != null){
                out.close();
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        Teacher tea2 = teacherMapper.getTeacher(tea.getUsername());//修改后的数据

        String role = (String) request.getSession().getAttribute("role");
        if ("teacher".equals(role)){
            //更新Session里的数据
            request.getSession().setAttribute("name",tea.getName());
            //更新Cookie里的数据
            response.addCookie(CookieUtils.createCookie("name",tea.getName(),60*60*24*5));
            if (tea.getPhoto() != null){
                request.getSession().setAttribute("photo",tea.getPhoto());
                response.addCookie(CookieUtils.createCookie("photo",tea.getPhoto(),60*60*24*5));
            }
        }

        //判断是否修改成功
        if (tea1!=tea2){
            return true;
        }else {
            return false;
        }

    }

}

TeacherMapperImpl

package com.zhj.mapper.impl;

public class TeacherMapperImpl implements TeacherMapper {

    @Override
    public void update(String username, String name, String sex, int age, int courseId,String province,String city) {
        try {
            DBUtils.commonUpdate("update teacher set name=?,sex=?,age=?,courseId=?,province=?,city=? where username=?",name,sex,age,courseId,province,city,username);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void update(String username, String name, String sex, int age, int courseId, String province, String city, String photo) {
        try {
            DBUtils.commonUpdate("update teacher set name=?,sex=?,age=?,courseId=?,province=?,city=?,photo=? where username=?",name,sex,age,courseId,province,city,photo,username);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }


}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.5.4 删除老师功能

teaList.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <button οnclick="goIndex()">返回</button>
    <button οnclick="goAdd()">添加</button>

    <h1>教师列表页面</h1>

    <table id="teaListTable" border="1" width="600px">

        <tr>
            <th>账号</th>
            <th>姓名</th>
            <th>性别</th>
            <th>年龄</th>
            <th>省份</th>
            <th>城市</th>
            <th>课程</th>
            <th>操作</th>
            <th>操作</th>
        </tr>

    </table>

    <script src="https://code.jquery.com/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript">
  


        // 删除学生信息
        $("#teaListTable").on("click", ".delete-btn", function () {
            let username = $(this).data("username");
            $.ajax({
                url: "teacher?action=doDelete",
                type: "POST",
                data: {
                    username: username
                },
                success: function (data) {
                    if (data == "1") {
                        alert("删除成功");
                        window.location = "teaList.jsp";
                    } else if (data == "-1") {
                        alert("删除失败");
                    }
                }
            })
        })

   


        function createTable(data) {
            let table = $("#teaListTable");

            for (let i = 0; i < data.length; i++) {
                let row = $("<tr></tr>");
                row.append($("<td></td>").text(data[i].teacher.username));
                row.append($("<td></td>").text(data[i].teacher.name));
                row.append($("<td></td>").text(data[i].teacher.sex));
                row.append($("<td></td>").text(data[i].teacher.age));
                row.append($("<td></td>").text(data[i].teacher.province));
                row.append($("<td></td>").text(data[i].teacher.city));
                row.append($("<td></td>").text(data[i].teacher.courseId));
                row.append($("<td></td>").html("<button class='delete-btn' data-username='" + data[i].teacher.username + "'>删除</button>"));
                row.append($("<td></td>").html("<button class='modify-btn' data-username='" + data[i].teacher.username + "'>修改</button>"));
                table.append(row);
            }

            }

    </script>


</body>
</html>

TeacherController

package com.zhj.controller;

@WebServlet("/teacher")
public class TeacherController extends BaseServlet {

    private TeacherService teacherService = new TeacherServiceImpl();

    public void doDelete(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        boolean delete = teacherService.delete(request, response);
        String code;
        if(delete){
            code = "1";
        }else{
            code = "-1";
        }
        response.getWriter().write(code);
    }

}

TeacherServiceImpl

package com.zhj.service.impl;

public class TeacherServiceImpl implements TeacherService {

    private TeacherMapper teacherMapper = new TeacherMapperImpl();
    private CourseService courseService = new CourseServiceImpl();

    @Override
    public boolean delete(HttpServletRequest request, HttpServletResponse response) {
        String username = request.getParameter("username");
        teacherMapper.delete(username);
        Teacher teacher = teacherMapper.getTeacher(username);
        if (teacher == null){
            return true;
        }
        return false;
    }
}

TeacherMapperImpl

package com.zhj.mapper.impl;

public class TeacherMapperImpl implements TeacherMapper {

    @Override
    public void delete(String username) {
        try {
            DBUtils.commonUpdate("delete from teacher where username = ?",username);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public Teacher getTeacher(String username) {

        Teacher teacher = null;
        try {
            teacher = DBUtils.commonQueryObj(Teacher.class, "select * from teacher where username = ?", username);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        return teacher;
    }


}


运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2150824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

引领长期投资新篇章:价值增长与财务安全的双重保障

随着全球金融市场的不断演变&#xff0c;长期投资策略因其稳健性和对价值增长的显著推动作用而日益受到投资者的重视。在这一背景下&#xff0c;Zeal Digital Shares&#xff08;ZDS&#xff09;项目以其创新的数字股票产品&#xff0c;为全球投资者提供了一个全新的长期投资平…

IPv6(四)

文章目录 Path MTUIPv6配置 Path MTU IPv4 对于数据过大的数据包会执行切片操作&#xff0c;但是切片有可能会造成设备性能的降低 IPv6使用Path MTU来传递数据过大的数据包 依次会协商最小的 MTU 单元为了减少中间转发设备的压力&#xff0c;中间转发设备不对 IPv6 报文进行分片…

【快速笔记】freeRTOS

第十八章 低功耗Tickless模式 睡眠模式:__WFI 中断唤醒 __WFE 事件唤醒 CPU CLK关闭 停止模式&#xff1a;RAM保持 中断唤醒 当 STM32F103 处于休眠模式的时候 Cortex-M3 内核停止运行&#xff0c;但是其他外设运行正常&#xff0c; 比如 NVIC、SRAM 等。 休眠模式的功耗比其他…

【Linux】环境部署kafka集群

目录 一、kafka简介 1. 主要特点 2.组件介绍 3.消息中间件的对比 二、环境准备 1.Java环境 2.Zookeeper环境 3.硬件环境集群 三、Zookeeper的集群部署 1.下载zookeeper 2.部署zookeeper集群 &#xff08;1&#xff09;node1节点服务器 &#xff08;2&#xff09;no…

排序----希尔排序

void ShellSort(int* a, int n) {int gap n;while (gap > 1){// 1保证最后一个gap一定是1// gap > 1时是预排序// gap 1时是插入排序gap gap / 3 1;for (size_t i 0; i < n - gap; i){int end i;int tmp a[end gap];while (end > 0){if (tmp < a[end]){…

6.C_数据结构_查询_哈希表

概述 哈希表的查询是通过计算的方式获取数据的地址&#xff0c;而不是依次比较。在哈希表中&#xff0c;有一个键值key&#xff0c;通过一些函数转换为哈希表的索引值。 其中&#xff1a;这个函数被称为哈希函数、散列函数、杂凑函数&#xff0c;记为&#xff1a;H(key) 哈希…

MySQL 中的锁定粒度:理解与应用

在 MySQL 数据库的使用中&#xff0c;锁定粒度是一个至关重要的概念。它决定了数据库在并发控制中锁定的范围和程度&#xff0c;对数据库的性能和并发能力有着深远的影响。今天&#xff0c;我们就来深入了解一下 MySQL 中的锁定粒度是什么意思&#xff0c;并通过实际案例来更好…

鸿蒙开发之ArkUI 界面篇 十五 交叉轴对其方式

鸿蒙界面有两个容器一个是Colum、一个是Row&#xff0c;Colum主轴是垂直方向&#xff0c;交叉轴是水平方向&#xff0c;Row的主轴是水平方向&#xff0c;交叉轴是垂直方向&#xff0c;对应方向调整子控件的话&#xff0c;justifyContent调整的是主轴方向的子控件距离&#xff0…

论文阅读-《Attention is All You Need》

注意力就是一切 【要点】&#xff1a;论文提出了一种全新的网络架构——Transformer&#xff0c;完全基于注意力机制&#xff0c;无需使用循环和卷积&#xff0c;实现了在机器翻译任务上的性能提升和训练效率的显著提高。 【方法】&#xff1a;通过构建一个仅使用注意力机制的…

【高分系列卫星简介】

高分系列卫星是中国国家高分辨率对地观测系统&#xff08;简称“高分工程”&#xff09;的重要组成部分&#xff0c;旨在提供全球范围内的高分辨率遥感数据&#xff0c;广泛应用于环境监测、灾害应急、城市规划、农业估产等多个领域。以下是对高分系列卫星及其数据、相关参数和…

Java流程控制语句——条件控制语句详解(附有流程图)#Java条件控制语句有哪些?#if-else、switch

在 Java 编程中&#xff0c;条件控制语句用于控制程序的执行路径&#xff0c;决定根据某些条件来选择执行某段代码或跳过某段代码。它们是 Java 编程的重要组成部分&#xff0c;帮助开发者根据不同的输入、状态或数据流来编写更加灵活和动态的代码。在本文中&#xff0c;我们将…

利用git将项目上传到github

采用git而不是在pycharm中共享的原因&#xff1a;可能会出现上图报错 目录 1、创建github仓库2、在 git bash 中初始化Git仓库&#xff0c;添加文件&#xff0c;上传代码 1、创建github仓库 2、在 git bash 中初始化Git仓库&#xff0c;添加文件&#xff0c;上传代码

【C++】STL----list常见用法

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;C从小白到高手 &#x1f339;往期回顾&#x1f339;&#xff1a;[C]vector常见用法 &#x1f516; 流水不争&#xff0c;争的是滔滔不息。 文章目录 一、list的介绍li…

【C++】list容器的基本使用

一、list是什么 list的底层结构是带头双向循环链表。 相较于 vector 的连续线性空间&#xff0c;list 就显得复杂很多&#xff0c;它是由一个个结点构成&#xff0c;每个结点申请的空间并不是连续的&#xff0c;它的好处是每次插入或删除一个数据&#xff0c;就配置或释放一个…

WebServer:log

超时锁的编写 这个问题处于blockqueue.h文件中&#xff0c;内容如下&#xff1a; template<class T> bool BlockDeque<T>::pop(T& item, int timeout) {std::unique_lock<std::mutex> locker(mtx_);while(deq_.empty()) {if(condConsumer_.wait_for(lo…

内存泄漏

文章目录 内存泄漏发现问题topVisualVMArthas 原因分析代码层面并发请求 诊断问题MAT原理 –支配树获取运行时快照 内存泄漏 内存泄漏&#xff08;memory leak&#xff09;&#xff1a;在Java中如果不再使用一个对象&#xff0c;但是该对象依然在GC ROOT的引用链上&#xff0c;…

12.第二阶段x86游戏实战2-CE找基地址

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

全网最全:企业微信用户授权登录对接完整流程

Hello&#xff01;欢迎各位新老朋友来看小弟博客&#xff0c;祝大家事业顺利&#xff0c;财源广进&#xff01;&#xff01; 主题&#xff1a;企业微信用户授权与校验完整对接流程 一&#xff1a;构造第三方应用授权链接 如果第三方应用需要在打开的网页里面携带用户的身份信息…

吸尘器制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

吸尘器制造行业&#xff0c;作为传统制造业的重要组成部分&#xff0c;也在积极探索如何通过先进技术实现生产模式的创新升级。5G智能工厂与物联数字孪生平台的融合应用&#xff0c;为吸尘器制造业的数字化转型铺设了一条高速通道&#xff0c;不仅极大地提升生产效率&#xff0…

华为---代理ARP简介及示例配置

目录 1. 概念 2. 前提条件 3. 使用环境 4. 工作过程 5. 优点 6. 缺点 7. 示例配置 7.1 示例场景 7.2基本配置 7.3 配置端口隔离 7.4 开启代理ARP 7.4.1 VLAN内代理ARP 7.4.2 VLAN间代理ARP 7.4.3路由式ARP代理 1. 概念 代理ARP&#xff08;Proxy ARP&#xff09;&…