第八章AJAX(1)

第八章AJAX

本章主干知识点:
1、AJAX 基础:为什么要AJAX;XmlHttpRequest对象;封装XHR对象;
2、Json:Json语法规范;浏览器和服务器对Json的处理;
3、AJAX Jquery;
4、AJAX案例:CRUD;新闻的无刷新评论;
5、AJAX高级:重定向的陷阱;AJAX全局事件;

第 1 节1-什么是AJAX
第 2 节2-没有AJAX的日子
第 3 节3-第一个Ajax程序
第 4 节4-封装一个Ajax的JS库
第 5 节5-案例:检查用户名是否可用
第 6 节6-为什么需要Json
第 7 节7-什么是Json
第 8 节8-如何把Json字符串解析为JS对象
第 9 节9-服务器端把Java对象序列化为Json
第 10 节10-Gson两个细节问题
第 11 节11-Jquery封装的AJAX
第 12 节12-JQuery封装 AJAX案例
第 13 节13-JQueryAJAX处理Json1
第 14 节14-JQueryAJAX处理Json2
第 15 节15-AJAX案例:无刷新登录
第 16-18 节16-AJAX案例:文章无刷新评论1 -3
第 19-25 节19-AJAX案例:学生增删改查1 -7
第 26 节26-如何在AJAX中重定向
第 27 节27-AJAX显示loading避免用户等不急
第 28 节28-JQuery的AJAX全局事件

【第 1 节1-什么是AJAX 】

AJAX简介

 

ajax:就是在页面不刷新的时候,在页面上向服务器发出请求获得数据的一种机制。

    1 没有AJAX会怎么样?普通的页面每次执行提交请求的时候都要刷新当前页面。开发一个看效果:用<video src="diaosi.mp4" autoplay controls></video>播放视频(只有支持html5的浏览器能播放),然后放一个提交评论的表单。

   2  在演示使用了AJAX的页面,如果提交评论,页面就不会刷新,视频不会被打断。

   3  AJAX是一种进行页面局部异步刷新的技术。用AJAX向服务器发送请求和获得服务器返回的数据并且更新到界面中,不是整个页面刷新,而是在HTML页面中使用JavaScript创建XMLHTTPRequest(简称XHR)对象来向服务器发出请求以及获得返回的数据,在页面中由XMLHTTPRequest来发出Http请求和获得服务器的返回数据,这样页面就不会刷新了。 XMLHTTPRequest是AJAX的核心对象。局部:一小部分刷新,其他部分不刷新;异步:网络请求期间,浏览器不卡。

【第 2 节2-没有AJAX的日子】

例子:【没有ajax】

【NoAjax1Servlet.java】

package com.rupeng.web6;

import java.io.IOException;

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

