《HTML教程》-12.4.3-14.4.5教學(xué)材料_第1頁
《HTML教程》-12.4.3-14.4.5教學(xué)材料_第2頁
《HTML教程》-12.4.3-14.4.5教學(xué)材料_第3頁
《HTML教程》-12.4.3-14.4.5教學(xué)材料_第4頁
《HTML教程》-12.4.3-14.4.5教學(xué)材料_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

絕對不能對innerHTML顯示的元素注冊事件處理程序發(fā)送Ajax請求!否則,就起不到Ajax應(yīng)有的作用!Ajax的作用是在不刷新當(dāng)前網(wǎng)頁的情況下請求服務(wù)器,并用服務(wù)器返回的數(shù)據(jù),更新當(dāng)前頁面。如果對innerHTML顯示的元素注冊事件處理程序,發(fā)送Ajax請求,則相當(dāng)于在另一個頁面中發(fā)起請求,會刷新當(dāng)前頁面,起不到Ajax應(yīng)有的作用!這個問題的現(xiàn)象就是,Ajax請求收不到服務(wù)器端的響應(yīng),不會觸發(fā)readystatechange事件,同時刷新當(dāng)前頁面。如果遇到這種現(xiàn)象,你就有可能掉入innerHTML的怪圈。為了說明這個問題,讓我們修改一下loginView(清單12-6)和login.html(清單12-7)的代碼,修改方法如下:Login.html文件修改如下:將以下代碼的注釋標(biāo)記去掉,也就是說使用login.html中的“登錄”按鈕,而不是通過創(chuàng)建DOM節(jié)點的方式創(chuàng)建“登錄”按鈕。<!--<tr><thcolspan="2"><buttonid="loginBtn">登錄</button></th></tr>-->loginView修改如下:將以下代碼varloginBtn=document.createElement("input"); loginBtn.setAttribute("type","button"); loginBtn.setAttribute("value","登錄"); addEvent(loginBtn,'click',login); container.appendChild(loginBtn);修改為varloginBtn=document.getElementById("loginButton");addEvent(loginBtn,'click',login);也就是說,不再使用創(chuàng)建DOM節(jié)點的方式創(chuàng)建“登錄”按鈕,而是使用login.html中的登錄按鈕。從清單12-6可以看出,loginView中的數(shù)據(jù)處理是把login.html的內(nèi)容,通過innerHTML屬性顯示在ID為container的div中,也就是說,現(xiàn)在我們給innerHTML中的元素——也就是“登錄”按鈕——注冊了事件處理程序,讓innerHTML中的按鈕向服務(wù)器發(fā)送Ajax請求。現(xiàn)在運行一下程序——當(dāng)然你必須在服務(wù)器端代碼完成之后,才可以運行這個應(yīng)用——看看你觀察到了什么?12.4.4登錄功能的控制層實現(xiàn)——login方法在JavaWeb應(yīng)用中,以Servlet作為控制層。如果你沒學(xué)習(xí)過JSP的內(nèi)容,那就把Servlet作為能夠在服務(wù)器端運行的Java代碼就可以了。。在學(xué)習(xí)的過程中,沒有接觸過Java的同學(xué),可以只編寫客戶端程序,也就是我們的Ajax程序,服務(wù)器端的程序只要復(fù)制隨書源代碼就可以了回想一下12.2.1節(jié),我們已經(jīng)在BaseServlet.java中實現(xiàn)了最基本的控制分發(fā)、客戶端數(shù)據(jù)響應(yīng)等功能,這里只需要繼承這個BaseServlet,就可以重用這些基本的功能啦。在com.phoenix.servlet包中新建StudentServlet.java類(方法見附錄A2.3),讓它繼承自BaseServlet。在StudentServlet.java類中,新建login()方法。因為,要使用BaseServlet中的控制分發(fā)功能,所以這個login()方法的簽名要與BaseServlet中的doGet或doPost一致。由于doGet或doPost的簽名比較長,不容易記住??梢圆捎脧?fù)制BaseServlet中的doGet方法,然后改名為login,再把方法體中的內(nèi)容刪除的方法新建login()方法。完整的login方法代碼如清單12-9所示。登錄功能需要接收客戶端傳來的“學(xué)號”和“密碼”,并與數(shù)據(jù)庫中保存的學(xué)生信息進(jìn)行比對。如果一致,則把學(xué)生的信息保存在Session對象(JSP中表示服務(wù)器與客戶端的一次會話)中,并向客戶端返回“登錄成功!”的處理結(jié)果。如不一致,則直接返回“登錄失敗!”的處理結(jié)果。首先,要取得客戶端傳的學(xué)號和密碼。在JSP(或Servlet)中可以使用request對象(HttpServletRequest類型的對象,也就是這里的req參數(shù))接收客戶端傳來的請求參數(shù),代碼如下:StringstudentId=req.getParameter("studentId"); Stringpassword=req.getParameter("password");回想一下清單12-8中客戶端login登錄代碼中,封裝的請求字符串:vardata="studentId="+studentId+"&password="+password;“=”前面的studentId和password就是請求參數(shù)的名字,正與req.getParameter("studentId")方法中的參數(shù)studentId一致。這就是服務(wù)器端接收客戶端請求參數(shù)的方法。第二,將客戶輸入的“學(xué)號”和“密碼”與數(shù)據(jù)庫中的學(xué)生信息進(jìn)行比較。這是通過業(yè)務(wù)邏輯類StudentLogic(這里的studengLogic變量就是StudentLogic對象)來實現(xiàn)的,代碼如下:booleanisLogin=studentLogic.isLogin(studentId,password);StudentLogic的實現(xiàn)見12.3.4節(jié),到時再討論isLogin()方法的詳細(xì)實現(xiàn)。如果isLogin()方法返回true,說明輸入的學(xué)號和密碼與數(shù)據(jù)庫中的一致,可以進(jìn)行登錄。若返回false,則表示登錄失敗。實現(xiàn)登錄的代碼如下:Stringtip="登錄失??!"; if(isLogin){//登錄成功 HttpSessionsession=req.getSession(); session.setAttribute(Constants.USER_NAME,studentId); tip="登錄成功!"; } this.writeJSONString(resp,tip);如果登錄成功,即isLogin()返回true,也就是if條件為真,則把學(xué)生的學(xué)號保存在session對象(HttpSession類型的對象)中。在Servlet中可以通過request對象(即這里的變量req)的getSession()方法獲取session對象,而不能像JSP中直接使用session這個內(nèi)置對象。獲取session對象之后,可以通過它的setAttribute()方法將學(xué)號保存在session中,完成用戶登錄,并修改tip(提示信息)的值為“登錄成功!”,返回到客戶端。writeJSONString()函數(shù)(也可以使用showTip方法)即BaseServlet.java(見12.2.1節(jié))中向客戶端回送信息的方法。12.4.5登錄功能的邏輯層實現(xiàn)——isLogin方法

在MVC模型中,用于業(yè)務(wù)邏輯處理部件,比如這里的登錄邏輯處理,稱為邏輯層??刂茖痈鶕?jù)用戶的請求,調(diào)用相應(yīng)的邏輯層方法完成用戶的請求。邏輯層是由普通的Java類來實現(xiàn)的,它與普通的Java類沒有任何不同,都包含自己的屬性和方法。關(guān)于學(xué)生的選課功能都在StudentLogic類中完成。在項目的com.phoenix.logic包下新建StudentLogic.java類(新建類的方法見附錄A2.2),并在類中添加以下代碼:privateBaseDaobaseDao=newBaseDao();這是創(chuàng)建業(yè)務(wù)邏輯層操作數(shù)據(jù)庫所需要的對象baseDao,供StudentLogic類中的所有方法使用。然后輸入清單12-10所示的代碼,也就是isLogin方法的實現(xiàn)代碼。視野拓展

