zoukankan      html  css  js  c++  java
  • Ajax

    Ajax

    Ajax

    Asynchronous JavaScript And XML:异步的JavaScript和XML

    Ajax并不是新的编程语言,指的是一种交互方式,异步加载,客户端和服务器的数据交互更新在局部页面的技术,不需要刷新整个页面(局部刷新)。

    优点:

    1.局部刷新,效率更高。 2.用户体验更好。

    示例:同步加载

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>同步加载</title>
    </head>
    <body>
        ${str}
        <form action="/AjaxServlet1" method="post">
            <input type="text" name="text">
            <input type="submit">
        </form>
    </body>
    </html>
    
    package com.wildfire.servlet.Ajax;
    
    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("/AjaxServlet1")
    public class AjaxServlet1 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String str="HelloWord!";
            req.setAttribute("str",str);
            req.getRequestDispatcher("Ajax1_tongbu.jsp").forward(req,resp);
        }
    }
    

    image-20201112162134544

    image-20201112162226893

    先点击提交查询按钮,然后开始在文本框中输入内容,三秒后,当文本框前弹出“HelloWord”的时候,会中断你的录入。而使用Ajax就不会这样。

    基于JQuery的Ajax

    导入JQuery:在web下新建js,将jquery-3.4.1.js粘贴到js文件下,在jsp页面中加入如下代码:

    <script type="text/javascript" src="js/jquery-3.4.1.js"></script>
    

    IDEA--》工具栏--》Build--》Rebuild Project(使js下的jquery-3.4.1.js同步到out中)

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Ajax2</title>
        <script type="text/javascript" src="js/jquery-3.4.1.js"></script>
        <script>
            $(function(){
                var btn=$("#btn");
                btn.click(function () {
                    $.ajax({
                        //相当于form表中的action
                        url:'/AjaxServlet1',
                        //相当于form表单中的method
                        type:'post',
                        //传到Servlet的参数,相当于地址栏拼接了一个id=1
                        data:'id=1',
                        //服务端返回的数据类型(该实例中返回的是HelloWord)
                        dataType:'text',
                        //成功
                        success:function (data) {
                            var text=$("#text")
                            text.before("<span>"+data+"</span><br>")
                        }
                    })
                })
            })
        </script>
    </head>
    <body>
        ${str}
        <input type="text" name="text" id="text">
        <input type="submit" id="btn">
    </body>
    </html>
    
    package com.wildfire.servlet.Ajax;
    
    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("/AjaxServlet1")
    public class AjaxServlet1 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String id=req.getParameter("id");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String str="HelloWord!";
            resp.setContentType("UTF-8");
            //不能跳转到Jsp(会将所有的Jsp源代码加载回去),只能将所需数据返回。
            resp.getWriter().write(str);
            /*req.setAttribute("str",str);
            req.getRequestDispatcher("Ajax2.jsp").forward(req,resp);*/
    
        }
    }
    

    image-20201116211950802

    使用Ajxa,点击提交查询按钮后开始书写,三秒钟后弹出“HelloWord?”,但是同时你仍然可以继续在输入框中输入你想输入的内容。

    使用Ajax的注意点:

    1.前端:不能使用表单提交(表单提交是同步),改用JQuery的方式动态绑定事件提交。

    2.后端:不能跳转到Jsp(会将所有的Jsp源代码加载回去),只能将所需数据返回。

    如果使用跳转到Jsp,返回的代码如图:

    image-20201116212852321

    如果我们用alert(data)将它输出出来,如下图:

    image-20201116213259246

    传统WEB数据交互和Ajax数据交互的区别:

    客户端请求方式不同:

    ​ 传统WEB数据交互:浏览器发送同步请求(form表单、a标签)。

    ​ Ajax:异步引擎对象发送异步请求。

    服务器响应方式不同:

    ​ 传统WEB数据交互:响应一个完整的JSP页面(视图)。

    ​ Ajax:响应需要的数据。

    客户端处理方式不同:

    ​ 传统:需要等待服务器完成响应并且重新加载整个页面之后,用户才能进行后续的操作

    ​ Ajax:动态更新页面中的局部内容,不影响其他操作。

    Ajax原理(了解)

    image-20201119223807213

    Ajax语法(基于JQuery)

    $.ajax({属性})

    常用属性:

    url:请求的后端服务地址

    type:请求⽅式,默认 get

    data:请求参数

    dataType:服务器返回的数据类型,多数是text/json

    success:请求成功的回调函数

    error:请求失败的回调函数

    complete:请求完成的回调函数(⽆论成功或者失败,都会调⽤)

    JSON

    JavaScript Object Notation,⼀种轻量级数据交互格式,完成 js 与 Java 等后端开发语⾔对象数据之间 的转换。

    例如,在java中创建一个User对象:

    package com.wildfire.javabean;
    
    public class User {
        private Integer id;
        private String name;
        private Integer age;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public User(Integer id, String name, Integer age) {
            this.id = id;
            this.name = name;
            this.age = age;
        }
    }
    
    User user=new User(20183694,"张三",21);
    

    而使用JSON:

    var user = {
        id:20183694,
    	name:"张三",
    	age:21
    }
    

    使用JSON

    要导入六个jar包:

    image-20201119232615745

    示例:

    package com.wildfire.servlet.Ajax;
    
    import com.wildfire.javabean.User;
    import net.sf.json.JSONObject;
    
    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("/AjaxServlet")
    public class AjaxServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            User user=new User(20183694,"张三",21);
            resp.setCharacterEncoding("UTF-8");
            //将java对象转化为JSON格式
            JSONObject jsonObject =JSONObject.fromObject(user);
            resp.getWriter().write(jsonObject.toString());
    
        }
    }
    
    <%--
      Created by IntelliJ IDEA.
      User: DELL
      Date: 2020/11/19
      Time: 23:31
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Ajax3</title>
        <script type="text/javascript" src="js/jquery-3.4.1.js"></script>
        <script>
            $(function(){
                var btn=$("#btn");
                btn.click(function(){
                    $.ajax({
                        url:'/AjaxServlet',
                        type:'post',
                        dataType:'json',
                        success:function(data){
                            $("#id").val(data.id);
                            $("#name").val(data.name);
                            $("#age").val(data.age);
                        }
    
                    });
                });
            })
        </script>
    </head>
    <body>
        学号<input type="text" name="id" ><br>
        姓名<input type="text" name="name"><br>
        年龄<input type="text" name="age"><br>
        <input type="submit" value="查找" id="btn">
    
    </body>
    </html>
    

    image-20201120000555193

    Ajax实例:省市区三级联动

    参考博客:

  • 相关阅读:
    Resource和Autowired区别
    mybatisplus 分页查询+ dao层抽象
    Error attempting to get column from result set
    第一模块经济学核心原理,第一模块经济学核心原理
    springboot 优雅的启动类
    maven把依赖打进jar包
    第一章:第1课 经济学世界观(上)
    AutomicBoolean
    java异步转同步
    接口作为方法的返回值
  • 原文地址:https://www.cnblogs.com/wind-and-sky/p/14012103.html
Copyright © 2011-2022 走看看