JavaWeb學習筆記8:Ajax&JQuery

1-Ajax介紹

“Asynchronous Javascript And XML”(異步JavaScript和XML)
它並不是新的技術,只是把原有的技術整合到了一起,具體
1、使用CSS和XHTML來表示
2、使用DOM模型來交互和動態顯示
3、使用XMLHttpRequest來和服務器進行異步通信
4、使用javascript來綁定和調用

2-Ajax Get、Post請求

1、創建對象

/*XMLHttpRequest 用於在後臺與服務器交換數據,
	這意味着在不重新加載網頁的情況下,能對網頁進行更新
	open()中的url - 可以指向任何類型的文件,比如.txt和.xml,或者服務器腳本文件*/
function  ajaxFunction(){//不同瀏覽器中執行時return的request
	var xmlHttp;
	try{ // Firefox, Opera 8.0+, Safari
		xmlHttp=new XMLHttpRequest();
	}
	catch (e){
		try{// Internet Explorer
			xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e){
			try{
				xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
			}
		  catch (e){}
		}
	}
	return xmlHttp;
}

2、發送請求

function get(){
	var request = ajaxFunction();
	//參數一:請求類型 參數二:url 參數三:是否異步
	request.open("GET","/Ajax01/DemoServlet01?user=Hillain",true);
	request.send();
	request.onreadystatechange = function(){
		if(request.readyState==4&&request.status==200){
			alert(request.responseText);
		}
	}
}

Post請求的1步與Get一樣,第2步的代碼如下:

function post(){
	var request = ajaxFunction();
	request.open("POST","/Ajax01/DemoServlet01",true);
	//沒有這一行就無法傳送數據,數據就爲null
	request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
	request.send("user=Hillain");	//post的傳值方式
	request.onreadystatechange = function(){
		if(request.readyState==4&&request.status==200){
			alert(request.responseText);
		}
	}
}
3-Ajax 校驗用戶名

這裏用了個綜合案例來使用Ajax獲取信息
login.jsp:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
	<script type="text/javascript">
		function  ajaxFunction(){
			var xmlHttp;
			try{ // Firefox, Opera 8.0+, Safari
				xmlHttp=new XMLHttpRequest();
			}
			catch (e){
				try{// Internet Explorer
					xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
				}
				catch (e){
					try{
						xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
					}
				  catch (e){}
				}
			}
			return xmlHttp;
		}
		function checkUsername(){
			var userName = document.getElementById("name").value;
			//alert("name="+userName);	可以取值
			var xmlHttp = ajaxFunction();
			xmlHttp.open("post","/Ajax01/CheckUserName",true);
			xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
			xmlHttp.onreadystatechange = function(){
				if(xmlHttp.readyState==4&&xmlHttp.status==200){
					var message = xmlHttp.responseText;
					var span = document.getElementById("name_msg");
					if(message==1){
						span.innerHTML = "<font color='red'>用戶名已存在!</font>";
					}else{
						span.innerHTML = "<font color='green'>用戶名可用!</font>";
					}
				}
			}
			xmlHttp.send("nameName="+userName);
		}
	</script>
</head>
<body>
	<table>
		 <tr>
			<td>用戶名:</td>
			<td><input type="text" id="name" name="name" onblur="checkUsername()"><span id="name_msg"></span></td>
		 </tr>
		 <tr>
			<td>密碼:</td>
			<td><input type="password" name="password"></td>
		 </tr>
		 <tr>
			<td>郵箱:</td>
			<td><input type="text" name="email"></td>
		 </tr>
		 <tr>
			<td colspan="2"><input type="submit" value="註冊"></td>
		 </tr>
</table>
</body>
</html>