public class NoAjax1Servlet extends HttpServlet
{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException
	{
		this.doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException
	{
		String action = req.getParameter("action");
		if(action==null||action.length()<=0)
		{
			req.getRequestDispatcher("/NoAjax1.jsp").forward(req, resp);
		}
		else
		{
			int i = Integer.parseInt(req.getParameter("i"));
			int j = Integer.parseInt(req.getParameter("j"));
			int result = i+j;
			req.setAttribute("i", i);
			req.setAttribute("j", j);
			req.setAttribute("result", result);
			try
			{
				Thread.sleep(5000);
			} catch (InterruptedException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			req.getRequestDispatcher("/NoAjax1.jsp").forward(req, resp);
		}
	}
}

【NoAJAX.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>
</head>
<body>
<form method="post" action="noajax1">
	<input type="hidden" name="action" value="calc"/>
	<input type="text" name="i" value="${i}"/>+
	<input type="text" name="j" value="${j}"/>
	<input type="submit" value="="/>${result }
</form>

<br/>
<video src="xiaopingguo.mp4" controls="controls" ></video><br/>
123123131323fasfasfasf
</body>
</html>

【有ajax】

【YouAJAXServlet.java】

package com.rupeng.web6;

import java.io.IOException;
import java.util.List;

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

import com.google.gson.Gson;

public class YouAJAXServlet extends HttpServlet
{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException
	{
		this.doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException
	{
		String action = req.getParameter("action");
		if (action == null || action.length() <= 0)
		{
			req.getRequestDispatcher("YouAJAX.jsp").forward(req, resp);
		} else if (action.equals("post"))
		{
			String message = RupengUtils.getParameter(req, "message");
			new CommentDAO().addnew(message);
			resp.getWriter().print("ok");
		}
		else if(action.equals("list"))
		{
			resp.setCharacterEncoding("UTF-8");
			resp.setContentType("text/html?charset=UTF-8");
			List<CommentInfo> list  = new CommentDAO().getAll();
			String json = new Gson().toJson(list);
			resp.getWriter().print(json);			
		}
	}
} 

【YouAJAX.jsp】

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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>使用AJAX之后</title>
<script type="text/javascript">
	var rpAjax=function(url,onsuccess){
		var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); 
		xmlhttp.open("POST",url,true);
		xmlhttp.onreadystatechange=function(){
			if(xmlhttp.readyState==4)
			{
				if(xmlhttp.status==200)
				{
					onsuccess(xmlhttp.responseText);
				}
				else
				{
					alert("ajax请求错误");
				}
			}
		};
		xmlhttp.send();
	};
	
	var loadComments=function(){
		rpAjax("youajax?action=list",function(respTxt){
			var json = eval("("+respTxt+")");
			var ulComments = document.getElementById("ulComments");
			var html="";
			for(var i=0;i<json.length;i++)
			{
				var comment = json[i];
				html+="<li>"+comment.createDateTime+":"+comment.message+"</li>";
			}
			ulComments.innerHTML=html;
		});		
	};

	window.οnlοad=function(){
		document.getElementById("submit").οnclick=function(){
			var message = document.getElementById("message").value;
			rpAjax("youajax?action=post&message="+message,function(){
				loadComments();
				document.getElementById("message").value = "";
			});
		};
		loadComments();
	};
</script>
</head>
<body>
<video src="xiaopingguo.mp4" controls="controls" ></video>
<ul id="ulComments">
</ul>

<textarea rows="5" cols="50" id="message"></textarea>
<input type="button" value="评论" id="submit"/>
</body>
</html>

XMLHTTPRequest

 

    1 开发一个AJAX功能需要开发服务端和客户端两块程序。以一个在服务器端计算加法的程序为例。首先开发一个Servlet计算两个数的和。服务器端注意println和print结果不一样哦

    2封装一个简单的js库简化XHR调用(备注)。

    3  案例:AJAX校验用户名是否存在,焦点离开用户名触发。T_Users Id,Name,Password。在数据库中录入几条数据。注册页面,在用户名控件失去焦点(blur),发出ajax请求(请求带用户名),服务器返回ok(在服务器端根据不同的情况进行print("ok")或者error),如果是“error”,就alert提醒用户,用户名已经被注册。

   4  思考:根据id加载用户信息怎么做?加载T_users数据到table中?怎么做。

可以用xml储存数据,但实际中只用JSON


 

【第 3 节3-第一个Ajax程序】

【Ajax1Servlet.java】

package com.rupeng.web6;

import java.io.IOException;

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

public class Ajax1Servlet extends HttpServlet
{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException
	{
		this.doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException
	{
		String action = req.getParameter("action");
		if(action==null||action.length()<0)
		{
			req.getRequestDispatcher("/Ajax11.jsp").forward(req, resp);
		}
		else if(action.equals("add"))
		{
			int i = Integer.parseInt(req.getParameter("i"));
			if(i<0)
			{
				//resp.sendRedirect("index.jsp");
				//return;
			}
			
			int j = Integer.parseInt(req.getParameter("j"));
			resp.setContentType("text/html");
			resp.getWriter().print(i+j);
		}
	}
}

【Ajax1.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">
	window.οnlοad=function(){
		var add = document.getElementById("add");
		add.οnclick=function(){
			var i = document.getElementById("i").value;
			var j = document.getElementById("j").value;
			
			
			//XHR对象执行,发出Http请求,页面不用刷新
			var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); //创建XMLHTTP对象,考虑兼容性
			xhr.open("POST","ajax1?action=add&i="+i+"&j="+j,true);
			xhr.onreadystatechange=function(){
				alert("onreadystatechange,readyState="+xhr.readyState);
				if(xhr.readyState==4)//服务器返回了
				{
					if(xhr.status==200)//xhr.status http状态码
					{
						alert(xhr.responseText);//xhr.responseText返回的报文体
						document.getElementById("result").innerText = xhr.responseText;
						//根据服务器返回的内容更新需要更新的内容
					}
					else
					{
						alert("服务器返回错误");
					}
				}
			};
			alert("send之前");
			xhr.send();//发出请求。并不会等服务器返回send方法才结束,因为我们需要提前监听xhr.onreadystatechange
			// 事件,以便得知“服务器返回了”
			alert("send之后");
		};
	};
</script>
</head>
<body>
<input type="text" id="i"/>+<input type="text" id="j"/>
<input type="button" id="add" value="="/><span id="result"></span>
</body>
</html>

【第 4 节4-封装一个Ajax的JS库】

 

【ajax.js】

//url就是请求的地址
//successFunc就是一个请求返回成功之后的一个function,有一个参数,参数就是服务器返回的报问体
function rpajax(url,successFunc)
{
	var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); //创建XMLHTTP对象,考虑兼容性
	xhr.open("POST",url,true);
	xhr.onreadystatechange=function(){
		if(xhr.readyState==4)//服务器返回了
		{
			if(xhr.status==200)//xhr.status http状态码
			{
				successFunc(xhr.responseText);
			}
			else
			{
				alert("服务器返回错误");
			}
		}
	};
	xhr.send();//发出请求。并不会等服务器返回send方法才结束,因为我们需要提前监听xhr.onreadystatechange
}

【Ajax11.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" src="ajax.js"></script>
<script type="text/javascript">
	window.οnlοad=function(){
		var add = document.getElementById("add");
		add.οnclick=function(){
			var i = document.getElementById("i").value;
			var j = document.getElementById("j").value;
			rpajax("ajax1?action=add&i="+i+"&j="+j,function(respTxt){
				alert(respTxt);
				document.getElementById("result").innerText = respTxt;
			});	
		};
	};
</script>
</head>
<body>
<input type="text" id="i"/>+<input type="text" id="j"/>
<input type="button" id="add" value="="/><span id="result"></span>
</body>
</html>

【第 5 节5-案例:检查用户名是否可用

 

【UserDAO.java】【UserInfo.java】

引用【Ajax.js】

【CheckUserName.html】

<!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" src="ajax.js"></script>
<script type="text/javascript">
	window.οnlοad=function(){
		var txtUserName= document.getElementById("txtUserName");
		//onblur:焦点离开触发onblur事件
		txtUserName.onblur = function(){
			//var username = txtUserName.value;
			var username = this.value;
			rpajax("checkUserName?username="+username,function(data){
				var msg = document.getElementById("msg");
				if(data=="ok")
				{
					msg.innerHTML = "用户名可用";
					msg.style.color = "green";
				}
				else if(data=="error")
				{
					msg.innerHTML = "用户名已经被注册 ";
					msg.style.color = "red";
				}
			});
		}
	}
</script>
</head>
<body>
	用户名:<input type="text" id="txtUserName"/><span id="msg"></span>
</body>
</html>

【CheckUserNameServlet.java】

package com.rupeng.web6;

import java.io.IOException;

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

public class CheckUserNameServlet extends HttpServlet
{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException
	{
		this.doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException
	{
		String username = RupengUtils.getParameter(req,"username");
		UserInfo user =  UserDAO.getByUserName(username);
		resp.getWriter().print(user==null?"ok":"error");
	}
}

【第 6 节6-为什么需要Json】

 

【获取用户信息】

【GetUserInfo.html】

<!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" src="ajax.js"></script>
<script type="text/javascript">
	window.οnlοad=function(){
		var txtUserName= document.getElementById("txtUserName");
		//onblur:焦点离开触发onblur事件
		txtUserName.onblur = function(){
			//var username = txtUserName.value;
			var username = this.value;
			rpajax("getUserInfo?username="+username,function(respTxt){
				if(respTxt=="error")
				{
					alert("查无此用户名");
				}
				else
				{
					var values =  respTxt.split(",");
					var age = values[1];
					var email = values[2];
					var phoneNum = values[3];
					document.getElementById("age").innerHTML = age;
					document.getElementById("email").innerHTML = email;
					document.getElementById("phoneNum").innerHTML = phoneNum;
				}
			});
		}
	}
</script>
</head>
<body>
	用户名:<input type="text" id="txtUserName"/>
	年龄:<span id="age"></span>
	邮箱:<span id="email"></span>
	手机号:<span id="phoneNum"></span>
</body>
</html>

【GetUserInfoServlet.java】

package com.rupeng.web6;

import java.io.IOException;

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

import com.google.gson.Gson;

public class GetUserInfoServlet extends HttpServlet
{
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException
	{
		String username = RupengUtils.getParameter(req, "username");
		UserInfo u = UserDAO.getByUserName(username);
		if(u==null)
		{
			resp.getWriter().print("error");
		}
		else
		{
			/*
			String s = u.getAge()+","+u.getEmail()+","+u.getPhoneNum();
			resp.getWriter().print("ok,"+s);*/
			/*
			String s = "{age:"+u.getAge()+",email:'"+u.getEmail()+"',phoneNum:'"+u.getPhoneNum()+"'}";
			resp.getWriter().print(s);*/
			Gson gson = new Gson();
			String s = gson.toJson(u);//遍历对象的所有字段,生成json字符串
			resp.getWriter().print(s);
		}
	}
}

【第 7 节7-什么是Json】

 

Json

