servlet(2)—javaEE

news2024/12/29 14:09:48

1.获取请求数据

1.1开发前端发请求

ajax封装代码

// 参数 args 是一个 JS 对象, 里面包含了以下属性
// method: 请求方法
// url: 请求路径
// body: 请求的正文数据
// contentType: 请求正文的格式
// callback: 处理响应的回调函数, 有两个参数, 响应正文和响应的状态码
function ajax(args) {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
        // 0: 请求未初始化
        // 1: 服务器连接已建立
        // 2: 请求已接收
        // 3: 请求处理中
        // 4: 请求已完成,且响应已就绪
        if (xhr.readyState == 4) {
            args.callback(xhr.status, xhr.responseText)
        }
    }
    xhr.open(args.method, args.url);
    if (args.contentType) {
        xhr.setRequestHeader('Content-type', args.contentType);
    }
    if (args.body) {
        xhr.send(args.body);
    } else {
        xhr.send();
    }
}

html前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input id="u" type="text" placeholder="请输入账号">
    <br>
    <input id="p" type="password" placeholder="请输入密码">
    <br>
    <button onclick="send()">ajax get提交</button>
    <script src="ajax.js"></script>
    <script>
        var username = document.querySelector("#u");
        var password = document.querySelector("#p");
        function send() {
            ajax({
                method: "GET",
                url:"request/get?username="+username.value+"&password="+password.value,
                callback: function(status,resp){
                    alert("响应状态码:"+status+",响应正文:"+resp)
                }
            })
        }
    </script>
</body>
</html>

1.2开发后端servlet

package org.example.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/request/get")
public class requestGet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.printf("username=%s,password=%s\n",username,password);
    }
}

在这里插入图片描述

打印结果:
在这里插入图片描述

2.客户端发送请求

2.1ajax发请求

(1)8的获取请求数据使用的就是ajax发请求
(2)get方法的执行流程
①点击get提交按钮到绑定的点击事件
②执行绑定的点击事件的函数(ajax代码)
③执行后端代码
在这里插入图片描述
(2)可能出现的问题
①按钮点击以后没有反应,抓包解决
在这里插入图片描述

②没有发http请求,一定是前端代码的问题,开发者工具,源代码才是浏览器真正运行的代码解决
在这里插入图片描述

③抓包出现404,检查请求路径和服务端资源路径
在这里插入图片描述
请求路径:
绝对路径写法:
在这里插入图片描述

相对路径写法:
在这里插入图片描述

④出现405,方法不支持,检查后端代码,看是否提供对应的服务方法
在这里插入图片描述

在这里插入图片描述

2.2发送form表单格式的请求数据

前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input id="u" type="text" placeholder="请输入账号">
    <br>
    <input id="p" type="password" placeholder="请输入密码">
    <br>
    <button onclick="send()">ajax form表单提交</button>
    <script src="ajax.js"></script>
    <script>
        var username = document.querySelector("#u");
        var password = document.querySelector("#p");
        function send() {
            ajax({
                method: "POST",
                url:"request/post",
                contentType: "application/x-www-form-urlencoded",
                body:"username="+username.value+"&password="+password.value,
                callback: function(status,resp){
                    alert("响应状态码:"+status+",响应正文:"+resp)
                }
            })
        }
    </script>
</body>
</html>

后端代码:

package org.example.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/request/post")
public class requestFormAjax extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.printf("username=%s,password=%s\n",username,password);
    }
}

抓包看到的请求正文的结果
在这里插入图片描述

2.3发送JSON格式的请求数据

前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input id="u" type="text" placeholder="请输入账号">
    <br>
    <input id="p" type="password" placeholder="请输入密码">
    <br>
    <button onclick="send()">ajax json提交</button>
    <script src="ajax.js"></script>
    <script>
        var username = document.querySelector("#u");
        var password = document.querySelector("#p");
        function send() {
            // json对象
            var data = {
                username:username.value,
                password:password.value
            };
            ajax({
                method: "POST",
                url:"request/json",
                contentType: "application/json",
                // 将JSON对象转换为JSON字符串
                body: JSON.stringify(data),
                callback: function(status,resp){
                    alert("响应状态码:"+status+",响应正文:"+resp)
                }
            })
        }
    </script>
