




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、v 創(chuàng)建新項(xiàng)目v 用Struts 設(shè)計(jì)器制作前臺(tái)業(yè)務(wù)流程v 設(shè)計(jì)業(yè)務(wù)層功能v 開(kāi)發(fā)業(yè)務(wù)層和DAO 層代碼v 開(kāi)發(fā)前臺(tái)頁(yè)面流程v 整合Spring,Struts 和Hibernatev 發(fā)布,運(yùn)行,測(cè)試使用使用SSH開(kāi)發(fā)增刪改查的綜合用戶(hù)管理例子開(kāi)發(fā)增刪改查的綜合用戶(hù)管理例子第一部分第一部分 創(chuàng)建新項(xiàng)目創(chuàng)建新項(xiàng)目創(chuàng)建新項(xiàng)目創(chuàng)建新項(xiàng)目v 創(chuàng)建Web 項(xiàng)目ssh2v 加入 Struts 開(kāi)發(fā)功能v 使用Struts 工具開(kāi)發(fā)v 數(shù)據(jù)庫(kù)student1v 實(shí)現(xiàn)功能:對(duì)用戶(hù)的增刪改查n 前臺(tái):需要加入增加,修改刪除和查詢(xún)用戶(hù)所對(duì)應(yīng)的頁(yè)面n 后臺(tái)功能通過(guò)調(diào)用Struts Action 來(lái)完成,Struts
2、 的Action 再委托給業(yè)務(wù)層StudentManager 類(lèi)來(lái)完成n 根據(jù)個(gè)人愛(ài)好的不同,你既可以先完成前臺(tái)的頁(yè)面,也可以先把后臺(tái)的業(yè)務(wù)類(lèi)寫(xiě)完整,或者是兩個(gè)人分工的話一人負(fù)責(zé)一部分創(chuàng)建Web 項(xiàng)目v 選擇菜單選擇菜單File New Web Projectv 在在Project Name中輸入中輸入ssh2v 選中選中J2EE Specification Level下面的下面的Java EE 5.0 單選單選鈕鈕n 選擇哪個(gè)版本的選擇哪個(gè)版本的J2EE Specification Level 取決于你使用的服取決于你使用的服務(wù)器務(wù)器uTomcat4,Weblogic 9 以下版本請(qǐng)選擇以下
3、版本請(qǐng)選擇J2EE 1.4uTomcat 5,JBoss 4可以選擇可以選擇 Java EE 5.0n Java EE 5.0 可以直接使用可以直接使用 EL 表達(dá)式和表達(dá)式和JSTLv 最后點(diǎn)擊最后點(diǎn)擊Finish按鈕按鈕加入 Struts 開(kāi)發(fā)功能v 項(xiàng)目根節(jié)點(diǎn)上右鍵點(diǎn)擊,選擇上下文菜單中的項(xiàng)目根節(jié)點(diǎn)上右鍵點(diǎn)擊,選擇上下文菜單中的MyEclipse Add Struts Capabilitiesv 或者選擇菜單或者選擇菜單MyEclipse Project Capabilities Add Struts Capabilitiesv 添加添加 Struts 功能對(duì)話框的默認(rèn)值一般來(lái)說(shuō)不需要修
4、改功能對(duì)話框的默認(rèn)值一般來(lái)說(shuō)不需要修改就可以使用,點(diǎn)擊單選鈕就可以使用,點(diǎn)擊單選鈕 Struts 1.2 選擇選擇Struts 的版本的版本為為1.2 即可即可添加Struts 功能對(duì)話框指定了Struts 配置文件的存放位置可選的Struts 的版本指定了位于web.xml 中的Struts 核心Servlet 的名字指定了將會(huì)交給Struts 控制的URL 類(lèi)型指定了生成的類(lèi)的默認(rèn)包指定了默認(rèn)的國(guó)際化資源文件包是否安裝Struts 的標(biāo)簽庫(kù)文件添加了 Struts 的目錄結(jié)構(gòu)Struts1.2 的類(lèi)庫(kù)的類(lèi)庫(kù)struts-config.xmlStruts 的的TLD 文件文件驗(yàn)證器文件驗(yàn)證器
5、文件在 src 目錄下編寫(xiě)我們自己的類(lèi)第二部分第二部分 用用Struts 設(shè)計(jì)器制作前臺(tái)業(yè)務(wù)流程設(shè)計(jì)器制作前臺(tái)業(yè)務(wù)流程軟件開(kāi)發(fā)的設(shè)計(jì)階段軟件開(kāi)發(fā)的設(shè)計(jì)階段v 在實(shí)際項(xiàng)目開(kāi)發(fā)中,第一步要做的可能是設(shè)計(jì)應(yīng)用的整個(gè)流程,而不是立即著手制作JSP 或者編寫(xiě)Java 代碼v 做實(shí)際的項(xiàng)目開(kāi)發(fā),如果是大中型項(xiàng)目,思考項(xiàng)目到底該使用哪些技術(shù)和架構(gòu),用什么數(shù)據(jù)庫(kù)和操作系統(tǒng),最后應(yīng)該實(shí)現(xiàn)成何種樣子,有哪些模塊,系統(tǒng)的工作流程如何等等,這些內(nèi)容,相當(dāng)于設(shè)計(jì)階段軟件開(kāi)發(fā)的設(shè)計(jì)階段軟件開(kāi)發(fā)的設(shè)計(jì)階段v 對(duì)于我們要做的這個(gè)項(xiàng)目來(lái)說(shuō),具體的技術(shù)和系統(tǒng)結(jié)構(gòu)已經(jīng)選好,就是SSH 架構(gòu)。那么現(xiàn)在,在加入Spring 整合功能之
6、前,我們有必要把系統(tǒng)的表示層的工作流程搞清楚v 做這個(gè)流程設(shè)計(jì)有很多辦法,可以用畫(huà)圖工具例如Microsoft Visio,或者UML 建模工具開(kāi)發(fā)一個(gè)活動(dòng)圖等等都可以。因?yàn)槲覀兪褂玫氖荕yEclipse,所以我們這里可以用它自帶的Struts 設(shè)計(jì)器快速的畫(huà)出所有的應(yīng)用流程來(lái)Struts 配置文件編輯器v 雙擊 WebRoot/WEB-INF/struts-config.xml 就可以打開(kāi)Struts 配置文件編輯器v 在設(shè)計(jì)器網(wǎng)格面板上點(diǎn)擊右鍵,選擇菜單來(lái)創(chuàng)建Action,F(xiàn)orward,JSP 等等v 為了更好的反映系統(tǒng)的工作流程,我們還可以使用設(shè)計(jì)器工具欄上的 按鈕來(lái)給一些頁(yè)面加入連接
7、關(guān)系,但是如果彈出對(duì)話框詢(xún)問(wèn)是否設(shè)置為Action 的input 元素時(shí),我們選擇No 按鈕。大致來(lái)說(shuō),我們的應(yīng)用需要增刪改查四個(gè)模塊用戶(hù)管理應(yīng)用業(yè)務(wù)流程圖業(yè)務(wù)流程說(shuō)明功能模塊流程分頁(yè)列出用戶(hù)index.jsplist.do創(chuàng)建新用戶(hù)(new)new.jspnew.dolist.do刪除用戶(hù)(delete)Delete.dolist.do修改用戶(hù)(edit)edit.doedit.jspsave.dolist.do查找用戶(hù)(search)Search.dosearch.jsp需要說(shuō)明的是為了便于編寫(xiě)一個(gè)默認(rèn)的入口歡迎頁(yè)面,方便用戶(hù)的使用,我們已經(jīng)把原來(lái)顯示用戶(hù)列表的index.jsp 重命名成
8、了list.jsp。另外,到底這些功能該如何進(jìn)行分工和組織,也沒(méi)有絕對(duì)的標(biāo)準(zhǔn),讀者可以根據(jù)自己的需要或者習(xí)慣來(lái)進(jìn)行分工和命名。例如,新建用戶(hù)這個(gè)功能的命名可以是new,也可以起名為add 或者create。另外通用或者共用的Forward 路徑可以設(shè)置成Global Forward,即全局轉(zhuǎn)向,例如上圖中所顯示的所有到/error.jsp 的轉(zhuǎn)向,可以統(tǒng)一定義為一個(gè)全局的名為error 的Forward文檔規(guī)范化文檔規(guī)范化v 相比較于 Java 源代碼來(lái)說(shuō),給JSP 頁(yè)面加入一些文檔比較困難些,因?yàn)镴ava 文件可以用Javadoc 格式的注釋來(lái)加入并生成說(shuō)明,但是JSP 沒(méi)有這方面的規(guī)定和好
9、用的文檔工具v 寫(xiě)必要的流程說(shuō)明n 便于自己核對(duì)是否全部頁(yè)面都按照預(yù)期實(shí)現(xiàn)n 方便自己或者別人日后對(duì)項(xiàng)目方便進(jìn)行修改,升級(jí)和維護(hù)v 軟件開(kāi)發(fā)本質(zhì)上屬于集體勞動(dòng),所以作為其中的一員,盡量不要只把系統(tǒng)的設(shè)計(jì)藍(lán)圖或者注意事項(xiàng)放在自己的腦子里,一定要想辦法把它表示成可見(jiàn)的文檔來(lái)便于大家的交流和日后維護(hù)。現(xiàn)在我們把JSP 頁(yè)面的功能用表格的方式列出來(lái),如下表所示:頁(yè)面名功能描述index.jsp入口頁(yè)面list.jsp用戶(hù)信息列表顯示頁(yè)面(核心頁(yè)面)edit.jsp用戶(hù)信息修改表單輸入頁(yè)面error.jsp出錯(cuò)信息顯示頁(yè)面new.jsp添加新用戶(hù)表單輸入頁(yè)面search.jsp顯示查找用戶(hù)結(jié)果的頁(yè)面Ac
10、tion 說(shuō)明v 還有個(gè)問(wèn)題需要大家解決,就是進(jìn)入修改和刪除功能的Action 時(shí),需要在URL 里以地址帶參數(shù)的方式來(lái)傳遞到底是修改或者刪除哪個(gè)用戶(hù)v 舉個(gè)例子,修改用戶(hù)我們用edit.do?id=1 這種形式。另外用戶(hù)的ID 是不可修改的,因此如果表單里要傳遞這個(gè)參數(shù),一般就以表單的hidden(隱藏)類(lèi)型的輸入域來(lái)表示,具體代碼類(lèi)似這樣: input type=”hidden” name=”id” value=” 另外如果前臺(tái)需要一些數(shù)據(jù),后臺(tái)可以通過(guò)request.setAttribute()方法來(lái)設(shè)置,前臺(tái)則需要用request.getAttribute()方法或者EL 表達(dá)式來(lái)讀取
11、這些值A(chǔ)ction 路徑類(lèi)名功能描述/listListAction分頁(yè)顯示用戶(hù)信息/editEditAction根據(jù)ID 獲取用戶(hù)信息并傳遞給edit.jsp/saveSaveAction保存對(duì)用戶(hù)信息的修改/newNewAction創(chuàng)建新用戶(hù)/deleteDeleteAction根據(jù)ID 刪除用戶(hù)/searchSearchAction根據(jù)用戶(hù)名查找用戶(hù),并將結(jié)果返回給search.jsp創(chuàng)建數(shù)據(jù)庫(kù)創(chuàng)建數(shù)據(jù)庫(kù)v 數(shù)據(jù)庫(kù):Student1v 字段n Id:int 主鍵n Username:varchar(50) NOT NULLn Password: varchar(20) NOT NULLn
12、Age: int系統(tǒng)框架系統(tǒng)框架v 到現(xiàn)在為止,應(yīng)用的整個(gè)前臺(tái)大框架已經(jīng)確定,接下來(lái)就是考慮后臺(tái)的業(yè)務(wù)層的功能了v 我們已經(jīng)確定要使用Spring + Hibernate 來(lái)完成后臺(tái)功能。Struts 的Action 將會(huì)調(diào)用業(yè)務(wù)層,業(yè)務(wù)層再會(huì)去調(diào)用數(shù)據(jù)訪問(wèn)層和其它的一些輔助功能層(工具類(lèi)或者第三方類(lèi)庫(kù))v 整個(gè)系統(tǒng)從橫向分層就分成了下面的部分:v 當(dāng)然并沒(méi)有人規(guī)定到底怎樣分層才是完全正確的表示層控制層業(yè)務(wù)層數(shù)據(jù)訪問(wèn)層輔助功能層學(xué)習(xí)方法交流學(xué)習(xí)方法交流v 系統(tǒng)分成一般來(lái)說(shuō)大家可以按照軟件工程書(shū)籍上的辦法進(jìn)行分層,然而更現(xiàn)實(shí)的卻是大家都在按照自己公司的方式進(jìn)行分層。v 這時(shí)對(duì)于初學(xué)者來(lái)說(shuō)必須避免
13、的一個(gè)誤區(qū)就是喋喋不休的對(duì)采用何種標(biāo)準(zhǔn)或者為什么教科書(shū)上所講的東西和現(xiàn)實(shí)不一樣或者說(shuō)對(duì)于某個(gè)東西的原理進(jìn)行一次次的爭(zhēng)論,或者用大家熟悉的話來(lái)概括:鉆牛角尖。v 鉆牛角尖表面看是勤奮好學(xué),對(duì)某種內(nèi)容具有韌性或者探索精神,然而我們卻不得不面對(duì)這樣一個(gè)場(chǎng)面:如果我們企圖完全弄懂一個(gè)問(wèn)題,就不得不把和它關(guān)聯(lián)的問(wèn)題也搞懂。但是尷尬的是,首先我們并不能無(wú)限制的得到任何自己需要的資料(大部分技術(shù)都是黑盒子,外人看不到內(nèi)部實(shí)現(xiàn)的),另一方面,我們不得不承認(rèn)人腦的記憶和理解是有限的這個(gè)現(xiàn)實(shí)。當(dāng)你高高興興的以為自己弄懂了一個(gè)又一個(gè)問(wèn)題時(shí),最后卻尷尬的發(fā)現(xiàn)似乎自己高興過(guò)后只能記起其中的一兩個(gè)(當(dāng)然有個(gè)好辦法就是把這
14、些問(wèn)題都記下來(lái)便于以后查找)。學(xué)習(xí)方法交流學(xué)習(xí)方法交流v 我想做程序員首先要有鉆研精神,其次,也得有實(shí)用主義的精神。學(xué)技術(shù),就是為了解決實(shí)際的問(wèn)題的,如果你想為技術(shù)而技術(shù),請(qǐng)先填飽肚子。遇到自己不會(huì)的東西怎么辦?首先是能用就行,我們把它看成黑盒子就行了,就像用遙控器的人永遠(yuǎn)不需要還得懂紅外線,集成電路,振蕩器,發(fā)射器到底是怎么回事一樣。說(shuō)到這里似乎已經(jīng)扯遠(yuǎn)了話題,然而看到過(guò)很多學(xué)生天天追求后臺(tái)原理或者軟件工程,然而卻連簡(jiǎn)單的應(yīng)用也作不出或者設(shè)計(jì)圖都畫(huà)不好。不是他們不努力,而是他們努力走向了另一個(gè)方向:鉆研理論。v 對(duì)于初學(xué)者,第一步要的就是:能用。其余的,在這基礎(chǔ)之上才能去談進(jìn)一步提高。而且,
15、在國(guó)內(nèi)的現(xiàn)狀就是,絕大多數(shù)人是開(kāi)發(fā)應(yīng)用(簡(jiǎn)單的說(shuō)就是編寫(xiě)固定流程的東西),而不是深入軟件的底層來(lái)做開(kāi)發(fā)工具或者自己動(dòng)手寫(xiě)或者改進(jìn)虛擬機(jī)。開(kāi)發(fā)經(jīng)驗(yàn)交流開(kāi)發(fā)經(jīng)驗(yàn)交流v 對(duì)于這個(gè)項(xiàng)目來(lái)說(shuō),當(dāng)前臺(tái)的結(jié)構(gòu)設(shè)計(jì)的差不多的時(shí)候,我們也可以轉(zhuǎn)而先去做后臺(tái)的業(yè)務(wù)層,將前臺(tái)的功能進(jìn)行提取,看看后臺(tái)能不能先把大部分都實(shí)現(xiàn)了v 這也是實(shí)際開(kāi)發(fā)兩人或者多人分工協(xié)作可能出現(xiàn)的情況,例如:一個(gè)寫(xiě)前臺(tái),一個(gè)寫(xiě)后臺(tái)v 當(dāng)然我們并不是要讓大家非得按照軟件工程或者項(xiàng)目管理規(guī)范,把所有的文檔都寫(xiě)好了才能真正開(kāi)始編碼,我們只需要讓想法表示出來(lái),就可以了v 用代碼來(lái)表示自己的想法,其實(shí)也是一種很不錯(cuò)的辦法(一直備受贊揚(yáng)的敏捷開(kāi)發(fā)Agil
16、e,就是這樣)第三部分第三部分 設(shè)計(jì)業(yè)務(wù)層功能設(shè)計(jì)業(yè)務(wù)層功能養(yǎng)成使用接口的習(xí)慣v 對(duì)于業(yè)務(wù)層的設(shè)計(jì),我們可以先寫(xiě)接口,然后再具體實(shí)現(xiàn)v 當(dāng)然直接寫(xiě)成類(lèi)的方式也是沒(méi)人禁止的,尤其是自己學(xué)習(xí)的時(shí)候也是很合適的做法v 寫(xiě)接口就意味著我們并不需要寫(xiě)好具體的實(shí)現(xiàn)代碼,所以設(shè)計(jì)階段一般來(lái)說(shuō)還是鼓勵(lì)使用接口來(lái)做,這樣大家只需要討論好哪些功能需要,哪些不需要就行了v 給這個(gè)接口加上足夠多的注釋?zhuān)ɑ蛘呶臋n)進(jìn)行業(yè)務(wù)層的具體設(shè)計(jì)v 首先定義接口IStudentManager(這個(gè)以I 開(kāi)頭的名稱(chēng)來(lái)自于Eclipse 的源碼中的定義接口的習(xí)慣,I 表示Interface,便于開(kāi)發(fā)人員一眼看出這是個(gè)接口,當(dāng)然請(qǐng)不要誤
17、會(huì)所有的接口必須以I 開(kāi)頭才能定義)v 把它放在包service中,用來(lái)定義用戶(hù)管理模塊應(yīng)有的功能。當(dāng)然用manager 作為業(yè)務(wù)層的包還是別的名稱(chēng)都是無(wú)所謂的v 顯示用戶(hù)列表時(shí)數(shù)據(jù)量大,需分頁(yè)顯示,分頁(yè)部分的接口設(shè)計(jì)如下所示:n public int getTotalCount(); / 得到用戶(hù)總數(shù)n public int getTotalPage(int pageSize) ;/ 獲取總頁(yè)面數(shù)n public List findPagedAll(int currentPage, int pageSize);/ 分頁(yè)顯示數(shù)據(jù)定義接口IStudentManager方法v 本項(xiàng)目的主要功能是增
18、刪改查,結(jié)合我們前面所討論的業(yè)務(wù)流程,并考慮到方法的參數(shù)和返回值等情況,我們一個(gè)個(gè)的定義這些功能所對(duì)應(yīng)的方法聲明v 新建用戶(hù),我們定義一個(gè)方法即可,返回值告訴調(diào)用者是否保存成功。 n public boolean save(Student student)v 保存用戶(hù),我們前面的流程是首先通過(guò)ID 找到Student 對(duì)象,然后再保存更新,所以一共需要兩個(gè)方法的定義:n public Student findById(int id);/ 根據(jù)ID 查找n public boolean update(Student student);/ 更新用戶(hù)對(duì)象定義接口IStudentManager方法v
19、刪除用戶(hù),根據(jù) ID 進(jìn)行刪除就可以了,所以定義一個(gè)方法即可,返回值同樣是成功時(shí)返回true,其它情況下返回falsen public boolean delete(Student student) v 查找用戶(hù),我們則只需要一個(gè)方法就可以了,在這里我們只提供根據(jù)用戶(hù)名進(jìn)行查找的功能,方法的參數(shù)是用戶(hù)名,返回值則是包含找到的用戶(hù)對(duì)象的列表,如果找不到的話就返回nulln public List findStudentByUsername(String username);開(kāi)發(fā)經(jīng)驗(yàn)交流v 至此,我們所有的初步設(shè)計(jì)工作都已完成了,下一步就可以著手進(jìn)行詳細(xì)設(shè)計(jì)了。但是因?yàn)檫@個(gè)項(xiàng)目相對(duì)比較規(guī)模小,所以
20、我們接下來(lái)就進(jìn)入具體的開(kāi)發(fā)過(guò)程中v 對(duì)于大型項(xiàng)目實(shí)際開(kāi)發(fā)中一般會(huì)進(jìn)行詳細(xì)設(shè)計(jì),要把所有的JSP 頁(yè)面的樣子畫(huà)出來(lái),每個(gè)類(lèi)的UML 圖也要畫(huà)出來(lái),以及每個(gè)頁(yè)面和類(lèi)的具體實(shí)現(xiàn)思路也得進(jìn)行說(shuō)明,例如:頁(yè)面中加入的表單驗(yàn)證腳本代碼,Action 類(lèi)的工作流程,DAO 層采用何種技術(shù)實(shí)現(xiàn)等等(當(dāng)然這里可以使用Spring 中的HibernateDaoSupport 或者HibernateTemplate)v 不過(guò)實(shí)際開(kāi)發(fā)中你會(huì)發(fā)現(xiàn)基本上所有的詳細(xì)設(shè)計(jì)都會(huì)有紕漏或者錯(cuò)誤之處,需要在開(kāi)發(fā)過(guò)程中逐步進(jìn)行必要的修改開(kāi)發(fā)經(jīng)驗(yàn)交流v 設(shè)計(jì)完成后,到底是先做前臺(tái)頁(yè)面還是先實(shí)現(xiàn)后臺(tái)的功能類(lèi)呢?n 這個(gè)問(wèn)題其實(shí)并無(wú)標(biāo)準(zhǔn)答
21、案,全依賴(lài)于開(kāi)發(fā)人員的習(xí)慣而決定v 由于前面我們已經(jīng)將業(yè)務(wù)層接口確定,所以如果假設(shè)這個(gè)項(xiàng)目有兩個(gè)人進(jìn)行開(kāi)發(fā)的話,是可以分頭進(jìn)行的,只需要最后在Spring 配置文件中將接口的具體實(shí)現(xiàn)類(lèi)指定就可以了v 相對(duì)來(lái)說(shuō),這個(gè)項(xiàng)目的業(yè)務(wù)層代碼比較簡(jiǎn)單,所以我打算先實(shí)現(xiàn)后臺(tái)功能。前臺(tái)的JSP,Struts 的部分則放在后面進(jìn)行開(kāi)發(fā)第四部分第四部分 開(kāi)發(fā)業(yè)務(wù)層和開(kāi)發(fā)業(yè)務(wù)層和DAO 層代碼層代碼第四部分內(nèi)容v 添加Hibernate功能v 添加Spring 功能v Spring 整合 Hibernatev 用Spring 2.0 的aop 和tx 聲明式配置解決事務(wù)提交問(wèn)題v 開(kāi)發(fā)業(yè)務(wù)層添加Hibernate功
22、能添加Hibernate功能v 現(xiàn)在我們要把Hibernate功能添加到當(dāng)前項(xiàng)目,這一步不反向工程生成DAO,因?yàn)槲覀冏罱K的目的是使用Spring整合的Hibernate DAO 類(lèi)添加 Hibernate Capabilitiesv 添加 Hibernate 類(lèi)庫(kù) (JARs) 到項(xiàng)目的類(lèi)路徑v 在項(xiàng)目中創(chuàng)建并配置 hibernate.cfg.xmlv 在項(xiàng)目中創(chuàng)建自定義的 Session Factory 類(lèi)來(lái)簡(jiǎn)化 Hibernate 會(huì)話處理v 添加 Hibernate 功能的步驟:n 在Package Explorer 中選擇 ssh2 項(xiàng)目n 從 MyEclipse 菜單欄選擇MyEc
23、lipse Project Capabilities Add Hibernate Capabilities . 來(lái)啟動(dòng) Add Hibernate Capabilities 向?qū)dd Hibernate Capabilities向?qū)нx擇Hibernate 類(lèi)庫(kù)版本可以添加到項(xiàng)目的構(gòu)造路徑的類(lèi)庫(kù)集合選中的類(lèi)庫(kù)將會(huì)添加到項(xiàng)目的構(gòu)造路徑中, 但相應(yīng)的JAR 文件將不會(huì)復(fù)制到項(xiàng)目中. 這些 JAR 文件會(huì)在發(fā)布程序時(shí)復(fù)制選中的類(lèi)庫(kù) JAR 文件將會(huì)被復(fù)制到項(xiàng)目并添加到構(gòu)造路徑中去(這個(gè)方式在開(kāi)發(fā)不依賴(lài)于MyEclipse 的項(xiàng)目的時(shí)候,或者解決JAR 包沖突的時(shí)候很有用),此處選用復(fù)制的方式相對(duì)于現(xiàn)
24、在項(xiàng)目的路徑, 可以新建或者使用現(xiàn)有目錄,Hibernate 類(lèi)庫(kù)將會(huì)被向?qū)?fù)制到這里創(chuàng)建Hibernate XML 配置文件v 上頁(yè)選擇Next 按鈕前進(jìn)到本頁(yè)創(chuàng)建 Hibernate XML 配置文件選擇數(shù)據(jù)庫(kù)連接如果不想現(xiàn)在就設(shè)置數(shù)據(jù)庫(kù)連接屬性,去掉復(fù)選框即可跳過(guò)選擇以前創(chuàng)建好的數(shù)據(jù)庫(kù)連接,相關(guān)的連接信息將會(huì)自動(dòng)填入到對(duì)話框中選中后則會(huì)自動(dòng)加入相應(yīng)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)類(lèi)庫(kù)jar 文件到項(xiàng)目的類(lèi)路徑中如果選中,那么Hibernate 將會(huì)自動(dòng)根據(jù)映射文件來(lái)動(dòng)態(tài)生成建表語(yǔ)句然后執(zhí)行,然而這種方法不是很可靠,所以一般來(lái)說(shuō)不要用創(chuàng)建SessionFactory這一頁(yè)選擇是否生成Session Facto
25、ry 類(lèi),去掉復(fù)選框Create SessionFactory class?的選中狀態(tài),最后點(diǎn)擊Finish 按鈕完成整個(gè)添加過(guò)程向?qū)ЫY(jié)束后將進(jìn)行的操作v 如果在第一頁(yè)選擇了復(fù)制類(lèi)庫(kù)到你的項(xiàng)目, 將復(fù)制 Hibernate 類(lèi)庫(kù) (JARs) 到項(xiàng)目中v 更新項(xiàng)目的構(gòu)造路徑來(lái)包含已安裝的 Hibernate 類(lèi)庫(kù)v 給項(xiàng)目創(chuàng)建并配置 hibernate.cfg.xml 文件添加Spring 功能給項(xiàng)目加入Spring 功能v 項(xiàng)目創(chuàng)建完畢后就可以加入 Spring 開(kāi)發(fā)功能了。要給項(xiàng)目添加Spring 功能,請(qǐng)按照下面的步驟進(jìn)行:n 在Package Explorer 視圖中選擇 ssh2項(xiàng)目
26、;n 接下來(lái), 從 MyEclipse 菜單欄選擇MyEclipse Project Capabilities Add Spring Capabilities . 來(lái)啟動(dòng) Add Spring Capabilities 向?qū)?對(duì)于這個(gè)項(xiàng)目來(lái)說(shuō),你可以直接點(diǎn)擊Finish 按鈕就行了加入Spring 功能向?qū)?duì)話框的第1頁(yè)Spring 版本,一般選擇Spring 2 單選鈕選擇要加入項(xiàng)目類(lèi)路徑的類(lèi)庫(kù)點(diǎn)擊此鏈接可以修改類(lèi)庫(kù)設(shè)置選擇JAR 類(lèi)庫(kù)的安裝方式,上面的單選鈕只是把引用的類(lèi)庫(kù)加入類(lèi)路徑,下面的則需要指定一個(gè)目錄把所有的JAR 文件和標(biāo)簽文件加入到當(dāng)前項(xiàng)目中,這種方式適用于不依賴(lài)MyEclip
27、se 進(jìn)行開(kāi)發(fā)或者手工管理類(lèi)庫(kù)當(dāng)選中了 Spring Web 的時(shí)候需要指定標(biāo)簽庫(kù)文件的安裝目錄注意有些Myeclipse 的該窗口沒(méi)有 Spring2.0 ORM/DAO/hibernate3 libraries類(lèi)庫(kù),要在添加完后手動(dòng)添加,添加方法Build path add libraries加入Spring 功能向?qū)?duì)話框的第2頁(yè)創(chuàng)建Spring bean 定義文件可以修改Spring 配置文件的名字(修改Folder 和File 選項(xiàng))加入Spring 功能向?qū)?duì)話框的第3頁(yè)配置一個(gè)使用現(xiàn)有Hibernate配置文件的Spring下的LocalSessionFactory采用默認(rèn)的se
28、ssionFactory就可以了Spring 整合 Hibernate使用反向工程快速生成Java POJO 類(lèi),映射文件和DAOv 術(shù)語(yǔ)解釋n DAO 是Data Access Object,數(shù)據(jù)訪問(wèn)對(duì)象的縮寫(xiě)n POJO 是Plain and Old Java Object,普通和舊式的Java 對(duì)象的縮寫(xiě),也就是普通Java 類(lèi)的意思v 打開(kāi)MyEclipse Database Explorer透視圖n 點(diǎn)擊工具欄上的點(diǎn)擊 按鈕可以顯示多個(gè)透視圖供切換n Window Open Perspective Other MyEclipse Database Explorer來(lái)顯示打開(kāi)透視圖對(duì)話
29、框DB Browser 視圖創(chuàng)建連接點(diǎn)右鍵,選擇New啟動(dòng)反向工程向?qū)c(diǎn)右鍵,選擇Open ConnectionHibernate 反向工程向?qū)У?1 頁(yè)Spring 整合Hibernate 的項(xiàng)目文件內(nèi)容StudentDAOv StudentDAO類(lèi)繼承自HibernateDaoSupport,該類(lèi)來(lái)自于Spring,它提供了獲取HibernateTemplate 的方法:getHibernateTemplate(),這個(gè)DAO 也實(shí)現(xiàn)了保存,刪除,查找實(shí)體類(lèi)的方法,在此需要加入對(duì)應(yīng)業(yè)務(wù)處理的分頁(yè)和更新功能n public int getTotalCount()n public List f
30、indPagedAll(int currentPage, int pageSize)n public void update(Student1 transientInstance) n public List findByUsername(Object username) v 另外,它還缺少必要的功能:事務(wù)處理用Spring 2.0 的aop 和tx 聲明式配置解決事務(wù)提交問(wèn)題修改applicationContext.xmlv Spring 1.2 方式的事務(wù)代理是非常繁瑣的,現(xiàn)在我們用Spring 2.0 的聲明式事務(wù)來(lái)完成。將上面的applicationContext.xml 將其內(nèi)容修改
31、為如下所示“注意這里根據(jù)文件位置來(lái)定”測(cè)試并運(yùn)行v 寫(xiě)一個(gè)測(cè)試類(lèi) Spring2TransactionDAOTest.java,來(lái)測(cè)試這個(gè)新的基于聲明式的AOP 配置文件public class Spring2TransactionDAOTest public static void main(String args) ApplicationContext ctx = new ClassPathXmlApplicationContext(applicationContext2.xml); Student1DAO dao = (Student1DAO)ctx.getBean(StudentDAO
32、); Student1 user = new Student1(); user.setPassword(密碼); user.setUsername(spring 2 事務(wù)代理測(cè)試); user.setAge(new Integer(200); dao.save(user); 運(yùn)行結(jié)果:Exception in thread main java.lang.ClassCastException: $Proxy1 cannot be cast to dao.Student1DAOat dao.Spring2TransactionDAOTest.main(Spring2TransactionDAOTe
33、st.java:13)這是什么原因呢?Spring 2.0 的文檔中明明不是說(shuō)它的AOP 可以自動(dòng)根據(jù)要代理的類(lèi)的類(lèi)型來(lái)選擇是基于JDK 的接口代理還是CGLib 的類(lèi)代理嘛?然而沒(méi)有辦法,出錯(cuò)了,也許這是Spring 的一個(gè)Bug 吧修改代碼v 現(xiàn)在只好按照要求,把類(lèi)加入一個(gè)接口定義,先修改Student1DAO.java,讓它實(shí)現(xiàn)一個(gè)接口IStudentDAO:public class Student1DAO extends HibernateDaoSupport implements IStudentDAO編寫(xiě)接口v 寫(xiě)一個(gè)接口IStudentDAO(可以通過(guò)重構(gòu)功能來(lái)生成,選擇菜單Re
34、factory Extract Interface,在對(duì)話框的Interface name 處輸入IStudentDAO,然后選中對(duì)話框中需要加入到接口中的方法列表,最后點(diǎn)擊Finish 按鈕即可import java.util.List;public interface IStudentDAO / property constantspublic static final String USERNAME = username;public static final String PASSWORD = password;public static final String AGE = age;
35、public abstract void save(Student1 transientInstance);public abstract void delete(Student1 persistentInstance);public abstract Student1 findById(java.lang.Integer id);public abstract List findByExample(Student1 instance);public abstract List findByProperty(String propertyName, Object value);public a
36、bstract List findByUsername(Object username);public abstract List findByPassword(Object password);public abstract List findByAge(Object age);public abstract List findAll();public abstract Student1 merge(Student1 detachedInstance);public abstract void attachDirty(Student1 instance);public abstract vo
37、id attachClean(Student1 instance);再次測(cè)試并運(yùn)行v 這時(shí)候?qū)?yīng)的 Spring2TransactionDAOTest.java 里面的代碼已經(jīng)自動(dòng)變成了:IStudentDAO dao = (IStudentDAO)ctx.getBean(StudentDAO);v 再次運(yùn)行測(cè)試類(lèi)Spring2TransactionDAOTest,然后檢查數(shù)據(jù)庫(kù),可以很高興的看到數(shù)據(jù)已經(jīng)插入進(jìn)來(lái)了v 這里會(huì)出現(xiàn)異常 關(guān)于主鍵是否自增長(zhǎng)的問(wèn)題通過(guò)修改student.hbm.xmlv v v v 開(kāi)發(fā)業(yè)務(wù)層開(kāi)發(fā)業(yè)務(wù)層開(kāi)發(fā)StudentManager類(lèi)代碼v 創(chuàng)建前面設(shè)計(jì)好的ISt
38、udentManager接口v 修改或者新建類(lèi)service.StudentManager,來(lái)實(shí)現(xiàn)先前定義的IStudentManager 接口中的功能v 為了便于使用Spring 整合,我們將其中的DAO層設(shè)置成一個(gè)屬性dao,通過(guò)方法getDao()和setDao()定義,類(lèi)型為dao.Student1DAO。業(yè)務(wù)層的絕大部分功能都是委托給dao 來(lái)實(shí)現(xiàn)的,而對(duì)于那些需要返回布爾值來(lái)確定是否操作成功的方法,我們用try-catch 語(yǔ)句來(lái)實(shí)現(xiàn)這樣的需求,即:沒(méi)有異常時(shí)返回true,否則返回false-private IStudentDAO dao;public int getTotalCo
39、unt() return dao.getTotalCount();public int getTotalPage(int pageSize) int totalCount = getTotalCount(); / 得到頁(yè)面總數(shù) int totalPageCount = (totalCount + pageSize) - 1) / pageSize; return totalPageCount;public List findPagedAll(int currentPage, int pageSize) return dao.findPagedAll(currentPage, pageSize)
40、;-public IStudentDAO getDao() return dao;public void setDao(IStudentDAO dao) this.dao = dao;因?yàn)檫@個(gè)類(lèi)需要訪問(wèn)底層的數(shù)據(jù)庫(kù),在這里可以通過(guò)Spring 來(lái)設(shè)置對(duì)應(yīng)的DAO 類(lèi)的實(shí)例,因此我們還要在Spring 的配置文件applicationContext.xml 中加入下面的bean 配置:測(cè)試并運(yùn)行業(yè)務(wù)層v 編寫(xiě)測(cè)試類(lèi)test.StudentBizTest.javapackage test;public class StudentBizTest public static void main(Str
41、ing args) ApplicationContext ctx = new ClassPathXmlApplicationContext(applicationContext.xml); IStudentManager studentBiz = (IStudentManager)ctx.getBean(studentBiz); List studentList = studentBiz.findPagedAll(1, 3); System.out.println(每頁(yè)三行,第一頁(yè)數(shù)據(jù): ); for(Student1 student :studentList) System.out.prin
42、tln(姓名: + student.getUsername()+密碼: + student.getPassword(); 與前例類(lèi)似,studentManager需要抽象出接口IStudentManager運(yùn)行這個(gè)類(lèi),得到如下的輸出:log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).log4j:WARN Please initialize the log4j system properly.Hibernate
43、: select top 3 student1x0_.id as id0_, student1x0_.Username as Username0_, student1x0_.Password as Password0_, student1x0_.Age as Age0_ from myssh.dbo.student1 student1x0_每頁(yè)三行,第一頁(yè)數(shù)據(jù):姓名:dd大多數(shù) 密碼:1234 姓名:spring dao 密碼:pa 姓名:spring dao2 密碼:pa2 第五部分第五部分 開(kāi)發(fā)前臺(tái)頁(yè)面流程開(kāi)發(fā)前臺(tái)頁(yè)面流程前臺(tái)如何開(kāi)發(fā)前臺(tái)如何開(kāi)發(fā)v 前面我們已經(jīng)完成了必要的功能設(shè)計(jì),在此階
44、段給以編碼實(shí)現(xiàn)v 對(duì)于我們來(lái)說(shuō),按照業(yè)務(wù)流程說(shuō)明表中的流程進(jìn)行開(kāi)發(fā),遇到JSP,就創(chuàng)建或者修改JSP頁(yè)面;遇到.do,就根據(jù)用戶(hù)管理應(yīng)用業(yè)務(wù)流程圖流程開(kāi)發(fā)或者修改Action類(lèi)。這樣一個(gè)流程一個(gè)流程的開(kāi)發(fā),最后再進(jìn)行測(cè)試,就可以完成了v 下面我們重溫業(yè)務(wù)流程說(shuō)明及用戶(hù)管理應(yīng)用業(yè)務(wù)流程圖重溫業(yè)務(wù)流程重溫業(yè)務(wù)流程功能模塊流程分頁(yè)列出用戶(hù)index.jsplist.do創(chuàng)建新用戶(hù)(new)new.jspnew.dolist.do刪除用戶(hù)(delete)Delete.dolist.do修改用戶(hù)(edit)edit.doedit.jspsave.dolist.do查找用戶(hù)(search)Search.d
45、osearch.jsp需要說(shuō)明的是為了便于編寫(xiě)一個(gè)默認(rèn)的入口歡迎頁(yè)面,方便用戶(hù)的使用,我們已經(jīng)把原來(lái)顯示用戶(hù)列表的index.jsp 重命名成了list.jsp。另外,到底這些功能該如何進(jìn)行分工和組織,也沒(méi)有絕對(duì)的標(biāo)準(zhǔn),讀者可以根據(jù)自己的需要或者習(xí)慣來(lái)進(jìn)行分工和命名。例如,新建用戶(hù)這個(gè)功能的命名可以是new,也可以起名為add 或者create。另外通用或者共用的Forward 路徑可以設(shè)置成Global Forward,即全局轉(zhuǎn)向,例如上圖中所顯示的所有到/error.jsp 的轉(zhuǎn)向,可以統(tǒng)一定義為一個(gè)全局的名為error 的Forward重溫用戶(hù)管理應(yīng)用業(yè)務(wù)流程圖開(kāi)發(fā)前臺(tái)代碼開(kāi)發(fā)前臺(tái)代碼v
46、 具體的編碼過(guò)程不再贅述,按照流程創(chuàng)建一個(gè)個(gè)JSP頁(yè)面,最后再修改后臺(tái)的Action類(lèi)代碼v 需要提示大家的是,像EditAction這樣的功能的寫(xiě)法,需要根據(jù)ID查找一個(gè)用戶(hù)然后傳遞給前臺(tái)進(jìn)行修改,雖然沒(méi)有明確的在設(shè)計(jì)圖中反映出來(lái),如果不幸找不到用戶(hù)信息的話,務(wù)必需要告訴使用人員要修改的用戶(hù)找不到,可以轉(zhuǎn)向到/error.jsp進(jìn)行顯示。接下來(lái)要做的就是先將傳遞過(guò)來(lái)的字符串類(lèi)型的ID參數(shù)通過(guò)Integer.parseInt(String)方法轉(zhuǎn)換成int,然后再將通過(guò)后臺(tái)業(yè)務(wù)層(也即IStudentManager)找到的用戶(hù)信息通過(guò)request對(duì)象設(shè)置屬性傳遞給前臺(tái)的JSP頁(yè)面,前臺(tái)頁(yè)面則
47、使用EL表達(dá)式加以顯示。v 實(shí)現(xiàn)過(guò)程中一定要全面考慮到客戶(hù)端驗(yàn)證(JavaScript表單驗(yàn)證)和服務(wù)器端驗(yàn)證(在Action類(lèi)中進(jìn)行必要的數(shù)據(jù)驗(yàn)證),解決中文問(wèn)題解決中文問(wèn)題v 加入解決中文字符編碼的過(guò)濾器TomcatFormFilterv 在web.xml中進(jìn)行配置v http:/ 因?yàn)镾pring 用了LOG4J 做出錯(cuò)信息的輸出,雖然后臺(tái)有很多的真實(shí)出錯(cuò)信息,然而在這里卻是看不到的。所以需要加入日志處理功能v 在src 目錄下創(chuàng)建配置文件,選擇菜單File New File,文件名輸入perties,文件內(nèi)容如下所示:log4j.rootLogger=WARN, st
48、doutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d %p %c - %m%n項(xiàng)目項(xiàng)目ssh2源代碼目錄結(jié)構(gòu)源代碼目錄結(jié)構(gòu)表單驗(yàn)證腳本代碼表單驗(yàn)證腳本代碼v 文件 js/form.js 是抽取出來(lái)公用的表單驗(yàn)證功能的腳本代碼,其代碼清單如下所示:function checkForm(form) / 驗(yàn)證表單輸入不為空的
49、腳本代碼 if(form.username.value = ) alert(用戶(hù)名不能為空!); form.username.focus(); return false; - / 確保年齡有效并在 0 120之間 if(isNaN(parseInt(form.age.value) | form.age.value 120) alert(請(qǐng)輸入有效的年齡!); form.age.focus(); return false; return true;開(kāi)發(fā)開(kāi)發(fā)error.jsp 出錯(cuò)了! 出錯(cuò)了! 詳細(xì)信息是: $message 返回 出錯(cuò)的信息可以放在出錯(cuò)的信息可以放在 request 的的att
50、ribute 里面,里面,例如調(diào)用例如調(diào)用request.setAttribute(“message”,”出錯(cuò)了!出錯(cuò)了!”);之后相關(guān)的出錯(cuò)信息就可以顯示在之后相關(guān)的出錯(cuò)信息就可以顯示在這個(gè)頁(yè)面中。另外還提供了一個(gè)返回鏈接讓用戶(hù)這個(gè)頁(yè)面中。另外還提供了一個(gè)返回鏈接讓用戶(hù)能夠回去繼續(xù)操作能夠回去繼續(xù)操作第一個(gè)流程 index.jsplist.dovindex.jsp源碼分析源碼分析 歡迎使用用戶(hù)管理系統(tǒng) 查看用戶(hù)列表 大家通過(guò)查看運(yùn)行時(shí)的大家通過(guò)查看運(yùn)行時(shí)的HTML源代碼就可以看到其輸出是:源代碼就可以看到其輸出是:,這句話可以讓我們,這句話可以讓我們的頁(yè)面總能正確找到引用的圖片,的頁(yè)面總能正
51、確找到引用的圖片,CSS等外部資源。假設(shè)頁(yè)面等外部資源。假設(shè)頁(yè)面有個(gè)圖片寫(xiě)著:有個(gè)圖片寫(xiě)著:,那么即使這個(gè)頁(yè)面的內(nèi)那么即使這個(gè)頁(yè)面的內(nèi)容通過(guò)容通過(guò)forward變成了變成了/ssh2/user/welcome.do,而圖片依然會(huì)從,而圖片依然會(huì)從地址地址http:/localhost:8080/ssh2/gif/a.gif 來(lái)讀取來(lái)讀取點(diǎn)擊超鏈接,瀏覽過(guò)去的是顯示分頁(yè)點(diǎn)擊超鏈接,瀏覽過(guò)去的是顯示分頁(yè)的的Struts 的控制器的控制器ListAction.javaListAction.java代碼代碼/* 分頁(yè)顯示用戶(hù)信息分頁(yè)顯示用戶(hù)信息 */public class ListAction ex
52、tends Action public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) / 分析當(dāng)前頁(yè)碼分析當(dāng)前頁(yè)碼String pageString=request.getParameter(page);if(pageString = null | pageString.length() = 0) pageString = 1;int currentPage= 0 ;try currentPage = I
53、nteger.parseInt(pageString);/ 當(dāng)前頁(yè)碼當(dāng)前頁(yè)碼 catch(Exception e) if(currentPage = 0) currentPage = 1;int pageSize = 3;/每頁(yè)顯示的數(shù)據(jù)數(shù)每頁(yè)顯示的數(shù)據(jù)數(shù) / 讀取數(shù)據(jù)讀取數(shù)據(jù)List users = manager.findPagedAll(currentPage, pageSize);request.setAttribute(users,users);/ 保存用戶(hù)列表保存用戶(hù)列表request.setAttribute(totalPage, manager.getTotalPage(pag
54、eSize);/ 保存總頁(yè)數(shù)保存總頁(yè)數(shù)request.setAttribute(totalCount, manager.getTotalCount();/ 保存記錄總數(shù)保存記錄總數(shù)request.setAttribute(currentPage, currentPage);/ 保存當(dāng)前頁(yè)碼保存當(dāng)前頁(yè)碼return mapping.findForward(display);private IStudentManager manager;public IStudentManager getManager() return manager;public void setManager(IStuden
55、tManager manager) this.manager = manager;當(dāng)取到了數(shù)據(jù)和分頁(yè)相關(guān)的信息后,我們將其存放在request 的屬性里面,以便在頁(yè)面中獲取這些值轉(zhuǎn)到前臺(tái)的顯示層用戶(hù)列表頁(yè)面list.jsp 來(lái)顯示用戶(hù)和功能鏈接此屬性在Sping中注入list.jsp代碼代碼v list.jsp 用用來(lái)顯示用戶(hù)和功能鏈接v 它是我們這個(gè)用戶(hù)管理應(yīng)用的中心頁(yè)面,所有的功能都從這里出發(fā) 用戶(hù)列表頁(yè)面用戶(hù)列表頁(yè)面 用戶(hù)列表頁(yè)面用戶(hù)列表頁(yè)面 用戶(hù)用戶(hù)ID 用戶(hù)名用戶(hù)名 操作操作 $user.id $user.username 修改修改 刪除刪除 共共$totalCount個(gè)用戶(hù)個(gè)用戶(hù)第
56、第$currentPage頁(yè)頁(yè)/共共$totalPage頁(yè)頁(yè) 遍歷上頁(yè)ListAction.java代碼存放在request中的users屬性值需傳遞id值到EditAction.java中從ListAction.java存放在request中獲取屬性值list.jsp代碼代碼v list.jsp 用用來(lái)顯示用戶(hù)和功能鏈接v 它是我們這個(gè)用戶(hù)管理應(yīng)用的中心頁(yè)面,所有的功能都從這里出發(fā) 1 上一頁(yè)上一頁(yè) c:if test=$currentPage 上一頁(yè)上一頁(yè) c:if test=$currentPage 下一頁(yè)下一頁(yè) = totalPage 下一頁(yè)下一頁(yè) / 頁(yè)面跳轉(zhuǎn)函數(shù)頁(yè)面跳轉(zhuǎn)函數(shù) / 參
57、數(shù)參數(shù): 包含頁(yè)碼的表單元素,例如輸入框,下拉框等包含頁(yè)碼的表單元素,例如輸入框,下拉框等 function jumpPage(input) if(input.value = $currentPage) return; / 頁(yè)碼相同就不做跳轉(zhuǎn)頁(yè)碼相同就不做跳轉(zhuǎn) var newUrl = $pageContext.request.contextPath/list.do?page= + input.value; document.location = newUrl; 若上一頁(yè)有數(shù)據(jù),則設(shè)置超鏈接,否則不設(shè)置超鏈接若下一頁(yè)有數(shù)據(jù),則設(shè)置超鏈接,否則不設(shè)置超鏈接使用javascript函數(shù)實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)
58、功能list.jsp代碼代碼v list.jsp 用用來(lái)顯示用戶(hù)和功能鏈接v 它是我們這個(gè)用戶(hù)管理應(yīng)用的中心頁(yè)面,所有的功能都從這里出發(fā)轉(zhuǎn)到轉(zhuǎn)到 option value=$i selected第第$i頁(yè)頁(yè) 輸入頁(yè)碼:輸入頁(yè)碼: 添加用戶(hù)添加用戶(hù)查找用戶(hù)查找用戶(hù)用戶(hù)名用戶(hù)名: 下拉框選項(xiàng)變化調(diào)用javascript跳轉(zhuǎn)函數(shù)本段代碼用戶(hù)通過(guò)選擇下拉框?qū)崿F(xiàn)頁(yè)面跳轉(zhuǎn)本段代碼用戶(hù)通過(guò)輸入文本框并點(diǎn)擊按鈕實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)添加用戶(hù)超鏈接查找用戶(hù)按鈕,調(diào)用SearchAction.java用戶(hù)列表頁(yè)面外觀當(dāng)點(diǎn)擊添加用戶(hù)鏈接后,我們就進(jìn)入另當(dāng)點(diǎn)擊添加用戶(hù)鏈接后,我們就進(jìn)入另一個(gè)模塊:添加用戶(hù),流程是一個(gè)模塊:添加
59、用戶(hù),流程是new.jspnew.dolist.do增加用戶(hù)流程new.jspnew.dolist.dov 添加新用戶(hù)表單輸入頁(yè)面new.jspv new.jsp源碼分析 添加用戶(hù)添加用戶(hù) 添加用戶(hù)添加用戶(hù) 用戶(hù)名用戶(hù)名:td 密碼密碼: 年齡年齡: td 當(dāng)前頁(yè)面引入當(dāng)前頁(yè)面引入js/form.js文件文件提交到提交到NewAction.java,提交前調(diào)用,提交前調(diào)用form.js中的中的checkForm()函數(shù),雖然這里用函數(shù),雖然這里用Struts 標(biāo)簽庫(kù)編寫(xiě),也還是標(biāo)簽庫(kù)編寫(xiě),也還是可以加入對(duì)應(yīng)的客戶(hù)端驗(yàn)證代碼的可以加入對(duì)應(yīng)的客戶(hù)端驗(yàn)證代碼的利用利用document對(duì)象對(duì)象loca
60、tion屬屬性實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)性實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)NewAction.java代碼代碼/* 創(chuàng)建新用戶(hù)創(chuàng)建新用戶(hù) */public class NewAction extends Action public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) StudentForm studentForm = (StudentForm) form;try Student student = new Student();s
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 甘肅省白銀市靖遠(yuǎn)縣重點(diǎn)中學(xué)2024年中考數(shù)學(xué)模試卷含解析
- 廣東滄江中學(xué)2024屆中考數(shù)學(xué)仿真試卷含解析
- 2025部門(mén)級(jí)安全培訓(xùn)考試試題含答案(培優(yōu)A卷)
- 2025年新工人入場(chǎng)安全培訓(xùn)考試試題研優(yōu)卷
- 2024-2025管理人員崗前安全培訓(xùn)考試試題【典優(yōu)】
- 2025年新入職工入職安全培訓(xùn)考試試題含完整答案(有一套)
- 2025公司級(jí)安全培訓(xùn)考試試題【突破訓(xùn)練】
- 2025企業(yè)主要負(fù)責(zé)人安全培訓(xùn)考試試題附參考答案【培優(yōu)A卷】
- 2025年公司三級(jí)安全培訓(xùn)考試試題ab卷
- 工業(yè)分析 第三版 課件全套 盛曉東 第1-6章 試樣的采集和制備 - 安全分析和實(shí)驗(yàn)室安全知識(shí)
- 2024電力人工智能樣本存儲(chǔ)技術(shù)要求
- 縣中醫(yī)院婦科重點(diǎn)專(zhuān)科建設(shè)匯報(bào)
- 全國(guó)優(yōu)質(zhì)課一等獎(jiǎng)初中音樂(lè)《深情》課件
- 碳捕集、利用與封存技術(shù)
- 產(chǎn)品系統(tǒng)設(shè)計(jì)課件-
- 帶狀皰疹護(hù)理查房
- 檔案移交目錄表
- 幼兒園故事課件:《小馬過(guò)河》
- 電腦耗材實(shí)施方案、供貨方案、售后服務(wù)方案
- 人工智能語(yǔ)言與倫理學(xué)習(xí)通超星課后章節(jié)答案期末考試題庫(kù)2023年
- 抑郁病診斷證明書(shū)
評(píng)論
0/150
提交評(píng)論