ajax怎样从服务器端返回xml呢?
原始的Ajax:直接使用XmlHttpRequest
如上所述,Ajax的核心是JavaScript对象XmlHttpRequest。下面的示例文章评价系统将带您熟悉Ajax的底层基本知识:http://tearesolutionscom/ajax-demo/raw-ajaxhtml。注:如果您已经在本地WebLogic容器中安装了ajax-demowar,可以导航到http://localhost:7001/ajax-demo/raw-ajaxhtml,
浏览应用程序,参与投票,并亲眼看它如何运转。熟悉了该应用程序之后,继续阅读,进一步了解其工作原理细节。
首先,您拥有一些简单的定位点标记,它连接到一个JavaScriptcastVote(rank)函数。
function castVote(rank) {
var url = "/ajax-demo/static-article-rankinghtml";
var callback = processAjaxResponse;
executeXhr(callback, url);
}
该函数为您想要与之通信的服务器资源创建一个URL并调用内部函数executeXhr,提供一个回调JavaScript函数,一旦服务器响应可用,该函数就被执行。由于我希望它运行在一个简单的Apache环境中,“cast vote URL”只是一个简单的HTML页面。在实际情况中,被调用的URL将记录票数并动态地呈现包含投票总数的响应。
下一步是发出一个XmlHttpRequest请求:
function executeXhr(callback, url) {
// branch for native XMLHttpRequest object
if (windowXMLHttpRequest) {
req = new XMLHttpRequest();
reqonreadystatechange = callback;
reqopen("GET", url, true);
reqsend(null);
} // branch for IE/Windows ActiveX version
else if (windowActiveXObject) {
req = new ActiveXObject("MicrosoftXMLHTTP");
if (req) {
reqonreadystatechange = callback;
reqopen("GET", url, true);
reqsend();
}
}
}
如您所见,执行一个XmlHttpRequest并不简单,但非常直观。和平常一样,在JavaScript领域,大部分的工作量都花在确保浏览器兼容方面。在这种情况下,首先要确定XmlHttpRequest是否可用。如果不能用,很可能要使用Internet Explorer,这样就要使用所提供的ActiveX实现。
executeXhr()方法中最关键的部分是这两行:
reqonreadystatechange = callback;
reqopen("GET", url, true);
第一行定义了JavaScript回调函数,您希望一旦响应就绪它就自动执行,而reqopen()方法中所指定的“true”标志说明您想要异步执行该请求。
一旦服务器处理完XmlHttpRequest并返回给浏览器,使用reqonreadystatechange指派所设置的回调方法将被自动调用。
function processAjaxResponse() {
// only if req shows "loaded"
if (reqreadyState == 4) {
// only if "OK"
if (reqstatus == 200) {
502 502'votes')innerHTML = reqresponseText;
} else {
alert("There was a problem retrieving the XML data:
" +
reqstatusText);
}
}
}
该代码相当简洁,并且使用了几个幻数,这使得难以一下子看出发生了什么。为了弄清楚这一点,下面的表格(引用自http://developerapplecom/internet/webcontent/xmlhttpreqhtml)列举了常用的XmlHttpRequest对象属性。
属性
描述
onreadystatechange
每次状态改变所触发事件的事件处理程序
readyState
对象状态值:
0 = 未初始化(uninitialized)
1 = 正在加载(loading)
2 = 加载完毕(loaded)
3 = 交互(interactive)
4 = 完成(complete)
responseText
从服务器进程返回的数据的字符串形式
responseXML
从服务器进程返回的DOM兼容的文档数据对象
status
从服务器返回的数字代码,比如404(未找到)或200(就绪)
statusText
伴随状态码的字符串信息
现在processVoteResponse()函数开始显示出其意义了。它首先检查XmlHttpRequest的整体状态以保证它已经完成(readyStatus == 4),然后根据服务器的设定询问请求状态。如果一切正常(status == 200),就使用innerHTML属性重写DOM的“votes”节点的内容。
既然您亲眼看到了XmlHttpRequest对象是如何工作的,就让我们利用一个旨在简化JavaScript与Java应用程序之间的异步通信的框架来对具体的细节进行抽象。
Ajax: DWR方式
按照与文章评价系统相同的流程,我们将使用Direct Web Remoting(DWR)框架实现同样的功能。
假定文章和投票结果存储在一个数据库中,使用某种对象/关系映射技术来完成抽取工作。为了部署起来尽可能地简单,我们不会使用数据库进行持久性存储。此外,为使应用程序尽可能通用,也不使用Web框架。相反,应用程序将从一个静态HTML文件开始,可以认为它由服务器动态地呈现。除了这些简化措施,应用程序还应该使用Spring Framework关联一切,以便轻松看出如何在一个“真实的”应用程序中使用DWR。
现在应该下载示例应用程序并熟悉它。该应用程序被压缩为标准的WAR文件,因此您可以把它放置到任何一个Web容器中——无需进行配置。部署完毕之后,就可以导航到http://localhost:7001/ajax_demo/dwr-ajaxhtml来运行程序。
可以查看HTML 源代码,了解它如何工作。给人印象最深的是,代码如此简单——所有与服务器的交互都隐藏在JavaScript对象ajaxSampleSvc的后面。更加令人惊讶的是,ajaxSampleSvc服务不是由手工编写而是完全自动生成的!让我们继续,看看这是如何做到的。
引入DWR
如同在“原始的Ajax”一节所演示的那样,直接使用XmlHttpRequest创建异步请求非常麻烦。不仅JavaScript代码冗长,而且必须考虑服务器端为定位Ajax请求到适当的服务所需做的工作,并将结果封送到浏览器。
设计DWR的目的是要处理将Web页面安装到后端服务上所需的所有信息管道。它是一个Java框架,可以很轻松地将它插入到Web应用程序中,以便JavaScript代码可以调用服务器上的服务。它甚至直接与Spring Framework集成,从而允许用户直接向Web客户机公开bean。
DWR真正的巧妙之处是,在用户配置了要向客户机公开的服务之后,它使用反射来生成JavaScript对象,以便Web页面能够使用这些对象来访问该服务。然后Web页面只需接合到生成的JavaScript对象,就像它们是直接使用服务一样;DWR无缝地处理所有有关Ajax和请求定位的琐碎细节。
让我们仔细分析一下示例代码,弄清它是如何工作的。
应用程序细节:DWR分析
关于应用程序,首先要注意的是,它是一个标准的Java应用程序,使用分层架构(Layered Architecture)设计模式。使用DWR通过JavaScript公开一些服务并不影响您的设计。
下面是一个简单的Java服务,我们将使用DWR框架直接将其向JavaScript代码公开:
package comtearesolutionsservice;
public interface AjaxSampleSvc {
Article castVote(int rank);
}
这是一个被简化到几乎不可能的程度的例子,其中只有一篇文章可以投票。该服务由Spring管理,它使用的bean名是ajaxSampleSvc,它的持久性需求则依赖于ArticleDao。详情请参见applicationContextxml。
为了把该服务公开为JavaScript对象,需要配置DWR,添加dwrxml文件到WEB-INF目录下:
<xml version="10" encoding="UTF-8">
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 04//EN"
"http://wwwgetaheadltduk/dwr/dwrdtd">
<dwr>
<allow>
<create creator="spring" javascript="ajaxSampleSvc">
<param name="beanName" value="ajaxSampleSvc" />
</create>
<convert converter="bean" match="comtearesolutionsmodelArticle"/>
<exclude method="toString"/>
<exclude method="setArticleDao"/>
</allow>
</dwr>
dwrxml文件告诉DWR哪些服务是要直接向JavaScript代码公开的。注意,已经要求公开Spring bean ajaxSampleSvc。DWR将自动找到由应用程序设置的SpringApplicationContext。为此,必须使用标准的servlet 过滤器ContextLoaderListener来初始化Spring ApplicationContext。
DWR被设置为一个servlet,所以把它的定义添加到webxml:
<xml version="10" encoding="UTF-8">
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc//DTD
Web Application 23//EN" "http://javasuncom/dtd/web-app_2_3dtd">
<web-app>
<display-name>Ajax Examples</display-name>
<listener>
<listener-class>
orgspringframeworkwebcontextContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>ajax_sample</servlet-name>
<servlet-class>comtearesolutionswebAjaxSampleServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<display-name>DWR Servlet</display-name>
<description>Direct Web Remoter Servlet</description>
<servlet-class>ukltdgetaheaddwrDWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ajax_sample</servlet-name>
<url-pattern>/ajax_sample</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/</url-pattern>
</servlet-mapping>
</web-app>
做完这些之后,可以加载http://localhost:7001/ajax-demo/dwr,看看哪些服务可用。结果如下:
图3 可用的服务
单击ajaxSampleSvc链接,查看有关如何在HTML页面内直接使用服务的示例实现。其中包含的两个JavaScript文件完成了大部分的功能:
<script type='text/javascript'
src='/ajax-demo/dwr/interface/ajaxSampleSvcjs'></script>
<script type='text/javascript'
src='/ajax-demo/dwr/enginejs'></script>
ajaxSampleSvcjs是动态生成的:
function ajaxSampleSvc() { }
ajaxSampleSvccastVote = function(callback, p0)
{
DWREngine_execute(callback, '/ajax-demo/dwr',
'ajaxSampleSvc', 'castVote', p0);
}
现在可以使用JavaScript对象ajaxSampleSvc替换所有的XmlHttpRequest代码,从而重构raw-ajaxhtml文件。可以在dwr-ajaxhtml文件中看到改动的结果;下面是新的JavaScript函数:
function castVote(rank) {
ajaxSampleSvccastVote(processResponse, rank);
}
function processResponse(data) {
var voteText = "
Thanks for Voting!
"
+ "
Current ranking: " + datavoteAverage + " out of 5
"
+ "
Number of votes placed: " + datanumberOfVotes + "
";
502 502'votes')innerHTML = voteText;
}
惊人地简单,不是吗?由ajaxSampleSvc对象返回的Article域对象序列化为一个JavaScript对象,允许在它上面调用诸如numberOfVotes()和voteAverage()之类的方法。在动态生成并插入到DIV元素“votes”中的HTML代码内使用这些数据。
下一步工作
在后续文章中,我将继续有关Ajax的话题,涉及下面这些方面:
Ajax最佳实践
像许多技术一样,Ajax是一把双刃剑。对于一些用例,其应用程序其实没有必要使用Ajax,使用了反而有损可用性。我将介绍一些不适合使用的模式,突出说明Ajax的一些消极方面,并展示一些有助于缓和这些消极方面的机制。例如,对Netflix**浏览器来说,Ajax是合适的解决方案吗?或者,如何提示用户确实出了一些问题,而再次单击按钮也无济于事?
管理跨请求的状态
在使用Ajax时,最初的文档DOM会发生一些变化,并且有大量的页面状态信息存储在客户端变量中。当用户跟踪一个链接到应用程序中的另一个页面时,状态就丢失了。当用户按照惯例单击Back按钮时,呈现给他们的是缓存中的初始页面。这会使用户感到非常迷惑!
调试技巧
使用JavaScript在客户端执行更多的工作时,如果事情不按预期方式进行,就需要一些调试工具来帮助弄清出现了什么问题。
参看:http://dev2devbeacomcn/techdoc/2005110103html
服务器收到客户端数据包确认后返回,是因为在网络通信中,数据传输可能会出现丢包、延迟等问题,因此发送方需要确认接收方是否已经正确地接收了数据,以保证数据的可靠性和完整性。客户端发送数据包后,等待服务器的确认消息,如果服务器收到了数据包并正确处理了该数据包,服务器会返回确认消息,通知客户端数据包已经被正确地接收和处理。这样,客户端才能继续发送下一个数据包,从而保证数据传输的顺畅和正确性。
在实际的网络通信中,数据包确认机制是一种常见的网络协议,如TCP协议就是使用数据包确认机制来保证数据的可靠性和完整性。在TCP协议中,每个数据包都会被分配一个序号,接收方在接收到数据包后,会返回一个确认消息,确认已经正确地接收到该数据包,并告诉发送方下一个期望接收的数据包序号。如果发送方在一定时间内没有接收到确认消息,就会重新发送该数据包,直到接收方正确地接收到该数据包,并返回确认消息为止。
数据包确认机制的实现可以有效地保证数据传输的可靠性和正确性,但同时也会带来一定的延迟和额外的网络开销。因此,在设计网络通信协议时,需要根据实际的应用场景和需求,权衡可靠性和效率之间的关系,选择合适的协议和机制。
发送的是字节集,取回数据()也是返回字节集啊,也就是字节型数组{152,0,1,0,0,19,0,0,152}如果发送的是文本那可以这样
编辑框1内容=到文本(客户1取回数据())
从用户输入网址到网页被返回步骤:
第一步、浏览器中输入域名。
第二步、域名解析。
浏览器会把输入的域名解析成对应的IP,过程如下:
1浏览器查找浏览器缓存,如果有域名对应的IP地址则返回,如果没有继续查找。
2浏览器查看本机的host文件,如果有域名对应的IP地址则返回,如果没有继续查找。
3然后是路由器缓存,路由器一般有自己的缓存,如果有域名对应的IP地址则返回,如果没有继续查找。
4接着是对本地DNS服务器进行递归查询,看是否有域名对应的IP。主机向本地域名服务器的查询一般都是采用递归查询。
所谓递归查询就是如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文,而不是让该主机自己进行下一步查询。(本地域名服务器地址是通过DHPC协议获取地址,DHPC是负责分配IP地址的)
5本地域名服务器采用迭代查询,它先向一个根域名服务器查询。本地域名服务器向根域名服务器的查询一般都是采用迭代查询。
所谓迭代查询就是当根域名服务器收到本地域名服务器发出的查询请求报文后,要么告诉本地域名服务器下一步应该查询哪一个域名服务器,然后本地服务器自己进行后续的查询。
6根域名服务器告诉本地域名服务器,下一次应查询的域名服务器dnscom的IP地址。
7本地域名服务器向域名服务器dnscom进行查询。
8域名服务器dnscom告诉本地域名服务器,下一次应查询的权限域名服务器dnsbaiducom的IP地址。
9本地域名服务器向权限域名服务器dnsbaiducom进行查询。
10权限域名服务器dnsbaiducom告诉本地域名服务器,所查询的主机的IP地址。
本地域名服务器最后把查询结果告诉主机。
浏览器中输入URL到页面返回的全过程
第三步、浏览器与目标服务器建立TCP连接
1主机浏览器通过DNS解析得到了目标服务器的IP地址后,与服务器建立TCP连接。
2TCP3次握手连接:浏览器所在的客户机向服务器发出连接请求报文;服务器接收报文后,同意建立连接,向客户机发出确认报文;客户机接收到确认报文后,再次向服务器发出报文,确认已接收到确认报文;此处客户机与服务器之间的TCP连接建立完成,开始通信。
第四步、浏览器通过http协议向目标服务器发送请求
请求行,请求头,请求实体内容。浏览器向主机发起一个HTTP-GET方法报文请求。请求中包含访问的URL,还有User-Agent用户浏览器操作系统信息,编码等。值得一提的是Accep-Encoding和Cookies项。
Accept-Encoding一般采用gzip,压缩之后传输html文件。Cookies如果是首次访问,会提示服务器建立用户缓存信息,如果不是,可以利用Cookies对应键值,找到相应缓存,缓存里面存放着用户名,密码和一些用户设置项。
第五步、服务器给出响应,将指定文件发送给浏览器
状态行,响应头,响应实体内容,返回状态码200OK,表示服务器可以响应请求,返回报文,由于在报头中Content-type为“text/html”,浏览器以HTML形式呈现,而不是下载文件。
注意:但是,对于大型网站存在多个主机站点,往往不会直接返回请求页面,而是重定向。返回的状态码就不是200OK,而是301,302以3开头的重定向码,浏览器在获取了重定向响应后,在响应报文中Location项找到重定向地址,浏览器重新第一步访问即可。
补充一点的就是,重定向是为了负载均衡或者导入流量,提高SEO排名。利用一个前端服务器接受请求,然后负载到不同的主机上,可以大大提高站点的业务并发处理能力;重定向也可将多个域名的访问,集中到一个站点。
由于baiducom,wwwbaiducom会被搜索引擎认为是两个网站,照成每个的链接数都会减少从而降低排名,永久重定向会将两个地址关联起来,搜索引擎会认为是同一个网站,从而提高排名。
第六步、TCP释放链接
1浏览器所在主机向服务器发出连接释放报文,然后停止发送数据;
2服务器接收到释放报文后发出确认报文,然后将服务器上未传送完的数据发送完;
3服务器数据传输完毕后,向客户机发送连接释放报文;
4客户机接收到报文后,发出确认,然后等待一段时间后,释放TCP连接;
第七步、浏览器显示页面中所有文本。
浏览器接收到返回的数据包,根据浏览器的渲染机制对相应的数据进行渲染。渲染后的数据,进行相应的页面呈现和脚步的交互。
楼上回答是一种方法,不过还有一种方法,就是使用 AJAXPRO 可以在页面直接以对象的形式调用。
aspxcs 文件里面需要注册一下你使用的类:
AjaxProUtilityRegisterTypeForAjax(typeof(AjaxPager));
在函数方法上加上声明:
[AjaxProAjaxMethod]
public DataTable GetData()
{
return new DataTable();
}
在客户端调用方法为:
AjaxPagerGetData()Rows[0][0] 获取datatable内的值
有些网站确实是打不开的,打不开的话,就出现这个结果。
服务器无数据返回怎么操作:
1、可能是由于封包被进行了加密从而返回的数据包是无效的,或者发回的是空数据包。
2、数据中有特殊字符等可能就会有问题,处理方式,查询出有特殊字符的数据,修改掉就可以了。
3、检查网络是否正确连接。
0条评论