</body>
</html>

servlet代码的第一种写法,了解就行

package org.example.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

@WebServlet("/request/json")
public class requestJSON1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收请求body为json格式的数据,需要使用inputStream
        InputStream is = req.getInputStream();
        //接收到的是字节流,需要使用字节字符转换流来转换
        InputStreamReader isr = new InputStreamReader(is, "UTF-8");
        //最终是:字符流(字节字符转换流(字节流))
        BufferedReader br = new BufferedReader(isr);
        String str;
        //读取一行到字符串,如果不为空,表示没有结束
        while ((str=br.readLine()) != null){
            System.out.println(str);
        }
    }
}

抓包看到的请求正文的结果
在这里插入图片描述
测试JSON在java中的使用:
引入依赖:

<dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-databind</artifactId>
     <version>2.11.3</version>
</dependency>

测试JSON在java中的使用

package org.example.servlet;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.HashMap;

public class textJSON {
    public static void main(String[] args) throws JsonProcessingException {
        // json反序列化:JSON字符串转java对象
        String json = "{\"username\":\"in\",\"password\":\"123\"}";
        // 需要使用Jackson框架提供的api来完成
        // 这个对象就是辅助完成JSON字符串和java对象相互转化
        ObjectMapper objectMapper = new ObjectMapper();
        // 可以转换为map,但是还是不但方便
        HashMap map = objectMapper.readValue(json,HashMap.class);
        System.out.println(map);//结果:{password=123, username=in}
        // 建议:自定义一个类型,成员变量名就是JSON字符串的键名,类型要保持一致
        User user = objectMapper.readValue(json,User.class);
        System.out.println(user);//结果:User{username='in', password='123'}
    }
}

用户类:

package org.example.servlet;

public class User {
    private String username;
    private String password;

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

servlet代码的第二种写法,也建议这样完成

package org.example.servlet;

import com.fasterxml.jackson.databind.ObjectMapper;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

@WebServlet("/request/json")
public class requestJSON2 extends HttpServlet {
    private static final ObjectMapper objectMapper = new ObjectMapper();
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //接收请求body为json格式的数据,需要使用inputStream
        InputStream is = req.getInputStream();
        // json反序列化:将JSON字符串转化为java对象
        User user = objectMapper.readValue(is,User.class);
        System.out.println(user);
    }
}

2.4发送form-data格式的数据

前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input id="u" type="text" placeholder="请输入账号">
    <br>
    <input id="p" type="password" placeholder="请输入密码">
    <br>
    <button onclick="send()">ajax form-data提交</button>
    <script src="ajax.js"></script>
    <script>
        var username = document.querySelector("#u");
        var password = document.querySelector("#p");
        function send() {
            // form-data数据提交使用FormData对象
            var data = new FormData();
            data.append("username",username.value);
            data.append("password",password.value);
            ajax({
                method: "POST",
                url:"request/form-data",
                // form-data不要设置contentType字段,发数据的时候ajax会自动生成
                body: data,
                callback: function(status,resp){
                    alert("响应状态码:"+status+",响应正文:"+resp)
                }
            })
        }
    </script>
</body>
</html>

后端代码:

package org.example.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/request/form-data")
//要获取form-data格式的数据就必须加上这个注解
@MultipartConfig
public class requestFormData extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.printf("username=%s,password=%s\n",username,password);
    }
}

2.5发送form-data格式的数据(文件上传)

