1. 程式人生 > >Ajax最實用的小例子集合

Ajax最實用的小例子集合

今天我為大家帶來了幾個非常實用的ajax小例子,都是在工程中經常用到的實用的例子。適合有基礎的同學,廢話也不多說了,看程式碼

  哦,對了,所有的例子都是用servlet+jsp實現的 至於三大框架的,我相信,只要這個會了,那都不是事...大笑

1、我們先用基本的ajax實現驗證使用者名稱是否存在的例子(此例子只對IE瀏覽器),

例子截圖


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>原生的ajax</title>
<script type="text/javascript">
var xmlhttp;
//建立XMLHttpRequest物件
function createXMLHttpRequest() {
	try {
		//針對IE5、IE5.5、IE6
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
			//針對IE5、IE5.5、IE6
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (e) {
			try {
				//針對FireFox、Mozillar、Opera、Safari、IE7、IE8
				xmhttp = new XMLHttpRequest();//建立XMLHttpRequest物件

				if (xmlhttp.overrideMimeType) {//修正某些瀏覽器的BUG
					xmlhttp.overrideMimeType("text/xml");
				}
			} catch (e) {
			}
		}
	}
}

function ajaxsub(t) {

	//建立一個XmlHttpRequest物件(js內建物件)
	createXMLHttpRequest();

	if (xmlhttp != null) {//確定XMLHttpRequest是否建立成功

		var url = "AjaxServlet";
		//1.是http請求的方式  POST和GET
		//2.是伺服器的地址,可以一個servlet
		//3.是採用同步還是非同步,true為非同步
		xmlhttp.open("POST", url, true);

		//post請求要自己設定請求頭  注意順序
		xmlhttp.setRequestHeader("Content-Type",
				"application/x-www-form-urlencoded;");
		xmlhttp.onreadystatechange = callfun; //註冊回撥函式  callfun對應一個js的函式名字,這個函式由我們自己定義

		//傳送請求
		xmlhttp.send("on=check&name=" + t.value + "&id=10");
	} else {
		alert("不能建立XMLHttpRequest物件例項")
	}

}

