2022-09-03 第六小组 张宁杰 ajax&axios

一,AJAX

异步刷新(局部刷新),前端技术,可以给后台发请求

异步:整个页面不会全部刷新,只有某个局部刷新

验证用户名存在

使用 ajax 发送请求,页面不可以通过后台跳转

如果需要跳页面,也是通过我们前端的JS来跳转,不可能通过servlet跳转

发请求3种方式

\1. 地址栏

\2. a 标签

\3. form 表单

\4. location.href 或 windows.open()

注意点:

  • ajax和form表单不能同时使用
  • ajax:不跳页面
  • form:一定跳走的

请求体

post请求才有请求体

ajax发起请求,后台给出的响应会回到ajax的响应处理函数中。

readyState:

0: xhr被创建成功,open方法未调用
1: open被调用,建立的连接
2: send被调用,可以获取状态行和响应头
3: 可以拿到响应体,响应体加载中
4: 响应体下载完成,可以直接使用responseText。
代表请求可以正常发送,响应能够正常接收。

案例:

   <p>
       账号:<input type="text" id="username"><span id="msg"></span>
   </p>
    <input type="button" onclick="valid()" value="验证">


<script>
    function valid() {
        let username = document.querySelector("#username").value;
        let msg = document.querySelector("#msg");
        // 向后台发请求
        // 使用ajax,JS原生的ajax
        // XMLHttpRequest是ajax的支持对象
        let xhr = new XMLHttpRequest();
        // console.log(xhr.readyState + "....0");
        // 设置请求的方式和url地址
        // xhr.open("GET","valid.do?username=" + username);
        // console.log(xhr.readyState + "....1")

        // 发送POST请求
        xhr.open("POST","valid.do");

        // POST请求需要设置一下请求头信息
        // Content-type,发送的请求的内容的类型
        // application/x-www-form-urlencoded 文档流
        xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");

        // 发请求,并且设置请求体
        xhr.send("username=" + username + "&password=123456");
        // 指定xhr状态变化的处理函数
        xhr.onreadystatechange = function() {
            // console.log(this.readyState);
            // 正常接收后台的响应
            if(this.readyState === 4) {
                // 通过xhr的responseText获取到对应的响应体
                // console.log(this.responseText);
                switch (this.responseText) {
                    case "1":
                        msg.innerHTML = "用户名可用";
                        break;
                    case "0":
                        msg.innerHTML = "用户名已存在";
                }
            }
        }
    }
</script>
@WebServlet(name = "ValidServlet", value = "/valid.do")
public class ValidServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("valid.do已经接受到请求...");
        PrintWriter out = response.getWriter();
        // 后台给前台AJAX的响应
        String username = request.getParameter("username");

        if(Objects.equals(username,"admin")){
            // 0代表不可用 1代表可用
            out.write("0");
        }else {
            out.write("1");
        }
        out.flush();
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }
}

用 JQuery 实现验证

账号:<input type="text" id="username"><span id="msg"></span>
<button id="validBtn">验证</button>

<script src="static/js/jquery-3.0.0.min.js"></script>
<script>
    $(function() {
        $("#validBtn").click(function() {
            let username = $("#username").val();
            let password = "123456";

            // formData构建一个表单数据对象
            // formData是JS的内置对象,和JQuery无关,和Vue无关
            let formData = new FormData();
            formData.append("username",username);
            formData.append("password",password);

            // 发送ajax请求
            // 3.完整写法
            $.ajax({
                url: "valid.do",
                type: "post",
                data: formData,
                success : function(res) {
                    console.log(res);
                },
                error : function(res) {
                    console.log(res);
                }
            });


            // 2.发送post请求
            // $.post("valid.do","username=" + username,function (data) {
            //     if(data == "1") {
            //         $("#msg").html("用户名可用...")
            //     }
            //     if(data == "0") {
            //         $("#msg").html("用户名已存在...")
            //     }
            // });

            // 1.发送get请求
            // $.get("valid.do?username=" + username,function(data) {
            //     // data就是后台回来的响应体
            //     console.log(data);
            //     if(data == "1") {
            //         $("#msg").html("用户名可用...")
            //     }
            //     if(data == "0") {
            //         $("#msg").html("用户名已存在...")
            //     }
            // });
        });
    })