(1)代码:
前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input id="u" type="text" placeholder="请输入账号">
    <br>
    <input id="p" type="password" placeholder="请输入密码">
    <br>
    <input id="f" type="file">
    <br>
    <button onclick="send()">ajax form-data提交</button>
    <script src="ajax.js"></script>
    <script>
        var username = document.querySelector("#u");
        var password = document.querySelector("#p");
        var head = document.querySelector("#f");
        function send() {
            // form-data数据提交使用FormData对象
            var data = new FormData();
            data.append("username",username.value);
            data.append("password",password.value);
            var choosedFiles = head.files[0];
            if(choosedFiles){
                data.append("head",choosedFiles);
            }
            ajax({
                method: "POST",
                url:"request/form-data-file",
                // form-data不要设置contentType字段,发数据的时候ajax会自动生成
                body: data,
                callback: function(status,resp){
                    alert("响应状态码:"+status+",响应正文:"+resp)
                }
            })
        }
    </script>
</body>
</html>

后端代码:

package org.example.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;

@WebServlet("/request/form-data-file")
//要获取form-data格式的数据就必须加上这个注解
@MultipartConfig
public class requestFormDataFile extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // form-data上传简单类型的数据通过getParameter获取
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        // form-data上传文件通过getPath获取,返回值part对象就可以获取文件的相关信息,也可以对其进行操作
        Part head = req.getPart("head");
        String path = "E:/TMP/" + head.getSubmittedFileName();
        head.write(path);//保存客户端上传的文件到服务端本地
        System.out.println(head.getSubmittedFileName());//获取上传的文件名
        System.out.println(path);
        System.out.println(head.getSize());//获取上传文件的字节数
        System.out.printf("username=%s,password=%s\n",username,password);
    }
}

抓包结果:
在这里插入图片描述
在这里插入图片描述

打印结果:
在这里插入图片描述
(2)保存的文件如何设计
①文件较小且上传文件的数据量不大,可以考虑使用数据库,将二进制数据转换为字符串(Base64),然后保存;文件较大,不考虑使用数据库保存,一般使用单独的服务器来做
②文件较大,放在服务器的本地硬盘上,但是注意不能放在项目的目录下,对于访问问题,可以自己写代码提供服务资源,请求数据包含一些信息就可以返回不同文件的响应

3.服务端返回响应

3.1返回HTML格式的数据(servlet返回动态网页)

(1)原因:HTML是静态的,不通过ajax是无法访问一个网页构造不同的内容
(2)servlet返回动态网页就是根据条件来拼接HTML字符串

package org.example.servlet;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/response/html")
public class responseHtml extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String userId = req.getParameter("userId");
        String html = "<P>欢迎你,%s</P>";
        String name = "张三";
        if(!"1".equals(userId)){
            name = "李四";
        }
        String body = String.format(html,name);
        resp.setContentType("text/html");
        resp.setCharacterEncoding("UTF-8");
        resp.getWriter().write(body);
    }
}

在这里插入图片描述
在这里插入图片描述

3.2返回JSON格式的数据

(1)序列化和反序列化

序列化:站在自己程序的角度,把自己程序中的对象转化为其他格式,用于返回响应数据
反序列化:站在自己程序的角度,把其他格式的数据转化为自己程序中的对象,用于接收请求数据

(2)测试json在Java中的使用
成员类:

package org.example.servlet;

public class User {
    private String username;
    private String password;

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

班级类:

package org.example.servlet;

import java.util.List;

public class classes {
    private int id;
    private String name;
    private List<User> student;

    @Override
    public String toString() {
        return "classes{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", student=" + student +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<User> getStudent() {
        return student;
    }

