学习JavaWeb第十九天

ajax和Json

ajax

  • 简介:Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

js原生的ajax请求(非重点)

步骤繁琐:

  • 步骤:
    • 1 创建 XMLHttpRequest 对象的语法: var iable=new XMLHttpRequest();
    • 2 规定请求的类型、URL 以及是否异步处理请求
      • xmlhttp.open(“GET”,“test1.txt”,true);
      • get传参 test1.txt?name=zhangsan
      • post传参 xmlhttp.send(“name=zhangsan”);
      • open(method,url,async)
      • method:请求的类型;GET 或 POST
      • url:文件在服务器上的位置
      • async:true(异步)或 false(同步)
        *3 发生请求 xmlhttp.send();
        *4、根据状态获取响应信息
`xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;}
}` 

*4.1、onreadystatechange 存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
*4.2、readyState 存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
0: 请求未初始化
1: 服务器连接已建立
2: 请求已接收
3: 请求处理中
4: 请求已完成,且响应已就绪
*4.3、status
200: “OK”
404: 未找到页面

使用示例:

`<!-- get提交方式 -->
 <script type="text/javascript"> var xmlhttp = new XMLHttpRequest();
xmlhttp.open("get", "${pageContext.request.contextPath }/ss?name=德玛西亚", true);
xmlhttp.send();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
document.getElementById("myDiv").innerHTML = xmlhttp.responseText;}
} </script>` 

`<script type="text/javascript"> var xmlhttp = new XMLHttpRequest();
xmlhttp.open("post", "${pageContext.request.contextPath }/ss", true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("name=dddd");
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
document.getElementById("myDiv").innerHTML = xmlhttp.responseText;}
} </script>` 

JQ的ajax请求(重点)

`<script type="text/javascript"> /* jq方式: */
$.ajax({
type: "post",  /* 提交方式 */
url: "${pageContext.request.contextPath}/s2", /* 链接地址  */
async:false, /* 是否异步 否表示同步  */
data: {"name":"John","location":"Boston"},  /* 传的参数 " 属性名=属性值&属性名=属性值& " 或者是 { 属性名:属性值,属性名:属性值 } */
dataType:"text", /* 返回的数据类型  */
success: function(msg){    /* 成功时 接收服务器数据的函数  */
alert( "Data Saved: " + msg );}
}); </script>` 

  • 参数介绍:
  • URL:和form表单中的action一样,都是代表请求的路径。
  • Data:数据,前台需要向后台传递的数据(一键值对形式)
  • Type:和form表单中method对应,代表请求类型 get/post
  • dataType:回传的数据类型。Text、xml、html、json…
  • success:成功的回调函数
  • async:是否异步
    • true 异步 默认
    • false 同步
    • 啥叫ajax的异步 同步?
    • 异步 指的是同一脚本中多个存在多个ajax时候它们是不区分顺序的,而是并发执行 (提交数据时页面还可以操作其他内容)
    • 同步 多个ajax按顺序执行。(提交数据时页面不可操作其他内容,页面可能会出现卡顿感)
  • 注意事项
    • 1、每个属性后都要跟随一个英文逗号,最后一个不用
    • 2、每一个属性都是键值对的形式存在,中间用英文冒号隔开:
    • 3、data:{ } 是一个特殊的写法,值是一个{},里面使用键值对存储,例如:data:{“键1”:值1, “键2”:值2, “键3”:值3},也可以使用这种: data:" 键1=值1&键2=值2";
    • 4、写法属性不用关心顺序问题

JQ的ajax请求简写方式:

`<script type="text/javascript"> /* jq简写方式post :jQuery.post(url, [data], [callback], [type]) */
$.post(
"${pageContext.request.contextPath}/s2",    /* url链接地址 */
{"name":"老六","location":"南美"},      /* 数据 */
function(msg){                   /* 成功时回调的函数,以及回调的数据msg */
alert( "Data Saved: " + msg );
}, 
"text"          /* 返回的数据类型  */
) </script>` 

  • $ .post(url,{},function(){},“text”)
    • 是$.ajax({}) 的简写方式,只不过这里只能使用post提交的方式。
    • 语法
    • $ .post(“链接地址”,{键值对的数据},回调函数,返回值类型);
    • $ .post(“check”,{“uname”:uname},function(obj){alert(obj);},“text”);
    • 注意:这种写法功能和$.ajax是一样的,不过严格要求属性顺序
  • $ .get(url,{},function(){},“text”);
    • 是$ .ajax({}) 的简写方式,只不过这里只能使用get提交的方式。
    • 语法
    • $ .get(“url”,{键值对的数据},回调函数,返回值类型);
    • $ .get(“check”,{“uname”:uname},function(obj){alert(obj);},“text”);
    • 注意:这种写法功能和$.ajax是一样的,只不过严格要求属性顺序

