AJAX编程实践
---------------------------------------------------------------------------------------------------------------
[版权申明:本文系作者原创,转载请注明出处]
文章出处:http://blog.csdn.net/sdksdk0/article/details/51727377
作者:朱培 ID:sdksdk0
---------------------------------------------------------------------------------------------------------------
本文主要从Ajax的产生背景讲起,分享什么是ajax?我们为什么要用ajax?ajax适用于什么场合?以及我们如何来使用ajax。本文通过ajax的两个常见案例来讲解ajax的编码步骤,学习目的要求熟练掌握ajax的5个开发步骤。学习的前提要求已经掌握了html,css,js,xml,jsp,servlet的基本知识。
一、Ajax简介
AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。
传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。
与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。
Ajax的工作原理相当于在用户和服务器之间加了—个中间层,使用户操作与服务器响应异步化。这样把以前的一些服务器负担的工作转嫁到客户端,利于客户端闲置的处理能力来处理,减轻服务器和带宽的负担,从而达到节约ISP的空间及带宽租用成本的目的。
二、Ajax使用场景
AJAX【适合】不用来传递大量数据,而只用来【传递少量数据】,在用户的【体验】上,【更加人性化】
AJAX是一个和服务器无关的技术,即服务器可使用:JavaEE,.NET,PHP,。。。这些技术都可
AJAX只管向服务器发送请求,同时只管接收服务器的HTML或XML或JSON载体响应
服务端不能使用转发或重定向到web页面,因为这样会起浏览器全面刷新
即只能以流的方式响应给浏览器。
1、数据验证:在文本框等输入表单中给予输入提示,或者自动完成,可以有效的改善用户体验,尤其是那些自动完成的数据可能来自于服务器端的场合,Ajax是很好的选择。
2、按需取数据:
我们以前的对级联菜单的处理多数是这样的:
为了避免每次对菜单的操作引起的重载页面,不采用每次调用后台的方式,而是一次性将级联菜单的所有数据全部读取出来并写入数组,然后根据用户的操作用 JavaScript来控制它的子集项目的呈现,这样虽然解决了操作响应速度、不重载页面以及避免向服务器频繁发送请求的问题,但是如果用户不对菜单进行 操作或只对菜单中的一部分进行操作的话,那读取的数据中的一部分就会成为冗余数据而浪费用户的资源,特别是在菜单结构复杂、数据量大的情况下(比如菜单有 很多级、每一级菜又有上百个项目),这种弊端就更为突出。
如果在此案中应用Ajax后,结果就会有所改观:
在初始化页面时我们只读出它的第一级的所有数据并显示,在用户操作一级菜单其中一项时,会通过Ajax向后台请求当前一级项目所属的二级子菜单的所有数据,如 果再继续请求已经呈现的二级菜单中的一项时,再向后面请求所操作二级菜单项对应的所有三级菜单的所有数据,以此类推……这样,用什么就取什么、用多少就取 多少,就不会有数据的冗余和浪费,减少了数据下载总量,而且更新页面时不用重载全部内容,只更新需要更新的那部分即可,相对于后台处理并重载的方式缩短了 用户等待时间,也把对资源的浪费降到最低。
三、Ajax编码
3.1 编码步骤
1、创建AJAX异步对象,例如:createAJAX()
2、准备发送异步请求,例如:ajax.open(method,url)
3、如果是POST请求的话,一定要设置AJAX请求头,例如:ajax.setRequestHeader()
如果是GET请求的话,无需设置设置AJAX请求头
4、真正发送请求体中的数据到服务器,例如:ajax.send()
5、AJAX不断的监听服务端响应的状态变化,例如:ajax.onreadystatechange,后面写一个无名处理函数
6、在无名处理函数中,获取AJAX的数据后,按照DOM规则,用JS语言来操作Web页面
3.2 ajax状态码
- 0:ajax异步对象创建好了,但暂时没有准备发送请求
- 1:ajax已经调用了open方法,但暂时没有真正发送请求
- 2:ajax已调用了seng()方法,但暂时没有到达服务器
- 3:请求已经到达服务器,正在处理中,服务器正在将响应返回的过程中
- 4:ajax异步对象已经完全接收到了服务端的响应信息,但这个时候的响应状态码不一定是正确的,可能是404/500或者200等
- 0-4都是ajax的状态码,每个浏览器的0-3这4种状态显示不一样,但是4这个状态码每个浏览器都有,所以只需要知道4就可以了。
- 一定要状态触发之后才可以出发function(){}函数,如果状态保持4-4-4不变,就不会触发function函数。
四、Ajax案例一:用户名自动检测
4.1 GET方式
这里的自动提示是以文字提示为例:
我们可以在myeclipse中新建一个web工程,然后写一个注册的jsp文件,这里命名为register.jsp。
在这个jsp中的html中的body下把这个表单先写好,并给其id,这里的作用主要是为了给后面的内容通过getElementById进行元素查找。
<form >
用户名:<input id="usernameID" type="text" name="username" maxlength="10" /> <span id="resID"></span>
</form>
因为有的浏览器可能会不支持ajax,所以我们需要来判断一个浏览器是否兼容。这里也就是先创建一个ajax对象。
function createAJAX(){
var ajax=null;
try{
ajax=new ActiveXObject("microsoft.xmlhttp"); }catch(e1){
try{
ajax=new XMLHttpRequest();
}catch(e2){
alert("您的浏览器不支持ajax,请更换浏览器试试!");
}
}
return ajax;
}
然后就是按照前面分享的编码步骤进行:
//定位文本框,同时提供焦点事件
document.getElementById("usernameID").onblur=function(){
//获取文本框中输入的值
var username=this.value.trim(); //如果内容为空
if(username.length==0){
document.getElementById("resID").innerHTML="用户名不能为空";
}else{
//对网址中的汉字进行utf-8编码
username=encodeURI(username);
var ajax=createAJAX(); var method="GET";
var url="${pageContext.request.contextPath}/servlet/UserServlet?time="+new Date().getTime()+"&username="+username;
ajax.open(method,url); ajax.send(null); ajax.onreadystatechange=function(){
if(ajax.readyState==4){
if(ajax.status==200){
var tip=ajax.responseText; document.getElementById("resID").innerHTML=tip; }
} } }
}
这里我们需要用到servlet来做服务器的接收和验证操作。这里是通过get方法来实现的。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username=request.getParameter("username");
byte[] buf = username.getBytes("ISO-8859-1");
username = new String(buf,"UTF-8");
//System.out.println(username);
String tip="<font color='green'>可注册</font>";
if("朱培".equals(username)){
tip="<font color='red'>该用户已存在</font>";
}
response.setContentType("text/html;charset=UTF-8");
PrintWriter pw=response.getWriter();
pw.write(tip);
pw.flush();
pw.close(); }
运行Tomcat服务器。通过地址进行访问。
效果如下:当鼠标移开的时候,如果库中有则会提示用户已存在。
若用户不存在,则可以进行注册。
4.2 POST方式
post方式很多都与get方法类似,但是还是有区别的,例如post方法需要设置ajax请求头为post,它会将请求的汉字自动进行utf-8的编码。这里用图片提示为例:
//定位文本框,同时提供焦点事件
document.getElementById("usernameID").onblur=function(){
//获取文本框中输入的值
var username=this.value.trim(); //如果内容为空
if(username.length==0){
document.getElementById("resID").innerHTML="用户名不能为空";
}else{ var ajax=createAJAX(); var method="POST";
var url="${pageContext.request.contextPath}/servlet/UserServlet?time="+new Date().getTime();
ajax.open(method,url); //设置ajax请求头为post,它会将请求的汉字自动进行utf-8的编码
ajax.setRequestHeader("content-type","application/x-www-form-urlencoded"); var content="username="+username;
ajax.send(content); ajax.onreadystatechange=function(){
if(ajax.readyState==4){
if(ajax.status==200){
var tip=ajax.responseText; var imgElement = document.createElement("img");
//设置img标签的src/width/height的属性值
imgElement.src = tip;
imgElement.style.width = "15px";
imgElement.style.height = "15px";
//定位span标签
var spanElement = document.getElementById("resID");
//清空span标签中的内容
spanElement.innerHTML = "";
//将img标签加入到span标签中
spanElement.appendChild(imgElement); }
} } }else{ var spanElement = document.getElementById("resID");
spanElement.innerHTML = "";
}
}
这段代码的第6布就是将从服务器中读取到的图片进行解析并且显示到span中,也就是我们前面设置的那个html页面。
对于selvet,使用post方法:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { request.setCharacterEncoding("UTF-8");
String username=request.getParameter("username"); String tip="images/b.jpg";
if("朱培".equals(username)){
tip="images/a.jpg";
}
response.setContentType("text/html;charset=UTF-8");
PrintWriter pw=response.getWriter();
pw.write(tip);
pw.flush();
pw.close();
}
效果如下:
五、Ajax案例二:省市级联
关于省市级联的案例非常非常多,这里主要是通过客户端使用ajax进行无刷新拿到服务器中的数据。
首先要把html文件写好,
<select id="provinceID" style="width:120px">
<option>选择省份</option>
<option>湖南省</option>
<option>广东省</option>
</select> <select id="cityID">
<option>选择城市</option> </select>
还需要我们把之前写的那个createAJAX()引入进来。
<script type="text/javascript" src="js/ajax.js"></script>
然后就继续在这个script脚本中进行编写了。
//定位省份下拉框,同时添加内容改变事件
document.getElementById("provinceID").onchange=function(){
//清空
var cityElement=document.getElementById("cityID");
cityElement.options.length=1; //只保留第一个 //获取选中省份的名字
var index=this.selectedIndex;
var optionElement=this[index];
//获取选中的option标签中的内容
var province=optionElement.innerHTML; if("选择省份"!=province){ var ajax=createAJAX(); var method="POST";
var url="${pageContext.request.contextPath}/servlet/Province?time="+new Date().getTime();
ajax.open(method,url); //设置ajax请求头为post,它会将请求体重的汉子自动进行utf-8的编码
ajax.setRequestHeader("content-type","application/x-www-form-urlencoded"); var content="province="+province;
ajax.send(content); ajax.onreadystatechange=function(){ if(ajax.readyState==4){
if(ajax.status==200){
var xmlDocument=ajax.responseXML; //按照dom去解析xml文档
var cityElementArray=xmlDocument.getElementsByTagName("city");
var size=cityElementArray.length;
for(var i=0;i<size;i++){
//innerHTML只能在html/jsp中使用,不能再xml中使用
var city=cityElementArray[i].firstChild.nodeValue;
var optionElement=document.createElement("option"); optionElement.innerHTML=city; cityElement.appendChild(optionElement); } }
} } } }
对于服务端,采用的是post方法:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { request.setCharacterEncoding("UTF-8");
String province=request.getParameter("province");
//xml格式的数据
response.setContentType("text/xml;charset=UTF-8");
PrintWriter pw = response.getWriter(); pw.write("<?xml version='1.0' encoding='UTF-8' ?>");
pw.write("<root>"); if("广东省".equals(province)){
pw.write("<city>广州</city>");
pw.write("<city>深圳</city>");
pw.write("<city>佛山</city>");
}else if("湖南省".equals(province)){
pw.write("<city>长沙</city>");
pw.write("<city>衡阳</city>");
pw.write("<city>永州</city>");
pw.write("<city>株洲</city>");
}
pw.write("</root>");
pw.flush();
pw.close(); }
效果如下:
这里是会无刷新操作,可以给用户发出好的交互体验。
五、总结
AJAX编程实践的更多相关文章
- 高性能JavaScript 编程实践
前言 最近在翻<高性能JavaScript>这本书(2010年版 丁琛译),感觉可能是因为浏览器引擎的改进或是其他原因,书中有些原本能提高性能的代码在最新的浏览器中已经失效.但是有些章节的 ...
- C# socket编程实践
C# socket编程实践——支持广播的简单socket服务器 在上篇博客简单理解socket写完之后我就希望写出一个websocket的服务器了,但是一路困难重重,还是从基础开始吧,先搞定C# ...
- 高性能javascript学习笔记系列(5) -快速响应的用户界面和编程实践
参考高性能javascript 理解浏览器UI线程 用于执行javascript和更新用户界面的进程通常被称为浏览器UI线程 UI线程的工作机制可以理解为一个简单的队列系统,队列中的任务按顺序执行 ...
- 01HTTP服务&AJAX编程
HTTP服务&AJAX编程 一.服务器 1. 什么是服务器? 能够提供某种服务的机器(计算机)称为服务器. 2.服务器的分类: 1.按系统分类:Lin ...
- Method Swizzling和AOP(面向切面编程)实践
Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...
- 编程实践中C语言的一些常见细节
对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所有测试结果基于这个环境获得,为简化起见, ...
- atitit.ajax 最佳实践跟框架选型 o99
atitit.ajax 最佳实践跟框架选型 1. 选型框架dwr/dwr3 跟jq 1 2. DWR方便的地方分为两个地方. 1 3. dwr 优点: 1 4. 缺点: 2 5. 根jq的区别 2 1 ...
- http服务&ajax编程
http服务&ajax编程 1.服务器 前言:通俗的讲,能够提供某种服务的机器(计算机)称为服务器 1.1.服务器类型 按照不同的划分标准,服务可划分为以下类型: 按服务类型可分为:文件服务器 ...
- AJAX编程-封装ajax工具函数
即 Asynchronous [e'sɪŋkrənəs] Javascript And XML,AJAX 不是一门的新的语言,而是对现有技术的综合利用.本质是在HTTP协议的基础上以异步的方式与服务器 ...
随机推荐
- [LeetCode] K-diff Pairs in an Array 数组中差为K的数对
Given an array of integers and an integer k, you need to find the number of unique k-diff pairs in t ...
- 将 Net 项目升级 Core项目经验:(一)迁移Net项目为Net Core\Standard项目
迁移Net项目为Net Core\Standard项目 背景: 我们公司内部有自己ORM开发框架,最新因为需要将系统迁移到国产服务器上,所以首先需要将最基础的ORM框架改造可以运行在国产服务器上.对于 ...
- Mysql运算符与函数(胖胖老师)
use test;create table `employee`( emp_no int unsigned, emp_name varchar(30), emp_sex varcha ...
- Passward
问题 A: Passward 时间限制: 1 Sec 内存限制: 512 MB 题目描述 你来到了一个庙前,庙牌上有一个仅包含小写字母的字符串 s. 传说打开庙门的密码是这个字符串的一个子串 t,并 ...
- 51nod 1364 最大字典序排列(线段树)
1364 最大字典序排列基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 给出一个1至N的排列,允许你做不超过K次操作,每次操作可以将相邻的两个数交换,问能够得到的字 ...
- 【小小复习·大米饼】
(一)数位DP模板 ·LIS的数位DP: ·含b进制数个数+数形结合的数位DP ·平衡数的数位DP: (二)网络流问题 ·Edmonds_Karp:(见书)·Dinic(见书)·ISAP(见书)·例题 ...
- hdu 1130 How Many Trees?(Catalan数)
How Many Trees? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 笔记12 注入AspectJ切面
虽然Spring AOP能够满足许多应用的切面需求,但是与AspectJ相比, Spring AOP 是一个功能比较弱的AOP解决方案.AspectJ提供了Spring AOP所不能支持的许多类型的切 ...
- Java Servlet 笔记3
Servlet 表单数据 很多情况下,需要传递一些信息,从浏览器到 Web 服务器,最终到后台程序.浏览器使用两种方法可将这些信息传递到 Web 服务器,分别为 GET 方法和 POST 方法. 1. ...
- P2P技术详解(三):P2P技术之STUN、TURN、ICE详解
1.内容概述 在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有少部分主机能够直接接入Internet.很多时候,我们希望网络中的两台主机能够直接进行通信,即所谓的P2P ...