【Web】Ajax基本使用

Ajax

同步的概念

客户端向服务器发送请求,服务器端处理和响应请求,客户端这段时间会被阻塞等待,不能进行其他操作,服务器端响应后需要重新载入整个页面。


异步

客户端向服务器端发送请求,服务器端处理响应时,客户端无需等待,还可以进行其他操作,服务器端响应之后,页面载入通过JavaScript DOM进行页面的局部刷新,不需要重新载入整个页面。


XMLHttpRequest :通过这个对象可以实现后台和服务器的数据交换,实现网页的部分更新。

一个完整的Http请求的过程

1.      建立TCP连接

2.      Web浏览器向Web服务器发送请求命令。

3.      Web浏览器发送请求头信息。

4.      Web服务器应答

5.      Web服务器发送应答头信息。

6.      Web服务器向浏览器发送数据。

7.      Web服务器关闭TCP连接。

 

一个Http请求一般由四部分组成

Http请求的方法,get或者post

请求的URL,也就是请求的地址

请求头,包含一些客户端环境信息,身份验证信息。

请求体,包含客户端提交的查询字符串信息,表单信息。

一个Http请求一般由三部分组成

一个数字和文字组成的状态吗,用来显示请求是成功还是失败。

响应头,响应头也和请求头一样包含许多有用的信息,例如服务器类型、日期时间、内容类型、长度。

响应体,响应正文。

Http状态码由3位数字构成,其中首位数字定义了状态码的类型。

1XX : 信息类,表示收到Web浏览器的请求,正在进一步处理中。

2XX : 成功,表示用户请求被正确接收,处理。如200

3XX:重定向,表示请求没有成功,客户必须采取进一步的动作。

4XX: 客户端错误,表示客户端提交的请求有错误,例如:404 Not Found

5XX:服务器错误,表示服务器不能完成对请求的处理: 如500

通过XMLHttpRequest发送请求

方法介绍

 

open(method,url,async);

method: 请求的方法,使用get还是post请求。

url:请求的地址。

async:是否发送异步请求,默认为true。

send(string);

发送的内容。

示例:

request.open(“POST”,”create.jsp”,true);
request.setRequestHeader(“Content-type”,”application/x-www-form-urlencoded”);
request.send(“name=a&sex=man”);

通过XMLHttpRequest取得响应

responseText: 获取字符串形式的响应数据。

responseXML: 获得XML形式的响应数据。

status和statusText: 以数字和文本形式返回HTTP状态码。

getAllResponseHeader(): 获取所有的响应报头。

getResponseHeader(); 查询响应中的某个字段的值。

readyState属性

服务器响应成功时得到通知。

0: 请求还未初始化,open还没有调用。

1: 服务器连接已建立,open已经调用。

2: 请求已接收,也就是收到头信息。

3: 请求处理中,也就是接收到响应主体。

4:请求已完成,且响应已就绪。

 

如何监听服务器响应的状态,通过onreadystatechange方法

var request = new XMLHttpRequest();
request.open(“GET”,”get.jsp”,true);
request.send();
request.onreadstatechange=function(){
  if(request.readyState ===4 && request.status === 200){
  //响应成功后做一些事情
}
}

简单示例:例子参考http://blog.csdn.net/sdandan/article/details/4914597

AjaxServlet.java

package com.meng.ajax;
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 AjaxServlet extends HttpServlet {
	private static final String CONTENT_TYPE = "text/xml; charset=gb2312";
	public void init() throws ServletException {
	}
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		try {
			//添加一个睡眠时间,模拟耗时操作
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		response.setContentType(CONTENT_TYPE);
		PrintWriter out = response.getWriter();
		String action = request.getParameter("action");
		if (("send").equals(action)) {
			StringBuffer sb = new StringBuffer("<type>");
			sb.append("<type_name>AA</type_name>");
			sb.append("<type_name>BB</type_name>");
			sb.append("<type_name>CC</type_name>");
			sb.append("<type_name>DD</type_name>");
			sb.append("</type>");
			out.write(sb.toString());
			out.close();
		}
	}
}
Ajax.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 'Ajax.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
</head>
<script type="text/javascript">
/*通过异步传输XMLHTTP发送参数到ajaxServlet,返回符合条件的XML文档*/
function getResult(){ 
var url = "/AjaxDemo/Ajax?action=send";
 if (window.XMLHttpRequest) { 
    req = new XMLHttpRequest();
 }else if (window.ActiveXObject){    
 req = new ActiveXObject("Microsoft.XMLHTTP");   
 }  
	 if(req){     
	    req.open("GET",url, true);
	    req.onreadystatechange = complete;   
	    req.send(null); 
	  }
}
 /*分析返回的XML文档*/
function complete(){  if (req.readyState == 4){
 if (req.status == 200) {     
  var type = req.responseXML.getElementsByTagName("type_name");
  var str=new Array();     
  for(var i=0;i< type.length;i++){     
        str[i]=type[i].firstChild.data;   
        document.all['td'].innerHTML+=str[i]+"";      
    }  
} }}
</script>
<body>
<table width="80%" border="0" cellspacing="0" cellpadding="0">
		<tr>
			<td id="td"> </td>
		</tr>
	</table>
	<br/><input type="button" οnclick="getResult()" value="get"/><br/>
	<input type="text"/>
</body>
</html>
配置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_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>AjaxDemo</display-name>
  <servlet>
  	<servlet-name>Ajax</servlet-name>
  	<servlet-class>com.meng.ajax.AjaxServlet</servlet-class>
  </servlet>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>GetJsp</servlet-name>
    <servlet-class>com.meng.ajax.GetJsp</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>Ajax</servlet-name>
  	<url-pattern>/Ajax</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>GetJsp</servlet-name>
    <url-pattern>/servlet/GetJsp</url-pattern>
  </servlet-mapping>
</web-app>
使用一个servlet来访问WEB-INF下的jsp页面。
public class GetJsp extends HttpServlet {
	public GetJsp() {
		super();
	}
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
	}
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request, response);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.getRequestDispatcher("/WEB-INF/Ajax.jsp").forward(request, response);
	}
	public void init() throws ServletException {
		// Put your code here
	}
}

从访问结果可以看出,如果我们设置为异步访问,则可以继续进行客户端操作,如果设置为同步访问,则客户端会等待,被阻塞,通过改变open("GET",url, true);第三个参数,可以看到使用Ajax的好处,拥有更好的交互体验。







  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值