Servlet(CheckUserName):

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
	throws ServletException, IOException {
	try {
		String userName = request.getParameter("nameName");
		response.setContentType("text/html;charset=utf-8");
		UserDao user = new UserDaoImpl();
		boolean isExist = user.CheckUserName(userName);
		if(isExist){//用戶名存在時
			response.getWriter().println(1);
		}else{//用戶名不存在時
			response.getWriter().println(2);
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	doGet(request, response);
}
4-JQuery 介紹及load()

JQuery是屬於Javascript的代碼框架,它的作用的簡化代碼,提高效率,write less do more
JQuery load示例1:

function load(){
	/*	responseTxt - 包含調用成功時的結果內容
			statusTXT - 包含調用的狀態
				xhr - 包含 XMLHttpRequest 對象  */
	$("#content").load("/Ajax01/JQueryTest01",function(responseTxt,statusText,xhr) {
		$("#content").val(responseTxt);	//接收Servlet傳輸過來的數據
	});	
}

JQuery load示例2:

//利用按鈕標籤獲取信息:
<h3><input type="button" onclick="load()" value="點擊獲取信息"></h3>
//利用按鈕標籤獲取信息:
<a href="load()">點擊獲取信息</a>	//雖然能接收到信息但是仍會刷新網頁,導致數據流失

function load(){
	$("#div01").load("/Ajax01/JQueryTest01?name=load",function(123) {
		$("#div01").html(responseTxt);
	});	
}

注意在示例2中,分別用了button標籤和a標籤來獲取信息,但結果是button能夠獲取信息,而a標籤不能。這是爲什麼呢?原因是:我們都知道,a標籤裏的一般都是超鏈接,而超鏈接都是會跳轉到另一個頁面的,這裏a標籤雖然是引用了load(),但是load()是有用到servlet的,也就是說,最後a標籤還是會跳向當前頁面,就好比你獲取到了信息沒錯,但是刷新了,相當於沒獲取到,所以沒有顯示該有的信息。而button就不一樣了,button就是一個單純的頁面元素,所以不會有刷新的問題。

5-JQuery get()與post()

對比get與post方法,除了參數一,後面的參數基本一樣,get參數一的寫法與html的寫法一樣,而post則是在後面加上{參數1名:參數1值,參數2名:參數2值,…}

function get(){
	$.get("/Ajax01/JQueryTest01?name=get", function(data, status) {
		$("#div01").text(data);
	});
}
function post(){
	$.post("/Ajax01/JQueryTest01", {name:"post"},function(data, status) {
		$("#div01").text(data);
	});
}

還記得上面有一個利用Ajax校驗用戶名的例子嗎?在這裏我們利用JQuery再實現一次校驗用戶名,看看兩種方式的主要代碼有什麼不一樣。

function checkUsername(){
	var name = $("name").val();
	$.post("/Ajax01/CheckUserName",{nameName:name},function(data,textStatus){
		if(data==1){
			$("#name_msg").html("<font color='red'>用戶名已存在!</font>");
		}else{
			$("#name_msg").html("<font color='green'>用戶名可用!</font>")
		}
	});
}
6-JQuery 仿百度搜索欄

這一塊內容我從開發的順序來表達👇
search.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>仿百度搜索欄</title>
<script type="text/javascript" src="JQuery/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="JQuery/search.js"></script>
</head>
<body>
	<input style="width: 400px;height:40;font-size: 15px" id="content">
	<div style="width: 400px;height:200px;border-color:gray;border:1px solid" id="div01">
	</div>
</body>
</html>

FindKeyWordImpl(dao實現):

public class KeyWordDaoImpl implements KeyWordDao{
	@Override
	public List<KeyWordBean> findKeyWord(String keyWord) throws SQLException {
		QueryRunner qr = JDBCUtil_c3p0.getQR();
		String sql = "select * from keyword where keyword like ? limit 5";
		List<KeyWordBean> keyword= qr.query(sql, keyWord+"%",new BeanListHandler<KeyWordBean>(KeyWordBean.class));
		return keyword;
	}
}

search.js(獲取鍵盤輸入信息並回調):

$(function() {
	$("#content").keyup(function() {
		var word = $(this).val();
		if(word==""){
			$("#div01").hide();
		}else{
			$("#div01").show();
			$.post("FindKeyWord",{keyWord:word},function(data,status){
				$("#div01").html(data);
			});
		}
	})	//這裏不能加';'號,否則無法正確執行!
});

FindKeyWord(Servlet):

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
	throws ServletException, IOException {
	try {
		String keyWord = request.getParameter("keyWord");
		System.out.println(keyWord);
		KeyWordDao dao = new KeyWordDaoImpl();
		List<KeyWordBean> list = dao.findKeyWord(keyWord);
		request.getSession().setAttribute("list", list);
		request.getRequestDispatcher("table.jsp").forward(request, response);
	} catch (Exception e) {
		e.printStackTrace();
	}
}

table.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">
</head>
<body>
	<table>
		<c:forEach items="${list}" var="key">
				<tr>
					<td>
						${key.keyWord }
					</td>
				</tr>
		</c:forEach>
	</table>
</body>
</html>

在這裏插入圖片描述


7-JQuery 省市聯動

city.jsp(頁面顯示):

<body>
	<select name="province" id="province">
		<option value="">---請選擇---
		<option value="1">福建省
		<option value="2">浙江省
		<option value="3">廣東省
		<option value="4">江西省
	</select>
	<select name="city" id="city">
		<option value="">---請選擇---
	</select>
</body>

search.js(在JQuery中,被city.jsp調用):

$(function() {
	$("#province").change(function() {
		var cid = $(this).val();
		$.post("SearchCityServlet", {cid:cid}, function(data, textStatus) {
			//alert(data);
			//添加之前先清空之前的數據
			$("#city").html("<option value=''>---請選擇---");
			//這裏的find()中的數據爲Servlet中將CityBean全路徑修改的標籤名
			$(data).find("city").each(function() {
				var id = $(this).children("id").text();	//.text取其中值
				var city = $(this).children("cname").text();
				$("#city").append("<option value='"+id+"'>"+city);//value後有""
			})
		})
	})
});

Dao內容:
(其中CityBean對象包含了id、cname和cid)

@Override
public List<CityBean> FindByCid(int cid) throws SQLException {
	QueryRunner qr = JDBCUtil_c3p0.getQR();
	String sql = "select * from city where cid = ?";
	List<CityBean> list = qr.query(sql, cid,new BeanListHandler<CityBean>(CityBean.class));
	return list;
}

Servlet實現(XStream的使用):
(注意:使用XStream之前必須得導入相關包)

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	try {
		//1.獲取參數並找到城市
		int cid = Integer.parseInt(request.getParameter("cid"));
		CityDao dao = new CityDaoImpl();
		List<CityBean> list = dao.FindByCid(cid);
		//2.利用XStream將list轉爲xml
		XStream x = new XStream();
		x.alias("city", CityBean.class);//將全路徑標籤變爲city標籤
		//x.useAttributeFor(CityBean.class, "id");//將id標籤變爲屬性
		String xml = x.toXML(list);
		//3.設置編碼(xml數據)並返回
		response.setContentType("text/xml;charset=utf-8");
		response.getWriter().write(xml);
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

在這裏插入圖片描述


這個案例中,不太好理解的估計就是search.js與Servlet之間的關係了。在Servlet中,利用XStream給CityBean這個對象轉換爲xml,然後再利用js把xml數據顯示到jsp頁面上進行顯示。

8-Json引入與省市聯動改進

上面用到的xml,在這裏我們引入了json。舉個例子看看json和xml的區別:
XML格式如下:

<list>
	<city>
		<id>1<id>
		<pid>1</pid>
		<cname>深圳</cname>
	</city>
	<city >
		<id>2<id>
		<pid>1</pid>
		<cname>東莞</cname>
	</city>
</list>

Json格式如下:

[
{"id":"1","pid":"1","cname":"深圳"},
{"id":"2","pid":"1","cname":"東莞"}
];

相比之下json的可讀性和佔用容量都優於xml
那現在我們使用json來完成一次省市聯動,這裏其他代碼都與之前類似,變動如下:
1、首先把jsp導入的js文件變成search_json.js
2、書寫search_json.js
3、書寫Servlet,封裝好json對象並傳遞

Servlet代碼:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	try {
		//1.獲取參數並找到城市
		int cid = Integer.parseInt(request.getParameter("cid"));
		CityDao dao = new CityDaoImpl();
		List<CityBean> list = dao.FindByCid(cid);
		//2.利用Json將list轉爲Json數據
		JSONArray ja = JSONArray.fromObject(list);
		String json = ja.toString();
		//3.設置編碼(Json數據)並返回
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().write(json);
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

search_json.js:

$(function() {
	$("#province").change(function() {
		var cid = $(this).val();
		$("#city").html("<option value''>---請選擇---");
		$.post("SearchCityByJson",{cid:cid},function(data,status){
			$(data).each(function(index,c){
				$("#city").append("<option value='"+c.id+"'>"+c.cname)
			});
		},"json");
	});
});

注意點:
1、Js中的each遍歷,json中有index,c c爲遍歷的單條信息,index爲索引
2、Js中使用json的post方法必須帶第四個參數,即傳遞數據方式,否則無法識別

HPF-自我總結

  js的代碼一開始寫確實不好理解,而且很容易出錯,多寫應該就會好很多了。
  其次是關於仿百度提示欄的一個問題,這是我在寫這篇博客的時候突然有的疑惑,也就是爲什麼Servlet將對象傳遞給jsp頁面1,而jsp頁面1的內容會在jsp頁面2顯示出來,我覺得我還是單獨寫一篇博客比較好,到時候會在這裏貼出博客地址。
  最後,如果有什麼問題的話歡迎交流,有幫助的話也請支持一下哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章