//回撥函式
function callfun() {//獲取伺服器返回的資料
	//回撥函式裡面會執行多次,次數取決建立連線的時間和建立連線成功之後伺服器處理的時間

	//獲取與伺服器建立連線是否成功
	if (xmlhttp.readyState == 4) {
		if (xmlhttp.status == 200) {//伺服器已經成功處理請求,並返回資料
			var serviceData = xmlhttp.responseText;//獲取伺服器返回的文字資料
			//alert("伺服器返回的資料是:" + serviceData);

			var vs = "";
			if (serviceData == "1") {
				vs = "不可以註冊";
			} else {
				vs = "可以註冊";
			}
			document.getElementById("msg_info").innerHTML = vs;
		}

	}

}
</script>
</head>
<body>
使用者名稱:<input type="text" name="username" onblur="ajaxsub(this)"><label id="msg_info"></label>
</body>
</html>
servlet程式碼
String name=request.getParameter("name");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		//獲取資料庫的資料
		String sql="select * from users where username='"+name+"'";
		System.out.println(sql);
		try {
			ResultSet rs=DBUtil.getConn().createStatement().executeQuery(sql);
                        //判斷是否存在
			if(rs.next()){
				out.print(1);
			}else{
				out.print(0);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		out.flush();
		out.close();

從上面的例子我們看得出原生的ajax對瀏覽器的相容問題及其不好,於是jquery就為我們提供了非常方便的ajax非同步得到資料的方法。
從下面的例子開始我們就用jquery提供的方法寫

2、省市級聯動

效果
我們可以用火狐的開發者模式看到要非同步載入的資料
首先我們先引用jquery <script type="text/javascript" src="js/jquery-1.11.1.js"></script>

jsp

省/直轄市
<select name="pri" id="pri">
<option>--請選擇--</option>
<option value="bj">北京</option>
<option value="hn">河南</option>
<option value="hb">湖北</option>
<option value="sx">山西</option>
</select>
市/區
<select id="city" name="city">
</select>
<script type="text/javascript">
$("#pri").change(function(){
        //獲取你點選的省
	var pri=$(this).val();
        //得到你非同步載入的servlet
	var url="AjaxServlet?on=city";
       //非同步載入資料
	$.post(url,{pri:pri},function(data){
		$("#city").empty();
		var city=data.split(",");
		for(var i=0;i<city.length;i++){
			$("#city").append("<option value='"+city[i]+"'>"+city[i]+"</option>");
		}
	});
});
</script>
servlet程式碼
	     String pri=request.getParameter("pri");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		//模擬資料庫的資料
		Map<String, String> map=new HashMap<String,String>();
		map.put("bj", "朝陽區,昌平區,海淀區,豐臺區");
		map.put("hn", "鄭州,開封,洛陽,滎陽");
		map.put("hb", "武漢,湖北1,湖北2,湖北3");
		map.put("sx", "大同,寶雞,山西1,山西2");
		//寫進輸出流
		out.print(map.get(pri));
		out.flush();
		out.close();

3、模仿百度查詢提示


jsp程式碼

<div class="search">
<input type="text" name="title" id="searchtitle"/>
<input type="button" value="搜尋" id="searchsub"/>
<div id="result">
</div>
</div

<script type="text/javascript">
$(function(){
	$("#searchtitle").keyup(function(){
		$("#result").css("display","none");//隱藏結果提示
		var title=$(this).val();//獲取查詢的內容
		setTimeout(function(){
			var url="AjaxServlet?on=tips";//非同步載入servlet
			$.post(url,{title:title},function(data){
				$("#result").empty();//清除查詢內容
				//判斷結果是否是空
				if(data.length!=0){
					var arr=data.split(",");//擷取字串
					for(var i=0;i<arr.length;i++){
						$("#result").append("<div class='tips'>"+arr[i]+"</div>");
					}
					//結果提示
					//$("#result").css("display","block");
					$("#result").fadeIn("slow");//淡入slow,fast,淡出fadeOut
					//點選tip新增到輸入框
					$(".tips").click(function(){
						var text=$(this).text();
						$("#searchtitle").val(text);
						$("#result").css("display","none");
					});
				}
			});
		},500);//延遲載入時間

	});
});
</script>
servlet程式碼
String title=request.getParameter("title");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		//預設最多出現六條資料 看你的需求  
		String sql="select name from items where name like'%"+title+"%' limit 6";
		try {
			ResultSet rs=DBUtil.getConn().createStatement().executeQuery(sql);
			StringBuffer sb=new StringBuffer();
			//拼Josn格式的資料
			while(rs.next()){
				sb.append(rs.getString(1)+",");
			}
			//sb.substring(0,(sb.length()-1))是一個String型別的;
			if(sb.length()>0){
				out.print(sb.substring(0,(sb.length()-1)));
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		out.flush();
		out.close();

4、層級選單


sevlet獲取的資料庫中的資料

String sql="SELECT cid,cname from catalog where pid='00'";
		List<Catalog> list=new ArrayList<Catalog>();
		try {
			ResultSet rs=DBUtil.getConn().createStatement().executeQuery(sql);
			Catalog cata=null;
			while(rs.next()){
				cata=new Catalog();
				cata.setCid(rs.getString(1));
				cata.setCname(rs.getString(2));
				list.add(cata);
			}
			request.setAttribute("list", list);
		}catch (Exception e) {
			e.printStackTrace();
		}
		request.getRequestDispatcher("jq_ajax.jsp").forward(request, response);

jsp程式碼
<divid="menudiv">
                       <ul>
                               <c:forEachitems="${list }" var="v">
                                      <liclass="oneli" id="${v.cid }">
                                              ${v.cname}
                                      </li>
                                      <ulclass="twoul">
 
                                      </ul>
                               </c:forEach>
                       </ul>
</div>

<script type="text/javascript">
   $(function(){
	   $(".oneli").click(function(){
		   var id=$(this).attr("id");
		   var mythis=this;//在回撥函式不能使用this物件
		   var l = $(mythis).next(".twoul").children("li").length;
		   if(l==0){
			   var url="AjaxServlet?on=menu";
			   $.post(url,{id:id},function(data){
				   data = eval("(" + data + ")");
				   for(var i=0;i<data.length;i++){
					   $(mythis).next(".twoul").append("<li>"+data[i].cname+"</li>");
				   }
			   });
		   }
		   $(this).next(".twoul").toggle();
	   });
   });
</script>

用來非同步獲取資料的servlet

String id=request.getParameter("id");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		String sql="SELECT cid,cname from catalog where pid='"+id+"'";
		List<Catalog> list=new ArrayList<Catalog>();
		
		try {
			ResultSet rs=DBUtil.getConn().createStatement().executeQuery(sql);
			Catalog cata=null;
			while(rs.next()){
				cata=new Catalog();
				cata.setCid(rs.getString(1));
				cata.setCname(rs.getString(2));
				list.add(cata);
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
		String jsonList=JSONArray.fromObject(list).toString();
		out.print(jsonList);
		out.flush();
		out.close();

5、非同步分頁

這個例子我用到了封裝json資料的包

使用JSONObject類的物件操作JSON物件
JSONArray 用來轉換json陣列格式的資料
get方法  根據下標獲取JSONArray 物件裡面的值
JSONObject用來轉換json物件格式的資料

需要用到jar包



jsp程式碼

<div>
<center>
<table>
<thead>  
		<tr>
			<td>id</td>
			<td>所屬類別</td>
			<td>商品名稱</td>
			<td>產地</td>
		</tr>
</thead>
 <tbody id="example">
 </tbody>
</table>
</center>
<div id="page">
</div>
</div>

<script type="text/javascript">
var nowpage=1;
$(function(){
	getJson(1);
});
function getJson(nowpage){
	var url1="AjaxServlet?on=ajaxpage";
	 $.ajax({  
	        type: "post", 
	        async: "false",
	        data:{page:nowpage},
	        url: url1,  
	        success: function(info){
	        	$("#example").empty();
	        	$("#page").empty();
	        	var obj=eval("("+info+")");
	        	var endPage=obj.page.endPage;
	        	var nowPage=obj.page.nowPage;
	        	$.each(obj.list,function(i,v){
	        		 $("#example").append("<tr><td>"+v.id+"</td><td>"+v.cid+"</td><td>"+v.city+"</td><td>"+v.name+"</td></tr>");
	        	});
	        	$("#page").append("當前:"+nowPage+"/"+endPage+"頁<a href='javascript: getJson(1)'>首頁</a><a href='javascript: getJson("+(nowPage-1)+")'>上一頁</a>");
	        	for(var i=1;i<=endPage;i++){
	        		$("#page").append("<a href='javascript: getJson("+i+")'>"+i+"</a>");
	        	}
	        	$("#page").append("<a href='javascript: getJson("+(nowPage+1)+")'>下一頁</a><a href='javascript: getJson("+endPage+")'>末頁</a>");
	        }
	        
	 });
}

</script>
servlet程式碼
response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		String page=request.getParameter("page");
		int pageSize=5;//一頁顯示的頁數
		int pageCount=27;//總頁數
		List<Items> itemsList=new ArrayList<Items>();
		int nowPage=(page=="" || page==null)?1:Integer.parseInt(page);//計算當前頁
		int endPage=pageCount/pageSize;//末頁
		
		endPage=(pageCount%pageSize==0)?endPage:endPage+1;//計算末頁,不夠一頁補一頁
		nowPage=(nowPage<1)?1:nowPage;//如果當前頁小於1,則返回第一頁
		nowPage=(nowPage>=endPage)?endPage:nowPage;//如果的當前頁大於末頁,則返回末頁
		Page p=new Page();
		p.setNowPage(nowPage);
		p.setEndPage(endPage);
		String sql="select * from items limit "+(nowPage-1)*pageSize+","+pageSize;
		try {
			ResultSet rs=DBUtil.getConn().createStatement().executeQuery(sql);
			Items i=null;
			while(rs.next()){
				i=new Items();
				i.setId(rs.getInt("id"));
				i.setCid(rs.getString("cid"));
				i.setName(rs.getString("name"));
				i.setCity(rs.getString("city"));
				itemsList.add(i);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Map<String,Object> map=new HashMap<String,Object>();
		map.put("page", p);
		map.put("list", itemsList);
		String jsonList=JSONObject.fromObject(map).toString();
		System.out.println(jsonList);
		out.print(jsonList);

由於現在寫的太多了,所以沒本法放個文件,對於JSONArray和JSONObect不懂得可以微博聯絡我,我給你文件....

想要原始碼的亦可以給我發微博

希望大家一起學習