异步处理ajax和前后端数据交互json

简介: 异步处理ajax和前后端数据交互json

ajax和json



Ajax

同步和异步:
  a标签是同步,调用完形成新的页面,页面会刷新.原页面在a标签后面的代码将不执行处于等待状态.    而异步请求不会.异步此页面的其他代码会继续执行
应用场景:
  用户名是否存在的校验,百度自动补全功能,商品查找,搜索图片
注意:
  ajax不能跨函数,不能跨页面

异步:强大之处服务器处理不影响浏览器的其他操作,增强用户体验度

原生ajax

入门案例:
  1:创建一个核心对象(XMLHttPRequest)
      该对象称之为ajax引擎
    2:编写onreadystatechange事件所调用的函数
      回到函数
    3:确定请求方式和请求路径
  4:发送请求
    5:处理返回结果

原生ajax案例:

index.jsp
<%--
  Created by IntelliJ IDEA.
  User: hp
  Date: 2020/5/14
  Time: 13:27
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
<h3>原生ajax</h3>
  <a href="js_01.jsp">原生ajax入门</a>
  </body>
</html>
js_01.jsp
<%--
  Created by IntelliJ IDEA.
  User: hp
  Date: 2020/5/14
  Time: 13:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="/day07/js/jquery-3.3.1.js"></script>
    <script>
        function sendAjax() {
            //发送sjax请求
            //1:创建ajax核心对象(xmlhttprequest)ajax引擎
            var xmlhttp;
            if(window.XMLHttpRequest){
                xmlhttp=new XMLHttpRequest();
            }else{
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            //2:编写onreaystatechange事件所调用的函数
            xmlhttp.onreadystatechange=function () {
                //1:监听ajax引擎的状态
                //5:处理结果
                if(xmlhttp.readyState==4 && xmlhttp.status==200){
                    $("#spId").html(xmlhttp.responseText);
                }
            }
            //3:编写ajax请求的方式和地址
            xmlhttp.open("post","demo1");
            //4:发送请求
            xmlhttp.send();
        }
    </script>
</head>
<body>
<input type="button" value="发送ajax请求" onclick="sendAjax()"/><br>
<span id="spId"></span>
</body>
</html>
Demo1Servlet.java
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(name = "Demo1Servlet", urlPatterns = "/demo1")
public class Demo1Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo1servlet执行了");
        response.getWriter().print("hello ajax 你好");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
原生ajax的属性
onreadystatechange事件
  在ajax对象状态发生改变时,就会出发该时间
  对象.onreadystatechange=function(){}
redaystate
  存在XMLHTTPRequest的状态
    0:请求未初始化(见不到的就相当于还没创建对象)
    1:服务器连接已建立
    2:请求已接收
    3:请求处理中
    4:请求已完后,且响应已就绪
status
  响应状态码:
    if(xmlhttp.readystate==4&&xmlhttp.status==200){
        //执行的代码片段
    }
responseText
  获取服务器响应回来的文本信息
原生ajax的方法
open(method,url,[async]);
  设置请求的类型,请求地址以及是否异步处理请求
  method:请求的类型;get或post
  url:文件在服务器上的位置
  async:true(异步)或false(同步)
send([string]);
  将请求发送到服务器
    string:存放post请求携带的参数
在post请求时要设置请求参数的mime类型
  xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");


jQuery中的Ajax


$.post(url,[params],fn,[type])

发送post请求


url:请求的路径


params:请求的参数


格式1:字符串key1=value1&key2=value2


格式2:json格式:


{“key1”:“value1”,“key2”:“value2”}


fn:回调函数


function(data){


//data:响应回来的数据(xmlHttp.responseText)


}


type:返回内容的格式 text xml json


默认返回的是text类型的数据,一般不需要自己设置,设置的话一般设置为json


ajax的post请求案例:

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
<h3>原生ajax</h3>
  <a href="js_01.jsp">原生ajax入门</a>
<h3>jQuery的ajax</h3>
<a href="js_02.jsp">jQuery的ajax</a>
  </body>
</html>

js_02.jsp

<%--
  Created by IntelliJ IDEA.
  User: hp
  Date: 2020/5/14
  Time: 13:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/jquery-3.3.1.js"></script>
    <script>
        function sendAjax() {
            var url = "demo2";
            var params ={"username":"汤姆","password":"123"};
            function fun(data) {
                alert(data);
            }
            $ .post(url, params, fun,"text");
        }
    </script>
</head>
<body>
<input type="button" value="发送ajax请求" onclick="sendAjax()"/><br>
<span id="spId"></span>
</body>
</html>

Demo02Servlet.java

@WebServlet(name = "Demo3Servlet", urlPatterns = "/demo2")
public class Demo3Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解决乱码
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print(request.getParameter("username")+":"+request.getParameter("password"));
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
如果换为get请求则 $.get(url,[params],fn,[type])即可
$.ajax写法想发post或者get都可以
$.ajax({url,[settings]})
  url:请求路径
  type:请求方式
  data:请求参数
  success:请求成功后的回调函数
  error:请求失败后调用的函数
  dateType:服务器返回的数据类型
    一般不需要自己设置,要设置的话一般设置为json
  async:设置是否为异步提交,默认为true(异步提交)
eg:
$.ajax({
  url:url,
  data:params,
  type:"post",
  success:f,
  error:ef,
  async:true
})

json

概述:
  JavaScript对象表示法,是存储和交换文本信息的语法,类似xml,  比xml更小,更快,更衣解析.
格式:
  格式1:json对象
    {"key":"value","key2":"value2"}//key为String类      型,value任意类型
  格式2:json数组
    ["aa","bb"]
  格式3:混合json
    [{"name":"张三","age":"11"},{"name":"张三2","age":"21"}]
    {"student":["张三","李四"]}
获取json对象格式的值直接:对象.key

java对象转换为json数据

常见的工具类:
  jsonlib
  fastjson(阿里巴巴的)
  gson(谷歌的)
    Jackjson(为springmvc默认的转换方式)

案例一:检测用户名是否被注册

需求分析:
  再注册页面上,当用户在用户名的输入框输入完成后,也就是失去焦点事件发送ajax请求,检验用户名是否存在
  该用户名已存在:
    提示:"该用户名已被占用"
    该用户名不存在:
    提示:"√"
技术分析:
  blur:失去焦点事件
  ajax:
  $.ajax({
      url:"",
        data:"",
        type:"",
        success:f,
        error:f,
        dataType:"text",
        async:true
  })
步骤分析:
  前台:
    提供注册页面,给用户名的输入框添加失去焦点事件
        输入框对象.blur(function(){
          //发送ajax请求
        })

demo1.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/jquery-3.3.1.js"></script>
    <script>
        //页面加载成功事件
        $(function () {
            //用户名输入框的失去焦点事件
            $("input[name='username']").on("blur",function () {
                //获取用户输入的name值
               var username=$(this).val();
               //使用ajax异步处理
                $.ajax({
                    url:"user",
                    data:{"username":username},
                    type:"post",
                    success:function (data) {
                        $("#nameMsg").html(data);
                    },
                    dataType:"text",
                    async:true
                })
            })
        })
    </script>
</head>
<body>
<form action="">
    <table align="center" border="1px solid red" width="300px" height="100px">
        <tr>
            <th colspan="2" align="center">
                用户表单
            </th>
        </tr>
        <tr>
            <td>用户名:</td>
            <td>
                <input type="text" name="username">
                <span id="nameMsg"></span>
            </td>
        </tr>
        <tr>
            <td>密码:</td>
            <td>
                <input type="password" name="pwd">
            </td>
        </tr>
        <tr>
            <td colspan="2" align="center">
                <input type="submit" id="subId" value="提交"/>
            </td>
        </tr>
    </table>
    <br>
</form>
</body>
</html>

UserServlet.java

@WebServlet(name = "UserServlet", urlPatterns = "/user")
public class UserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //获取前端传来的userName
        String username = request.getParameter("username");
        //调用service查看此用户名是否存在
        UserService userService = new UserService();
        User exist = userService.exist(username);
        if (exist==null) {
            response.getWriter().print("√");
        }else{
            response.getWriter().print("用户名已存在");
        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

UserService.java

public class UserService {
    public User exist(String username){
        UserDao userDao = new UserDao();
         return  userDao.exist(username);
    }
}

UserDao.java

public class UserDao {
    public User exist(String username){
        try {
            String sql = "select * from user where name = ? ";
            JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
            return template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username);
        } catch (DataAccessException e) {
            return null;
        }
    }
}
案例二:异步自动填充

demo2.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
  .content{
    width:643px;
    margin:200px auto;
    text-align: center;
  }
  input[type='text']{
    width:530px;
    height:40px;
    font-size: 14px;
  }
  input[type='button']{
    width:100px;
    height:46px;
    background: #38f;
    border: 0;
    color: #fff;
    font-size: 15px
  }
  .show{
    width: 535px;
    border: 1px solid #999;
    border-top: 0;
        display: none;
  }
</style>
<script type="text/javascript" src="js/jquery-3.3.1.js"></script>
<script type="text/javascript">
  //搜索框联想词的单击事件
  function fn(ele) {
        $("input[name='word']").val($(ele).html());
    }
  $(function () {
        $("input[name='word']").on("keyup",function () {
            $.ajax({
        url:"demo2",
        data:{"username":$(this).val()},
        type:"post",
        success:function (data) {
          if(data!="null"&&data.length>0){
              var str="";
                        $("div>div").empty();
              $.each(data,function (index,ele) {
                            str += "<span οnclick='fn(this)'>"+ele+"</span><br>";
                        });
                        $("div>div").html(str);
                        $("div>div").show();
          }else{
                        $("div>div").hide();
          }
                },
        dataType:"json",
        async:true
      })
        })
    })
</script>
</head>
<body>
  <div class="content">
    <img alt="" src="img/logo.png"><br/><br/>
    <input type="text" name="word">
    <input type="button" value="搜索一下">
    <div class="show"></div>
  </div>
</body>
</html>

Demo2Servlet.java

@WebServlet(name = "Demo2Servlet", urlPatterns = "/demo2")
public class Demo2Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        List<String> userList = new UserService().likeName(request.getParameter("username"));
        //将list转换为json
        String listJson = new ObjectMapper().writeValueAsString(userList);
        System.out.println("listJson======="+listJson);
        response.getWriter().print(listJson);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

service.java

public class UserService {
    public User exist(String username){
        UserDao userDao = new UserDao();
         return  userDao.exist(username);
    }
    public List<String> likeName(String username){
        UserDao userDao = new UserDao();
        return  userDao.likeName(username);
    }
}

dao.java

public class UserDao {
    public User exist(String username){
        try {
            String sql = "select * from user where name = ? ";
            JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
            return template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username);
        } catch (DataAccessException e) {
            return null;
        }
    }
        public List<String> likeName(String username){
        try {
            String sql = "select name from user where name like ?  ";
            JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
            return template.queryForList(sql, String.class, username+"%");
        } catch (DataAccessException e) {
            return null;
        }
    }
}


