Ajax

Ajax技术介绍:
全称: Asynchronized(异步) Javascript And Xml
技术组成: Javascript、DOM、CSS 和 XMLHttpRequest (ActiveXObject)
  
0 (未初始化) 对象已建立,但是尚未初始化(尚未调用open方法) 
1 (初始化) 对象已建立,尚未调用send方法 
2 (发送数据) send方法已调用,但是当前的状态及http头未知 
3 (数据传送中) 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误, 
4 (完成) 数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据 

 

代码演示(我通过写代码来介绍这种技术,然后再对其中的一些知识进行解释):

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>



  
    Ajax技术学习
    
  
  
  
    封装后的Ajax技术演示//这个在本文后续的代码中讲到
    
    

GET方式的ajax演示

Name:



POST方式的ajax演示

Name2:
Pwd:

 

代码中提到的步骤二处的同步和异步,这里讲一下:

这里的true为异步,false为同步,即:若在步骤4发送那里xhr.send()之后还有代码要执行,他不受Ajax的影响会继续执行,不用等待Ajax回来,即多线程,另一个线程去进行发送操作,这一个线程执行发送的下面的代码;而同步为单线程,Ajax没执行完返回来之前,send()下面的代码是不会执行的。

我在下面的OneServlet中加入的一个Thread.sleep(3000);就是为了体现同步和异步的区别。

 

OneServlet.java

package cn.hncu.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OneServlet extends HttpServlet {
	private SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
	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("GET--Ajax来了...");
		String name=request.getParameter("name");
		
//		try {
//			Thread.sleep(3000);
//		} catch (InterruptedException e) {
//			e.printStackTrace();
//		}
		
		out.println(name+",你好,来访时间是:"+sdf.format(new Date()));
	}

	public void doPost(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("post-ajax来了....");
		String name=request.getParameter("name");
		
		//int i=100/0;//故意让后台响应500的错误信息
		out.println(name+",你好,来访时间是:"+sdf.format(new Date()));
	}
}

 

 

 

下面我们来对相面的例子进行一点改进:

上面例子中的index.jsp中有一个超链接发到了封装后的ajaxDemo.jsp的,下面演示这个封装后的Ajax

ajaxDemo.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>



  
    Ajax技术学习
    
    
  
  
  
  	

封装后的ajax技术演示

		封装需求,封装后的调用方式:
    	var ajax = new Ajax();
    	//ajax.get(xhr,url,function succ(obj){...},function failure(obj){... })
    	ajax.get(xhr,url,succ(obj),failure(obj));
    	//ajax.post(xhr,url,data,function(data){...},function failure(obj){... });
    	ajax.post(xhr,url,data,succ(data), failure(obj));
    

GET方式的ajax演示

Name:



POST方式的ajax演示

Name2:
Pwd:

 

 

 

ajax.js

function Ajax(){
	this.get=function(obj, url, success, failure){
		//1创建一个ajax对象
		var xhr=obj;
		
		//2 设置通讯方式和地址
		xhr.open("GET", url, true);//异步--多线程
		//xhr.open("GET",url,false);//同步--单线程
		
		//3 设置访问成功后的 js对象(回调函数)
		xhr.onreadystatechange=function(){
			if (xhr.readyState==4){//服务器的响应消息接收完毕
				if (xhr.status==200){//服务器正常响应
					var txt=xhr.responseText;//后台的响应信息
					success(txt);
					alert("后台响应消息:"+txt);
				} else {
					if (failure){
						failure(xhr.status);//如404、500等
					}
				}
			}
		};
		
		//4发送---Get方式,没有参数(请求体) ---数据在请求地址中
		xhr.send(null);
	};
	
	this.post=function(obj, url, data, success, failure){
		//1创建一个ajax对象
		var xhr=obj;
		
		//2 设置通讯方式和地址
		xhr.open("POST", url, true);//异步--多线程
		//xhr.open("POST",url,false);//同步--单线程
		
		//3 设置访问成功后的 js对象(回调函数)
		xhr.onreadystatechange=function(){
			if (xhr.readyState==4){//服务器的响应消息接收完毕
				if (xhr.status==200){//服务器正常响应
					var txt=xhr.responseText;//后台的响应信息
					success(txt);
					alert("后台响应消息:"+txt);
				} else {
					if (failure){
						failure(xhr.status);//如404、500等
					}
				}
			}
		};
		
		xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		
		//4发送---POST方式,没有参数(请求体) ---数据在请求地址中
		xhr.send(data);
	};
}

 

然后仍然使用到了上面说到的OneServlet.java

 

 

 

你可能感兴趣的:(Javaee)