AJAX原理
来源:互联网 发布:知乎绑定合适的话题 编辑:程序博客网 时间:2024/06/10 00:38
1. AJAX简介及应用
AJAX(Asynchronous JavaScript And XML),直译为异步的JavaScript和XML。AJAX并不是一种全新的技术,而是将现有的JavaScript、XML等技术进行整合,通过异步请求的方式,实现页面无刷新式提交。需要强调的是,AJAX是客户端与服务器端的交互技术,和JavaScript的客户端验证技术有着本质的区别,读者不要混淆。
使用AJAX,请求响应模式不再是请求对应页面的模式,服务器端的响应不要求重新加载整个页面,而可能仅仅更新部分内容。而且发送的请求是异步的,不需要等待服务器对该异步请求做出响应,还可以继续当前页面的操作,当服务器对异步请求相应完成后,浏览器才对页面的局部内容进行更新。下面来看看AJAX技术在哪些地方得到了广泛的应用。
●验证注册名是否已使用
●网站页面局部登陆和退出
●文本框自动补全功能
●地图拖动、放大、缩小功能
2. XMLHttpRequest
掌握XMLHttpRequest对象的使用是学习AJAX技术(可使用AJAX框架)的核心。表6.1和表6.2分别列出了XMLHttpRequest的常用方法和属性,需要读者掌握。
3. AJAX案例
前面已经讲过,AJAX并不是一种全新的技术,而是将现有的JavaScript、XML等技术进行整合。本节通过JavaScript的XMLHttpRequest对象完成发送请求到服务器,并获得返回结果的任务,然后使用JavaScript更新局部的页面内容(不使用AJAX的框架,例如JQuery框架中的AJAX)。
●案例需求
本案例的需求非常简单,学生用户输入手机号码注册,离开该文本框时,后台查询MySQL数据库中的student表,如果系统数据库中该手机号已经存在,则提示“此手机号已被使用!”,如图6.13所示,否则提示“手机号可以使用!”,如图6.14所示。
●案例代码
接下来分步骤完成该需求的案例代码,并加以简单说明。
(1)创建ajax.jsp页面
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><html><head> <title>AJAX案例</title> <!-- 等待加入JavaScript代码 --></head><body> <form name="userForm" action="" method="post"> 注册手机号:<input type="text" name="phone" id="phone" onblur="checkPhoneExist()"/> <div id="msg"></div> </form></body></html>
使用文本框的onblur事件,实现文本框失去焦点时检查用户填写的注册手机号是否已经使用,具体调用的是checkPhoneExist()方法。另外,当从服务器获取结果数据后,仅需更新id为msg的div中的内容。
(2)编写checkPhoneExist()方法
在ajax.jsp页面头部编写检查用户填写的注册手机号是否已经使用的JavaScript方法是checkPhoneExist(),具体代码如下:
var xmlHttp; //声明一个变量,用于存储XMLHttpRequest对象 function checkPhoneExist() { var f = document.userForm; var userPhone = f.phone.value; //调用创建XMLHttpRequest对象的方法,给xmlHttp赋值 createXMLHttpRequest(); //调用具体的方法,执行AJAX操作,其中传入的参数表示访问服务器的CheckUser这个Servlet,并把用户填写的注册手机号作为userPhone的参数传入CheckUser doAjax("CheckUser?userPhone="+userPhone);}
(3)编写createXMLHttpRequest()方法
因为不同浏览器创建XMLHttpRequest对象的的方法是不同的,所以为了兼容不同版本的浏览器,将创建XMLHttpRequest对象的方法写成如下形式:
function createXMLHttpRequest() { if(window.XMLHttpRequest){ xmlHttp = new XMLHttpRequest(); }else if(window.ActiveXObject){ try { xmlHttp = new ActiveXObject("Msxml2.xmlHttp"); } catch (e) { try { xmlHttp = new ActiveXObject("Microsoft.xmlHttp"); } catch (e) { alert("对不起,您的浏览器不支持xmlHttpRequest对象!"); } } }}
(4)编写doAjax()方法
AJAX需要在JavaScript中给服务器指定的服务发送异步请求,在doAjax方法中调用XMLHttpRequest对象的相关方法,给服务器CheckUser这个Servlet发送异步请求。
function doAjax(url) { if(!xmlHttp){ return false; } //设置对象状态改变处理程序,即当XMLHttpRequest对象的状态发生改变时(XMLHttpRequest对象开始发送请求、请求发送完毕、开始读取响应、读取响应结束都是XMLHttpRequest对象的状态),会使用该页面中哪个JavaScript方法进行处理 xmlHttp.onreadystatechange = doRequest; //建立与服务器的连接,参数依次为请求中的方法、请求的地址和是否使用异步请求 xmlHttp.open("post",url,true); //如果是post方法请求,必须要添加下面的代码 xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); //发送请求,参数为请求的参数,null表示不配置参数 xmlHttp.send(null);}
(5)编写doRequest()方法
作为客户端浏览器,需要根据XMLHttpRequest对象状态的改变编写相应的代码,对页面进行处理。下面的代码完成的功能是当XMLHttpRequest对象读取响应结束,根据CheckUser这个Servlet响应的文本内容(yes表示该注册手机号未被使用,no表示已被使用),对id为msg这个div的内容进行局部更新。
function doRequest() { //readyState是表示XMLHttpRequest对象状态的属性,4表示读取响应结束 if(xmlHttp.readyState==4){ //status表示服务器返回响应的HTTP状态码,200表示服务器正常响应 if(xmlHttp.status==200){ //responseText表示响应的文本内容 if(xmlHttp.responseText=="yes"){ document.getElementById("msg").innerHTML="手机号可以使用!"; document.getElementById("msg").style.color="green"; }else{ document.getElementById("msg").innerHTML="此手机号已被使用!"; document.getElementById("msg").style.color="red"; } }else{ alert("请求返回处理的数据有错误!"); } }}
(6)编写CheckUser类
在服务器端,编写CheckUser这个Servlet(后面章节将会学到Servlet),处理XMLHttpRequest对象发送的请求。该Servlet和其他Servlet本质上没有区别,只是需要注意,返回给客户端响应的文本内容需要和客户端处理程序匹配。
@WebServlet("/CheckUser")public class CheckUser extends HttpServlet { private static final long serialVersionUID = 1L; public CheckUser(){ super(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); //设置编码 String phone = request.getParameter("userPhone"); //获取前台参数 String DBDRIVER="com.mysql.jdbc.Driver"; //数据库驱动类 String DBURL="jdbc:mysql://localhost/book"; //数据库地址 String DBUSER="mysql"; //数据库用户名 String DBPASS="root"; //数据库密码 Connection conn = null; //创建连接对象 Statement state = null; //创建SQL语句对象 ResultSet rs = null; //创建结果集对象 PrintWriter out = response.getWriter(); try { Class.forName(DBDRIVER); //加载数据库驱动 conn=DriverManager.getConnection(DBURL, DBUSER, DBPASS); //创建数据库连接 state = conn.createStatement(); String sql="select * from student where phone = '"+ phone +"'"; rs = state.executeQuery(sql); //执行SQL语句并获取结果集 if(rs.next()){ out.print("no"); }else{ out.print("yes"); } } catch (Exception e) { e.printStackTrace(); } finally { out.flush(); out.close(); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
- Ajax原理
- Ajax原理
- ajax原理
- ajax原理
- Ajax原理
- Ajax 原理
- ajax原理
- Ajax原理
- AJax原理
- Ajax原理
- Ajax原理
- AJAX原理
- ajax原理
- AJAX原理
- aJAX 原理
- AJAX原理
- Ajax原理
- ajax原理
- Lua学习笔记之lua基本语法DAY1
- adnroid组件化开发实战
- java web(三)jsp
- 研究生规划_笔记
- C到C++基础
- AJAX原理
- 最全Pycharm教程(3)——代码的调试、运行
- 数学基础复习笔记(1)——向量点积定义的证明
- Tensorflow学习之实现卷积神经网络(五)
- xcode解决xxx文件不能打开问题。
- 【POJ】2186
- 查找和排序(Py)
- 随便聊聊Lambda
- HDU 6194 string string string【后缀数组】