目录
这一节我们来说一下ajax的核心知识;
1. XMLHttpRequest对象的创建;
所有现代浏览器均支持XMLHttpRequest对象,(IE5和IE6使用的是ActiveXObject)。
XMLHttpRequest用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新;
<script type="text/javascript">
function loadName(){
var xmlHttp;
/* 如果有XMLHttpRequest对象,直接创建 */
if(window.XMLHttpRequest){
xmlHttp=new XMLHttpRequest();
}else{
/* 如果没有,则利用ActiveXObject对象 */
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
}
</script>
2. XMLHttpRequest对象请求后台;
这里要调用.open()和.send()方法
open(method,url,async) 规定请求的类型、URL 以及是否异步处理请求。
method:请求的类型;get 或 post
url:文件在服务器上的位置
async:true(异步)或 false(同步)
send(string)
将请求发送到服务器。 string:仅用于 post 请求
Get还是Post?
Get:更简单更快,在大部分情况下都能使用;
使用Post的情况:
无法使用缓存文件(更新服务器上的文件或数据库);
向服务器发送大量数据(Post没有数据量限制);
发送包含未知字符的用户输入时,Post比Get更稳定也更可靠;
异步还是同步?
Ajax指的是异步JavaScript和XML(Asynchronous JavaScript and XML)。
True:异步,表示程序请求服务器的同时,程序可以继续执行;能提高系统的运行效率;
False:同步,JavaScript会等到服务器就绪才继续执行。如果服务器繁忙或缓慢,应用程序会挂起或停止;
一般都用异步(True);
<script type="text/javascript">
function loadName(){
var xmlHttp;
/* 如果有XMLHttpRequest对象,直接创建 */
if(window.XMLHttpRequest){
xmlHttp=new XMLHttpRequest();
}else{
/* 如果没有,则利用ActiveXObject对象 */
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
/* 调用open方法,利用get异步请求 */
xmlHttp.open("get","getAjaxName",true);
/* 调用send方法发送请求 */
xmlHttp.send();
}
</script>
3. XMLHttpRequest对象响应服务器;
当请求被发送到服务器时,我们需要执行一些基于响应的任务;
每当readyState改变时,就会触发onreadystatechange事件;
readyState属性存有XMLHttpRequest的状态信息;
XMLHttpRequset对象的三个重要的属性:
onreadystatechange:存储函数(或函数名),每当readyState属性改变时,就会调用该函数;
readyState:存有XMLHttpRequest的状态,从0到4发生变化;
0:请求未初始化;
1:服务器连接已建立;
2:请求已接受;
3:请求处理中;
4:请求已完成,且响应已就绪;
status:
200:表示成功,“OK”;
404:表示失败,“未找到页面”;
<script type="text/javascript">
function loadName(){
var xmlHttp;
/* 如果有XMLHttpRequest对象,直接创建 */
if(window.XMLHttpRequest){
xmlHttp=new XMLHttpRequest();
}else{
/* 如果没有,则利用ActiveXObject对象 */
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
alert("readystate状态:"+xmlHttp.readyState+",status状态:"+xmlHttp.status);
xmlHttp.onreadystatechange=function(){
//alert("readystate状态:"+xmlHttp.readyState+",status状态:"+xmlHttp.status);
}
/* 调用open方法,利用get异步请求 */
xmlHttp.open("get","getAjaxName",true);
/* 调用send方法发送请求 */
xmlHttp.send();
}
</script>
当我们未改变readyState属性时,我们来看readyState的状态:
点击获取数据的按钮显示:
当我们改变了readyState的属性时,我们再来看看readyState的状态(取消onreadystatechange里面的注释):
.
可以看到readystate的状态是一步步变化的,status也是成功的连接状态(200状态);
在onreadystatechange事件中,我们规定当服务器响应已做好被处理的准备时所执行的任务;
获得服务器响应:使用XMLHttpRequest对象的responseText或responseXML属性;
responseText:获得字符串形式的响应数据;
responseXML:获得XML形式的响应数据;
主要用responseText;
<script type="text/javascript">
function loadName(){
var xmlHttp;
/* 如果有XMLHttpRequest对象,直接创建 */
if(window.XMLHttpRequest){
xmlHttp=new XMLHttpRequest();
}else{
/* 如果没有,则利用ActiveXObject对象 */
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
alert("readystate状态:"+xmlHttp.readyState+",status状态:"+xmlHttp.status);
xmlHttp.onreadystatechange=function(){
alert("readystate状态:"+xmlHttp.readyState+",status状态:"+xmlHttp.status);
if(xmlHttp.readyState==4 && xmlHttp.status==200){
alert(xmlHttp.responseText);
}
}
/* 调用open方法,利用get异步请求 */
xmlHttp.open("get","getAjaxName",true);
/* 调用send方法发送请求 */
xmlHttp.send();
}
</script>
当我们发送要求到服务器时,后台接受数据的时候用responseText,
当前面的readyState的状态是0,1,2,3,4后,再次点击时 就会获取到数据,如图所示:
4. 完整代码;
ajax.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function loadName(){
var xmlHttp;
/* 如果有XMLHttpRequest对象,直接创建 */
if(window.XMLHttpRequest){
xmlHttp=new XMLHttpRequest();
}else{
/* 如果没有,则利用ActiveXObject对象 */
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
alert("readystate状态:"+xmlHttp.readyState+",status状态:"+xmlHttp.status);
xmlHttp.onreadystatechange=function(){
alert("readystate状态:"+xmlHttp.readyState+",status状态:"+xmlHttp.status);
if(xmlHttp.readyState==4 && xmlHttp.status==200){
alert(xmlHttp.responseText);
document.getElementById("name").value=xmlHttp.responseText;
}
}
/* 调用open方法,利用get异步请求 */
xmlHttp.open("get","getAjaxName",true);
/* 调用send方法发送请求 */
xmlHttp.send();
}
</script>
</head>
<body>
<div style="text-align: center;">
<div>
<input type="button" value="Ajax获取数据" onclick="loadName()"/> <input type="text" id="name" name="name"/>
</div>
</div>
</body>
</html>
GetAjaxNameServlet.java:
package com.java.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GetAjaxNameServlet extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//获取getWriter()对象
PrintWriter out=response.getWriter();
out.print("ajax返回的文本");
//刷新
out.flush();
out.close();
}
}
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>AjaxJson</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>getAjaxNameServlet</servlet-name>
<servlet-class>com.java.web.GetAjaxNameServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getAjaxNameServlet</servlet-name>
<url-pattern>/getAjaxName</url-pattern>
</servlet-mapping>
</web-app>
获取数据的结果: