JavaEE学习日志(六十四): AJAX异步请求,JSON

29 篇文章 0 订阅
20 篇文章 1 订阅

JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)

AJAX

AJAX异步请求

A:异步
J:JavaScript
A:And
X:XML
同步请求:客户端请求到服务器,如果服务器没有响应,客户端只能等待,类似于卡死效果。
异步请求:客户端请求到服务器,如果服务器没有响应,客户端可以自由活动。

AJAX执行原理

浏览器内置了AJAX的引擎
在这里插入图片描述

原生态的JavaScript实现异步请求

实现步骤

  • 获取AJAX引擎
  • 设置回调函数。自定义函数,服务器响应成功后,自动调用。
  • 设置请求服务器路径
  • 提交
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        /*
            原生态的js实现ajax异步请求
         */
        function fn() {
            //获取AJAX引擎对象,XMLHttpRequest
            var xmlhttp = new XMLHttpRequest();
            //引擎对象调用事件,监听AJAX引擎的状态变化
            xmlhttp.onreadystatechange=function()
            {
                if (xmlhttp.readyState==4 && xmlhttp.status==200)
                {
                    //xmlhttp.responseText:AJAX引擎对象属性,服务器响应回来的文本数据
                    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
                }
            }
            //设置服务器路径
            xmlhttp.open("GET","/Web09/js_ajax");
            //提交请求
            xmlhttp.send();

        }
    </script>
</head>
<body>
<input type="button" value="ajax提交" onclick="fn()">
<div id="myDiv"></div>
</body>
</html>

服务器返回一个"收到"。
在这里插入图片描述
此时网页无刷新,还在这个页面。

jQuery的AJAX请求

跨浏览器操作

$.get() 函数

在这里插入图片描述
参数:

  • url:提交的服务器地址
  • data:提交到服务器的数据,以k=v&k=v的格式发送
  • callback:回调函数,服务器响应成功后,自动调用函数
  • type:服务器端响应回来的数据类型。返回内容格式,xml, html, script, json, text, _default。

前端

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="../js/jquery-1.11.0.min.js"></script>
    <script type="text/javascript">
        function fn() {
            /*
                jQuery中的函数get异步请求
             */
            $.get(
                //传递服务器地址路径
                "/Web09/jquery_get",
                //传递提交到服务器的参数
                "username=zhangsan&age=20",
                //回调函数,服务器响应成功
                //服务器响应回来的数据,会直接传递到参数中
                function (data) {
                    alert(data);
                },
                //服务器响应的数据格式
                "text"
            );

        }
    </script>
</head>
<body>
    <input type="button" value="get请求" onclick="fn()">
</body>
</html>

servlet

package com.itheima.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(urlPatterns = "/jquery_get")
public class Jquery_GetServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
            接收客户端的异步请求
            响应文本类型的数据
         */
        String username = request.getParameter("username");
        String age = request.getParameter("age");
        System.out.println(username+"="+age);
        response.getWriter().write("hehe");
    }

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

$.post()函数

和get函数一模一样,只不过提交的数据从请求行变成了请求体
在这里插入图片描述

<script type="text/javascript">
    function fn() {
        /*
            jQuery中的函数post异步请求
         */
        $.post(
            //传递服务器地址路径
            "/Web09/jquery_post",
            //传递提交到服务器的参数
            "username=zhangsan&age=20",
            //回调函数,服务器响应成功
            //服务器响应回来的数据,会直接传递到参数中
            function (data) {
                alert(data);
            },
            //服务器响应的数据格式
            "text"
        );

    }
</script>

$.ajax()函数

$.ajax():是get和post的底层函数,使用get或者post的时候,底层调用的都是ajax函数。

上层函数:简单,可以控制的内容少
底层函数:代码多,灵活性很大,可以控制的内容多

函数的参数

  • url:服务器请求的地址
  • async:异步请求或者同步请求,默认是true,表示异步
  • data:请求到服务器的参数,k=v
  • dataType:接收服务器响应的数据格式,text和json类型
  • error:服务器响应失败的回调函数
  • success:服务器响应成功的回调函数
  • type:get请求或post请求