   1  AJAX传递复杂数据如果自己进行格式定义的话会经历组装、解析的过程,因此AJAX中有一个事实上的数据传输标准JSon。Json(是一个标准,就像XML一样,Json规定了对象以什么样的格式保存为一个字符串)将复杂对象序列化为一个字符串,在浏览器端再将字符串反序列化为JavaScript可以读取的对象。Json被几乎所有语言支持

    2 Json是什么,Json就是javascript对象或者数组格式的字符串,Http协议不能传递JavaScript对象,所以要转换为字符串进行传输。

    JavaScript对象(键值对) varperson= {name:'rupeng',age:8};

    JavaScript数组:var names= ['rupeng','qq','taobao'];

    JavaScript对象数组:varpersons = [{name:'rupeng',age:8}, {name:'qq',age:15}, {name:'taobao',age:10}];

    JavaScript对象关联:var p ={name:'yzk',child:{name:'timi',age:1}};

 

笔记:json:服务器端把java对象转换为json字符串,在浏览器段把json字符串转换为JavaScript对象。就是一个字符串。



【Json1.html】

<!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">
	var p = {name:'rupeng','age':18,email:"yzk365@qq.com"};
	//alert(p.email);
	//alert(p.age);
	var names = ['rupeng','baidu','qq'];
	//alert(names[1]);
	var nums = [3,88,999];
	//alert(nums[2]);
	