</script>

案例:输出学生列表

  <button id="showStu">显示学生列表</button>

  <div id="info">

  </div>

<script src="static/js/jquery-3.0.0.min.js"></script>
<script>
    $(function(){
        $("#showStu").click(function() {

            $.ajax({
                url:"list.do",
                type : "get",
                // dataType的默认值是字符串
                // json串
                dataType: "json",
                success:function(data) {
                    // console.log(data);
                    // console.log(data.id);
                    // console.log(data.name);
                    // console.log(data.list);
                    $.each(data.list,function(index,item) {
                        $("#info").append(
                            item.id + "---" + item.name + " <br> "
                        );
                    })

                    // let info = $("#info");
                    // for(let i = 0;i < data.length;i++){
                    //     console.log(i);
                    // }
                }
            });

        });
    })
</script>
@WebServlet(name = "ListStudentServlet", value = "/list.do")
public class ListStudentServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<String> stus = Arrays.asList("aaa","bbb","ccc","ddd","eee","fff");

        PrintWriter out = response.getWriter();

        Student student = new Student(1001,"zhangsan");
        List<Student> list = new ArrayList<>();
        list.add(new Student(1001,"zhangsan1"));
        list.add(new Student(1002,"zhangsan2"));
        list.add(new Student(1003,"zhangsan3"));
        list.add(new Student(1004,"zhangsan4"));

        student.setList(list);

        out.print(JSON.toJSONString(student));
        /*
        * json串的格式:键值对
        *
        * {"id":1001,"name":"zhangsan","stus":{aaa,bbb,ccc...}}
        *
        * */
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }
}

二,AXIOS

对原生ajax的一个封装

ES6语法。Promise语法

axios发送get请求,

请求中如果有参数,还是一个默认的以文档里的形式发送,和之前的任何一种请求方式没有任何区别。

axios发送post请求,

请求中如果有参数,会把post请求的请求体转成json串,然后再发给后台。

案例:

<div id="app">
        <button @click="get">axios_get</button>
        <button @click="post">axios_post</button>
    </div>

<script src="static/js/vue.js"></script>
<script src="static/js/axios.min.js"></script>

<script>

/*
* axios发送get请求,
*   请求中如果有参数,还是一个默认的以文档里的形式发送,和之前的任何一种请求方式没有任何区别。
* axios发送post请求,
*   请求中如果有参数,会把post请求的请求体转成json串,然后再发给后台。
*
* */

    const app = new Vue({
        el:"#app",
        data:{},
        methods:{
            post(){
              // 发送 post
              axios.post("vue.do",{
                  "name":"a",
                  "pass":"123",
              }).then(function (response){
                  console.log(response);
              });
          },
            get(){
                // 发送get请求
                axios.get("vue.do?username=admin&password=666666").then(function(response){
                    console.log(response);
                    console.log(response.data);
                }).catch(function(err){
                    console.log(err);
                });
            }
        },
    });

</script>
@WebServlet(name = "VueServlet", value = "/vue.do")
public class VueServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("vueSevlet已经接到了请求...");

        // rquest.getParameter()方法只能接收默认的文档流中的参数,接不了json串。
//        String username = request.getParameter("username");
//        System.out.println("username--->" + username);

        // 从request中获取了一个流,缓冲字符输入流
        /*
            1、get请求,后台没有对应的对象来封装,不能有私密数据。
            2、post请求,后台都是有对象跟着的。username,password-----User
                id,name,age,gender,email-----------Student
         */
        BufferedReader reader = request.getReader();
        String line = reader.readLine();
        System.out.println(line);
        /*
            封装对象的前提:
                json串中的数据的key和对象的属性名要一致。
                是根据set方法的名封装的。
         */
        User user = JSON.parseObject(line, User.class);
        System.out.println(user);

//        String sql = "select * from user where username = ? and password = ?"
//        userdao.get(sql,user.getUsername(),user.getPassword());

        PrintWriter out = response.getWriter();
        out.print("hello axios and vue...");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }
}
posted @ 2022-09-08 16:56  贵妃就是贵妃  阅读(17)  评论(0编辑  收藏  举报