1. 发送请求

Ajax可以通过XMLHttpRequest对象实现采用异步方式在后台发送请求。通常情况下,Ajax发送请求有两种,一种是发送GET请求,另一种是发送POST请求。但是无论发送哪种请求,都需要经过以下4个步骤。

(1)初始化XMLHttpRequest对象。为了提高程序的兼容性,需要创建一个跨浏览器的XMLHttpRequest对象,并且判断XMLHttpRequest对象的实例是否成功,如果不成功,则给予提示。具体代码如下:

例1.1 发送请求。

http_request=false;
if(window.XMLHttpRequest){ //非IE浏览器
http_request=new XMLHttpRequest(); //创建XMLHttpRequest对象
}else if(window.ActiveXObject){ //IE浏览器
try{
http_request=new ActiveXObject("Msxml2.XMLHTTP"); //创建XMLHttpRequest对象
}catch(e){
try{
http_request=new ActiveXObject("Microsoft.XMLHTTP"); //创建XMLHttpRequest对象
}catch(e){}
}
}
if(!http_request){
alert("不能创建XMLHttpRequest 对象实例!");
return false;
}

(2) 为XMLHttpRequest对象指定一个返回结果处理函数(即回调函数),用于对返回结果进行处理。具体代码如下:

例1.2 设置回调函数。

http_request.onreadystatechange=getResult;  //调用返回结果处理函数

注意:使用XMLHttpRequest对象的onreadystatechange属性指定回调函数时,不能指定要传递的参数。如果要指定传递的参数,可以用以下方法:

http_request.onreadystatechange=function(){getResult(param)};

(3)创建一个与服务器的连接。在创建时,需要指定发送请求的方式(即GET或POST),以及设置是否采用异步方式发送请求。

例1.3 采用异步方式发送GET方式的请求的具体代码如下:

http_request.open('GET',url,true);

例1.4 采用异步方式发送POST方式的请求的具体代码如下:

http_request.open('POST',url,true);

说明:在open()方法中的url参数,可以是一个JSP页面的URL地址,也可以是Servlet的映射地址。也就是说,请求处理页,可以是一个JSP页面,也可以是一个Servlet。

技巧:在指定URL参数时,最好将一个时间戳追加到该URL参数的后面,这样可以防止因浏览器缓存结果而不能实时得到最新的结果。例如,可以指定URL参数为以下代码:

String url="deal.jsp?nocache="+new Date().getTime();

(4)想服务器发送请求。XMLHttpRequest对象的send()方法可以实现向服务器发送请求,该方法需要传递一个参数,如果发送的是GET请求,可以将该参数设置为null;如果发送的是POST请求,可以通过该参数指定要发送的请求参数。

向服务器发送GET请求的代码如下:

http_request.send(null);  //向服务器发送请求

例1.5 向服务器发送POST请求的代码如下:

var param="user="+form1.user.value+"&pwd="+form1.pwd.value+"&emali="+form1.email.value; //组合参数
http_request.send(param); //向服务器发送请求

需要注意的是在发送POST请求之前,还需要设置正确的请求头。具体代码如下:

http_request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

上面这句代码,需要加在“http_request.send(param);”语句之前。

2. 处理服务器响应

XMLHttpRequest对象提供了两个用来访问服务器响应的属性,一个是responseText属性,返回字符串响应;另一个是responseXML属性,返回XML响应。

2.1 处理字符串响应

字符串响应通常应用在响应不是特别复杂的情况下。例如,将响应显示在提示对话框中,或者响应只是显示成功或失败的字符串。

例2.1 将字符串响应显示到提示对话框中的回调函数的具体代码如下:

function getResult(){
if(http_request.readyState==4){ //判断请求状态
if(http_request.status==200){ //请求成功,开始处理返回结果
alert(http_request.responseText); //显示判断结果
}else { //请求页面有错误
alert("您所请求的页面有错误!");
}
}
}

如果需要将该响应结果显示到页面的指定位置,也可以先在页面的合适位置添加一个<div>或<span>标记,将设置该标记的id属性,如div_result,然后在回调函数中应用以下代码显示响应结果:

document.getElementById("div_result").innerHTML=http_request.responseText;

2.2 处理XML响应

如果在服务器端需要生成特别复杂的响应,那么就需要应用XML响应。应用XMLHttpRequest对象的responseXML属性,可以生成一个XML文档,而且当前浏览器已经提供了很好的解析XML文档对象的方法。

例2.2 保存图书信息的XML文档。具体代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<mr>
<books>
<book>
<title>Java Web程序开发范例宝典</title>
<publisher>人民邮电出版社</publisher>
</book>
<book>
<title>Java 范例完全自学手册</title>
<publisher>人民邮电出版社</publisher>
</book>
</books>
</mr>

