JQuery的Ajax

一、Ajax概述

概述

Ajax: 异步的JS和XML的组合;也就是需要在JS中发异步请求到服务器(XML操作被JQuery封装)

异步:多线程的执行;客户端与服务器可以同时执行

用途:可用于页面的局部刷新;在不需要刷新整个页面的情况下,可使用ajax

应用场景:注册功能、购物车、地图搜索

应用流程

客户端在JS中发异步请求url到服务器;服务器可进行处理,处理完成后,将数据回调给客户端(局部刷新);同时客户端发完请求后,也可以继续处理前端的代码的执行;构成了异步操作

二、Ajax应用

ajax的应用,可以分为两个部分:1.从服务器中获取数据 2.客户端传参数,再从服务器取数据

具体的ajax的异步功能有三种方式:$.get(..)、 $.post(..)、 $.ajax(..)

get和post用于处理较为简单的异步请求;ajax方法用于处理功能更为强大的异步处理

get和post基本操作类似;只不过get异步是通过url方式传参数,效率高,不安全;post异步通过请求体方式传参数,效率低,但安全

获取服务器数据

由于ajax需要前后端的操作,所以需使用eclipse来完成;服务器使用tomcat

eclipse服务器配置:

新建web项目:File->new->Other..->动态web; 编码项目名和导入web服务器tomcat

src目录:存储java代码

webContent:存前端资源:html,css,js,图片;

说明:由于还没有学习Servlet服务器资源,所以此处使用jsp来替代服务器资源;jsp即可写前端,也可写后端,在长期项目实践中,往往归为前面,所以也是放到WebContent目录

<!--客户端:-->
<!-- 案例:从服务器中获取数据,到前端展示;使用局部刷新 -->
<input type="button" value="加载数据" /><br/>
<div>...</div>

<script type="text/javascript" src="js/jquery-1.11.min.js"></script>
<script type="text/javascript">
    $("input").click(function(){
        //get异步请求  参数1:url路径  参数2:函数回调
        $.get("load.jsp",function(data){
            $("div").html(data); //服务器回调数据后,进行局部刷新
        })

        //js可以继续异步执行操作,只是此处没代码
    }) 
</script>
//服务器:
<%
	//此处用于编写java代码
	//response-相应的内置对象   相应回客户端
	response.getWriter().write("服务器返回的数据~");
%>   

客户端传参数

案例:做一个注册提示功能;输入用户名后,失去焦点,发异步请求到服务器,服务器根据用户名进行判断,如果为zs,则返回已注册;否则,返回恭喜可用

分析:使用ajax异步请求,且需要传参数到服务器,再服务器里面进行判断

<!--客户端:-->
<form action="">
    用户名:<input type="text" id="username" /><span></span><br/>
    密码:   <input type="text" id="password" /><span></span><br/>
    <input  type="submit" value="注册"/>
</form>

<script type="text/javascript" src="js/jquery-1.11.min.js"></script>
<script type="text/javascript">
    var isOK = false;  //开关判断
    $("#username").blur(function(){
        var value = $(this).val().trim();
        //参数1:url  参数2:传到后端的参数 json数据格式  参数3:回调函数
        //参数最终拼接到url中:?username=zs&age=12
        //$.get("reg.jsp",{username:value},function(data){
        //将参数以请求体方式传到服务器
        $.post("reg.jsp",{username:value},function(data){
            if(data==1){ //建议此处使用整数1,比较内容相等
                $("#username+span").html("<font color='red'>已注册</font>");
                isOK = false;
            }else if(data==0){
                $("#username+span").html("<font color='green'>恭喜可用</font>");
                isOK = true;
            }
        })
    })
    $("form").submit(function(){
        return isOK;
    })
</script>
//服务器
<%
    //接收请求参数:request 根据key获取value 
	String username = request.getParameter("username"); //username=zs 得到zs字符串
    if("zs".equals(username)){
    	//通过response响应对象,回传数据到客户端
    	response.getWriter().write("1");  //注意:传字符串“1”或“0”
    }else{
    	response.getWriter().write("0");
    }
%>    

三、ajax方法

相对于get和post的异步请求,ajax的方法功能更为强大;如果需要完成处异步请求以外的功能,则需使用ajax方法,例如: 发完请求后的刷新图片提示

<!--客户端-->
<!-- 案例:从服务器中获取数据,未取到数据前,显示一张一直刷新的图片 -->
<input type="button" value="加载数据" /><br/>
<div>...</div>
<script type="text/javascript" src="js/jquery-1.11.min.js"></script>
<script type="text/javascript">
    $("input").click(function(){
        $.ajax({  //data属性就是传参数的
            type:"get",  //请求类型
            url:"ajax.jsp",   //路径
            beforeSend:function(){ //发送数据前的触发执行
                $("div").html("<img src='img/Loading.gif'>服务器正在闹情绪...");
            },
            success:function(data){ //成功的请求
                $("div").html(data);
            }
        })
    })
</script>
//服务器
<%
	Thread.sleep(5000);   //睡眠5秒

	response.getWriter().write("服务器数据加载完成!!!");