代码示例

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="../js/jquery-1.11.0.min.js"></script>
    <script type="text/javascript">
        function fn() {
            /*
                底层ajax函数
                格式
                 $.ajax({
                    k:v,
                    k:v
                 });
             */
            $.ajax({
                //服务器路径
                url:"/Web09/jquery_ajax",
                //提交服务器的数据
                data:"username=zhangsan&age=20",
                //设置响应失败的回调函数
                error:function () {
                    alert("服务器响应失败");
                },
                //响应成功的回调函数
                success:function (data) {
                    alert("服务器响应成功"+data);
                },
                //设置接收的响应数据格式
                dataType:"text",
                //设置请求方式
                type:"GET"
            });
        }
    </script>
</head>
<body>
    <input type="button" value="ajax提交" onclick="fn()">
</body>
</html>

ajax没有中文乱码问题

这样写完全没问题,张三可以被服务器接收到

<script type="text/javascript">
     function fn() {
         $.get(
             "/Web09/demo",
             "username=张三",
             function (data) {
                 alert(data);
             },
             "text"
         );
     }
 </script>

异步请求和同步请求的差异

同步请求:没有响应会卡死
异步请求:没有响应,自由活动

好处:速度快,用户体验好,节约资源

JSON数据格式

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式,就是说不同的编程语言JSON数据是一致的。JS原生支持JSON。

JSON格式

json有两种格式:
对象格式:{"key1":obj,"key2":obj,"key3":obj...} 键必须是字符串
数组格式:[obj,obj,obj...]

注意:对象格式和数组格式可以互相嵌套

JSON练习一

<script type="text/javascript">
	/**
	 * 案例一
	 *  {key:value,key:value}
	 *  
	 * class Person{
	 * 	  String firstname = "张";
	 *    String lastname = "三丰";
	 *    Integer age = 100;
	 * }
	 * 
	 * Person p = new Person();
	 * System.out.println(p.firstname);
	 */
	//JSON数据格式,表示Java中的对象
    var person = {"firstname":"张","lastname":"三丰","age":100};
    //取出三丰
    alert(person.lastname);
	
    
  </script>

JSON练习二

<script type="text/javascript">
  	/**
	 * 案例二
	 *  [{key:value,key:value},{key:value,key:value}]
	 *  json数据本质是数组
     *  有两个元素,每个元素都是一个对象
	 */
	 var json = [
        {"firstname":"张","lastname":"三丰","age":100},
        {"firstname":"李","lastname":"四","age":150}
     ];
	 for (var i=0;i<json.length;i++){
	   alert(json[i].firstname+json[i].lastname+"=="+json[i].age);
     }
	 
  </script>

JSON练习三

<script language="JavaScript">
   /**
	 * 案例三
	 * {
	 *   "param":[{key:value,key:value},{key:value,key:value}]
	 * }
	 *  json本质是对象
    *   对应的键是param
    *   对应的值是数组
    *   数组有两个元素
    *   每个元素都是一个对象
    *
	 *  
	 */
	 var json = {
	   "param":[
         {"firstname":"张","lastname":"三丰","age":100},
         {"firstname":"李","lastname":"四","age":150}
       ]
   }
	 //取出李四
    alert(json.param[1].firstname+json.param[1].lastname);
	
	
	
  </script>

JSON练习四

<script language="JavaScript">
   /**
	 * 案例四
	 * {
	 *   "param1":[{key:value,key:value},{key:value,key:value}],
	 *   "param2":[{key:value,key:value},{key:value,key:value}],
	 *   "param3":[{key:value,key:value},{key:value,key:value}]
	 * }
	 *  
	 *  
	 */
	  var json = {
	      "param1":[
            {"firstname":"张","lastname":"三丰","age":100},
            {"firstname":"李","lastname":"四","age":150}
          ],
          "param2":[
            {"firstname":"张","lastname":"四丰","age":200},
            {"firstname":"李","lastname":"五","age":250}
          ],
          "param3":[
            {"firstname":"张","lastname":"五丰","age":300},
            {"firstname":"李","lastname":"六","age":350}
          ]
      }
	 //取出李四
    alert(json.param1[1].firstname+json.param1[1].lastname)


  </script>

AJAX响应JSON数据

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="../js/jquery-1.11.0.min.js"></script>
    <script type="text/javascript">
        function fn() {
            /*
                发送AJAX请求
                获取服务器响应的数据,使用JSON格式
             */
            $.get(
                "/Web09/jquery_json",
                "username=张三",
                function (data) {
                    alert(data.lastname);
                },
                "json"
            );
        }
    </script>