	var persons=[{name:'yzk',age:18,email:'yzk365@qq.com'},{name:'abc',age:22,email:'abc@qq.com'}];
	var p1 = persons[1];
	//alert(p1.name);
	var aa={name:'yzk',child:{name:'timi',age:'2'}};
	//alert(aa.child.name);
	
	var aa2 ={name:'yzk',child:{name:'timi',age:2,mother:{name:'fiona',age:18}}};
	alert(aa2.child.mother.name);
	alert(aa2.child.name);
</script>
</head>
<body>

</body>
</html>

【第 8 节8-如何把Json字符串解析为JS对象】

Json转换

 

    1 json:服务器端 把java对象转换为json字符串,在浏览器段把json字符串转换为JavaScript对象。就是一个字符串。

    2  如何把json字符串转换为js对象:var obj = eval("("+data+")")。举例:普通对象、数组、对象数组、多对象关联。eval有安全性问题。(所有浏览器支持)

     3(*)如果不用jquery,新版浏览器都原生支持JSON.parse,不支持的引用json2.js也就可以了。

    4Java中有有很多把Java对象序列化为Json字符串的类库,比如Gson、FastJson、JackSon等。用法大同小异,这里用Gson。 Gson gson =new Gson();String json = gson.toJson(p1);

 

【Json2.html】

<!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">
	var s1 = "{name:'yzk',age:18}";//普通的字符串
	var p1 ={name:'yzk',age:18};//键值对对象
	//alert(s1);
	//alert(p1);
	//alert(s1.name);
	//alert(p1.name);
	
	//eval("({name:'yzk',age:18})")把JavaScript对象格式的字符串解析为JavaScript对象
	//var p2 = eval("("+s1+")");//eval("({name:'yzk',age:18})")
	//alert(p2);
	//alert(p2.name);
	var s2 = "[3,5,9]";
	//alert(s2);
	//var arr1 = eval("("+s2+")");
	var arr1= JSON.parse(s2);//比eval安全
	alert(arr1[2]);
</script>
</head>
<body>

</body>
</html>

【第 9 节9-服务器端把Java对象序列化为Json 】

 

【Json3.html】

<!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" src="ajax.js"></script>
<script type="text/javascript">
	window.οnlοad=function(){
		var txtUserName= document.getElementById("txtUserName");
		//onblur:焦点离开触发onblur事件
		txtUserName.onblur = function(){
			//var username = txtUserName.value;
			var username = this.value;
			rpajax("getUserInfo?username="+username,function(respTxt){
				if(respTxt=="error")
				{
					alert("查无此用户名");
				}
				else
				{
					alert(respTxt);
					var p = eval("("+respTxt+")");//JSON.parse(respTxt);
					//alert(p.hello());
					document.getElementById("age").innerHTML = p.age;
					document.getElementById("email").innerHTML = p.email;
					document.getElementById("phoneNum").innerHTML = p.phoneNum;
				}
			});
		}
	}
</script>
</head>
<body>
	用户名:<input type="text" id="txtUserName"/>
	年龄:<span id="age"></span>
	邮箱:<span id="email"></span>
	手机号:<span id="phoneNum"></span>
</body>
</html>

【GetUserInfoServlet.java】见上

GSON方法

 

【第 10 节10-Gson两个细节问题】

Gson把Java对象的所有字段序列化成json,Gson不是使用JavaBean来定名称,而是根据私有变量。肯定不可能传输方法。

 

private String namehaha;