在回调函数中遍历保存图书信息的XML文档,并将其显示到页面中的代码如下:

function getResult(){
if(http_request.readyState==4){
if(http_request.status==200){
var xmldoc=http_request.responseXML;
var str="";
for (int i = 0; i <xmldoc.getElementByTagName("book").length; i++) {
var book=xmldoc.getElementByTagName("book").item(i);
str=str+"《"+book.getElementByTagName("title")[0].firstChild.data+"》由“"+
book.getElementByTagName('publisher')[0].firstChild.data+"”出版<br>";
}
document.getElementById("book").innerHTML=str; //显示图书信息
}else {
alert("您所请求的页面有错误!");
}
}
}
<div id="book"></div>

通过上面的代码获取的XML文档的信息如下:

《Java Web程序开发范例宝典》由“人民邮电出版社”出版

《Java 范例完全自学手册》由“人民邮电出版社”出版

3. 一个完整的实例——检测用户名是否唯一

例3.1 检测用户名是否唯一。

(1)创建index.jsp文件,在该文件中添加一个用于收集用户注册信息的表单及表单元素,以及表“检测用户名”按钮的图片,并在该图片的onclick事件中调用checkName()方法,检测用于名是否被注册。在页面的合适位置添加一个用于显示提示信息的<div>标记,并且通过CSS设置该<div>标记的样式。关键代码如下:

<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<style type="text/css">
<!--
#toolTip{
position:absolute; //设置绝对定位
left:331px; //设置左边距
top:39px; //设置顶边距
width:98px; //设置宽度
height:48px; //设置高度
padding-top:45px; //设置文字与顶边的距离
padding-left:25px; //设置文字与左边的距离
padding-right:25px; //设置文字与右边的距离
z-index:1;
display:none; //设置默认不显示
color:red; //设置文字的颜色
background-image:url(images/tooltip.gif); //设置背景图片
}
-->
</style>
<div id="toolTip"></div> <script type="text/javascript">
function createRequest(url){
http_request=false;
if(window.XMLHttpRequest){ //非IE浏览器
http_request=new XMLHttpRequest(); //创建XMLHttpRequest对象
}else if(window.ActiveXObject){ //IE浏览器
try{
http_request=new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
try{
http_request=new ActiveXObject("Microsoft.XMLHTTP");
}catch(e){}
}
}
if(!http_request){
alert("不能创建MLHttpRequest对象实例!");
return false;
}
http_request.onreadystatechange=getResult; //调用返回结果处理函数
http_request.open("GET", url, true); //创建与服务器的连接
http_request.send(null); //向服务器发送请求
} function getResult(){
if(http_request.readyState==4){ //判断请求状态
if(http_request.status==200){ //请求成功,开始处理返回结果
document.getElementById("toolTip").innerHTML=http_request.responseText; //设置提示内容
document.getElementById("toolTip").style.display="block"; //显示提示框
}else { //请求页面有错误
alert("您所请求的页面有错误!");
}
}
} function checkUser(userName){
if(userName.value==""){
alert("请输入用户名!");
userName.focus();
return;
}else{
createRequest('checkUser.jsp?user='+userName.value);
}
}
</script>
<body>
<form method="post" action="" name="form1">
用&nbsp;户&nbsp;名:<input type="text" name="username" id="username" size="32">
<img src="data:images/checkBt.png" width="100" height="26" style="cursor:hand;" onclick="checkUser(form1.username);"><br>
密&nbsp;&nbsp;&nbsp;&nbsp;码:<input type="password" name="pwd1" id="pwd1" size="35"><br>
确认密码:<input type="password" name="pwd2" id="pwd2" size="35"><br>
&nbsp;&nbsp;E-mail:<input type="text" name="email" id="email" size="45"><br>
<input type="image" name="imageField" src="data:images/registerBt.png">
</form> </body>
</html>

(2)编写检测用户名是否被注册的处理页checkUse.jsp,在该页面中判断输入的用户名是否注册,并应用JSP内置对象out的println()方法输出判断结果。checkUser.jsp页面的具体代码如下:

<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@ page import="java.util.*" %>
<%
String[] userList={"明日科技","mr","mrsoft","gao"}; //创建一个一维数据
String user=new String(request.getParameter("user").getBytes("ISO-8859-1"),"GB18030"); //获取用户名 防止乱码
Arrays.sort(userList); //对数组排序
int result=Arrays.binarySearch(userList, user);
if(result>-1){
out.println("很抱歉,该用户名已被注册!"); //输出检测结果
}else{
out.println("恭喜您,该用户名没有被注册!"); //输出检测结果
}
%>

