Ajax入门学习
来源:互联网 发布:js中怎么隐藏div 编辑:程序博客网 时间:2024/06/05 18:48
一、概述
ajax:客户端(特指PC浏览器)与服务器,可以在【不必刷新整个浏览器】的情况下,与服务器进行异步通讯的技术。注意:ajax不是新的编程语言,而是Google在2005年新推出的新的编程模式。
二、异步对象
1.XMLHttpRequest(非IE浏览器)
E5时,微软就开发出了第一个异步通讯对象,叫ActiveXObject对象,
Firefox等其它浏览器厂商也慢慢引入异步通讯对象,叫XMLHttpRequest对象,
IE的高版本,也将这个异步对象取名叫XMLHttpRequest对象
2.ActiveXObject(IE浏览器)
IE有向下兼容问题, 因此可以使用ActiveXObject对象。
3.使用异步对象
使用异步对象无需jar包,现代中高版本浏览器中内置了这个异步通讯对象,只需通过JavaScript就可以创建。不过虽然浏览器内置了ajax对象,但是并没有创建出来,需要我们自己使用JavaScript创建出来,代码如下:
function createAjax(){ var ajax = null ; try{ ajax = new ActiveXObject("Microsoft.xmlhttp"); }catch(e1){ try{ ajax = new XMLHttpRequest() ; }catch(e2){ alert("please change browser"); } } return ajax; }
三、异步对象的使用步骤
1.GET请求
1.创建异步对象
调用上面的js方法创建ajax对象
//1.创建ajax对象(状态1) var ajax = createAJAX() ;
2.准备发送请求,但是还没有真正发送请求
此时设置请求方式和url
//2.准备发请求 var method = "get" ;//请求方式var url = {pageContext.request.contextPath}/servlet/TimeServlet"; //请求urlajax.open(method,url);//(状态2)
3.真正发送请求
这里举例使用的是get请求,请求没有实体,顾设置为null
//3.真正发请求(这里的参数是请求体中的内容,由于是get请求,请求体为空,所有赋值为null)ajax.send(null);
4.ajax不断监听服务端的响应
ajax.readyState == 4 说明从服务端获取到了数据,响应码为200,说明正常
ajax.onreadystatechange = function(){ //如果状态码是4的话,表示ajax对象已经从服务器端带回信息回到了前台 if(ajax.readyState == 4 ){ if(ajax.status == 200 ){ var nowStr = ajax.responseText ; alert(nowStr); } }}
这里的服务端代码如下:
public class TimeServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); //注意:这行代码是告诉浏览器端服务器是以什么格式的数据返回的(必须要) response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); System.out.println("TimeServlet.doGet()"); //1.获取当前时间 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String time = sdf.format(date); //2.以流的方式发送到jsp页面 PrintWriter writer = response.getWriter(); writer.write(time); writer.flush(); writer.close(); //当流关闭之后,信息发送到前台 } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
注意:上面返回给jsp的数据是以流的形式返回,不能以请求重定向或者请求转发的形式,否则还是刷新了界面。
完整前台代码:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <base href="<%=basePath%>"> <title>My JSP</title> </head> <body> 当前时间:<span id="time"></span><br/> <input id="buttonID" type="button" value="获取当前时间"/><p/> <script type="text/javascript"> //异步创建AJAX对象 function createAJAX(){ var ajax = null ; try{ //如果是ie12的话 ajax = new ActiveXObject("microsoft.xmlhttp") ; }catch(e1){ try{ //如果是非ie的话 ajax = new XMLHttpRequest() ; }catch(e2){ alert("你的浏览器中不支持异步对象,请换浏览器1"); } } return ajax; } </script> <script type="text/javascript"> document.getElementById("buttonID").onclick = function(){ //1.创建ajax对象(状态1) var ajax = createAJAX() ; //2.准备发请求 var method = "get" ;//请求方式 var url = "${pageContext.request.contextPath}/servlet/TimeServlet"; //请求url ajax.open(method,url);//(状态2) //3.真正发请求(这里的参数是请求体中的内容,由于是get请求,请求体为空,所有赋值为null) ajax.send(null); //-------------------------------------等待 //4.ajax异步对象不断监听服务器响应的状态0-1-2-3-4 //为ajax对象设置状态改变时调用的方法 ajax.onreadystatechange = function(){ //如果状态码是4的话,表示ajax对象已经从服务器端带回信息回到了前台 if(ajax.readyState == 4 ){ //如果响应码是200,说明正常 if(ajax.status == 200 ){ var nowStr = ajax.responseText ; alert(nowStr); } } } } ; </script> </body></html>
这样,就完成了没有刷新整个页面就完成了动态获取当前时间。
2.POST请求
post请求方式和get方式大致步骤相同,主要不同的是第二步准备发送请求但是还么有真正发送时method改为post,然后在第三步真正发送时,send()方法的参数不可以为null,改为我们需要设置的参数(以键值对的形式)。例如:
var content = "username=" + username ;ajax.send(content);
注意:如果使用post请求,要在真正发送前加下面这行代码,它会将请求体中的汉字自动转换utf-8。
ajax.setRequestHeader("content-type","application/x-www-form-urlencoded");
下面就POST请求做一个例子。
前台代码:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>My JSP</title> </head> <body> 用户名[POST]:<input id="usernameID" type="text" maxlength="4"> <span id="resID"></span> <hr/> <script type="text/javascript"> document.getElementById("usernameID").onblur = function(){ var username = this.value ; alert(username); //1 var ajax = createAjax() ; //2 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"); //3 var content = "username=" + username ; ajax.send(content); //-----------------------------------等待 ajax.onreadystatechange = function(){ if(ajax.readyState == 4 ){ if(ajax.status == 200 ){ var tip = ajax.responseText; //6创建img标签 var imgElement = document.createElement("img"); //设置img标签的属性 imgElement.src = tip ; imgElement.style.height = "12px" ; imgElement.style.width = "12px" ; //定位span标签 var spanElement = document.getElementById("resID"); spanElement.innerHTML = "" ;//清空span标签的内容 spanElement.appendChild(imgElement); } } } } </script> <script type="text/javascript"> function createAjax(){ var ajax = null ; try{ ajax = new ActiveXObject("microsoft.xmlhttp"); }catch(e1){ try{ ajax = new XMLHttpRequest(); }catch(e2){ alert("你的浏览器不支持ajax,请更换浏览器"); } } return ajax; } </script> </body></html>
后台代码:
package com.itheima.web;import java.io.IOException;import java.io.PrintWriter;import java.util.Enumeration;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class UserServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); Enumeration names = request.getParameterNames(); while(names.hasMoreElements()){ Object nextElement = names.nextElement(); System.out.println("name:" + nextElement); } String username = request.getParameter("username") ; System.out.println("username" + username ); String desc = "<font color = 'green'>输入正确</font>" ; if(!"杰克".equals(username)){ desc = "<font color = 'red'>输入错误</font>" ; } //通过流将信息输出 PrintWriter pw = response.getWriter(); pw.write(desc); pw.flush() ; pw.close() ; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); String username = request.getParameter("username") ; String tip = "images/MsgError.gif" ; System.out.println("username:" + username); if("jack".equals(username)){ tip = "images/MsgSent.gif"; } response.setContentType("text/html;charset=utf-8"); PrintWriter pw = response.getWriter(); pw.write(tip); pw.flush(); pw.close(); }}
这里的图片是以字符串的形式在流中传输。
四、数据载体
1.三大载体
1.HTML
( A)优点:服务端响应的是普通html字符串,无需JS解析,配合innerHTML属性效率高
(B) 缺点:如果需要更新WEB页面中的很多处地方,HTML不太方便,同时innerHTML属性不是DOM的标准,不能操作XML
注意:innerHTML在xml中不能使用,用firstChild.nodeValue替代
(C)适合:小量数据载体,且只更新在web页面中的一个地方
2.XML
(A)优点:是种通用的普通字符串格式,任何技术都能解析,标签名可以任意,使用DOM标准规则能够解析XML的任何部分
(B)缺点:XML文件格式相当严格,出错后,responseXML属性返回NULL,如果XML文件过长,导致解析效率低下
(C)适合:大量具有层次数据载体
3.JSON
JSON(Java Script Object Notation(记号,标记))是一种轻量级的数据交换语言, 以文本字符串为基础,且易于让人阅读。
JS可以直接解析JSON格式的文本,前提是:该JSON必须采用JS格式书写的才行,如果该JSON是采用Java格式写的,必须使用eval()函数转换后,方可被JS解析,该eval(“”)函数接收一个字符串格式的内容。
2.如何使用:
response.setContentType("text/html;charset=utf-8");
OK,ajax的简单使用到此。
源码下载
- (AJAX学习一) AJAX入门
- ajax入门学习
- ajax入门学习
- AJAX入门学习
- ajax 入门学习文章
- AJAX入门学习总结
- AJAX入门学习总结 .
- Ajax 入门 【学习手记】
- Ajax入门学习总结
- AJAX入门学习总结
- Ajax入门学习
- AJAX => 入门学习
- AJAX入门学习笔记
- Ajax入门学习
- ajax入门学习
- Ajax入门学习
- AJAX入门学习
- Ajax学习(1)---Ajax 入门简介
- Android触摸屏事件派发机制详解与源码分析一(View篇)
- java一些概念
- gitHub控制版本的常用命令
- 图的广度优先遍历
- 组合索引的一些知识点
- Ajax入门学习
- UI控件之Button(按钮)和ImageButton(图像按钮)
- Java 高级—— IO 基础
- gulp build遇到的问题
- 第一次去游泳
- 碎片笔记 2016.06.19
- leetcode 10 Regular Expression Matching
- 数据存储类别
- html