1、AjaxAjax基础知识介基础知识介绍绍 用传统方式校验用户名是否重复传统方式校验用户名是否重复的设传统方式校验用户名是否重复的设计分析计分析RegUserUIReguser.jspRegUserMain.jsp注册校验用户名是否重复VerifyUserName?返回怎样的一个页面传统实现方式1:在原来的主窗口中回显结果n问题:q1:回显的页面在原来网页效果的基础上增加一点内容,可是服务器的响应结果会覆盖掉窗口中原来显示的那个网页内容,如果服务器在响应时仅仅回送要新增的内容,则会覆盖掉原来的整个网页,怎样做才能看到原来网页效果的基础上增加一点内容?q2:怎样用javascript代码将请求发送
2、给服务器,在发送请求时,怎样将文本框中填写的用户名作为参数传递给服务器。q3:怎样在标签中触发javascript函数调用?触发函数时要注意返回值。n实现思路:q让VerifyUserName仍然返回Reguser.jsp,这时候需要在Reguser.jsp页面中增加一条有时候显示,有时候不显示的提示信息。或者是通过生成一段javascript代码,然后用一个弹出对话框来显示提示信息。先用浏览器直接测试 VerifyUserName。q在标签中可以使用javascript协议或onclick事件来触发javascript函数调用,先用静态数据测试一下,然后用window.location.hr
3、ef属性(replace方法)或模拟表单提交的方式向服务器发送请求,把两种方式都要做一下。n缺点:q要为电脑增加一个鼠标,由于浏览器的特点是买回鼠标就会覆盖掉原来的电脑,所以,要想显示出电脑加鼠标的效果,只能同时去买回一个电脑和鼠标。q好比舞台要切换帷幕一样,上一场的帷幕上贴的是花,当下一场要换成贴龙时,最快的方式不是把原来帷幕上的花揭下来再换上龙,而是做两个帷幕,直接把上一个帷幕收起,同时把下一个帷幕拉开。每次都送出一个帷幕,帷幕上贴不同内容。传统实现方式2:用弹出的新窗口回显结果n实现方式:在弹出窗口中回显结果q弹出窗口演示q模态对话框演示n实现思路:q由弹出窗口打开一个网页的方式发出校验
4、用户名的请求,回送的应该是一个网页,只是这个网页的内容很简单,但是,如果要有关闭按钮,必须加上相应的按钮和javascript代码。q模态对话框的好处在于避免了受浏览器显示新窗口的方式的差异的影响,并可要求用户必须关闭弹出窗口后才能进行其他操作。n特点:n服务器回送的结果给新窗口,不影响原始窗口。一个帷幕收起,同时把下一个帷幕拉开。每次都送出一个帷幕,帷幕上贴不同内容。什么是AjaxnAjax的概念:q是asynchronous javascript and xml的简写。q不是一项具体的技术,而是几门技术的综合应用。q其核心只不过是要在javascript中调用一个叫XMLHttpReque
5、st的javascript类,这个类可以与Web服务器使用HTTP协议进行交互,程序不通过浏览器发出请求,而是用这个特殊的JavaScript对象发送请求,再由这个JavaScript对象接收响应,并将响应结果用DOM编程方式挂到原来的网页上(见下页的图),从而使得javascript借助这个api类可以干出比较有意义的事情。qXMLHttpRequest对象在网络上的俗称为XHR对象。Ajax的特点的特点nAjax的特点:q浏览器中显示一个页面后,这个页面以后一直不改变,所有的操作请求都由这个网页中的javascript代码发出,所有的结果都由javascript代码接受并增加到这个页面上,
6、浏览器窗口中显示的网页始终都是初始的那个网页。(见下面两页的图)q增强用户体验:可以在用户浏览网页的同时与服务器进行异步交互和实现网页内容的局部更新,例如,126邮箱密码安全性判断和google suggest;可以按需取数据,改善页面显示速度,例如,树状菜单和babasport的首页(整合多个信息的页面);视觉流畅的定时刷新,例如,聊天室。(用下几页的图举例说明)q学习ajax和应用ajax的难点不在于XMLHttpRequest本身,而在于javascript和DOM编程,没有较好的javascript和DOM编程基础,你就很难做出有意义的ajax应用。浏览器的普通交互方式Ajax的交互方
7、式同步交互和异步交互同步交互和异步交互 举个例子:普通举个例子:普通B/S模式模式(同步同步)AJAX技术技术(异步异步)*同步:提交请求-等待服务器处理-处理完毕返回 这个期间客户端浏览器不能干任何事 *异步:请求通过事件触发-服务器处理(这时浏览器仍然可以作其他事情)-处理完毕 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个 数据包的通讯方式。异步是指:发送方发出数据后,不等接收方发回响应,接着发送下 个数据包的通讯方式 易懂的理解易懂的理解:异步传输异步传输:你传输吧,我去做我的事了,传输完了告诉我一声你传输吧,我去做我的事了,传输完了告诉我一声 同步传输同步传输:你现在传输
8、,我要亲眼看你传输完成,才去做别的事你现在传输,我要亲眼看你传输完成,才去做别的事 AJAX案例之google suggest AJAX案例之Google MapsAjax的应用场景:财富通网吧充值界面成都传智播客 Ajax的应用场景:密码安全性检测Ajax的应用场景:RIA应用Ajax的应用场景:邮箱系统Ajax的应用场景:蓝源批发零售业连锁管理系统究竟什么是究竟什么是AjaxnAjax:一种不用刷新整个页面便可与服务器通讯的办法不用刷新整个页面便可与服务器通讯的办法图1 Web的传统模型。客户端向服务器发送一个请求,服务器返回整个页面,如此反复图2 在Ajax模型中,数据在客户端与数据在客
9、户端与服务器之间独立传输。服务器不再返服务器之间独立传输。服务器不再返回整个页面回整个页面Ajax的实现方式的实现方式n不用刷新整个页面便可与服务器通讯的办法:qFlashqJava appletq框架:如果使用一组框架构造了一个网页,可以只更新其中一个框架,而不必惊动整个页面q隐藏的iframeqXMLHttpRequest:该对象是对 JavaScript 的一个扩展,可使网页与服务器进行通信。是创建 Ajax 应用的最佳选择。实际上通常把实际上通常把 Ajax 当成当成 XMLHttpRequest 对象的代名词对象的代名词 Ajax的工作原理的工作原理nAjax的核心是JavaScri
10、pt对象XmlHttpRequest。该对象在Internet Explorer 5中首次引入,它是一种支持异步请求的技术。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。Ajax的工作原理的工作原理nAJAX采用异步交互过程。AJAX在用户与服务器之间引入一个中间媒介,从而消除了网络交互过程中的处理等待处理等待缺点。n用户的浏览器在执行任务时即装载了用户的浏览器在执行任务时即装载了AJAX引擎。引擎。AJAX引擎用引擎用JavaScript语语言编写,通常藏在一个隐藏的框架中。它负责编译用户界面及与服务器之间言编写,通常藏在一个
11、隐藏的框架中。它负责编译用户界面及与服务器之间的交互。的交互。nAJAX引擎允许用户与应用软件之间的交互过程异步进行,独立于用户与网引擎允许用户与应用软件之间的交互过程异步进行,独立于用户与网络服务器间的交流络服务器间的交流。现在,可以用Javascript调用AJAX引擎来代替产生一个HTTP的用户动作,内存中的数据编辑、页面导航、数据校验这些不需要重新载入整个页面的需求可以交给AJAX来执行。n使用AJAX,可以为JSP、开发人员、终端用户带来可见的便捷:用户界面AJAX引擎服务器用户界面服务器AJAX包含的技术包含的技术 AJAX:(Asynchronous JavaScript and
12、 XML)并不是一项新技术并不是一项新技术,其实是多种技术的综合,包括Javascript、XHTML和CSS、DOM、XML和XMLHttpRequest.q服务器端语言服务器端语言:服务器需要具备向浏览器发送特定信息的能力。AjaxAjax与服务器端语言无关与服务器端语言无关。qXMLXML(eXtensible Markup Language,可扩展标记语言)是一种描述数据的格式。AJAX AJAX 程序需要某种格式化的格式来在服务器和客户端程序需要某种格式化的格式来在服务器和客户端之间传递信息,之间传递信息,XML XML 是其中的一种选择是其中的一种选择qXHTMLXHTML(eXt
13、ended Hypertext Markup Language,使用扩展超媒体标记语言)和 CSSCSS(Cascading Style Sheet,级联样式单)标准化呈标准化呈现;现;qDOMDOM(Document Object Model,文档对象模型)实现动态显示和交互;实现动态显示和交互;q使用XMLHTTP组件XMLHttpRequestXMLHttpRequest对象对象进行异步数据读取异步数据读取q使用JavaScriptJavaScript绑定和处理所有数据绑定和处理所有数据AJAX的缺陷的缺陷AJAX不是完美的技术。也存在缺陷不是完美的技术。也存在缺陷:1 AJAX大量使用
14、了Javascript和AJAX引擎,而这个取决于浏览器的支持。IE5.0及以上、Mozilla1.0、NetScape7及以上版本才支持,Mozilla虽然也支持AJAX,但是提供XMLHttpRequest的方式不一样。所以,使用AJAX的程序必须测试针对各个浏览器的兼容性。2 AJAX更新页面内容的时候并没有刷新整个页面,因此,网页的后退功能是失效的;有的用户还经常搞不清楚现在的数据是旧的还是已经更新过的。这个就需要在明显位置提醒用户“数据已更新”。3 对流媒体的支持没有FLASH、Java Applet好。4 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax。XMLHttp
15、Request对象对象nXMLHttpRequest对象对象XMLHttpRequest是XMLHTTP组件的对象,通过这个对象,AJAX可以像桌面应用程序一样只同服务器进行数据层面的交换,而不用每次都刷新界面,也不用每次将数据处理的工作都交给服务器来做;这样既减轻了服务器负担又加快了响应速度、缩短了用户等待的时间。nXMLHttpRequest最早是在IE5中以ActiveX组件的形式实现的。非W3C标准.n创建XMLHttpRequest对象(由于非标准所以实现方法不统一由于非标准所以实现方法不统一)qInternet Explorer把XMLHttpRequest实现为一个ActiveX
16、对象q其他浏览器(Firefox、Safari、Opera)把它实现为一个本地的JavaScript对象。qXMLHttpRequest在不同浏览器上的实现是兼容的在不同浏览器上的实现是兼容的,所以可以用同样的方式访问XMLHttpRequest实例的属性和方法,而不论这个实例创建的方法是什么。XMLHttpRequest对象初始化对象初始化nfunction createXmlHttpRequest()var xmlhttp=null;try/Firefox,Opera 8.0+,Safari xmlhttp=new XMLHttpRequest();catch(e)/IEIE7.0以下的浏
17、览器以以下的浏览器以ActiveX组件的方式来创建组件的方式来创建XMLHttpRequest对象对象var MSXML=MSXML2.XMLHTTP.6.0,MSXML2.XMLHTTP.5.0,MSXML2.XMLHTTP.4.0,MSXML2.XMLHTTP.3.0,MSXML2.XMLHTTP,Microsoft.XMLHTTP;for(var n=0;n MSXML.length;n+)try xmlhttp=new ActiveXObject(MSXMLn);break;catch(e)return xmlhttp;XMLHttpRequest对象方法对象方法方法方法 描述描述 a
18、bort()停止当前请求停止当前请求 getAllResponseHeaders()把把http请求的所有响应首部作为键请求的所有响应首部作为键/值对返回值对返回getResponseHeader(headerLabel)返回指定首部的串值返回指定首部的串值open(“method”,”url”)建立对服务器的调用,建立对服务器的调用,method参数可以是参数可以是GET,POST。url参数参数可以是相对可以是相对URL或绝对或绝对URL。这个方法还包括。这个方法还包括3个可选参数。个可选参数。send(content)向服务器发送请求向服务器发送请求 setRequestHeader(l
19、abel,value)把指定首部设置为所提供的值。在设置任何首部之前必须先调把指定首部设置为所提供的值。在设置任何首部之前必须先调用用open()XMLHttpRequest对象属性对象属性发送请求发送请求-方法和属性介绍方法和属性介绍n利用XMLHttpRequest 实例与服务器进行通信包含以下3个关键部分:qonreadystatechange 事件处理函数qopen 方法qsend 方法 发送请求发送请求-方法和属性介绍方法和属性介绍nonreadystatechange:q该事件处理函数由服务器触发,而不是用户该事件处理函数由服务器触发,而不是用户q在 Ajax 执行过程中,服务器会
20、通知客户端当前的通信状态。这依靠更新 XMLHttpRequest 对象的 readyState 来实现。改变改变 readyState 属性是服务器对客户端连接操作的一种方式。属性是服务器对客户端连接操作的一种方式。q每次每次 readyState 属性的改变都会触发属性的改变都会触发 readystatechange事件事件发送请求发送请求-方法和属性介绍方法和属性介绍nopen(method,url,asynch)qXMLHttpRequest 对象的对象的 open 方法允许程序员用一个方法允许程序员用一个Ajax调用向服务器发送调用向服务器发送请求请求。qmethod:请求类型,类似
21、:请求类型,类似“GET”或或”POST”的字符串。若只想从服务器检索的字符串。若只想从服务器检索一个文件,而不需要发送任何数据,使用一个文件,而不需要发送任何数据,使用GET(可以在可以在GET请求里通过附加在请求里通过附加在URL上的查询字符串来发送数据,不过数据大小限制为上的查询字符串来发送数据,不过数据大小限制为2000个字符个字符)。若需要向。若需要向服务器发送数据,用服务器发送数据,用POST。q在某些情况下,有些浏览器会把多个在某些情况下,有些浏览器会把多个XMLHttpRequest请求的结果缓存在同一个请求的结果缓存在同一个URL。如果对每个请求的响应不同,这就会带来不好的结
22、果。把当前时间戳追加。如果对每个请求的响应不同,这就会带来不好的结果。把当前时间戳追加到到URL的最后,就能确保的最后,就能确保URL的惟一性,从而避免浏览器缓存结果的惟一性,从而避免浏览器缓存结果。qurl:路径字符串,指向你所请求的服务器上的那个文件。可以是绝对路径或相:路径字符串,指向你所请求的服务器上的那个文件。可以是绝对路径或相对路径。对路径。qasynch:表示请求是否要异步传输,默认值为:表示请求是否要异步传输,默认值为true(异步异步)。指定。指定true,在读取后,在读取后面的脚本之前,不需要等待服务器的相应。指定面的脚本之前,不需要等待服务器的相应。指定false,当脚本
23、处理过程经过这,当脚本处理过程经过这点时,会停下来,一直等到点时,会停下来,一直等到Ajax请求执行完毕再继续执行请求执行完毕再继续执行。lvar url=GetAndPostExample?timeStamp=+new Date().getTime();发送请求发送请求-方法和属性介绍方法和属性介绍nsend(data):qopen 方法定义了 Ajax 请求的一些细节。send 方法可为已经待命的请求发送指令方法可为已经待命的请求发送指令qdata:将要传递给服务器的字符串。q若选用的是若选用的是 GET 请求,则不会发送任何数据,请求,则不会发送任何数据,给给 send 方法传递方法传递
24、 null 即可即可:request.send(null);q当向send()方法提供参数时,要确保open()中指定的方法是POST,如果没有数据作为请求体的一部分发送,则使用null.q完整的完整的 Ajax 的的 GET 请求示例:请求示例:使用get请求时send方法参数时null,如果传值的话,服务器也接受不到发送请求发送请求-方法和属性介绍方法和属性介绍nsetRequestHeader(header,value)q当浏览器向服务器请求页面时,它会伴随这个请求发送一组首部信息。这些首部信息是一系列描述请求的元数据(metadata)。首部信息用来声明一个请求是首部信息用来声明一个请
25、求是 GET 还是还是 POST。qAjax 请求中,发送首部信息的工作可以由 setRequestHeader完成q参数header:首部的名字;参数value:首部的值。q如果用如果用 POST 请求向服务器发送数据,需要将请求向服务器发送数据,需要将“Content-type”的首部设置为的首部设置为“application/x-www-form-urlencoded”.它会告知服务器正在发送数据,并且数据已它会告知服务器正在发送数据,并且数据已经符合经符合URL编码了。编码了。q该方法必须在该方法必须在open()之后才能调用之后才能调用q完整的完整的 Ajax 的的 POST 请求示
26、例:请求示例:接收接收-方法和属性介绍方法和属性介绍n用 XMLHttpRequest 的方法可向服务器发送请求。在 Ajax 处理过程中,XMLHttpRequest 的如下属性可被服务器更改:qreadyStateqstatusqresponseTextqresponseXML接收接收-方法和属性介绍方法和属性介绍nreadyStateqreadyState 属性表示表示Ajax请求的当前状态请求的当前状态。它的值用数字代表。n0 代表未初始化。还没有调用 open 方法n1 代表正在加载。open 方法已被调用,但 send 方法还没有被调用n2 代表已加载完毕。send 已被调用。请求
27、已经开始n3 代表交互中。服务器正在发送响应n4 代表完成。响应发送完毕代表完成。响应发送完毕q每次每次 readyState 值的改变,都会触发值的改变,都会触发 readystatechange 事件事件。如果把 onreadystatechange 事件处理函数赋给一个函数,那么每次 readyState 值的改变都会引发该函数的执行。qreadyState 值的变化会因浏览器的不同而有所差异。但是,当请但是,当请求结束的时候,每个浏览器都会把求结束的时候,每个浏览器都会把 readyState 的值统一设为的值统一设为 4接收接收-方法和属性介绍方法和属性介绍nstatusq服务器发送
28、的每一个响应也都带有首部信息。三位数的状态码是服务器发送的响应中最重要的首部信息,并且属于超文本传输协议中的一部分。q常用状态码及其含义:n404 没找到页面(not found)n403 禁止访问(forbidden)n500 内部服务器出错(internal service error)n200 一切正常(ok)n304 没有被修改(not modified)(服务器返回304状态,表示源文件没有被修改)q在在 XMLHttpRequest 对象中,服务器发送的状态码都保存在对象中,服务器发送的状态码都保存在 status 属性里。通过把这个值和属性里。通过把这个值和 200 或或 304
29、 比较,可以确保比较,可以确保服务器是否已发送了一个成功的响应服务器是否已发送了一个成功的响应接收接收-方法和属性介绍方法和属性介绍nresponseTextqXMLHttpRequest 的 responseText 属性包含了从服务器发送的数据包含了从服务器发送的数据。它是一个HTML,XML或普通文本,这取决于服务器发送的内容。q当 readyState 属性值变成 4 时,responseText 属性才可用,表明 Ajax 请求已经结束。接收接收-方法和属性介绍方法和属性介绍nresponseXMLq如果服务器返回的是如果服务器返回的是 XML,那么数据将储存在那么数据将储存在 re
30、sponseXML 属性属性中。中。q只用服务器发送了带有正确首部信息的数据时,只用服务器发送了带有正确首部信息的数据时,responseXML 属属性才是可用的。性才是可用的。MIME 类型必须为类型必须为 text/xml成都传智播客 AJAX开发框架开发框架AJAX实质上也是遵循Request/Server模式,所以这个框架基本的流程是:n对象初始化n发送请求n服务器接收n服务器返回n客户端接收n修改客户端页面内容。只不过这个过程是异步的。A、初始化、初始化XMLHttpRequest对象对象nfunction createXmlHttpRequest()var xmlhttp=null
31、;try/Firefox,Opera 8.0+,Safari xmlhttp=new XMLHttpRequest();catch(e)/IEIE7.0以下的浏览器以以下的浏览器以ActiveX组件的方式来创建组件的方式来创建XMLHttpRequest对象对象var MSXML=MSXML2.XMLHTTP.6.0,MSXML2.XMLHTTP.5.0,MSXML2.XMLHTTP.4.0,MSXML2.XMLHTTP.3.0,MSXML2.XMLHTTP,Microsoft.XMLHTTP;for(var n=0;n MSXML.length;n+)try xmlhttp=new Acti
32、veXObject(MSXMLn);break;catch(e)return xmlhttp;B、指定响应处理函数、指定响应处理函数n指定当服务器返回信息时客户端的处理方式。只要将相应的处理函指定当服务器返回信息时客户端的处理方式。只要将相应的处理函数名称赋给数名称赋给XMLHttpRequest对象的对象的onreadystatechange属性就属性就可以了可以了.比如:比如:XMLHttpReq.onreadystatechange=processResponse;n注意注意:这个函数名称不加括号,不指定参数。也可以用这个函数名称不加括号,不指定参数。也可以用Javascript函函数直
33、接量方式定义响应函数。比如:数直接量方式定义响应函数。比如:XMLHttpReq.onreadystatechange=function();/处理返回信息的函数function processResponse()C、发出、发出HTTP请求请求n向服务器发出向服务器发出HTTP请求了。这一步调用请求了。这一步调用XMLHttpRequest对象的对象的open和和send方法。方法。http_request.open(GET,http:/www.example.org/some.file,true);http_request.send(null)n按照顺序,按照顺序,open调用完毕之后要调用
34、调用完毕之后要调用send方法。方法。send的参数如果是的参数如果是以以Post方式发出的话,可以是任何想传给服务器的内容。方式发出的话,可以是任何想传给服务器的内容。n注意:如果要传文件或者Post内容给服务器,必须先调用setRequestHeader方法,修改MIME类别。如下:nhttp_request.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);这时资料则以查询字符串的形式列出,作为send的参数,例如:name=value&anothername=othervalue&so=on发出发出
35、Http请求的代码请求的代码/发送请求function sendRequest()/获取文本框的值var chatMsg=input.value;var url=chatServlet.do?charMsg=+chatMsg;/建立对服务器的调用XMLHttpReq.open(POST,url,true);/设置MiME类别,如果用 POST 请求向服务器发送数据,/需要将Content-type 的首部设置为 application/x-www-form-urlencoded./它会告知服务器正在发送数据,并且数据已经符合URL编码了。XMLHttpReq.setRequestHeader(
36、Content-Type,application/x-www-form-urlencoded);/状态改变的事件触发器,客户端的状态改变会触发readystatechange事件,/onreadystatechange会调用相应的事件处理函数XMLHttpReq.onreadystatechange=processResponse;/发送数据XMLHttpReq.send(null);D、处理服务器返回的信息、处理服务器返回的信息处理响应处理函数都应该做什么。处理响应处理函数都应该做什么。首先,它要检查首先,它要检查XMLHttpRequest对象的对象的readyState值,判断请求目前的
37、状态。参照值,判断请求目前的状态。参照前文的属性表可以知道,前文的属性表可以知道,readyState值为值为4的时候,代表服务器已经传回所有的信息,的时候,代表服务器已经传回所有的信息,可以开始处理信息并更新页面内容了。如下:可以开始处理信息并更新页面内容了。如下:if(http_request.readyState=4)/信息已经返回,可以开始处理信息已经返回,可以开始处理 else /信息还没有返回,等待信息还没有返回,等待服务器返回信息后,还需要判断返回的服务器返回信息后,还需要判断返回的HTTP状态码,确定返回的页面没有错误。所有状态码,确定返回的页面没有错误。所有的状态码都可以在的
38、状态码都可以在W3C的官方网站上查到。其中,的官方网站上查到。其中,200代表页面正常。代表页面正常。if(http_request.status=200)/页面正常,可以开始处理信息页面正常,可以开始处理信息 else /页面有问题页面有问题D、处理服务器返回的信息、处理服务器返回的信息nXMLHttpRequest对成功返回的信息有两种处理方式:nresponseText:将传回的信息当字符串使用;nresponseXML:将传回的信息当XML文档使用,可以用DOM处理。/处理返回信息的函数function processResponse()if(XMLHttpReq.readyState
39、=4)/判断对象状态 4代表完成 if(XMLHttpReq.status=200)/信息已经成功返回,开始处理信息 document.getElementById(chatArea).value=XMLHttpReq.responseText;数据格式摘要n在服务器端 AJAX 是一门与语言无关的技术。在业务逻辑层使用何种服务器端语言都可以。n从服务器端接收数据的时候,那些数据必须以浏览器能够理解的格式来发送。服务器端的编程语言一般以如下 3 种格式返回数据:qXMLqJSONqHTMLXML格式n优点:qXML 是一种通用的数据格式。q不必把数据强加到已定义好的格式中,而是要为数据自定义合
40、适的标记。q利用 DOM 可以完全掌控文档。n缺点:q如果文档来自于服务器,就必须得保证文档含有正确的首部信息。若文档类型不正确,那么 responseXML 的值将是空的。q当浏览器接收到长的 XML 文件后,DOM 解析可能会很复杂JSON格式nJSON(JavaScript Object Notation)一种简单的数据格式,比xml更轻巧。JSON是JavaScript原生格式原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的API或工具包。nJSON的规则很简单:对象是一个无序的对象是一个无序的“名称名称/值值对对”集合。一个对象以集合。一个对象以“”(左括号
41、)开始,(左括号)开始,“”(右括号)结束。每个(右括号)结束。每个“名称名称”后跟一个后跟一个“:”(冒(冒号);号);“名称名称/值值对对”之间使用之间使用“,”(逗号)分隔(逗号)分隔。规则如下规则如下:1)映射用冒号(“:”)表示。名称:值 2)并列的数据之间用逗号(“,”)分隔。名称1:值1,名称2:值2 3)映射的集合(对象)用大括号(“”)表示。名称1:值1,名称2:值2 4)并列数据的集合(数组)用方括号(“”)表示。名称1:值,名称2:值2,名称1:值,名称2:值2 5 元素值可具有的类型:string,number,object,array,true,false,null
42、JSON 示例nJSON 用冒号用冒号(而不是等号而不是等号)来赋值。每一条赋值语句用逗号分开。整个对象用大来赋值。每一条赋值语句用逗号分开。整个对象用大括号封装起来。可用大括号分级嵌套数据。括号封装起来。可用大括号分级嵌套数据。n对象描述中存储的数据可以是字符串,数字或者布尔值。对象描述也可存储函对象描述中存储的数据可以是字符串,数字或者布尔值。对象描述也可存储函数,那就是对象的方法。数,那就是对象的方法。解析JSONnJSON 只是一种文本字符串。它被存储在 responseText 属性中n为了读取存储在 responseText 属性中的 JSON 数据,需要根据 JavaScript
43、 的 eval 语句。函数函数 eval 会把一个字符串当作它的参数会把一个字符串当作它的参数。然后这个字符串会被当作然后这个字符串会被当作 JavaScript 代码来执行。因为代码来执行。因为 JSON 的的字符串就是由字符串就是由 JavaScript 代码构成的,所以它本身是可执行的代码构成的,所以它本身是可执行的n代码实例:处理JSON例子一例子一:var people=firstName:Brett,lastName:McLaughlin,email:brettnewI;alert(people.firstName);alert(people.lastName);alert(peo
44、ple.email);处理JSON例子二例子二:var people=firstName:Brett,email:brettnewI,firstName:Mary,email:marynewI ;alert(people0.firstName);alert(people0.email);alert(people1.firstName);alert(people1.email);处理JSON例子三例子三:var people=programmers:firstName:Brett,email:brettnewI,firstName:Jason,email: ;window.alert(peopl
45、e.programmers0.firstName);window.alert(people.programmers1.email);处理JSON例子四例子四:var people=programmers:firstName:Brett,email:brettnewI,firstName:Jason,email:,firstName:Elliotte,lastName:Harold,email: ,authors:firstName:Isaac,genre:science fiction,firstName:Tad,genre:fantasy,firstName:Frank,genre:chri
46、stian fiction ,musicians:firstName:Eric,instrument:guitar,firstName:Sergei,instrument:piano ;window.alert(people.programmers1.firstName);window.alert(people.musicians1.instrument);处理JSON例子五例子五 var people=username:mary,age:20,info:tel:1234566,celltelphone:788666,address:city:beijing,code:1000022,city
47、:shanghai,code:2210444 ;window.alert(people.username);window.alert(people.info.tel);window.alert(people.address0.city);JSON 小结n优点:q作为一种数据传输格式,JSON 与 XML 很相似,但是它更加灵巧。qJSON 不需要从服务器端发送含有特定内容类型的首部信息。n缺点:q语法过于严谨q代码不易读qeval 函数存在风险解析 HTMLn HTML 由一些普通文本组成。如果服务器通过 XMLHttpRequest 发送 HTML,文本将存储在 responseText 属
48、性中。n不必从 responseText 属性中读取数据。它已经是希望的格式,可以直接将它插入到页面中。n插入 HTML 代码最简单的方法是更新这个元素的 innerHTML 属性。HTML 小结n优点:q从服务器端发送的 HTML 代码在浏览器端不需要用 JavaScript 进行解析。qHTML 的可读性好。qHTML 代码块与 innerHTML 属性搭配,效率高。n缺点:q若需要通过 AJAX 更新一篇文档的多个部分,HTML 不合适qinnerHTML 并非 DOM 标准。对比小结n若应用程序不需要与其他应用程序共享数据的时候不需要与其他应用程序共享数据的时候,使用 HTML 片段来
49、返回数据时最简单的n如果数据需要重用如果数据需要重用,JSON 文件是个不错的选择,其在性能和文件大小方面有优势n当远程应用程序未知时当远程应用程序未知时,XML 文档是首选,因为 XML 是 web 服务领域的“世界语”案例:省份与城市的联动下拉列表框n效果演示。联动下拉:纯静态数据的html方式n实验步骤:q演示程序运行的效果。q编写一个静态province.html页面,其中使用一个二维数组来装载所有数据,然后分析和编码实现省份与城市的联动下拉列表框。q编写一个静态jsonProvince.html页面,其中使用JSON对象方式来装载所有数据,然后分析和编码实现此种数据格式下的省份与城市
50、的联动下拉列表框。联动下拉:动态生成数据的方式n实验步骤:q编写一个ListProvinceAction的Action和相应的province.jsp页面,留出数据待填充,大家清晰看到后面的任务就是生成出数据。q创建代表省份与城市的province和City实体类,然后将相应的实体对象存放在一个单例的MemoryDao中,用一个ArrayList集合存储所有Province对象,Province对象中保存有一个City对象的集合,在MemoryDao中构建出各个对象及关系。q创建ProvinceService类获取所有省份列表和CityService类获取某个省份下的所有城市。q在ListPr