由于本实例比较简单,这里没有从数据库中获取用户信息,而是将用户信息保存在一个一维数组中。在实际项目开发时,通常情况下是从数据库中获取用户信息。

Ajax技术——与服务器通信的更多相关文章

  1. Json介绍与Ajax技术

    AJAX   AJAX准备知识:JSON 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据 ...

  2. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  3. 使用ajax与服务器通信的步骤

    使用ajax与服务器通信的步骤: 1. 创建一个XMLHttpRequest对象 2. 创建url,data,通过xmlHttpRequest.send() 3. 服务器端接收ajxa的请求,做相应处 ...

  4. Ajax技术

    1.ajax技术的背景 不可否认,ajax技术的流行得益于google的大力推广,正是由于google earth.google suggest以及gmail等对ajax技术的广泛应用,催生了ajax ...

  5. Java之Ajax技术

    ajax(asynchronouse javascript and xml) 异步的javascript 和 xml(现在常把xml换成json): ajax是2005年提出的,在2006,2007年 ...

  6. ajax 技术和原理分析

    ajax所包含的技术 大家都知道ajax并非一种新的技术,而是几种原有技术的结合体.它由下列技术组合而成. 1.使用CSS和XHTML来表示. 2. 使用DOM模型来交互和动态显示. 3.使用XMLH ...

  7. AJAX技术的核心

    //创建一个XMLHttpRequest对象 ,利用此对象与服务器进行通信 是AJAX技术的核心 /** * 获取XmlHttpRequest对象 */ function getXMLHttpRequ ...

  8. 你真正的了解Ajax?Ajax技术简述

    Ajax技术是目前在浏览器中通过JavaScript脚本可以使用的所有技术的集合.Ajax并没有创造出某种具体的新技术,它所使用的大多数技术都是在很多年以前就已经存在了,然而Ajax以一种崭新的方式来 ...

  9. Ajax 技术原理(转)

    Ajax 技术原理 2010-01-04 原文出处:http://www.nowamagic.net/ajax/ajax_AjaxPrinciple.php 在写这篇文章之前,曾经写过一篇关于AJAX ...

随机推荐

  1. Hadoop案例(六)小文件处理(自定义InputFormat)

    小文件处理(自定义InputFormat) 1.需求分析 无论hdfs还是mapreduce,对于小文件都有损效率,实践中,又难免面临处理大量小文件的场景,此时,就需要有相应解决方案.将多个小文件合并 ...

  2. [实战]MVC5+EF6+MySql企业网盘实战(23)——文档列表

    写在前面 上篇文章实现了图片列表,这篇文章实现文档列表将轻车熟路,因为逻辑基本相似,只是查询条件的不同.这里将txt,doc,docx,ppt,pptx,xls,xlsx的文件都归为文档列表中. 系列 ...

  3. es6js promise在ie中报错“未定义”

    解决办法,我使用https://cdn.bootcss.com/es6-promise/4.1.1/es6-promise.auto.min.js直接引入在html中,也可以安装相应的babel-po ...

  4. CentOS 7 kibana安装配置

    Kibana 是为Elasticsearch设计的开源分析和可视化平台,你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互.你可以很容易实现高级的数据分析 ...

  5. 洛谷P1726 上白泽慧音 [Tarjan]

    题目传送门 上白泽慧音 题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村 ...

  6. Python类总结-析构函数和__call__方法

    class Foo: def __init__(self): pass #析构函数 def __del__(self): print('解释器要销毁我了,我要做最后一次呐喊') def __call_ ...

  7. js中箭头函数和普通函数this的区别

    最近在学习angularJs的时候由于里面涉及到了箭头函数,箭头函数除了声明上有点区别以外,和普通函数最主要的区别还是在this的问题上. Js中函数中嵌套的函数this不会 “继承”.比如说以下代码 ...

  8. MAC OS 10.10.5虚拟机免费下载(可安装Xcode7)

    MAC OS 10.10.5虚拟机免费下载(可安装Xcode7)   MAC OS 10.10.5虚拟机免费(可安装Xcode7)下载地址:链接: http://pan.baidu.com/s/1dD ...

  9. FastReport.Net使用:[30]对话框使用

    使用对话框需要知道的地方  1.按钮的DialogResult属性. 假如DialogResult属性值为OK的按钮被点击,报表将会展现后面的对话框或者报表页:如果属性值为None,则停留在当前窗体: ...

  10. [CSAcademy]Squared Ends

    [CSAcademy]Squared Ends 题目大意: 给你一个长度为\(n(n\le10^4)\)的数列\(\{A_i\}(A_i\le10^6)\).定义区间\(A_{[l,r]}\)的代价为 ...