.ajax()、 .post()、$ .get()区别:

  • 相同点:效果一样异步交互。
  • 不同点:
    • $.ajax()、这个是jQuery最开始的封装的异步交互、采用的是JavaScript中XMLHttpRequest这一项技术(IE6 最开始支持的)、算是jQuery的第一次封装。功能强大、涵盖了get、post请求、并且书写上不区分顺序问题。
    • .post()、是jQuery Ajax的第二次封装,原因是 .ajax()写法过于臃肿,简化为.post()/.get(),功能是相同的没有区别。但是在书写过程中要求属性的顺序必须按照严格的要求,否则整个Ajax不能使用。
    • .get(),和post一样都属于jQuery的第二次封装,但是和post的区别是,虽然浏览器不能直接展示拼接的url,但是后台执行的时候,然后会缓存数据、大小限制、信息不安全等、但是唯一的好处是比.post()快。
关于返回值类型:
  • Text 返回纯文本类型 默认
  • Html 返回的HTML格式的代码
  • Script 直接返回脚本
  • Xml 返回xml格式的文件
  • Json 返回Json格式的数据
  • Jsonp 跨域数据交互协议
  • Html的返回和text实质是一样,一般情况下都用text代替了。

ajax之序列化表单信息:快速提取表单信息。

  • 简介:序列化这个功能是jQuery的。目的是将表单中的值按固定格式定义出来。
  • 选取 < form>进行序列化,但也可以对个别表单元素的 jQuery 对象进行序列化,比如 < input>, < textarea> 等
  • 使用方式:表单对象 . serialize()
  • 比如:$("#login").serialize( );
  • 返回值格式(键值对形式,) :”名字1”:”值1”&名字2”:”值2”…;

使用示例:

`<form method="post" ,action="">
    <input type="text" name="user"/>
    <input type="text" name="mail"/>
    <input type="radio" value="1" name="gender"> man
    <input type="radio" value="2" name="gender"> women
    <input type="submit" value="提交"/>
</form>
<script type="text/javascript"> //javascript
$('button').click(function(){
    $.ajax({
    type : 'POST',
    url : '/ajax/',
    data : $('form').serialize(),         //序列化表单输入,选择内容
        success : function (response, status, xhr) {
        alert(response);
        }
});
}); </script>` 

Json:

  • 简介:JSON :一种轻量级的数据交换格式。在 JSON 中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:
  • 存储特点:
    • 对象表示为键值对
    • 数据由逗号分隔
    • 花括号保存对象
    • 方括号保存数组

JSON的数据的3种基本格式

  • 第一种:数组格式 [1, “哈哈”, 5, true]
  • 第二种:对象格式 {“name”:“萌萌”,“age”:18}
  • 第三种:对象数组
`[{
"name": "张三",
"age": 18,
"score": [93, 94, 99]
}, {
"name": "李四",
"age": 19,
"score": [93, 98, 99]
}, {
"name": "王五",
"age": 20,
"score": [93, 91, 99]
}]` 

  • 第四种:复杂类型
`{
"class": "0729",
"students": [{
"name": "张三",
"age": 18,
"score": [93, 94, 99]
}, {
"name": "李四",
"age": 19,
"score": [93, 98, 99]
}, {
"name": "王五",
"age": 20,
"score": [93, 91, 99]
}]
}` 

json的转化工具:

  • Jsonlib 比较旧的一种转化json的工具,适用于简单的json转化

  • Fastjson 目前比较流行

  • Jackson工具: 经得起考验的一种工具,适用于java的任意框架。

    • Jackson可以将我们的对象、集合、数组等转化为json串。Boolean值可以直接不需要转化,作用是获取后台数据,以对象形式去接收便于操作。
    • 使用步骤
    • 1、导包:
    • jackson-annotations-2.7.9.jar
    • jackson-core-2.7.9.jar
    • jackson-databind-2.7.9.jar
    • 2、实例化ObjectMapper类对象:new ObjectMapper( );
    • 3、调用ObjectMapper对象的writeValueAsString()方法,放进String、对象、数组等。比如:mapper.writeValueAsString(room);返回的是一个String;
    • 4、接收调用。

使用示例:

package com.offcn.json.utils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

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 com.fasterxml.jackson.databind.ObjectMapper;
import com.offcn.entity.ClassRoom;
import com.offcn.entity.User;
import com.sun.org.apache.bcel.internal.generic.NEW;

@WebServlet("/j1")
public class JsonObejectDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Object arr[] = new Object[6];
        arr[0] = "大波浪";
        arr[1] = 18;
        arr[2] = true;
        arr[3] = new int[] { 1, 2, 3 };
        ArrayList<String> list = new ArrayList<String>();
        list.add("1号元素");
        list.add("2号元素");
        arr[4] = list;
        arr[5] = null;
        HashMap<Integer, Object[]> map = new HashMap<Integer, Object[]>();
        map.put(1, arr);
        ObjectMapper mapper = new ObjectMapper();
        String string = mapper.writeValueAsString(map);
        System.out.println(string);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
//结果:
{"1":["大波浪",18,true,[1,2,3],["1号元素","2号元素"],null]}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容