         publicString getName()

         {

                  returnnamehaha;

         }

 

         publicvoid setName(String name)

         {

                  this.namehaha= name;

         }

按照javabean规范:这个属性的名字是name。${u.name}

1.Gson中是遍历所有的字段,和属性的名字没关系,所以Gson序列化为Json拿到的是namehaha:"123"

2.不是把对象传给浏览器,所以不可以传输方法

 

 

第 11 节11-Jquery封装的AJAX


JQuery AJAX

     1Jquery封装简化了AJAX,有$.get、$.post等不同效果的方法,这里介绍最常使用的$.ajax(可以获得请求失败的消息),加法的例子。

 

一般不用$.get,因为Ajax的缓存很烦人,不会用到缓存,网上有的人用$.post,建议用更好的$.ajax

 

jquery2.0以上不支持IE6/7/8 所以建议用2.0以下版本

 

     $.ajax({

                    type: "post", url:"/test3/Ajax1Servlet",

                    data: { i1:$("#txt1").val(), i2: $("#txt2").val() },

                    success: function (data,txtStatus) {alert(data);},

                    error: function () {alert("错误"); }

                });

    2 ajax方法的参数就是一个字典,最好设定post提交,data为提交的报文体,success为请求成功的处理事件,error为请求通讯失败的处理事件(服务器错误、404等)

【CheckUserNameServlet.java】

【JQueryAjax1.html】

<!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" src="jquery-1.8.3.js"></script>
<script type="text/javascript">
	$(function(){
		$("#txtUserName").blur(function(){
			var username1 = $("#txtUserName").val();
			$.ajax({type:"post",url:"checkUserName222",data:{username:username1},
				success:function(data){alert("成功"+data);},
				error:function(){alert("ajax请求失败!");}
			});	
		});
	});
</script>
</head>
<body>
用户名:<input type="text" id="txtUserName"/>
</body>
</html>

【第 12 节12-JQuery封装 AJAX案例】

【Ajax1Servlet.java】

【JQueryAjax2.html】

<!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" src="jquery-1.8.3.js"></script>
<script type="text/javascript">
$(function(){
	$("#btnAdd").click(function(){
		var i1 = $("#i1").val();
		var i2 = $("#i2").val();
		$.ajax({type:"post",url:"ajax1",data:{action:'add',i:i1,j:i2},
			success:function(data){$("#result").html(data);},
			error:function(){alert("ajax请求失败");}
		});
	});
});
</script>
</head>
<body>
<input type="text" id="i1"/>+<input type="text" id="i2"/>
<input type="button" id="btnAdd" value="="/>
<span id="result"></span>
</body>
</html>

【第 13 节13-JQueryAJAX处理Json1 】

JQuery AJAX Json处理

 