    public void setStudent(List<User> student) {
        this.student = student;
    }
}

测试JSON在java中的使用:

package org.example.servlet;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

public class textJSON {
    public static void main(String[] args) throws JsonProcessingException {
        // json反序列化:JSON字符串转java对象
        String json = "{\"username\":\"in\",\"password\":\"123\"}";
        // 需要使用Jackson框架提供的api来完成
        // 这个对象就是辅助完成JSON字符串和java对象相互转化
        ObjectMapper objectMapper = new ObjectMapper();
        // 可以转换为map,但是还是不但方便
//        HashMap map = objectMapper.readValue(json,HashMap.class);
//        System.out.println(map);//结果:{password=123, username=in}
        // 建议:自定义一个类型,成员变量名就是JSON字符串的键名,类型要保持一致
        User user = objectMapper.readValue(json,User.class);
        System.out.println(user);//结果:User{username='in', password='123'}
        //简单类型的JSON对象
        User user1 = new User();
        user1.setUsername("张三");
        user1.setPassword("123");
        String json1 = objectMapper.writeValueAsString(user1);//结果:{"username":"张三","password":"123"}
        System.out.println(json1);
        User user2 = new User();
        user2.setUsername("李四");
        user2.setPassword("456");
        //初始化list,包含user1和user2两个对象
        List<User> list = Arrays.asList(user1,user2);
        String json2 = objectMapper.writeValueAsString(list);//结果:[{"username":"张三","password":"123"},{"username":"李四","password":"456"}]
        System.out.println(json2);
        //复杂类型的JSON对象
        classes classes1 = new classes();
        classes1.setId(1);
        classes1.setName("hehe");
        classes1.setStudent(list);
        String json3 = objectMapper.writeValueAsString(classes1);
        System.out.println(json3);//结果:{"id":1,"name":"hehe","student":[{"username":"张三","password":"123"},{"username":"李四","password":"456"}]}
    }
}

(3)代码
前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h4>班级信息</h3>
    <p id="class_info"></p>
    <ul></ul>
    <script src="ajax.js"></script>
    <script>
        var classInfo = document.querySelector("#class_info");
        var studentList = document.querySelector("ul");
        ajax({
            method: "GET",
            url: "response/json",
            callback:function(status,resp){
                console.log("响应状态码:"+status+",响应正文:"+resp);
                var json = JSON.parse(resp);
                console.log(json);
                // 解析响应的班级信息的数据
                classInfo.innerHTML = `
                    班级id:${json.id},班级姓名:${json.name}
                `
                // 解析响应的学生列表的信息
                var content = '';
                for(var stu of json.student){
                    content += `
                        <li>学生姓名:${stu.username},账号密码:${stu.password}</li>
                    `
                }
                studentList.innerHTML = content;
            }
        });
    </script>
</body>
</html>

ajax封装的代码:

// 参数 args 是一个 JS 对象, 里面包含了以下属性
// method: 请求方法
// url: 请求路径
// body: 请求的正文数据
// contentType: 请求正文的格式
// callback: 处理响应的回调函数, 有两个参数, 响应正文和响应的状态码
function ajax(args) {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
        // 0: 请求未初始化
        // 1: 服务器连接已建立
        // 2: 请求已接收
        // 3: 请求处理中
        // 4: 请求已完成,且响应已就绪
        if (xhr.readyState == 4) {
            args.callback(xhr.status, xhr.responseText)
        }
    }
    xhr.open(args.method, args.url);
    if (args.contentType) {
        xhr.setRequestHeader('Content-type', args.contentType);
    }
    if (args.body) {
        xhr.send(args.body);
    } else {
        xhr.send();
    }
}

后端代码:

package org.example.servlet;

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

@WebServlet("/response/json")
public class responseJSON extends HttpServlet {
    private static final ObjectMapper m = new ObjectMapper();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        User user1 = new User();
        user1.setUsername("张三");
        user1.setPassword("123");
        User user2 = new User();
        user2.setUsername("李四");
        user2.setPassword("456");
        List<User> list = Arrays.asList(user1,user2);
        //复杂类型的JSON对象
        classes classes1 = new classes();
        classes1.setId(1);
        classes1.setName("hehe");
        classes1.setStudent(list);
        //返回给前端一个JSON字符串
        String json = m.writeValueAsString(classes1);
        //设置响应正文的数据格式
        resp.setContentType("application/json");
        //设置响应正文的编码
        resp.setCharacterEncoding("UTF-8");
        //设置到body中
        resp.getWriter().write(json);
    }
}

