当前位置: 首页 > article >正文

Day69补 前后端分离思想

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.kler.cn/a/313082.html

相关文章:

  • Ai创作新风标!仅需三步,利用ai工具免费制作抖音爆款的动物融合视频(含完整的步骤)
  • Dial-insight:利用高质量特定领域数据微调大型语言模型防止灾难性遗忘
  • Docker入门系列——Docker-Compose
  • Java基于SpringBoot+Vue的宠物共享平台的设计与实现(附源码,文档)
  • PaaS云原生:分布式集群中如何构建自动化压测工具
  • sqoop import将Oracle数据加载至hive,数据量变少,只能导入一个mapper的数据量
  • JAVA毕业设计176—基于Java+Springboot+vue3的交通旅游订票管理系统(源代码+数据库)
  • 【HTML5】html5开篇基础(1)
  • 【学习笔记】数据结构(六 ①)
  • 通过markdown表格批量生成格式化的word教学单元设计表格
  • 基于深度学习的花卉智能分类识别系统
  • 【win工具】win安装flameshot并设置截图快捷键
  • 【Python报错已解决】xlrd.biffh.XLRDError: Excel xlsx file; not supported
  • C++自动寻径算法
  • 《黑神话悟空》开发框架与战斗系统解析
  • 4.C++中程序中的命名空间
  • git 本地分支误删,怎么恢复?误删本地已提交未推送的分支!
  • 基于Python实现一个浪漫烟花秀
  • 如何设置 Django 错误邮件通知 ?
  • I2C中继器TCA9517A(TI)
  • 新160个crackme - 060-snake
  • 2024年Q3国际信息系统安全认证联盟(ISC2)内部研讨会要点分享
  • 系统架构设计师 大数据架构篇二
  • 球形包围框-Bounding Sphere-原理-代码实现
  • Mycat中间件
  • 牛客BC92,逆序输出