     可以使用$.parseJSON()把json字符串解析为JavaScript对象

 

【JQueryAjax3.html】

<!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" src="jquery-1.8.3.js"></script>
<script type="text/javascript">
var getUserInfoSuccess = function(data)
{
	if(data=="error")
	{
		alert("用户名不存在!");
	}
	else
	{
		var p = $.parseJSON(data);//
		$("#age").text(p.age);
		$("#email").text(p.email);
		$("#phoneNum").text(p.phoneNum);
	}
};

$(function(){
	$("#txtUserName").blur(function(){
		var username = $(this).val();
		$.ajax({type:"post",url:"getUserInfo",data:{username:username},
			success:getUserInfoSuccess,
			error:function(){alert("ajax错误");}
		});
	});
});
</script>
</head>
<body>
用户名:<input type="text" id="txtUserName"/>
	年龄:<span id="age"></span>
	邮箱:<span id="email"></span>
	手机号:<span id="phoneNum"></span>
</body>
</html>

【统一返回的数据为json格式】

【JQueryAjax4.html】

<!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" src="jquery-1.8.3.js"></script>
<script type="text/javascript">
var getUserInfoSuccess = function(data)
{
	var obj = $.parseJSON(data);
	if(obj.errorCode=="error")
	{
		alert("用户名不存在!");
	}
	else if(obj.errorCode=="ok")
	{
		var p = obj.data;//
		$("#age").text(p.age);
		$("#email").text(p.email);
		$("#phoneNum").text(p.phoneNum);
	}
};

$(function(){
	$("#txtUserName").blur(function(){
		var username = $(this).val();
		$.ajax({type:"post",url:"getUserInfo2",data:{username:username},
			success:getUserInfoSuccess,
			error:function(){alert("ajax错误");}
		});
	});
});
</script>
</head>
<body>
用户名:<input type="text" id="txtUserName"/>
	年龄:<span id="age"></span>
	邮箱:<span id="email"></span>
	手机号:<span id="phoneNum"></span>
</body>
</html>

【AjaxResult.java】一般都是这么命名

package com.rupeng.web6;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

//把逻辑错误码放到errorCode中,把返回给浏览器的数据放到data中
public class AjaxResult
{
	private String errorCode;//"ok","error"
	private Object data;//返回的数据
	public String getErrorCode()
	{
		return errorCode;
	}
	public void setErrorCode(String errorCode)
	{
		this.errorCode = errorCode;
	}
	public Object getData()
	{
		return data;
	}
	public void setData(Object data)
	{
		this.data = data;
	}
	
	@Override
	public String toString()
	{		
		//Gson gson = new Gson();
		Gson gson = new GsonBuilder()  
		  .setDateFormat("yyyy-MM-dd")  
		  .create(); 
		return gson.toJson(this);
	}
}

【GetUserInfoServlet2.java】

package com.rupeng.web6;

import java.io.IOException;

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

import com.google.gson.Gson;

public class GetUserInfoServlet2 extends HttpServlet
{
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException
	{
		String username = RupengUtils.getParameter(req, "username");
		UserInfo u = UserDAO.getByUserName(username);
		AjaxResult result = new AjaxResult();
		if(u==null)
		{
			result.setErrorCode("error");
		}
		else
		{
			result.setErrorCode("ok");
			result.setData(u);
		}
		//resp.setContentType("application/json");
		Gson gson = new Gson();
		String s = gson.toJson(result);//遍历对象的所有字段,生成json字符串
		//resp.getWriter().print(s);
		resp.getWriter().print("ok");
	}
}



【第 14 节14-JQueryAJAX处理Json2 】

     如果设定ajax请求的ContentType为"application/json"或者ajax请求中设定dataType:"json",那么success的第一个参数就是JavaScript对象,不用手动解析了。如果设定了dataType: "json",而返回的不是json格式,则还是会error。用根据id加载一条t_persons举例子。



     ajax的业务错误处理:error事件是通讯错误、服务器错误等。如何处理“id数据找不到、没有权限”这样的错误:用通用的AjaxResult类


【JQueryAjax5.html】

<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Insert titlehere</title>
<script type="text/javascript"src="jquery-1.8.3.js"></script>
<scripttype="text/javascript">
var getUserInfoSuccess = function(data)//如果设定了dataType:"json",那么data参数的值
//就不再是服务器返回的json字符串,而是parseJSON之后的js对象
{
         //varobj = $.parseJSON(data);
         if(data.errorCode=="error")
         {
                  alert("用户名不存在!");
         }
         elseif(data.errorCode=="ok")
         {
                  varp = data.data;//
                  $("#age").text(p.age);
                  $("#email").text(p.email);
                  $("#phoneNum").text(p.phoneNum);
         }
};
 
$(function(){
         $("#txtUserName").blur(function(){
                  varusername = $(this).val();
                  $.ajax({type:"post",dataType:"json",url:"getUserInfo2",data:{username:username},
                          success:getUserInfoSuccess,
                          error:function(){alert("ajax错误");}
                  });
         });
});
</script>
</head>
<body>
用户名:<input type="text" id="txtUserName"/>
         年龄:<spanid="age"></span>
         邮箱:<spanid="email"></span>
         手机号:<spanid="phoneNum"></span>
</body>
</html>


 

也可以在服务器端

【GetUserInfoServlet2.java】

//resp.setContentType("application/json");
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值