完成后端代码的结果
在这里插入图片描述
开发前端后的结果
在这里插入图片描述
(4)请求和响应
在这里插入图片描述

请求:前端如果是发送JSON:JSON.stringify(json对象);在这里插入图片描述
后端如果解析这个JSON:objectMapper.readValue(request.getInputStream, 类.class)在这里插入图片描述

响应:后端返回JSON字符串:response.writer(objectMapper.writerValueAsString(java对象);在这里插入图片描述
前端解析响应:ajax的callback回调函数,JSON.parse(方法参数中的响应正文字符串)在这里插入图片描述

4.实现请求一个路径,实现跳转或返回其他页面内容

4.1实现方式一:前端发ajax,后端返回json,前端解析响应,判断是否要跳转

前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input id="u" type="text" placeholder="请输入账号">
    <br>
    <input id="p" type="password" placeholder="请输入密码">
    <br>
    <input type="button" value="模拟用户登录(前端跳转)" onclick="login()">
    <br>
    <script src="ajax.js"></script>
    <script>
        var username = document.querySelector("#u");
        var password = document.querySelector("#p");
        // 实现方式一:前端发ajax,后端返回json,前端解析响应,判断是否要跳转
        function login(){
            ajax({
                method: "POST",
                url: "jump",
                contentType: "application/x-www-form-urlencoded",
                body: "username="+username.value+"&password="+password.value,
                callback: function(status,resp){
                    console.log("响应状态码:"+status+",响应正文:"+resp);
                    //转换响应正文JSON字符串为JSON对象
                    var json = JSON.parse(resp);
                    if(json.ok){
                        // 登录成功就跳转到这个路径
                        location.href = "request-ajax.html";
                    }else{
                        // 不成功给出弹窗提示
                        alert("账户或密码错误");
                    }
                }
            })
        }
    </script>
</body>
</html>

后端代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input id="u" type="text" placeholder="请输入账号">
    <br>
    <input id="p" type="password" placeholder="请输入密码">
    <br>
    <input type="button" value="模拟用户登录(前端跳转)" onclick="login()">
    <br>
    <script src="ajax.js"></script>
    <script>
        var username = document.querySelector("#u");
        var password = document.querySelector("#p");
        // 实现方式一:前端发ajax,后端返回json,前端解析响应,判断是否要跳转
        function login(){
            ajax({
                method: "POST",
                url: "jump",
                contentType: "application/x-www-form-urlencoded",
                body: "username="+username.value+"&password="+password.value,
                callback: function(status,resp){
                    console.log("响应状态码:"+status+",响应正文:"+resp);
                    //转换响应正文JSON字符串为JSON对象
                    var json = JSON.parse(resp);
                    if(json.ok){
                        // 登录成功就跳转到这个路径
                        location.href = "request-ajax.html";
                    }else{
                        // 不成功给出弹窗提示
                        alert("账户或密码错误");
                    }
                }
            })
        }
    </script>
</body>
</html>

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4.2实现方式二:前端发ajax,后端登录成功直接跳转,登录失败还是跳转本页面

但是不建议返回HTML,这里就不详细介绍了(会出现重定向的问题)

5.总结

5.1请求和响应的前后端代码

在这里插入图片描述

5.2服务端获取数据的方式

在这里插入图片描述

5.3服务端返回数据的方式

在这里插入图片描述

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

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

相关文章

qt中使用 ui 文件进行界面设计

目录 1、创建 Qt 应用 ​2、项目创建成功 3、直接点击打开 mainwindow.ui 文件 4、随便从左边侧边栏拖拽一个空间到 界面设计区域 5、在右侧边栏右键点击 pushButton 控件&#xff0c;点击转到槽 6、根据实际需要选择对应的信号&#xff0c;我这里方便演示选择 clicked&a…

linux 信号量semget/semop/semctl

专栏内容&#xff1a;linux下并发编程个人主页&#xff1a;我的主页座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物&#xff0e; 目录 前言 概述 原理机制 接口说明 代码演示 结尾 前言 本专栏主要分享linux下并发编…

基于 多态 的职工管理系统(Staff Management System)

目录 一、管理系统需求 作用&#xff1a;管理公司内所有员工的信息 分类&#xff1a;要显示每位员工的编号、姓名、岗位与职责 具体实现的功能&#xff1a; 二、创建管理 类 三、各个接口函数 1、菜单展示功能 2、 选择功能 3、创建员工功能 ①普通员工employee ②经理…

【Web3.0大势所趋】我看到了互联网未来的模样

前言 Web3.0 是一个越来越受到关注的话题&#xff0c;它被认为将会带来天翻地覆的变化。本文我们一起来谈谈 Web3.0 的概念、特点和优势&#xff0c;并探讨它为什么如此重要和具有革命性的。 文章目录 前言Web3.0是什么Web3.0的技术Web3.0的优势总结 Web3.0是什么 Web3.0: 是下…

尚硅谷Kafka

Kafka 1.Kafka概述1.1 定义1.2 消息队列1.2.1 传统消息队列的应用场景1.2.2 消息队列的两种模式 1.3 kafka基础架构 2.快速入门2.1 kafka环境安装2.2 kafka命令行操作参数2.2.1 主题命令行操作 2.2.2 生产者命令行操作2.2.3 消费者命令行操作 3.Kafka 生产者3.1 生产者消息发送…

Vue3+Vite神器:按需引入自定义组件unplugin-vue-components

前言 我们做项目时&#xff0c;会封装大量的公共组件&#xff0c;如果我们每一个都去在maints里面引入&#xff0c;非常麻烦不说&#xff0c;代码也不优雅。所以更好的方法就是自动注册全局组件&#xff0c;在组件中直接使用就好。 一种方法是自己在components文件夹下新建in…

QML控件--MenuBar

文章目录 一、控件基本信息二、控件使用三、属性成员四、成员函数 一、控件基本信息 Import Statement&#xff1a;import QtQuick.Controls 1.4 Since&#xff1a;Qt 5.1 二、控件使用 MenuBar&#xff1a;是菜单栏&#xff0c;通常&#xff0c;菜单静态声明为菜单栏的子项&…

redis入门必会知识

Redis基础知识目录 5、sortedSet 文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 一、redis是什么&#xff1f; Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务 ! 是一个开源的使用ANSI C语言编写…

【C++】——- 模板初阶介绍

前言&#xff1a; 在之前的学习中&#xff0c;我们已经把 C前期所需要用到的知识都给大家介绍了一遍。接下来&#xff0c;我们要学习的就是关于在C 中模板的基本知识&#xff0c;今天我带给大家的内容便是关于 模板初阶的介绍。 目录 &#xff08;一&#xff09; 泛型编程 &…

【Python_Opencv图像处理框架】图像形态学操作

写在前面 本篇文章是opencv学习的第三篇文章&#xff0c;主要讲解了图像的形态学有关操作&#xff0c;作为初学者&#xff0c;我尽己所能&#xff0c;但仍会存在疏漏的地方&#xff0c;希望各位看官不吝指正❤️ 写在中间 读完这篇文章后&#xff0c;相信您便能信手拈来下面图…

给照片换底色(python+opencv)

给照片换底色&#xff08;pythonopencv&#xff09; 本篇目录&#xff1a; &#x1f984; 一、分析照片基本信息 &#x1f984; 二、方法一&#xff08;遍历图像&#xff0c;将像素值点替换修改为指定颜色&#xff09; &#x1f984; 三、修改图片颜色方法二&#xff08;先转…

MySQL数据库索引

目录 0.知识回顾 1.数据库约束 一.索引 1.什么是索引 2.为什么要使用索引(作用) 3.索引的使用场景 4.如何使用索引 1.查看索引 2.创建索引 3.修改索引 4.删除索引 5.索引的分类 1.使用场景不同 2.按列区分 3.按数据组织方式 二.索引的数据结构 1.HASH 2.二叉搜…

如何设计自动化测试框架?阿里P7工程师耗时一个月总结而成

目录 一、什么是自动化测试框架 二、自动化测试框架的架构设计 三、自动化测试框架的最佳实践 四、自动化测试框架的组成部分 五、自动化测试框架的设计原则 六、如何选择自动化测试框架 七、自动化测试框架实例 八、结论 一、什么是自动化测试框架 自动化测试框架是一…

UE4/5多人游戏详解(八、游戏模式和游戏状态里的函数重写,插件内地图的地址做变量,做变量让按钮出现不同状态,插件内的所有代码)

目录 这里不写在插件里面&#xff0c;而是在游戏模式&#xff1a; 头文件&#xff1a; Cpp文件&#xff1a; 更改ini文件 进入地图设置模式&#xff1a; 写插件里面&#xff0c;做一个变量&#xff1a; 写变量 然后更改函数MenuSet&#xff1a; 在子系统中做变量&…

FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(四)

接着同样地我们也需要完成对千兆网口ETH模块和USB2.0模块的编写&#xff0c;实际上和UART串口模块的设计思想大同小异&#xff0c;也同样地需要完成两项关键功能即识别并解析报文、接收并发送数据&#xff0c;千兆网口ETH和USB2.0的底层驱动在前面的例程中也详细说明了&#xf…

常用的设计模式(单例模式、工厂模式等)

1.单例模式 概述: 在有些系统中&#xff0c;为了节省内存资源、保证数据内容的一致性&#xff0c;对某些类要求只能创建一个实例&#xff0c;这就是所谓的单例模式. 例如&#xff0c;Windows 中只能打开一个任务管理器&#xff0c;这样可以避免因打开多个任务管理器窗口而造…

Centos切换jdk版本

先安装了jdk1.8的版本&#xff0c;需要使用jdk17的版本 1.先安装jdk17&#xff0c;再配置环境变量&#xff1a; vim ~/.bashrc 2.在最后一行添加 ##这个添加的就是路径&#xff0c;一定要和自己jdk安装的路径是一致的 export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 3.然…

Mybatis框架超详解及运用总结

Mybatis 一、什么是Mybatils&#xff1f;二、第一个Mybatils程序2.1、创建springboot工程2.2、准备数据2.3、配置MyBatis2.4、编写SQL语句2.5、单元测试 三、JDBC四、数据库连接池五、lombok六、Mybatis基础操作6.1、删除6.2、新增6.2.1、主键返回 6.3、修改6.4、查询6.4.1、数…

【AI绘画】AI绘画的创意应用

目录 1.引言2.将AI生成的图像转化为数字艺术品2.1AI生成的画作拍卖2.2将AI生成的图像转化为雕塑 3.将AI生成的图像用于虚拟场景的创建3.1使用GAN生成虚拟人物3.2在虚拟场景中使用AI生成的图像 1.引言 当今的AI绘画技术已经发展到了让人惊艳的程度&#xff0c;不仅可以生成高质量…

【每日一题Day183】LC1187使数组严格递增 | dp

使数组严格递增【LC1187】 给你两个整数数组 arr1 和 arr2&#xff0c;返回使 arr1 严格递增所需要的最小「操作」数&#xff08;可能为 0&#xff09;。 每一步「操作」中&#xff0c;你可以分别从 arr1 和 arr2 中各选出一个索引&#xff0c;分别为 i 和 j&#xff0c;0 <…