目录
相关文章
|
7月前
|
JSON API 数据安全/隐私保护
深度分析淘宝卖家订单详情API接口,用json返回数据
淘宝卖家订单详情API(taobao.trade.fullinfo.get)是淘宝开放平台提供的重要接口,用于获取单个订单的完整信息,包括订单状态、买家信息、商品明细、支付与物流信息等,支撑订单管理、ERP对接及售后处理。需通过appkey、appsecret和session认证,并遵守调用频率与数据权限限制。本文详解其使用方法并附Python调用示例。
|
5月前
|
JSON API 数据格式
淘宝拍立淘按图搜索API系列,json数据返回
淘宝拍立淘按图搜索API系列通过图像识别技术实现商品搜索功能,调用后返回的JSON数据包含商品标题、图片链接、价格、销量、相似度评分等核心字段,支持分页和详细商品信息展示。以下是该API接口返回的JSON数据示例及详细解析:
|
6月前
|
机器学习/深度学习 JSON 监控
淘宝拍立淘按图搜索与商品详情API的JSON数据返回详解
通过调用taobao.item.get接口,获取商品标题、价格、销量、SKU、图片、属性、促销信息等全量数据。
|
5月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
5月前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
6月前
|
JSON 缓存 自然语言处理
多语言实时数据微店商品详情API:技术实现与JSON数据解析指南
通过以上技术实现与解析指南,开发者可高效构建支持多语言的实时商品详情系统,满足全球化电商场景需求。
|
6月前
|
JSON API 数据格式
干货满满!淘宝商品详情数据,淘宝API(json数据返回)
淘宝商品详情 API 接口(如 taobao.item.get)的 JSON 数据返回示例如下
|
7月前
|
JSON 算法 安全
淘宝商品详情API接口系列,json数据返回
淘宝开放平台提供了多种API接口用于获取商品详情信息,主要通过 淘宝开放平台(Taobao Open Platform, TOP) 的 taobao.tbk.item.info.get(淘宝客商品详情)或 taobao.item.get(标准商品API)等接口实现。以下是关键信息及JSON返回示例:
|
5月前
|
JSON 中间件 Java
【GoGin】(3)Gin的数据渲染和中间件的使用:数据渲染、返回JSON、浅.JSON()源码、中间件、Next()方法
我们在正常注册中间件时,会打断原有的运行流程,但是你可以在中间件函数内部添加Next()方法,这样可以让原有的运行流程继续执行,当原有的运行流程结束后再回来执行中间件内部的内容。​ c.Writer.WriteHeaderNow()还会写入文本流中。可以看到使用next后,正常执行流程中并没有获得到中间件设置的值。接口还提供了一个可以修改ContentType的方法。判断了传入的状态码是否符合正确的状态码,并返回。在内部封装时,只是标注了不同的render类型。再看一下其他返回的类型;
284 4
|
5月前
|
JSON Java Go
【GoGin】(2)数据解析和绑定:结构体分析,包括JSON解析、form解析、URL解析,区分绑定的Bind方法
bind或bindXXX函数(后文中我们统一都叫bind函数)的作用就是将,以方便后续业务逻辑的处理。
351 3