這種聲明對象的方式是對于每一個StudentLogic對象都聲明一個BaseDao對象,這種方式稱為“多例模式”(相對于“單例模式”而言)。這種方式創(chuàng)建的對象比較多,對服務(wù)器硬件的要求較高。實際應(yīng)用中,根據(jù)需要使用“單例模式”?!皢卫J健敝行枰紤]“線程安全”的問題。為了簡化項目案例,這里并不討論設(shè)計模式的有關(guān)問題,請有興趣的讀者參閱相關(guān)書箱。雖然這里不要求大家掌握這些內(nèi)容,但作為一名合格的程序員,應(yīng)該具備這方面的知識,所以大家作為學(xué)習(xí)方向,自學(xué)一下這些方面的內(nèi)容。在這個方法中,我們首先給定了要在數(shù)據(jù)庫中執(zhí)行的SQL語句:select*fromstuwherestuId=?andpassword=?它的意思是要從數(shù)據(jù)庫表stu中,選取字段stuId和password分別等于形式參數(shù)studentId和password的學(xué)生記錄。上述SQL語句在baseDao(基礎(chǔ)框架BaseDao的實例)中執(zhí)行,并返回一個List<Student>,它是一個泛型的List,說明這個List中存放的都是Student對象。如果這個List(即students變量)不為null,而且

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論