</head>
<body>
<input type="button" value="json提交" onclick="fn()">
</body>
</html>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println(request.getParameter("username"));
        //向客户端响应JSON数据格式
        response.setContentType("text/html;charset=utf-8");
        //定义一个JSON数据    {"firstname":"张","lastname":"三丰","age":100}
        String json = "{\"firstname\":\"张\",\"lastname\":\"三丰\",\"age\":100}";
        response.getWriter().write(json);
    }

在这里插入图片描述

JSON-LIB工具

作用:把java中的数据转成JSON格式的数据
包含:对象,数组,集合…
缺点:

  • jar包太多,需要全部使用才能生效。
  • 有两个不同的方法来转换对象和集合
  1. JSON-LIB工具把对象person中的数据转成json格式
    方法:JSONObject.fromObject(person) 返回值是本类的对象,需要再次调用方法toString()来获得字符串
public void objectToJson(){
        Person person = new Person("张三",30,"浙江省杭州市");
        //JSON-LIB工具:JSONObject类静态方法fromObject
        //方法返回值是本类的对象,再次调用方法toString()
        String json = JSONObject.fromObject(person).toString();
        System.out.println(json);//{"address":"浙江省杭州市","age":30,"name":"张三"}

    }
  1. 集合或数组转成json
    方法:JSONArray.fromObject(list) 需要再次调用方法toString()来获得字符串
public void listToJson(){
        List<Person> list = new ArrayList<>();
        list.add(new Person("张三",20,"浙江省杭州市"));
        list.add(new Person("李四",33,"浙江省宁波市"));
        list.add(new Person("王五",44,"浙江省温州市"));
        //JSON-LIB工具:JSONArray类静态方法fromObject
        String json = JSONArray.fromObject(list).toString();
        System.out.println(json);
        //[{"address":"浙江省杭州市","age":20,"name":"张三"},{"address":"浙江省宁波市","age":33,"name":"李四"},{"address":"浙江省温州市","age":44,"name":"王五"}]
        String[] str = {"qq","wx","msn"};
        String json2 = JSONArray.fromObject(str).toString();
        System.out.println(json2);//["qq","wx","msn"]
    }

Gson工具(用它)

谷歌公司开发的一个转换工具和JSON-LIB工具一样
把java中的数据转成JSON格式的数据
优点:

  • 就一个jar包
  • 一个方法就能转换所有数据

使用步骤:

  1. 创建Gson对象Gson gson = new Gson();
  2. 调用方法gson.toJson(任意数据)
public void listToJson() {
        List<Person> list = new ArrayList<>();
        list.add(new Person("张三", 20, "浙江省杭州市"));
        list.add(new Person("李四", 33, "浙江省宁波市"));
        list.add(new Person("王五", 44, "浙江省温州市"));
        //gson工具实现转换
        Gson gson = new Gson();
        //对象调用一个方法叫toJson(任意数据)
        String json = gson.toJson(list);
        System.out.println(json);
        //[{"name":"张三","age":20,"address":"浙江省杭州市"},{"name":"李四","age":33,"address":"浙江省宁波市"},{"name":"王五","age":44,"address":"浙江省温州市"}]

    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaEE学习笔记是我自己在学习过程中总结的javaweb各项技术和知识点。它包含了JavaEE的十三种核心技术,分别是JDBC、JNDI、EJB、RMI、Servlet、JSP、XML、JMS、Java IDL、JTS、JTA、JavaMail和JAF。 JavaEE一个开放的标准的组件体系结构,它独立于平台,但使用Java语言。一个JavaBean是一个满足JavaBeans规范的Java类,通常定义了一个现实世界的事物或概念。一个JavaBean的主要特征包括属性、方法和事件。 在支持JavaBeans规范的开发环境中,可以可视地操作JavaBean,也可以使用JavaBean构造出新的JavaBean。JavaBean的优势还在于Java带来的可移植性。所以在JavaEE学习笔记中,你可以找到关于这些核心技术和JavaBean的详细内容和示例。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [javaEE学习笔记](https://download.csdn.net/download/sugar_map/10268742)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [JavaEE学习笔记整理](https://blog.csdn.net/qq_51861704/article/details/124133294)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值