Ajax && Jquery&&百度搜索提示&&JQuery實現省市聯動
Ajax
是什麼?
AJAX即“Asynchronous Javascript And XML”(非同步JavaScript和XML),是指一種建立互動式網頁應用的網頁開發技術 , 它並不是一種新的技術
ajax並非一種新的技術,而是幾種原有技術的結合體。它由下列技術組合而成。
1.使用CSS和XHTML來表示。
2. 使用DOM模型來互動和動態顯示。
3.使用XMLHttpRequest來和伺服器進行非同步通訊。
4.使用javascript來繫結和呼叫。
在上面幾中技術中,除了XmlHttpRequest物件以外,其它所有的技術都是基於web標準並且已經得到了廣泛使用,XMLHttpRequest雖然目前還沒有被W3C所採納,但是它已經是一個事實的標準,因為目前幾乎所有的主流瀏覽器都支援它。
有什麼用?
傳統的網頁,如果需要更新內容,必須載入整個網頁。 如果只需要對網頁上的某個內容進行區域性重新整理, 那麼就需要使用到Ajax了。 它可以讓我們無需重新載入全部網頁內容,即可完成對某個部分的內容執行重新整理 。 最典型的的例子, 莫過於大家在註冊網站的時候, 輸入的使用者名稱,會自動的提示我們,該使用者已被註冊。
AJAX - 向伺服器傳送請求:
get方法:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <!-- 使用Ajax演示get方法 --> <script type="text/javascript"> //1.獲取XMLHttpRequest的物件 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; } //2.執行get請求 function get() { //1.建立XMLHttpRequest的物件 var request=ajaxFunction(); //2.傳送請求 /* 引數一: 請求型別 GET or POST 引數二: 請求的路徑 引數三: 是否非同步, true or false */ request.open("GET","DemoServlet01?name=zhangsan&age=18",true); //3. 獲取響應資料 註冊監聽的意思。 一會準備的狀態發生了改變,那麼就執行 = 號右邊的方法 request.onreadystatechange=function() { //前半段表示 已經能夠正常處理。 再判斷狀態碼是否是200 if (request.readyState==4 && request.status==200) { //彈出相應的資訊 alert(request.responseText); } } request.send(); } </script> </head> <body> <h2><a href=" " onclick="get()" >這是一個get請求</a></h2> </body> </html>
Post方法:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<!-- 使用Ajax演示post方法 -->
<script type="text/javascript">
//1.獲取XMLHttpRequest的物件
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;
}
//2.提交物件
function post() {
//獲取XMLHttpRequest物件
var request=ajaxFunction();
//2.傳送請求
request.open("POST","DemoServlet01",true);
//想獲取伺服器傳送過來的資料, 加一個狀態的監聽。
request.onreadystatechange=function(){
if(request.readyState==4 && request.status == 200){
alert("post:"+request.responseText);
}
}
//3.帶上引數 ,如果使用的是post方式帶資料,那麼 這裡要新增頭, 說明提交的資料型別是一個經過url編碼的form表單資料
request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
//4.傳送
request.send("name=Bill&age=18");
}
</script>
</head>
<body>
<h2><a href="" onclick="post()">這是一個post請求</a></h2>
</body>
</html>
伺服器響應:
如需獲得來自伺服器的響應,請使用 XMLHttpRequest 物件的 responseText 或 responseXML 屬性。
responseText | 獲得字串形式的響應資料。 |
responseXML | 獲得 XML 形式的響應資料。 |
onreadystatechange 事件
當請求被髮送到伺服器時,我們需要執行一些基於響應的任務。
每當 readyState 改變時,就會觸發 onreadystatechange 事件。
readyState 屬性存有 XMLHttpRequest 的狀態資訊。
下面是 XMLHttpRequest 物件的三個重要的屬性:
屬性 | 描述 |
---|---|
onreadystatechange | 儲存函式(或函式名),每當 readyState 屬性改變時,就會呼叫該函式。 |
readyState | 存有 XMLHttpRequest 的狀態。從 0 到 4 發生變化。
|
status | 200: "OK" 404: 未找到頁面 |
GET 還是 POST?
與 POST 相比,GET 更簡單也更快,並且在大部分情況下都能用。
然而,在以下情況中,請使用 POST 請求:
- 無法使用快取檔案(更新伺服器上的檔案或資料庫)
- 向伺服器傳送大量資料(POST 沒有資料量限制)
- 傳送包含未知字元的使用者輸入時,POST 比 GET 更穩定也更可靠
例項:校驗使用者密碼
前端頁面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
//使用ajax演示使用者名稱校驗
//1.獲取XMLHttpRequest的物件
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;
}
//2.提交物件
function checkUserName() {
//1.獲取輸入框的內容
var name=document.getElementById("name").value;
//2.建立XMLHttpRequest物件
var xmlHttp=ajaxFunction();
//傳送資料到伺服器
xmlHttp.open("POST","/AjaxDemo01/CheckUserNameServlet",true);
//獲取伺服器發來的資料,註冊監聽
xmlHttp.onreadystatechange=function(){
if(xmlHttp.readyState==4 && xmlHttp.status == 200){
var rs=xmlHttp.responseText;
if(rs==1)
document.getElementById("span01").innerHTML="<font color='red'>使用者名稱已存在!</font>";
else
document.getElementById("span01").innerHTML="<font color='green'>使用者名稱可用</font>";
}
}
//3.帶上引數 ,如果使用的是post方式帶資料,那麼 這裡要新增頭, 說明提交的資料型別是一個經過url編碼的form表單資料
xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
//4.傳送
xmlHttp.send("name="+name);
}
</script>
</head>
<body>
<TABLE>
<TR>
<TD>使用者名稱:</TD>
<TD><INPUT TYPE="text" NAME="name" id="name" onblur="checkUserName()"><span id="span01"></span></TD>
</TR>
<TR>
<TD>密碼:</TD>
<TD><INPUT TYPE="text" NAME="psw"></TD>
</TR>
<TR>
<TD>郵箱:</TD>
<TD><INPUT TYPE="text" NAME="mail"></TD>
</TR>
<TR>
<TD>簡介:</TD>
<TD><TEXTAREA NAME="" ROWS="5" COLS="5"></TEXTAREA></TD>
</TR>
<tr>
<td colspan="2"><input type="submit" value="註冊"></td>
</tr>
</TABLE>
</body>
</html>
用於檢查使用者名稱的Servlet:
public class CheckUserNameServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//1.用於檢查使用者名稱
String name = request.getParameter("name");
System.out.println("name="+name);
UserDao dao=new UserDaoImpl();
boolean isExist = dao.checkUserName(name);
//2.通知頁面,是否有該使用者名稱
if (isExist) {
response.getWriter().println(1);//有該使用者
} else {
response.getWriter().println(2);//未有該使用者
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Dao實現:
public class UserDaoImpl implements UserDao {
public boolean checkUserName(String name) throws SQLException {
QueryRunner runner=new QueryRunner(JDBCUtil.getDataSource());
String sql="select count(*) from t_suer where username =?";
Long resault = (Long) runner.query(sql, new ScalarHandler(),name);
return resault>0;
}
}
JQuery
是什麼?
javascript 的程式碼框架。
有什麼用?
簡化程式碼,提高效率。write less do more , 寫得更少,做的更多。
jQuery load() 方法
jQuery load() 方法是簡單但強大的 AJAX 方法。
load() 方法從伺服器載入資料,並把返回的資料放入被選元素中。
語法:
$(selector).load(URL,data,callback);
例子:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
<script type="text/javascript">
function show() {
//找到這個元素, 去執行載入的動作, 載入/day16/DemoServlet02 , 得到的資料,賦值顯示
$("#aaa").load("/AjaxDemo01/DemoServlet02" , function(responseText , statusTXT , xhr) {
//找到id為text01的元素, 設定它的value屬性值為 responseText 對應的值
$("#aaa").val(responseText);
});
}
</script>
</head>
<body>
<input type="button" value="使用jQuery演示load方法" onclick="show()"/>
<input type="text" id="aaa">
</body>
</html>
HTTP 請求:GET vs. POST
兩種在客戶端和伺服器端進行請求-響應的常用方法是:GET 和 POST。
- GET - 從指定的資源請求資料
- POST - 向指定的資源提交要處理的資料
GET 基本上用於從伺服器獲得(取回)資料。註釋:GET 方法可能返回快取資料。
POST 也可用於從伺服器獲取資料。不過,POST 方法不會快取資料,並且常用於連同請求一起傳送資料。
get() 方法
$.get() 方法通過 HTTP GET 請求從伺服器上請求資料。
語法:
$.get(URL,callback);
必需的 URL 引數規定您希望請求的 URL。
可選的 callback 引數是請求成功後所執行的函式名。
例項:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
<script type="text/javascript">
function get() {
$.get("/AjaxDemo01/DemoServlet02?name=zhangsan&age=18" , function(data ,status) {
$("#div01").text(data);
});
}
</script>
</head>
<body>
<input type="button" value="使用jQuery演示get方法" onclick="get()"/>
<div id="div01" style="width: 100px;height: 100px; border: 1px solid blue; ">
</div>
</body>
</html>
post方法:
$.post() 方法通過 HTTP POST 請求從伺服器上請求資料。
語法:
$.post(URL,data,callback);
必需的 URL 引數規定您希望請求的 URL。
可選的 data 引數規定連同請求傳送的資料。
可選的 callback 引數是請求成功後所執行的函式名。
賦值顯示
val("aa"); ---只能放那些標籤帶有value屬性
html("aa"); ---寫html程式碼
text("aa");
其實沒有什麼區別,如果想針對這分資料做html樣式處理,那麼只能用html()
例項:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
<script type="text/javascript">
function post() {
$.post("/AjaxDemo01/DemoServlet02",{name:"zhangsan",age:18}, function(data ,status) {
$("#div01").html(data);
});
}
</script>
</head>
<body>
<input type="button" value="使用jQuery演示post方法" onclick="post()"/>
<div id="div01" style="width: 100px;height: 100px; border: 1px solid blue; ">
</div>
</body>
</html>
使用JQuery校驗使用者名稱
前端頁面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
<script type="text/javascript">
//使用jQuery演示使用者名稱校驗
function checkUserName() {
//1.獲取輸入框的資料
var name=$("#name").val();
//2.傳送請求給伺服器
$.post("/AjaxDemo01/CheckUserNameServlet",{name:name},function(data ,status){
if (data==1) {
//3.輸出到頁面上
$("#span01").html("<font color='red'>使用者名稱已被註冊</font>");
} else {
$("#span01").html("<font color='green'>使用者名稱可以使用</font>")
}
})
}
</script>
</head>
<body>
<TABLE>
<TR>
<TD>使用者名稱:</TD>
<TD><INPUT TYPE="text" NAME="name" id="name" onblur="checkUserName()"><span id="span01"></span></TD>
</TR>
<TR>
<TD>密碼:</TD>
<TD><INPUT TYPE="text" NAME="psw"></TD>
</TR>
<TR>
<TD>郵箱:</TD>
<TD><INPUT TYPE="text" NAME="mail"></TD>
</TR>
<TR>
<TD>簡介:</TD>
<TD><TEXTAREA NAME="" ROWS="5" COLS="5"></TEXTAREA></TD>
</TR>
<tr>
<td colspan="2"><input type="submit" value="註冊"></td>
</tr>
</TABLE>
</body>
</html>
後端通前面Ajax的一樣。。。
實現百度搜索提示:jaxDemo02baidu
前端頁面:
<%@ 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 charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="js/qiandu.js"></script>
</head>
<body>
<center>
<h2>千度</h2>
<input type="text" name="word" id="word" style="width: 600px;height: 50px;font-size: 20px;">
<input type="button" value="揪一下" style="width: 100px;height: 50px;"/>
<div id="div01" style="position:relative; left : -54px; width: 600px; height: 200px ; border: 1px solid blue; display: none"></div>
</center>
</body>
</html>
js部分:
/**
* 捕捉鍵盤彈起事件
* 在文件準備就緒的時候,對某一個元素進行onkeyup事件監聽
*/
$(function() {
$("#word").keyup(function() {
//1.獲取輸入的值
var word=$("#word").val();
//2.請求資料
if (word=="") {//頁面無輸入時,隱藏提示框
$("#div01").hide();
} else {//頁面有輸入時,根據查詢伺服器的資料,在提示框顯示
$.post("FindWordServlet",{word:word},function(data,status){
//alert(data);
$("#div01").show();
$("#div01").html(data);
});
}
})
});
用於處理頁面請求的Servlet :
public class FindWordServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//1.獲取頁面資料
String word = request.getParameter("word");
System.out.println("word="+word);
//2.執行查詢
WordsDao dao=new WordsDaoImpl();
List<WordBean> list = dao.findWord(word);
//3.返回資料
response.setContentType("text/html;charset=utf-8");
// response.getWriter().write("資料是:");
//存值
request.setAttribute("list", list);
//返回一個頁面,把list.jsp上的內容返回給頁面
request.getRequestDispatcher("list.jsp").forward(request, response);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
list.jsp頁面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<table style="width: 100%">
<c:forEach items="${list }" var="w">
<tr>
<td>
${w.word }
</td>
</tr>
</c:forEach>
</table>
封裝查詢結果的bean:
public class WordBean {
private int id;
private String word;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
}
dao實現:
public class WordsDaoImpl implements WordsDao {
public List<WordBean> findWord(String word) throws SQLException {
QueryRunner runner=new QueryRunner(JDBCUtil.getDataSource());
return runner.query("select * from word where word like ? limit ?",
new BeanListHandler<WordBean>(WordBean.class),word+"%",5);
}
}
使用JQuery實現省市聯動:
前端頁面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
<!-- 這是使用xml的方式
<script type="text/javascript" src="js/city_xml.js"></script>
-->
<!-- 這是使用json-->
<script type="text/javascript" src="js/city_json.js"></script>
</head>
<body>
省份:<select name="province" id="province">
<option value="">-請選擇-
<option value="1">陝西
<option value="2">四川
<option value="3">廣州
</select>
城市:<select name="city" id="city">
<option value="">-請選擇-
</select>
</body>
</html>
1.使用XML格式傳輸資料
js程式碼:
/**
* 用xml的方式省市聯動
*/
$(function () {
//1.找到省份的元素
$("#province").change(function() {
//2.獲取省份的pid
var pid=$(this).val();
$.post("CityServlet",{pid:pid},function(data,status){
//清空之前的值
$("#city").html("<option value=''>-請選擇-");
//從data資料裡面找出所有的city , 然後遍歷所有的city。
//遍歷一個city,就執行一次function方法data裡面找出所有的city,然後遍歷
$(data).find("city").each(function() {
//遍歷出來的每一個city,取它的孩子. id , cname
var id = $(this).children("id").text();
var cname = $(this).children("cname").text();
$("#city").append("<option value='"+id+"' >"+cname)
});
});
});
});
使用XML格式的Servlet:
public class CityServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//1.獲取頁面提交的省份pid
int pid = Integer.parseInt(request.getParameter("pid"));
//2.根據pid查詢城市
CityDao dao=new CityDaoImpl();
List<CityBean> list = dao.findCity(pid);
//3.把資料返回到頁面--->>XStream 轉化bean對物件為xml;
XStream xStream=new XStream();
//把id變成屬性
// xStream.useAttributeFor(CityBean.class, "id");
//設定別名
xStream.alias("city", CityBean.class);
//把list集合轉化成一個xml字串
String xml = xStream.toXML(list);
response.setContentType("text/xml;charset=utf-8");
response.getWriter().write(xml);
} catch (SQLException e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
2.使用json格式傳輸資料
js程式碼:
$(function () {
//1.找到省份的元素
$("#province").change(function() {
//2.獲取省份的pid
var pid=$(this).val();
$.post("CityServlet2",{pid:pid},function(data,status){
//清空之前的值
$("#city").html("<option value=''>-請選擇-");
//遍歷,追加
$(data).each(function(index,c) {
$("#city").append("<option value='"+c.id+"'>"+c.cname);
});
},"json");
});
});
使用Json格式的Servlet :
public class CityServlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//1.獲取頁面提交的省份pid
int pid = Integer.parseInt(request.getParameter("pid"));
//2.根據pid查詢城市
CityDao dao=new CityDaoImpl();
List<CityBean> list = dao.findCity(pid);
//3.把list轉成json資料
//JSONArray-->>變成陣列或集合 []
//JSObject-->>變成普通資料 {}
JSONArray jsonArray=JSONArray.fromObject(list);
String json = jsonArray.toString();
//4.傳送資料給頁面
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(json);
} catch (SQLException e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
用於封裝城市查詢結果的bean:
public class CityBean {
private int id;
private int pid;
private String cname;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
}
用於根據省份id查詢城市的dao:
public class CityDaoImpl implements CityDao {
public List<CityBean> findCity(int pid) throws SQLException {
QueryRunner runner=new QueryRunner(JDBCUtil.getDataSource());
return runner.query("select * from city_province where pid=?",
new BeanListHandler<CityBean>(CityBean.class),pid);
}
}
XStream的使用:轉化 bean物件成 xml
// XStream 轉化 bean物件成 xml
XStream xStream = new XStream();
//想把id做成屬性
xStream.useAttributeFor(CityBean.class, "id");
//設定別名
xStream.alias("city", CityBean.class);
//轉化一個物件成xml字串
String xml = xStream.toXML(list);
轉化bean物件成json
//3.把list轉成json資料
//JSONArray-->>變成陣列或集合 []
//JSObject-->>變成普通資料 {}
JSONArray jsonArray=JSONArray.fromObject(list);
String json = jsonArray.toString();
伺服器和客戶端資料傳輸的方式
xml:
<list>
<city>
<id>1<id>
<pid>1</pid>
<cname>深圳</cname>
</city>
<city >
<id>2<id>
<pid>1</pid>
<cname>東莞</cname>
</city>
</list>
Json:閱讀性更好 、 容量更小。
{"name":"aaa" , "age":19}