Java程序员从笨鸟到菜鸟之(八十四)深入浅出Ajax
Ajax(Asynchronous JavaScript and XML),异步的JavaScript与XML 。所谓同步,就是在进行一个操作之前必须要等到上一个操作返回操作结果才能进行这个操作,而异步则是在进行一个操作时可以不受上一个操作的影响,上一个操作是否返回操作都可以执行这个操作,各个操作可以同时进行,对用户来说,不用等待了,不用等待上一个操作就可以执行新的操作了。给用户的体验增强了。异步传输是面向字符的传输,它的单位是字符;而同步传输是面向比特的传输,它的单位是桢,它传输的时候要求接受方和发送方的时钟是保持一致的。 其实ajax并不是什么新技术,而是一些技术的组装。Ajax给我们的网络带来了很大的好处,假如我们只是简单的提交一个表单,我们就没必要刷新整个页面,只需要局部表单提交,刷新局部就可以了,这将大大减少了网络流量。有优点的同时他也有缺点,缺点就是我们浏览器上的后退和前进按钮就失效了。假如我们页面有三个异步ajax操作,浏览器并不把他当作三个请求操作,后退的时候也不会后退三次回到原始页面
Ajax的工作原理相当于在用户和服务器之间加了—个中间层,使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax引擎自己来做, 只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。
Ajax中最重要的一个对象就是XMLHttpRequest,这个对象最早是由微软在IE中以插件的形式提供的,但微软只是简单的提出这么一个对象,并没有真正的去实用它,后来其他浏览器也给出了这个对象,但他们都是提供的内置对象,而不是简单的插件的形式了。所以在获得这个对象的时候就避免不了要用if。。Else判断了、判断是否为IE浏览器,我们使用判断一个对象是否存在来判断,这个对象是IE所特有的,他就是active控件的对象。通过window.ActiveXObject,在if语句中写这么语句,因为在javascript中,如果不是undefined或者false他就是为true,所以,只要这个active空间存在,if条件就为真。也就是说就是IE浏览器。IE获得XMLHttpRequest对象是一个固定形式:xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");这是IE特有的获得XMLHttpRequest对象的方式,其他浏览要想获得XMLHttpRequest对象直接new就可以,也就是xmlHttpRequest =new XMLHttpRequest();虽然IE和其他浏览器获得XMLHttpRequest对象的方式是不同的,但是XMLHttpRequest的使用方式是一样的。
好了,判断完浏览器之后,我们就开始准备向服务器发送请求了,准备发送请求我们用:xmlHttpRequest.open("POST", "AjaxServlet", true);这里的三个参数我们有必要说一下,第一个参数是表示我们的请求是以什么形式发送,第二个参数是我们请求的地址,这里我们的地址是一个servlet,第三个参数指明是否为以异步的形式发送请求,一般我们都会设置为true。
准备好发送以后,我们要给他接收做一下准,ajax接收数据是以一个回调函数的形式接收数据的。也就是说我们注册好这个回调函数后,当达到某一要求时他会自动调用这个回调函数,然后去执行回调函数的内容,注册回调函数:xmlHttpRequest.onreadystatechange = ajaxCallback;注意这个回调函数ajaxCallback不要带括号。这个回调函数注册点我们从字面上也可以看出,他是在准备状态改变的时候调用这个函数。
一切准备好之后我们就要进行真正的发送请求了,发送请求是调用的xmlHttpRequest对象的send方法,这个方法里面当以post的形式发送请求,这里的方法的参数,就是我们请求的地址的参数,这个地址的参数是以键值对的形式传参的,如果是以get的形式请求时,我们可以把send方法的参数设置为null。,假如我们是以get的请求方式,发送代码即为了:xmlHttpRequest.send(null);,我们在来说说以post的请求方式请求时。xmlHttpRequest.send(null),null可以传参数(即send(“v1="+v1));并且在真正发送之前(xmlHttpRequest.send(null))之前必须设置
xmlHttpRequest.setRequestHeader("content-type","application/x-www-form-urlencoded");这一点一定要注意。
OK,请求发送出去了之后,我们下面来看一下我们怎么来接受请求返回的数据。根据HTTP协议我们应该知道,我们的一个请求应该分为四个步骤,也就是说一个请求有四个状态,他的状态即为xmlHttpRequest对象的readstate属性。我们来看一下这五个状态的具体内容:
从上边可以看出我们上边注册的回调函数将会被执行四次,但是我们其实就只在请求完成时执行我们回调函数的内容就OK,所以在回调函数里面我们可以进行一下判断
if (xmlHttpRequest.readyState == 4) { //请求完成}。
虽然我们判断了请求是否完成,但我们不知道这个请求是否成功,在我们http协议中,请求成功的状态码是200,所以我们如下判断一下状态码是否为200就可以了。
if (xmlHttpRequest.status == 200) {}
OK,以上差不多我们就把ajax的执行过程讲解了一遍,在看具体代码之前,我们来看一下xmlHttpRequest这个对象的属性:
下面我们就来看一下ajax整个执行流程的代码示例:我们以一个计算器的例子来实现:
首先我们来看一下表单代码:
- <input type="button" value="add"
- onclick=
- ajaxSubmit();;
- >
- <br>
- <input type="text" name="value1" id="value1ID">
- <br>
- <input type="text" name="value2" id="value2ID">
- <br>
- <div id="div1"></div>
然后我们来看一下执行的ajax的javascript代码:
- <script type="text/javascript">
- var xmlHttpRequest = null; //声明一个空对象以接收XMLHttpRequest对象
- function ajaxSubmit() {
- if (window.ActiveXObject) // IE浏览器
- {
- xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
- } else if (window.XMLHttpRequest) //除IE外的其他浏览器实现
- {
- xmlHttpRequest = new XMLHttpRequest();
- }
- if (null != xmlHttpRequest) {
- var v1 = document.getElementById("value1ID").value;
- var v2 = document.getElementById("value2ID").value;
- //当利用get方法访问服务器端时带参数的话,直接在"AjaxServlet"后面加参数, 下面send方法为参数null就可以,用post方法这必须在把参数加在send参数内,如下
- xmlHttpRequest.open("POST", "AjaxServlet", true);
- //关联好ajax的回调函数
- xmlHttpRequest.onreadystatechange = ajaxCallback;
- //真正向服务器端发送数据
- // 使用post方式提交,必须要加上如下一行,get方法就不必加此句
- xmlHttpRequest.setRequestHeader("Content-Type",
- "application/x-www-form-urlencoded");
- xmlHttpRequest.send("v1=" + v1 + "&v2=" + v2);
- }
- }
- function ajaxCallback() { //ajax一次请求会改变四次状态,所以我们在第四次(即一次请求结束)进行处理就OK,
- if (xmlHttpRequest.readyState == 4) { //请求成功
- if (xmlHttpRequest.status == 200) {
- var responseText = xmlHttpRequest.responseText;
- document.getElementById("div1").innerHTML=responseText;
- }
- }
- }
- </script>
最后我们来看一下服务器端的执行:
Dopost方法内
- String v1 = req.getParameter("v1");
- String v2 = req.getParameter("v2");
- System.out.println("v1=" + v1 + ", v2=" + v2);
- String v3 = String.valueOf(Integer.valueOf(v1) + Integer.valueOf(v2));
- PrintWriter out = resp.getWriter();
- resp.setHeader("pragma", "no-cache");
- resp.setHeader("cache-control", "no-cache");
- out.println(v3);
- out.flush();
下面我们来总结一下ajax的优势:
1、减轻服务器的负担。因为Ajax的根本理念是“按需取数据”,所以最大可能在减少了冗余请求和响影对服务器造成的负担;
2、无刷新更新页面,减少用户实际和心理等待时间;
3、也可以把以前的一些服务器负担的工作转嫁到客户端,利于客户端闲置的处理能力来处理,减轻服务器和带宽的负担,节约空间和带宽租用成本;
4、Ajax使WEB中的界面与应用分离(也可以说是数据与呈现分离);
from: http://blog.csdn.net/csh624366188/article/details/7670500
Java程序员从笨鸟到菜鸟之(八十四)深入浅出Ajax相关推荐
- java程序员从笨鸟到菜鸟_Java程序员从笨鸟到菜鸟之(十四)Html基础积累总结(上)...
[新朋友]点击标题下面(↑)蓝色字"Java那些事"关注 [老朋友]点击右上角,转发或分享本页面内容 这是我以前写的<java程序员由笨鸟到菜鸟>系列博客,每天更新一篇 ...
- Java程序员从笨鸟到菜鸟之(十)枚举,泛型详解
一:首先从枚举开始说起 枚举类型是JDK5.0的新特征.Sun引进了一个全新的关键字enum来定义一个枚举类.下面就是一个典型枚举类型的定义: public enum Color{ RED,BLUE, ...
- Java程序员从笨鸟到菜鸟之(九十四)深入java虚拟机(三)——类的生命周期(下)类的初始化...
上接深入java虚拟机--深入java虚拟机(二)--类加载器详解(上),在上一篇文章中,我们讲解了类的生命周期的加载和连接,这一篇我们接着上面往下看. 类的初始化:在类的生命周期执行完加载和连接之后 ...
- java程序员从笨鸟到菜鸟(八)泛型
1. 使用场景:一般是集合用的较多. 2. 使用规则: public static <E> void printArr(E [] inputArray) 所有泛型方法声明都有一个类型参数声 ...
- Java程序员从笨鸟到菜鸟全部博客目录
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.NET/csh624366188 欢迎关注微信账号:java那些事:csh624366188.每天一篇java相关的文章 大 ...
- Java程序员从笨鸟到菜鸟之(序言)+全部链接
http://blog.csdn.net/csh624366188 大学上了一年半,接触java也一年半了,虽然中间也有其他东西的学习,但是还是以java为主路线,想想这一年半,除去前半年几乎全玩了, ...
- Java程序员由笨鸟到菜鸟 电子版书正式发布 欢迎大家下载
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 欢迎关注 ...
- Java程序员从笨鸟到菜鸟之——总结和声明
前段时间经过大约二十天的时间把javaSE的内容总结了一下,最近由于个人原因和一些乱七八糟的事情,一直没在更新,首先感谢那些一如既往支持我的朋友.最近不知道为什么,一直很懒,做东西也一直是效率很低,生 ...
- Java程序员从笨鸟到菜鸟之(五)java开发常用类(包装,数字处理集合等)(下)...
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 写在前面:由于前天项目老师建设局的项目快到验收阶段,所以,前天晚上通宵,昨天睡了大半天, ...
- Java程序员从笨鸟到菜鸟之(一百零九)一步一步学习webservice(三)开发第一个基于XFire的webservice
在日常开发中,常用的webservice引擎主要有Axis,axis2,Xfire以及cxf(Xfire的升级版).现在只有axis2和cxf官方有更新.今天我们先以一个比较老的引擎为例.来讲诉一下w ...
最新文章
- jquery初始化的三种方式
- 用神经网络的分类行为理解力的相互作用
- 制作ubuntu 18.04 U盘启动盘
- Scala中的Map使用例子
- goods.java_javaweb网上书城项目 1.用户管理:注册会员 - 下载 - 搜珍网
- 【Python CheckiO 题解】Between Markers (simplified)
- Communications link failure,The last packet successfully received from the serve
- CTFbugku--菜鸟初学
- empty怎么发音_empty是什么意思
- Java之多线程断点下载的实现
- vim 插件之supertab
- vue 打印 某块内容成pdf
- 简单三步,教你搭建一个私有云盘
- 智能泊车技术及现状详解
- AP计算机从绝望到满分-----深圳中学张嘉轩如何说
- java中linux下反斜杠,Linux下反斜杠号\引发的思考
- SDUT实验六7-6 sdut- C语言实验-矩阵转置
- 面向对象设计之单一职责原则(Simple-Responsibility Principle)
- cad面积计算机,CAD中如何计算面积?
- 13 种文章投稿后状态,你的文章在哪个阶段?(转载)
热门文章
- Lesson 7 (3) 深入理解PyTorch与PyTorch库架构
- UTXO 与账户余额模型
- 《Science》杂志:机器学习究竟将如何影响人类未来的工作? 2018-01-11 Smiletalker AI科技评论 AI 科技评论按:人工智能、机器学习相关技术已经多次刷新了人们对于「计算机能
- 《巴伦周刊》:纳德拉带领微软中兴
- 语言可以直接访问位元元址_OOP语言中FBC问题对应用框架的影响
- Spring Cache抽象-缓存注解
- Spring-AOP 混合使用各种切面类型及不同切面总结
- Java-Java中的线程池原理分析及使用
- oracle集群 节点切换不,Oracle 11gR2 RAC集群单节点关闭开启
- python学习笔记(一)——操作符和运算变量