一)什麼是JavaScript【以下簡稱JS】 JS是 (1)基於對象 JS本身就有一些現成的對象可供程式員使用,例如:Array,Math,String。。。 JS並不排除你可以自已按一定的規則創建對象 (2)事件驅動 JS代碼寫好後,需要外界觸發後,方可運行,例如:單擊事件,定時執行,。。。 ( ...
一)什麼是JavaScript【以下簡稱JS】
JS是
(1)基於對象
JS本身就有一些現成的對象可供程式員使用,例如:Array,Math,String。。。
JS並不排除你可以自已按一定的規則創建對象
(2)事件驅動
JS代碼寫好後,需要外界觸發後,方可運行,例如:單擊事件,定時執行,。。。
(3)解釋性
每次運行JS代碼時,得需要將原代碼一行一行的解釋執行
相對編譯型語言(例如:Java、C++)執行速度相對較慢
(4)基於瀏覽器的動態交互網頁技術
如果JS嵌入到HTML中,可以不需要伺服器支持,直接由瀏覽器解釋執行
如果JS嵌入到JSP或Servlet中,必需要伺服器支持,直接由瀏覽器解釋執行
(5)嵌入在HTML標簽中
JS必須嵌入到一個名叫<script src="引入外部js文件"></script>的標簽中,方可運行
腳本語言
二)JS中的三種類型
(1)基本類型:number,string,boolean
number包含正數,負數,小數
string由''或""定界
boolean由true或false,但js中的boolean也包含更多情況,例如:存在表示true,不存在表示false
var num = 100; var str = "哈哈"; var flag = false; window.alert(num); window.alert(str); window.alert(flag); |
(2)特殊類型:null,undefined
null表示一個變數指向null
undefined表示一個變數指向的值不確定
var array = null; var student; alert(array); alert(student); |
(3)複合類型:函數,對象,數組
對象包含內置對象和自定義的對象
三)JS中有三種定義函數的方式
(1)正常方式:function mysum(num1,num2){return num1+num2;}
function mysum(num1,num2){ return num1 + num2; } var myresult = mysum(100,200); alert("myresult="+myresult); |
(2)構造器方式:new Function("num1","num2","return num1+num2;")
var youresult = new Function("num1","num2","return num1+num2"); alert( youresult(1000,2000) ); |
(3)直接量或匿名或無名方式:var mysum = function(num1,num2){return num1+num2;}
var theyresult = function(num1,num2){ return num1 + num2; } alert( theyresult(10000,20000) ); |
四)JS中有四種對象
(1)內置對象 :Date,Math,String,Array,。。。
var str = new Date().toLocaleString(); window.document.write("<font size='44' color='red'>"+str+"</font>"); |
(2)自定義對象:Person,Card,。。。
function Student(id,name,sal){ //this指向s引用 this.id = id; this.name = name; this.sal = sal; } var s = new Student(1,"波波",7000); document.write("編號:" + s.id + "<br/>"); document.write("姓名:" + s.name + "<br/>"); document.write("薪水:" + s.sal + "<br/>"); |
(3)瀏覽器對象: window,document,status,location,history。。。
function myrefresh(){ window.history.go(0); } |
(4)ActiveX對象:ActiveXObject("Microsoft.XMLHTTP"),。。。
五)演示JS對象的屬性,方法和事件的使用
(1)window.location.href
var url = "04_array.html"; window.location.href = url; |
(2)form.submit()
<form action="/js-day01/04_array.html" method="POST"> <input type="button" value="提交到服務端" onclick="doSubmit()"/> </form> <script type="text/javascript"> function doSubmit(){ //表單提交 document.forms[0].submit(); } </script> |
(3)inputElement.onblur = 函數
(4)document.createElement(“img”)
(5)imgElement.style.width/height
六)回顧傳統Web應用請求和響應特點【顯示當前時間】
(1)請求:瀏覽器以HTTP協議的方式提交請求到伺服器
(2)響應:伺服器以HTTP協議的方式響應內容到瀏覽器
註意:HTTP是WEB大眾化非安全協議
HTTPS是WEB安全協議,是基於HTTP協議的,且加了一些加密等特殊功能,常用於線上支付,或者是需要安全性較高的網站中,例如:12306網站
HTTP請求有三個部份組成:請求行,請求頭,請求體
HTTP響應有三個部份組成:響應行,響應頭,響應體
(3)狀態欄:有明顯的進度條刷新現象,如果伺服器響應較慢的話,進度條刷新也會變慢,IE9等中高版本瀏覽器,有明顯轉圈圈圖標
(4)歷史欄:會收集原來已訪問過的web頁面,進行緩存
(5)缺點:不需變化的大量數據,也全部刷新,造成瀏覽器載入和處理負擔
(6)可改進的地方:讓不需變化的大量數據,原封不動,不用緩存到歷史欄中,無需全部刷新,只刷新某些需要變化的數據區域,例如:當前時間的區域
當前時間:<span>${requestScope.str}</span><br/> <input type="button" value="同步方式提交"/> |
<script type="text/javascript"> //定位button按鈕,同時添加單擊事件 document.getElementsByTagName("input")[0].onclick = function(){ var url = "${pageContext.request.contextPath}/TimeServlet?id="+new Date().getTime(); window.location.href = url; } </script> |
public class TimeServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { System.out.println("TimeServlet::doGet"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String str = sdf.format(new Date()); request.setAttribute("str",str); request.getRequestDispatcher("/06_time.jsp").forward(request,response); } } |
七)什麼是AJAX【Asynchronous非同步的JS和XML】,工作原理與特點
(1)什麼是同步:
請求1->響應1->請求2->響應2->
Web1.0時代
(2)什麼是非同步:
請求1->請求2->請求3->響應1->響應2->響應3->
請求1->響應1->請求2->請求3->響應2->響應3->
Web2.0時代
項目中:Web1.0為主(整個瀏覽器刷新),Web2.0為輔(瀏覽器局部刷新)
(3)什麼是AJAX
客戶端(特指PC瀏覽器)與伺服器,可以在【不必刷新整個瀏覽器】的情況下,與伺服器進行非同步通訊的技術
即,AJAX是一個【局部刷新】的【非同步】通訊技術
AJAX不是全新的語言,是2005年Google公司推出的一種全新【編程模式】,不是新的編程語言
(4)不用刷新整個頁面便可與伺服器通訊的辦法有:
(A)Flash/ActionScript
(B)框架Frameset
(C)iFrame(內嵌入框架)
(D)XMLHttpRequest(非IE瀏覽器)和ActiveXObject(IE瀏覽器)
背景:早上IE5時,微軟就開發出了第一個非同步通訊對象,叫ActiveXObject對象,
Firefox等其它瀏覽器廠商也慢慢引入非同步通訊對象,叫XMLHttpRequest對象,
IE的高版本,也將這個非同步對象取名叫XMLHttpRequest對象,但IE有向下相容問題,
也可以使用ActiveXObject對象。
無需第三方jar包,現代中高版本瀏覽器中內置了這個非同步通訊對象,只需通過JavaScript就可以創建
註意:所有瀏覽器中都內置了非同步對象,在預設情況下,該非同步對象並沒有創建出來
function createAJAX(){ var ajax = null; try{ ajax = new ActiveXObject("microsoft.xmlhttp"); }catch(e1){ ajax = new XMLHttpRequest(); } return ajax; } |
(5)AJAX工作原理
參見<<AJAX工作原理.JPG>>
(6)AJAX包含的技術
參見<<AJAX包含的技術.JPG>>
(7)AJAX開發步驟
步一:創建AJAX非同步對象,例如:createAJAX()
步二:準備發送非同步請求,例如:ajax.open(method,url)
步三:如果是POST請求的話,一定要設置AJAX請求頭,例如:ajax.setRequestHeader()
如果是GET請求的話,無需設置設置AJAX請求頭
步四:真正發送請求體中的數據到伺服器,例如:ajax.send()
步五:AJAX不斷的監聽服務端響應的狀態變化,例如:ajax.onreadystatechange,後面寫一個無名處理函數
步六:在無名處理函數中,獲取AJAX的數據後,按照DOM規則,用JS語言來操作Web頁面
(8)AJAX適合用在什麼地方
AJAX【適合】不用來傳遞大量數據,而只用來【傳遞少量數據】,在用戶的【體驗】上,【更加人性化】
AJAX是一個和伺服器無關的技術,即伺服器可使用:JavaEE,.NET,PHP,。。。這些技術都可
AJAX只管向伺服器發送請求,同時只管接收伺服器的HTML或XML或JSON載體響應
服務端不能使用轉發或重定向到web頁面,因為這樣會起瀏覽器全面刷新
即只能以流的方式響應給瀏覽器
八)AJAX應用
(1)無需刷新整個Web頁面顯示伺服器響應的當前時間
(text/html;charset=UTF-8)
當前時間:<span></span><br/> <input type="button" value="非同步方式提交"/> |
<script type="text/javascript"> //定位button按鈕,同時添加單擊事件 document.getElementsByTagName("input")[0].onclick = function(){ //NO1)創建AJAX非同步對象(每個瀏覽器內置的,無需第三方jar包) var ajax = createAJAX();//0 //NO2)AJAX非同步對象準備發送請求 var url = "${pageContext.request.contextPath}/TimeServletAjax?id="+new Date().getTime(); var method = "GET"; ajax.open(method,url);//1 //NO3)AJAX非同步對象真正發送請求體的數據到伺服器,如果請求體無數據的話,用null表示 var content = null; ajax.send(content);//2
//----------------------------------------等待
//NO4)AJAX非同步對象不斷監聽服務端狀態的變化,只有狀態碼變化了,方可觸發函數 //0-1-2-3-4,這些是可以觸發函數的 //4-4-4-4-4,這些是不可以觸發函數的 //以下這個函數是伺服器來觸發的,不是程式員觸發的,這和onclick是不一樣的 ajax.onreadystatechange = function(){ //如果AJAX狀態碼為4 if(ajax.readyState == 4){ //如果伺服器響應碼是200 if(ajax.status == 200){ //NO5)從AJAX非同步對象中獲取伺服器響應的結果 var str = ajax.responseText; //NO6)按照DOM規則,將結果動態添加到web頁面指向的標簽中 document.getElementsByTagName("span")[0].innerHTML = str; } } } } </script> |
public class TimeServletAjax extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String str = sdf.format(new Date()); //註意:在Web2.0時代,即非同步方式下,不能用轉發或重定向 //因為:轉發或重定向會引起瀏覽器全部刷新,而不是局部刷新 //所以得用以輸出流的方式將伺服器的結果輸出到瀏覽器 response.setContentType("text/html;charset=UTF-8"); PrintWriter pw = response.getWriter(); pw.write(str); pw.flush(); pw.close(); } } |
(2)基於HTML,以GET或POST方式,檢查註冊用戶名是否在資料庫中已存在(text/html;charset=UTF-8)
輸入用戶名[POST]:<input type="text" maxlength="8"/>游標移出後,立刻顯示結果 <hr/> <div></div> |
public class RegisterServletPost extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username"); String tip = "images/MsgSent.gif"; if("傑克".equals(username)){ tip = "images/MsgError.gif"; } response.setContentType("text/html;charset=UTF-8"); PrintWriter pw = response.getWriter(); pw.write(tip); pw.flush(); pw.close(); } } |
(3)基於XML,以POST方式,完成省份-城市二級下拉聯動
(text/xml;charset=UTF-8)
<select id="province" style="width:111px"> <option>選擇省份</option> <option>廣東</option> <option>湖南</option> <option>湖北</option> </select>
<select id="city" style="width:111px"> <option>選擇城市</option> </select> |
<script type="text/javascript"> //定位省份下拉框,同時添時內容改變事件 document.getElementById("province").onchange = function(){ //清除城市下拉框中的內容除第一項外 var citySelectElement = document.getElementById("city"); citySelectElement.options.length = 1; //獲取選中的省份 var i = this.selectedIndex; var optionElement = this[i]; var province = optionElement.innerHTML; //如果不是"選擇省份"的話 if("選擇省份" != province){ //NO1) var ajax = createAJAX(); //NO2) var method = "POST"; var url = "${pageContext.request.contextPath}/ProvinceCityServlet?id="+new Date().getTime(); ajax.open(method,url); ajax.setRequestHeader("content-type","application/x-www-form-urlencoded"); //NO3) var content = "province="+province; ajax.send(content);
//-------------------------------------------------
//NO4) ajax.onreadystatechange = function(){ if(ajax.readyState == 4){ if(ajax.status == 200){ //NO5) var xmlDocument = ajax.responseXML; //NO6)按照dom規則,解析xml文件中的所有內容 var cityElementArray = xmlDocument.getElementsByTagName("city"); var size = cityElementArray.length; for(var i=0;i<size;i++){ var cityElement = cityElementArray[i]; //innerHTML只能用於html和jsp頁面,不能用於xml頁面 //在xml頁面我們通常用firstChild.nodeValue去替代innerHTML var city = cityElement.firstChild.nodeValue; //<option></option> var optionElement = document.createElement("option"); //<option>廣州</option> optionElement.innerHTML = city; //<select id="city" style="width:111px"><option>廣州</option></select> citySelectElement.appendChild(optionElement); } } } } } } </script> |
public class ProvinceCityServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { this.doPost(request,response); } public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String province = request.getParameter("province");
response.setContentType("text/xml;charset=UTF-8"); PrintWriter pw = response.getWriter(); pw.write("<?xml version='1.0' encoding='UTF-8'?>"); pw.write("<root>");
if("廣東".equals(province)){ pw.write("<city>廣州</city>"); pw.write("<city>深圳</city>"); pw.write("<city>中山</city>"); pw.write("<city>珠海</city>"); }else if("湖南".equals(province)){ pw.write("<city>長沙</city>"); pw.write("<city>株洲</city>"); pw.write("<city>張家界</city>"); }else if("湖北".equals(province)){ pw.write("<city>武漢</city>"); pw.write("<city>黃崗</city>"); }
pw.write("</root>"); pw.flush(); pw.close(); } } |
(4)驗證碼檢查
(text/html;charset=UTF-8)
<form> 驗證碼: <input type="text" maxlength="4" size="4"/> <img src="image.jsp"/> <input type="button" value="看不清" size="2"/> <span></span> </form> |
<script type="text/javascript"> //定位按鈕,同時添加單擊事件 document.getElementsByTagName("input")[1].onclick = function(){ //定位img標簽,修改src屬性 document.images[0].src = "image.jsp?id="+new Date().getTime(); //清空span標簽中的內容 var spanElement = document.getElementsByTagName("span")[0]; spanElement.innerHTML = ""; //清空文本框中的內容 document.getElementsByTagName("input")[0].value = ""; } </script>
<script type="text/javascript"> //定位文本框,同時添加鍵盤彈起事件 document.getElementsByTagName("input")[0].onkeyup = function(){ //獲取輸入的驗證碼 var checkcode = this.value; //去空格 checkcode = trim(checkcode); //獲取驗證碼的長度 var size = checkcode.length; //如果長度為4 if(size == 4){ //NO1) var ajax = createAJAX(); //NO2) var method = "POST"; var url = "${pageContext.request.contextPath}/CheckcodeServlet?id="+new Date().getTime(); ajax.open(method,url); ajax.setRequestHeader("content-type","application/x-www-form-urlencoded"); //NO3) var content = "checkcode=" + checkcode; ajax.send(content);
//--------------------------------------------
//NO4) ajax.onreadystatechange = function(){ if(ajax.readyState == 4){ if(ajax.status == 200){ //NO5) var imagePath = ajax.responseText;
//NO6) var imgElement = document.createElement("img"); imgElement.src = imagePath; imgElement.style.width = "14px"; imgElement.style.height = "14px"; var spanElement = document.getElementsByTagName("span")[0]; spanElement.innerHTML = ""; spanElement.appendChild(imgElement); } } } }else{ //清空span標簽中的內容 var spanElement = document.getElementsByTagName("span")[0]; spanElement.innerHTML = ""; } } </script> |
public class CheckcodeServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); //獲取客戶端輸入的驗證碼 String checkcodeClient = request.getParameter("checkcode"); //獲取服務端產生的驗證碼 HttpSession httpSession = request.getSession(); String checkcodeServer = (String) httpSession.getAttribute("CHECKNUM"); //二個驗證碼進行比較 String tip = "images/MsgError.gif"; if(checkcodeClient!=null && checkcodeServer!=null && checkcodeClient.equals(checkcodeServer)){ tip = "images/MsgSent.gif"; } //以流的方式輸出tip變數 response.setContentType("text/html;charset=UTF-8"); PrintWriter pw = response.getWriter(); pw.write(tip); pw.flush(); pw.close(); } } |
九)XMLHttpRequest(即:AJAX)對象常用事件,方法和屬性
(1)事件:
ajax.onreadystatechange:表示AJAX非同步對象不斷監聽服務端的響應,
是由伺服器程式觸發,不是程式員觸發
(2)屬性:
ajax.readyState==0:表示AJAX非同步對象已創建好,但還沒有調用open()方法
ajax.readyState==1:表示AJAX非同步對象已調用open()方法,但還沒有調用send()方法
ajax.readyState==2:表示AJAX非同步對象已調用send()方法,但請求還沒有到達伺服器端
ajax.readyState==3:表示服務端已接收到AJAX非同步對象的請求,正在處理響應中。。。
ajax.readyState==【4】:表示AJAX非同步對象已經完完全全接收到了伺服器的響應信 息,但接收到的數據不一定都正確
上述5種狀態不是所有瀏覽器都相同,但狀態4每種瀏覽器都相同
ajax.status==200:表示AJAX非同步對象接收到響應碼,如果是200的話,表示一切正常
ajax.responseText:表示從AJAX非同步對象中獲取HTML載體中的數據
ajax.responseXML:表示從AJAX非同步對象中獲取XML載體中的數據
(3)方法:
ajax.open(method,url,可選的boolean值)
AJAX非同步對象準備發送非同步請求
參數一:以什麼方式發送,常用的用GET或POST,大小寫不敏感
參數二:發送到什麼地方去,常用Servlet或Struts2或SpringMVC來接收,
這裡只限於JavaEE學科
參數三:預設值為true,表示AJAX對象以【非同步】的方式提交到服務端
如果設置為false,表示AJAX對象以【同步】的方式提交到服務端
ajax.setRequestHeader("content-type","application/x-www-form-urlencoded")
表示將請求體中的內容,按照UTF-8的方式進行編碼,只針對POST請求有效
ajax.send(content)
AJAX非同步對象真正發送非同步請求
參數一:表示HTTP【請求體】中的內容
如果是GET方式:content = null,如果強行傳值到伺服器,服務端收不到,返回NULL
如果是POST方式:content != null,例如:username=jack&password=123&role=admin
十)數據載體
(1)HTML
(A)優點:服務端響應的是普通html字元串,無需JS解析,配合innerHTML屬性效率高
(B) 缺點:如果需要更新WEB頁面中的很多處地方,HTML不太方便,同時innerHTML屬性不是DOM的標準,不能操作XML
註意:innerHTML在xml中不能使用,用firstChild.nodeValue替代
(C)適合:小量數據載體,且只更新在web頁面中的一個地方
(2)XML
(A)優點:是種通用的普通字元串格式,任何技術都能解析,標簽名可以任意,使用DOM標準規則能夠解析XML的任何部分
(B)缺點:XML文件格式相當嚴格,出錯後,responseXML屬性返回NULL,如果XML文件過長,導致解析效率低下
(C)適合:大量具有層次數據載體
(3)JSON (下次課講)+ struts2框架
兼備HTML和XML的特點