版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
首先,根據(jù)學(xué)生對課程的選擇,構(gòu)造請求參數(shù)字符串。學(xué)生選修一門課程,就是把該課程ID對應(yīng)的復(fù)選框選中。要確定學(xué)生選修了哪幾門課程,只需要看一下選中狀態(tài)的復(fù)選框有幾個(gè)即可?;叵胍幌翫OM操作中節(jié)點(diǎn)的引用(查找)方法(見6.3節(jié)表6-4),自HTML5以后新增了一個(gè)querySelectorAll()方法,可以按照CSS的選擇器選擇指定的元素。CSS提供了屬性選擇器和偽類(或偽元素),可以用來選擇某些網(wǎng)頁元素。在這里,我們需要查找所有type=’checkbox’,且checked屬性為checked的input元素,根據(jù)這個(gè)要求,我們可以構(gòu)造一個(gè)以下的選擇器:input[type='checkbox']:checked然后,可以使用document對象的querySelectorAll()方法查找所有符合這一選擇器的所有復(fù)選框,得到一個(gè)NodeList類型的集合。注意這個(gè)NodeList不是普通的數(shù)組,不能使用遍歷數(shù)組的辦法(for…in)遍歷這個(gè)集合。只能使用最原始的for循環(huán)來遍歷它,找到選擇的所有課程,獲取所有選中課程的代碼如下:varselectedCourses=document.querySelectorAll("input[type='checkbox']:checked");把所有選擇的課程構(gòu)造成以下格式的請求參數(shù)字符串:courseId=200807006&courseId=200807008&courseId=200907016請注意,最后一個(gè)課程ID(200907016)的后面沒有&符號,而其他課程ID后均有一個(gè)&符號,所以最后一個(gè)課程ID要進(jìn)行特殊處理。構(gòu)造請求參數(shù)的代碼如下:vardata=""; for(vari=0;i<selectedCourses.length;i++){ data+="courseId="+selectedCourses[i].value; if(i!=selectedCourses.length-1){ data+="&"; } }最后一個(gè)課程ID為selectedCourseNodeList中下標(biāo)為selectedCourse.length–1的課程對象的ID。所以每次循環(huán)中都要判定是否為最后一個(gè)元素,如果不是,則在其后添加&符號。如果是最后一個(gè)元素,則不添加&。這就保證了最后一個(gè)ID后面不會(huì)添加&,從而保證請求參數(shù)的最后不會(huì)加上&。構(gòu)造請求參數(shù)字符串以后,就是創(chuàng)建異步對象、初始化請求——這里請求的URL是studentServlet?method=selectCourse,即StudentServlet中的selectCourse方法,注冊事件處理程序處理服務(wù)器響應(yīng)結(jié)果,最后是發(fā)送數(shù)據(jù),也就是這里的請求參數(shù)字符串。這里需要強(qiáng)調(diào)的是:這個(gè)操作會(huì)對服務(wù)器產(chǎn)生影響(在服務(wù)器上保存數(shù)據(jù)),所以使用POST請求方式;以POST方式發(fā)送請求時(shí),在發(fā)送請求之前(即調(diào)用send()方法之前)設(shè)置請求頭Content-Type,其值為application/x-www-form-urlencoded。這一點(diǎn)是必須的,否則服務(wù)器收不到客戶端發(fā)送的數(shù)據(jù)。用到的代碼如下:req.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); req.send(data);提交選課請求的完整代碼如清單12-13所示。12.5.4顯示選課結(jié)果——selectResult函數(shù)
這個(gè)函數(shù)十分簡單,只是負(fù)責(zé)把服務(wù)器的響應(yīng)顯示在提示框中(即清單12-4中的<divid="tip"/>)。完整代碼如清單12-14所示,12.5.5控制層選課功能的實(shí)現(xiàn)——selectCourse控制層所有關(guān)于學(xué)生的功能都在StudentServlet類中實(shí)現(xiàn),選課功能也不例外。在StudentServlet.java中添加selectCourse方法,由于這個(gè)方法簽名比較長,難于記住,我們還是采用老辦法——復(fù)制+改名就可以了。在這個(gè)方法中,首先要做的是接收客戶端傳來的參數(shù)。在12.5.3節(jié),我們已經(jīng)注意到請求參數(shù)字符串的格式為:courseId=200807006&courseId=200807008&courseId=200907016也就是說相同名字的參數(shù)courseId有多個(gè),而不是只有一個(gè)。在JSP中接收這種“多值”參數(shù)用的是request對象(也就是形式參數(shù)req)的getParameterValues()方法,它返回一個(gè)String類型的數(shù)組,代碼如下:String[]courseIds=req.getParameterValues("courseId");第二步,接下來要做的就是從Session對象中(這也就是為什么要求選課之前必須登錄的原因)取出保存的學(xué)生ID(學(xué)號),并對響應(yīng)信息進(jìn)行初始化:Stringmsg="你還沒有登錄,請登錄后再選!"; StringstudentId=(String)req.getSession().getAttribute(Constants.USER_NAME);如果取出的studentId為null,也就是說學(xué)生尚未登錄,則直接提示"你還沒有登錄,請登錄后再選!",然后直接返回。if(null==studentId){ showTip(resp,msg); return; }這里的showTip方法就是BaseServlet中用于向客戶端發(fā)送文本消息的方法。它的完整代碼請參見12-2。如果學(xué)生已經(jīng)登錄,則調(diào)用業(yè)務(wù)邏輯層StudentLogic的saveSelectedCourse方法,并把學(xué)生的學(xué)號和已經(jīng)選擇的課程號傳遞給它,代碼如下:booleanflag=studentLogic.saveSelectedCourse(studentId,courseIds); if(flag){ msg="選課成功!"; }else{ msg="選課信息保存失敗"; } showTip(resp,msg); return;然后,根據(jù)saveSelectedCourse方法的返回值,如果為true,則表示選修課程保存成功,則向客戶端響應(yīng)“選課成功!”,否則向客戶端響應(yīng)“選課信息保存失敗”。saveSelectedCourse方法的完整代碼如清單12-15所示。12.5.6選修課程的業(yè)務(wù)層實(shí)現(xiàn)——saveSelectedCourse方法
這里主要的任務(wù)是構(gòu)造一個(gè)SQL的insert語句,將選擇的內(nèi)容(課程)保存到數(shù)據(jù)庫中。選課是向selcourse表中插入一條數(shù)據(jù),構(gòu)造的SQL語句如下:Stringsql="insertintoselcourse(selcurId,stuId,courseId,"+"selTerm,grade)values(?,?,?,?,?)";然后,調(diào)用BaseDao中的saveSelCourseBatch()方法,并將sql語句、學(xué)生的學(xué)號和選擇的課程作為參數(shù)傳遞給它,并返回它的返回值即可,代碼如下:booleanflag=baseDao.saveSelCourseBatch(sql,studentId,courseIds); returnflag;完整的代碼如清單12-16所示。12.5.7選修課程的DAO層實(shí)現(xiàn)——saveSelCourseBatch方法
雖然項(xiàng)目的框架實(shí)現(xiàn)了項(xiàng)目所需要的大部分功能,但DAO層并沒提供這個(gè)批處理保存的功能,所以需要我們來專門實(shí)現(xiàn)。要進(jìn)行數(shù)據(jù)庫操作,首先要?jiǎng)?chuàng)建Connection類型的對象conn和PreparedStatement類型的對象stmt,分別代碼Java的數(shù)據(jù)庫連接和預(yù)編譯的SQL語句。代碼如下:Connectionconn=null;PreparedStatementstmt=null;然后,獲取數(shù)據(jù)庫連接,構(gòu)造預(yù)處理語句,并對SQL語句中的參數(shù)(即清單12-16中構(gòu)sql中的?號所表示的參數(shù))進(jìn)行賦值,并把構(gòu)造好的每條SQL語句添加到批處理中,代碼如下:conn=getConnection();stmt=conn.prepareStatement(sql);for(inti=0;i<params.length;i++){stmt.setString(1,IDProducer.getId());stmt.setString(2,studentId);stmt.setString(3,params[i]);stmt.setString(4,null);stmt.setInt(5,0);stmt.addBatch();}其中,stmt.setString(1,IDProducer.getId())中的1表示SQL語句中的第1個(gè)?號,第二個(gè)參數(shù)IDProducer.getId()框架中產(chǎn)生ID(即數(shù)據(jù)庫主鍵的類,getId()是返回產(chǎn)生ID的方法)。stmt.setInt(5,0)與之類似,就是對第5個(gè)?號賦值,這個(gè)?號代表的是成績字段,這里賦初值為0。與之類似的還有setFloat()、setDouble()等等,每個(gè)Java的原始類型都有相應(yīng)的set方法。Stmt.addBatch()方法是將當(dāng)前生成的SQL語句放到批處理中,等待執(zhí)行。批處理語句添加完成后,就是執(zhí)行批處理,把其的SQL語句全部執(zhí)行一次,代碼如下:int[]rows=stmt.executeBatch();方法executeBatch()進(jìn)行批處理語句的執(zhí)行,并返回一個(gè)整型的數(shù)組,如果數(shù)組中的每個(gè)元素都為1,則表示批處理執(zhí)行成功,否則執(zhí)行失敗。下面的代碼是對執(zhí)行結(jié)果的判斷:if(null!=params&&null!=rows){if(params.length==rows.length){booleanflag=true;for(inti=0;i<rows.length;i++){if(rows[i]<=0){flag=false;break;}
}returnflag;}}這里的params是String類型的數(shù)組,為saveSelCourseBatch()方法的最后一個(gè)參數(shù),它表示學(xué)生一次選課所選擇的所有課程。每門課程在selcourse表中保存為一條記錄,所以要驗(yàn)證params數(shù)組的長度和rows整型數(shù)組(executeBtach()方法的返回值)的長度是否相等,if(params.length==rows.length)。若不相等,則批處理一定執(zhí)行失敗(說明有某門課程沒有保存到數(shù)據(jù)庫中)。只有二者相等的情況下,才進(jìn)行進(jìn)一步的判斷:先假定批處理執(zhí)行結(jié)果是成功的,即booleanflag=true;再遍歷這個(gè)rows數(shù)組,看是否每個(gè)元素都是1(即大于0)。如果有一個(gè)元素不是1,則表示批處理執(zhí)行失敗,剩下的沒有進(jìn)一步判斷的必要,把flag置為false,然后直接退出循環(huán),返回flag標(biāo)志,對應(yīng)的代碼如下:booleanflag=true;for(inti=0;i<rows.length;i++){if(rows[i]<=0){flag=false;break;}}returnflag;如果rows數(shù)組的每個(gè)元素都是1,數(shù)據(jù)庫批處理執(zhí)行成功,則flag保持最初的值true,表示批處理執(zhí)行成功。完整的代碼如清單12-17所示。經(jīng)過了很長一段時(shí)間的埋頭苦干,你已經(jīng)完成了選課功能的編寫,從視圖層到控制層,再到業(yè)務(wù)層,最后是DAO層。來回顧一下編寫代碼的歷程,整理一下自己的思路,你會(huì)得到如下的編寫/調(diào)用路徑,如圖12-8所示。圖12-8選課功能實(shí)現(xiàn)流程好了,有了這幅圖代碼編寫思路就十分清晰了。還有一個(gè)“查詢成績”的功能,請大家比照12.5節(jié)“選課功能的實(shí)現(xiàn)”,自己完成,鍛煉大家學(xué)以致用的能力。如果實(shí)在有困難的讀者,可以參照隨書源碼,該部分的源碼在第12章目錄下。為了大家學(xué)習(xí)方便,還在第12章目錄中放置了一個(gè)只有項(xiàng)目框架的“空項(xiàng)目”AjaxSyn_Empty,大家可以在這個(gè)“空項(xiàng)目”的基礎(chǔ)上進(jìn)行學(xué)習(xí)開發(fā),避免因敘述不周而造成的某些組件的缺失,造成項(xiàng)目無法運(yùn)行。
在不同的Eclipse中導(dǎo)入項(xiàng)目可能會(huì)產(chǎn)生錯(cuò)誤,解決辦法參見附錄A2.7。12.6總結(jié)
本章主要以學(xué)生選課系統(tǒng)實(shí)例描述了Ajax在JavaWeb項(xiàng)目中的實(shí)際應(yīng)用,實(shí)際上Ajax不只僅僅應(yīng)用于JavaWeb項(xiàng)目中,也可用于其他語言的Web系統(tǒng)。Ajax是獨(dú)立于任何Web平臺(tái)的,即可用于J
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年徐匯區(qū)人民調(diào)解協(xié)會(huì)招聘調(diào)解秘書備考題庫及參考答案詳解1套
- 2026年北京科電高技術(shù)有限公司招聘備考題庫及答案詳解1套
- 2026年北京知行派教育科技有限公司招聘備考題庫及一套答案詳解
- 2026年南寧市第五十四中學(xué)秋季學(xué)期招聘備考題庫及1套完整答案詳解
- 2025年懷化市鶴中一體化發(fā)展事務(wù)中心公開選調(diào)工作人員備考題庫及一套完整答案詳解
- 2026年外派至中鐵建昆侖高速公路運(yùn)營管理有限公司南充過境高速及德遂高速公路路巡隊(duì)員招聘備考題庫及一套答案詳解
- 2026年信陽城發(fā)水務(wù)有限公司招聘備考題庫及1套完整答案詳解
- 2026年中國信達(dá)資產(chǎn)管理股份有限公司招聘備考題庫及參考答案詳解1套
- 2026年南京大學(xué)招聘南京赫爾辛基大氣與地球系統(tǒng)科學(xué)學(xué)院助理備考題庫及完整答案詳解一套
- 2026年廣州市花都區(qū)第一幼兒園招聘備考題庫及答案詳解一套
- 社會(huì)保障概論(第七版) 課件 第2章 社會(huì)保障制度的產(chǎn)生和發(fā)展
- 核醫(yī)學(xué)總論教學(xué)課件
- 新風(fēng)機(jī)組施工方案(3篇)
- 北京市朝陽區(qū)2023-2024學(xué)年七年級上學(xué)期期末語文試題(解析版)
- 安徽省2025年普通高中學(xué)業(yè)水平合格性考試語文題庫及答案
- B細(xì)胞淋巴瘤課件
- 《這一次我全力以赴》(2023年廣東省中考滿分作文13篇附審題指導(dǎo))
- 空調(diào)技師考試題及答案
- FRNC-5PC工藝計(jì)算軟件操作的指南
- 人工智能工程質(zhì)量管理體系與措施
- 養(yǎng)老機(jī)構(gòu)殯葬協(xié)議書
評論
0/150
提交評論