%>    

四、JSON数据

概述

JSON数据本质上就是带格式的字符串; 是一种数据交换格式,也就是用于前后端传递数据

语法

JSON数据有两种:1.最外层为{} 2.最外层为[]

最外层为{},表示该JSON数据最终解析为对象

最外层为[],表示该JSON数据最终解析为数组或集合

JSON数据的格式如下:"{key:value, key2: value2}"

五、JSON解析

JSON的解析方式有两种:1.将JSON数据解析为对象或容器 2.对象或容器反向解析为JSON数据

FastJson解析

FastJson是阿里巴巴提供的解析方式

public class Grade {
	private int id;
	private String name;
	private List<Student> stus;
    //set/get  toString 构造...
}

public class Student {
	private int id;
	private String name;
	private int age;
	//set/get  toString 构造...
}
//1.正向解析:将json数据解析成对象或容器
//String json1 = "{'id':1,'name':'JAVAEE-2305'}";
//解析复杂的数据:
String json1 = "{'id':1,'name':'JAVAEE-1703','stus':[{'id':101,'name':'刘铭','age':16}]}";
//规则:实体属性名与json数据的key要一致,值才能注入实体中
Grade grade = JSON.parseObject(json1, Grade.class);
System.out.println(grade);

String json2 = "['北京','天津','杭州']";
List<String> list = JSON.parseArray(json2, String.class);
System.out.println(list);
//2.反向解析:已知对象,产生JSON数据
List<Student> list = new ArrayList<Student>();
list.add(new Student(10000, "zs", 30));
Grade grade = new Grade(101, "java2305", list);

String json1 = JSON.toJSONString(grade);
System.out.println(json1);

//已知容器,产生JSON数据
String[] arr = {"北京","上海","深圳"};
String json2 = JSON.toJSONString(arr);
System.out.println(json2);

Jackson解析

//正向解析:1.根据json数据,解析成对象或容器
String json1 = "{\"id\":1,\"name\":\"JAVAEE-1703\",\"stus\":[{\"id\":101,\"name\":\"刘一\",\"age\":16}]}";
//解析成对象
ObjectMapper om = new ObjectMapper();
Grade grade = om.readValue(json1, Grade.class);
System.out.println(grade);

//解析成容器
String json2 = "[\"北京\",\"天津\",\"杭州\"]";
//<ArrayList<String>>:泛型中传的是集合
List<String> list = om.readValue(json2, new TypeReference<List<String>>() {
});
System.out.println(list);
//2.反向解析:已知对象或容器转json数据
List<Student> list = new ArrayList<Student>();
list.add(new Student(101, "ls", 35));
Grade grade = new Grade(1, "java2202", list);
//已知对象转json数据
ObjectMapper om = new ObjectMapper();
String json1 = om.writeValueAsString(grade);
System.out.println(json1);

//已知数组转json数据
String[] arr = {"北京","上海","广州"};
String json2 = om.writeValueAsString(arr);
System.out.println(json2);

JS的JSON解析

<input type="button" value="JSON解析" onclick="myclick()">
<script type="text/javascript">
    function myclick(){
        //JS的json解析:已知对象,转json字符串
        var obj = {name:'zs',age:30}; //通过json创建的对象
        var str = JSON.stringify(obj); //对象转字符串
        alert(str+"--->"+(typeof str))

        var obj2 = JSON.parse(str); //传入json字符串,解析成对象
        alert(obj2.name+","+obj2.age+"--->"+(typeof obj2))
    }
</script> 

六、总结与作业

总结

1.ajax概述(重点)
什么是ajax,用途,应用场景;应用流程
2.ajax的应用(重点)
获取服务器的数据的案例
客户端传参数到服务器,再获取服务器数据
3.ajax方法(重点)
比get和post异步加载更为强大
4.JSON数据
概述-数据交换格式;语法结构
5.json解析
FastJson解析-正向,反向解析(重点)
jacsson解析(了解)
JS的json解析(重点)

作业

1. 使用jquery的get异步请求,传入name和age,将jsp中定义的student对象返回并解析
在标签中显示对象的name和age值
提示: jsp返回字符串-->后端可以将对象转字符串; 到达前端:字符串接收,再转对象
,,
2. 使用jquery的ajax异步请求,传入name和age,将jsp中定义的student对象返回并解析,
在标签中显示对象的name和age值

晨考

1.fastjson包中,解析成对象和解析成集合的方法是什么?
String json1 = "{'id':1,'name':'JAVAEE-1703','stus':[{'id':101,'name':'刘铭','age':16}]}";
//规则:实体属性名与json数据的key要一致,值才能注入实体中
Grade grade = JSON.parseObject(json1, Grade.class);

解析成对象:JSON.parseObject();
解析成容器:JSON.parseArray();
2. js解析成对象和对象解析成json字符串的方法分别是什么?
解析成对象:JSON.parse();
解析成JSON:JSON.stringfy();
3. 使用ajax时,可以使用submit提交按钮吗? 为什么?
不可以,submit是整个页面的刷新,ajax是局部的刷新