使用SSH開(kāi)發(fā)增刪改查的綜合用戶(hù)管理例子資料_第1頁(yè)
使用SSH開(kāi)發(fā)增刪改查的綜合用戶(hù)管理例子資料_第2頁(yè)
使用SSH開(kāi)發(fā)增刪改查的綜合用戶(hù)管理例子資料_第3頁(yè)
使用SSH開(kāi)發(fā)增刪改查的綜合用戶(hù)管理例子資料_第4頁(yè)
使用SSH開(kāi)發(fā)增刪改查的綜合用戶(hù)管理例子資料_第5頁(yè)
已閱讀5頁(yè),還剩96頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、創(chuàng)建新項(xiàng)目用Struts 設(shè)計(jì)器制作前臺(tái)業(yè)務(wù)流程設(shè)計(jì)業(yè)務(wù)層功能開(kāi)發(fā)業(yè)務(wù)層和DAO 層代碼開(kāi)發(fā)前臺(tái)頁(yè)面流程(lichng)整合Spring,Struts 和Hibernate發(fā)布,運(yùn)行,測(cè)試使用(shyng)SSH開(kāi)發(fā)增刪改查的綜合用戶(hù)管理例子共一百零一頁(yè)第一(dy)部分 創(chuàng)建新項(xiàng)目共一百零一頁(yè)創(chuàng)建(chungjin)新項(xiàng)目創(chuàng)建Web 項(xiàng)目ssh2加入 Struts 開(kāi)發(fā)功能(gngnng)使用Struts 工具開(kāi)發(fā)數(shù)據(jù)庫(kù)student1實(shí)現(xiàn)功能:對(duì)用戶(hù)的增刪改查前臺(tái):需要加入增加,修改刪除和查詢(xún)用戶(hù)所對(duì)應(yīng)的頁(yè)面后臺(tái)功能通過(guò)調(diào)用Struts Action 來(lái)完成,Struts 的Action 再

2、委托給業(yè)務(wù)層StudentManager 類(lèi)來(lái)完成根據(jù)個(gè)人愛(ài)好的不同,你既可以先完成前臺(tái)的頁(yè)面,也可以先把后臺(tái)的業(yè)務(wù)類(lèi)寫(xiě)完整,或者是兩個(gè)人分工的話(huà)一人負(fù)責(zé)一部分共一百零一頁(yè)創(chuàng)建(chungjin)Web 項(xiàng)目選擇菜單(ci dn)File New Web Project在Project Name中輸入ssh2選中J2EE Specification Level下面的Java EE 5.0 單選鈕選擇哪個(gè)版本的J2EE Specification Level 取決于你使用的服務(wù)器Tomcat4,Weblogic 9 以下版本請(qǐng)選擇J2EE 1.4Tomcat 5,JBoss 4可以選擇 Java

3、 EE 5.0Java EE 5.0 可以直接使用 EL 表達(dá)式和JSTL最后點(diǎn)擊Finish按鈕共一百零一頁(yè)加入 Struts 開(kāi)發(fā)(kif)功能項(xiàng)目根節(jié)點(diǎn)上右鍵點(diǎn)擊(din j),選擇上下文菜單中的MyEclipse Add Struts Capabilities或者選擇菜單MyEclipse Project Capabilities Add Struts Capabilities添加 Struts 功能對(duì)話(huà)框的默認(rèn)值一般來(lái)說(shuō)不需要修改就可以使用,點(diǎn)擊單選鈕 Struts 1.2 選擇Struts 的版本為1.2 即可共一百零一頁(yè)添加(tin ji)Struts 功能對(duì)話(huà)框指定了Strut

4、s 配置文件的存放(cnfng)位置可選的Struts 的版本指定了位于web.xml 中的Struts 核心Servlet 的名字指定了將會(huì)交給Struts 控制的URL 類(lèi)型指定了生成的類(lèi)的默認(rèn)包指定了默認(rèn)的國(guó)際化資源文件包是否安裝Struts 的標(biāo)簽庫(kù)文件共一百零一頁(yè)添加了 Struts 的目錄(ml)結(jié)構(gòu)Struts1.2 的類(lèi)庫(kù)struts-config.xmlStruts 的TLD 文件(wnjin)驗(yàn)證器文件在 src 目錄下編寫(xiě)我們自己的類(lèi)共一百零一頁(yè)第二(d r)部分 用Struts 設(shè)計(jì)器制作前臺(tái)業(yè)務(wù)流程共一百零一頁(yè)軟件開(kāi)發(fā)的設(shè)計(jì)階段在實(shí)際項(xiàng)目開(kāi)發(fā)中,第一步要做的可能是設(shè)計(jì)

5、應(yīng)用的整個(gè)流程,而不是立即著手制作JSP 或者(huzh)編寫(xiě)Java 代碼做實(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ì)階段共一百零一頁(yè)軟件開(kāi)發(fā)的設(shè)計(jì)階段對(duì)于我們要做的這個(gè)項(xiàng)目來(lái)說(shuō),具體的技術(shù)和系統(tǒng)結(jié)構(gòu)已經(jīng)選好,就是SSH 架構(gòu)。那么現(xiàn)在,在加入Spring 整合功能之前,我們有必要把系統(tǒng)的表示層的工作流程搞清楚做這個(gè)流程設(shè)計(jì)有很多辦法,可以用畫(huà)圖工具例如Microsoft Visio,或者UML 建模工具開(kāi)發(fā)一個(gè)活動(dòng)圖等等都可以。因?yàn)?yn wi)我們使用的是My

6、Eclipse,所以我們這里可以用它自帶的Struts 設(shè)計(jì)器快速的畫(huà)出所有的應(yīng)用流程來(lái)共一百零一頁(yè)Struts 配置文件編輯器雙擊 WebRoot/WEB-INF/struts-config.xml 就可以打開(kāi)Struts 配置文件編輯器在設(shè)計(jì)(shj)器網(wǎng)格面板上點(diǎn)擊右鍵,選擇菜單來(lái)創(chuàng)建Action,F(xiàn)orward,JSP 等等為了更好的反映系統(tǒng)的工作流程,我們還可以使用設(shè)計(jì)器工具欄上的 按鈕來(lái)給一些頁(yè)面加入連接關(guān)系,但是如果彈出對(duì)話(huà)框詢(xún)問(wèn)是否設(shè)置為Action 的input 元素時(shí),我們選擇No 按鈕。大致來(lái)說(shuō),我們的應(yīng)用需要增刪改查四個(gè)模塊共一百零一頁(yè)用戶(hù)管理應(yīng)用(yngyng)業(yè)務(wù)流

7、程圖共一百零一頁(yè)業(yè)務(wù)流程說(shuō)明(shumng)功能模塊流程分頁(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 重命名成了list.jsp。另外,到底這些功能該如何進(jìn)行分工和組織,也沒(méi)有絕對(duì)的標(biāo)準(zhǔn),讀者可以根據(jù)自己(zj)的需要或者習(xí)慣來(lái)進(jìn)行分

8、工和命名。例如,新建用戶(hù)這個(gè)功能的命名可以是new,也可以起名為add 或者create。另外通用或者共用的Forward 路徑可以設(shè)置成Global Forward,即全局轉(zhuǎn)向,例如上圖中所顯示的所有到/error.jsp 的轉(zhuǎn)向,可以統(tǒng)一定義為一個(gè)全局的名為error 的Forward共一百零一頁(yè)文檔規(guī)范化相比較于 Java 源代碼來(lái)說(shuō),給JSP 頁(yè)面加入一些文檔比較困難些,因?yàn)镴ava 文件可以用Javadoc 格式的注釋來(lái)加入并生成說(shuō)明,但是JSP 沒(méi)有這方面的規(guī)定和好用的文檔工具寫(xiě)必要的流程說(shuō)明便于自己核對(duì)是否全部頁(yè)面都按照預(yù)期實(shí)現(xiàn)方便自己或者別人日后對(duì)項(xiàng)目方便進(jìn)行修改,升級(jí)和維護(hù)軟

9、件開(kāi)發(fā)本質(zhì)上屬于集體勞動(dòng),所以作為其中的一員,盡量不要只把系統(tǒng)的設(shè)計(jì)藍(lán)圖或者注意事項(xiàng)放在自己的腦子里,一定要想辦法把它表示成可見(jiàn)的文檔來(lái)便于大家(dji)的交流和日后維護(hù)?,F(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è)面共一百零一頁(yè)Action 說(shuō)明(shumng)還有個(gè)問(wèn)題需要大家解決,就是進(jìn)入修改和刪除功能的Action 時(shí),需要在URL 里

10、以地址帶參數(shù)的方式來(lái)傳遞到底是修改或者刪除哪個(gè)用戶(hù)舉個(gè)例子,修改用戶(hù)我們(w men)用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)讀取這些值A(chǔ)ction 路徑類(lèi)名功能描述/listListAction分頁(yè)顯示用戶(hù)信息/edi

11、tEditAction根據(jù)ID 獲取用戶(hù)信息并傳遞給edit.jsp/saveSaveAction保存對(duì)用戶(hù)信息的修改/newNewAction創(chuàng)建新用戶(hù)/deleteDeleteAction根據(jù)ID 刪除用戶(hù)/searchSearchAction根據(jù)用戶(hù)名查找用戶(hù),并將結(jié)果返回給search.jsp共一百零一頁(yè)創(chuàng)建(chungjin)數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù):Student1字段Id:int 主鍵Username:varchar(50) NOT NULLPassword: varchar(20) NOT NULLAge: int共一百零一頁(yè)系統(tǒng)(xtng)框架到現(xiàn)在(xinzi)為止,應(yīng)用的整個(gè)前臺(tái)大框

12、架已經(jīng)確定,接下來(lái)就是考慮后臺(tái)的業(yè)務(wù)層的功能了我們已經(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ù))整個(gè)系統(tǒng)從橫向分層就分成了下面的部分:當(dāng)然并沒(méi)有人規(guī)定到底怎樣分層才是完全正確的表示層控制層業(yè)務(wù)層數(shù)據(jù)訪問(wèn)層輔助功能層共一百零一頁(yè)學(xué)習(xí)方法(fngf)交流系統(tǒng)分成一般來(lái)說(shuō)大家可以按照軟件工程書(shū)籍上的辦法進(jìn)行分層,然而更現(xiàn)實(shí)的卻是大家都在按照自己公司的方式進(jìn)行分層。這時(shí)對(duì)于初學(xué)者來(lái)說(shuō)必須(bx)避免的一個(gè)誤區(qū)就是喋喋不休的對(duì)采用何種標(biāo)準(zhǔn)或者為什么教科書(shū)上所講的東西

13、和現(xiàn)實(shí)不一樣或者說(shuō)對(duì)于某個(gè)東西的原理進(jìn)行一次次的爭(zhēng)論,或者用大家熟悉的話(huà)來(lái)概括:鉆牛角尖。鉆牛角尖表面看是勤奮好學(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è)好辦法就是把這些問(wèn)題都記下來(lái)便于以后查找)。共一百零一頁(yè)學(xué)習(xí)(xux)方法交流我想做

14、程序員首先要有鉆研精神,其次,也得有實(shí)用主義的精神。學(xué)技術(shù),就是為了解決實(shí)際的問(wèn)題的,如果你想為技術(shù)而技術(shù),請(qǐng)先填飽肚子。遇到自己不會(huì)的東西怎么辦?首先是能用就行,我們把它看成黑盒子就行了,就像用遙控器的人永遠(yuǎn)不需要還得懂紅外線,集成電路,振蕩器,發(fā)射器到底是怎么回事一樣(yyng)。說(shuō)到這里似乎已經(jīng)扯遠(yuǎn)了話(huà)題,然而看到過(guò)很多學(xué)生天天追求后臺(tái)原理或者軟件工程,然而卻連簡(jiǎn)單的應(yīng)用也作不出或者設(shè)計(jì)圖都畫(huà)不好。不是他們不努力,而是他們努力走向了另一個(gè)方向:鉆研理論。對(duì)于初學(xué)者,第一步要的就是:能用。其余的,在這基礎(chǔ)之上才能去談進(jìn)一步提高。而且,在國(guó)內(nèi)的現(xiàn)狀就是,絕大多數(shù)人是開(kāi)發(fā)應(yīng)用(簡(jiǎn)單的說(shuō)就是編寫(xiě)

15、固定流程的東西),而不是深入軟件的底層來(lái)做開(kāi)發(fā)工具或者自己動(dòng)手寫(xiě)或者改進(jìn)虛擬機(jī)。共一百零一頁(yè)開(kāi)發(fā)(kif)經(jīng)驗(yàn)交流對(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)了這也是實(shí)際開(kāi)發(fā)兩人或者多人分工協(xié)作可能出現(xiàn)的情況,例如:一個(gè)寫(xiě)前臺(tái),一個(gè)寫(xiě)后臺(tái)當(dāng)然我們并不是要讓大家非得按照軟件工程或者項(xiàng)目管理規(guī)范,把所有的文檔都寫(xiě)好了才能真正開(kāi)始編碼,我們只需要讓想法表示出來(lái),就可以了用代碼來(lái)表示自己的想法,其實(shí)也是一種很不錯(cuò)的辦法(一直(yzh)備受贊揚(yáng)的敏捷開(kāi)發(fā)Agile,就是這樣)共一百零一頁(yè)第三部分(b fen) 設(shè)

16、計(jì)業(yè)務(wù)層功能共一百零一頁(yè)養(yǎng)成使用(shyng)接口的習(xí)慣對(duì)于業(yè)務(wù)層的設(shè)計(jì),我們可以先寫(xiě)接口,然后再具體實(shí)現(xiàn)當(dāng)然直接寫(xiě)成類(lèi)的方式也是沒(méi)人禁止的,尤其是自己學(xué)習(xí)的時(shí)候也是很合適的做法寫(xiě)接口就意味著我們并不需要寫(xiě)好具體的實(shí)現(xiàn)代碼,所以設(shè)計(jì)階段一般來(lái)說(shuō)還是鼓勵(lì)使用接口來(lái)做,這樣大家只需要討論(toln)好哪些功能需要,哪些不需要就行了給這個(gè)接口加上足夠多的注釋?zhuān)ɑ蛘呶臋n)共一百零一頁(yè)進(jìn)行業(yè)務(wù)(yw)層的具體設(shè)計(jì)首先定義接口IStudentManager(這個(gè)以I 開(kāi)頭的名稱(chēng)來(lái)自于Eclipse 的源碼中的定義接口的習(xí)慣,I 表示Interface,便于開(kāi)發(fā)人員一眼看出這是個(gè)接口,當(dāng)然請(qǐng)不要誤會(huì)所有的接

17、口必須以I 開(kāi)頭才能定義)把它放在包service中,用來(lái)定義用戶(hù)管理模塊應(yīng)有的功能。當(dāng)然用manager 作為業(yè)務(wù)層的包還是別的名稱(chēng)都是無(wú)所謂的顯示用戶(hù)列表時(shí)數(shù)據(jù)量大,需分頁(yè)顯示,分頁(yè)部分的接口設(shè)計(jì)如下(rxi)所示:public int getTotalCount(); / 得到用戶(hù)總數(shù)public int getTotalPage(int pageSize) ;/ 獲取總頁(yè)面數(shù)public List findPagedAll(int currentPage, int pageSize);/ 分頁(yè)顯示數(shù)據(jù)共一百零一頁(yè)定義接口(ji ku)IStudentManager方法本項(xiàng)目的主要功能是

18、增刪改查,結(jié)合我們前面(qin mian)所討論的業(yè)務(wù)流程,并考慮到方法的參數(shù)和返回值等情況,我們一個(gè)個(gè)的定義這些功能所對(duì)應(yīng)的方法聲明新建用戶(hù),我們定義一個(gè)方法即可,返回值告訴調(diào)用者是否保存成功。 public boolean save(Student student)保存用戶(hù),我們前面的流程是首先通過(guò)ID 找到Student 對(duì)象,然后再保存更新,所以一共需要兩個(gè)方法的定義:public Student findById(int id);/ 根據(jù)ID 查找public boolean update(Student student);/ 更新用戶(hù)對(duì)象共一百零一頁(yè)定義(dngy)接口IStude

19、ntManager方法刪除用戶(hù),根據(jù) ID 進(jìn)行刪除就可以了,所以定義一個(gè)方法即可,返回值同樣是成功時(shí)返回true,其它情況(qngkung)下返回falsepublic boolean delete(Student student) 查找用戶(hù),我們則只需要一個(gè)方法就可以了,在這里我們只提供根據(jù)用戶(hù)名進(jìn)行查找的功能,方法的參數(shù)是用戶(hù)名,返回值則是包含找到的用戶(hù)對(duì)象的列表,如果找不到的話(huà)就返回nullpublic List findStudentByUsername(String username);共一百零一頁(yè)開(kāi)發(fā)(kif)經(jīng)驗(yàn)交流至此,我們所有的初步設(shè)計(jì)工作都已完成了,下一步就可以著手進(jìn)行詳

20、細(xì)設(shè)計(jì)了。但是因?yàn)檫@個(gè)項(xiàng)目相對(duì)比較規(guī)模小,所以我們接下來(lái)就進(jìn)入具體的開(kāi)發(fā)過(guò)程中對(duì)于大型項(xiàng)目實(shí)際(shj)開(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)不過(guò)實(shí)際開(kāi)發(fā)中你會(huì)發(fā)現(xiàn)基本上所有的詳細(xì)設(shè)計(jì)都會(huì)有紕漏或者錯(cuò)誤之處,需要在開(kāi)發(fā)過(guò)程中逐步進(jìn)行必要的修改共一百零一頁(yè)開(kāi)發(fā)(kif)經(jīng)驗(yàn)交流設(shè)計(jì)完成后,到底

21、是先做前臺(tái)頁(yè)面還是先實(shí)現(xiàn)后臺(tái)的功能類(lèi)呢?這個(gè)問(wèn)題其實(shí)并無(wú)標(biāo)準(zhǔn)答案,全依賴(lài)于開(kāi)發(fā)人員的習(xí)慣而決定由于前面我們已經(jīng)將業(yè)務(wù)層接口確定,所以如果假設(shè)這個(gè)項(xiàng)目有兩個(gè)人進(jìn)行開(kāi)發(fā)的話(huà),是可以(ky)分頭進(jìn)行的,只需要最后在Spring 配置文件中將接口的具體實(shí)現(xiàn)類(lèi)指定就可以了相對(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ā)共一百零一頁(yè)第四部分(b fen) 開(kāi)發(fā)業(yè)務(wù)層和DAO 層代碼共一百零一頁(yè)第四部分(b fen)內(nèi)容添加Hibernate功能添加Spring 功能Spring 整合 Hibernate用Spring 2.0 的aop

22、和tx 聲明式配置解決事務(wù)(shw)提交問(wèn)題開(kāi)發(fā)業(yè)務(wù)層共一百零一頁(yè)添加(tin ji)Hibernate功能共一百零一頁(yè)添加(tin ji)Hibernate功能現(xiàn)在我們要把Hibernate功能添加到當(dāng)前(dngqin)項(xiàng)目,這一步不反向工程生成DAO,因?yàn)槲覀冏罱K的目的是使用Spring整合的Hibernate DAO 類(lèi)共一百零一頁(yè)添加(tin ji) Hibernate Capabilities添加 Hibernate 類(lèi)庫(kù) (JARs) 到項(xiàng)目的類(lèi)路徑在項(xiàng)目中創(chuàng)建(chungjin)并配置 hibernate.cfg.xml在項(xiàng)目中創(chuàng)建自定義的 Session Factory 類(lèi)來(lái)簡(jiǎn)

23、化 Hibernate 會(huì)話(huà)處理添加 Hibernate 功能的步驟:在Package Explorer 中選擇 ssh2 項(xiàng)目從 MyEclipse 菜單欄選擇MyEclipse Project Capabilities Add Hibernate Capabilities . 來(lái)啟動(dòng) Add Hibernate Capabilities 向?qū)Ч惨话倭阋豁?yè)Add Hibernate Capabilities向?qū)?xingdo)選擇(xunz)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)目中. 這些 J

24、AR 文件會(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)在項(xiàng)目的路徑, 可以新建或者使用現(xiàn)有目錄,Hibernate 類(lèi)庫(kù)將會(huì)被向?qū)?fù)制到這里共一百零一頁(yè)創(chuàng)建(chungjin)Hibernate XML 配置文件上頁(yè)選擇Next 按鈕前進(jìn)(qinjn)到本頁(yè)創(chuàng)建 Hibernate XML 配置文件共一百零一頁(yè)選擇(xunz)數(shù)據(jù)庫(kù)連接如果(rgu)不想現(xiàn)在就設(shè)置數(shù)據(jù)庫(kù)連接屬性,去掉復(fù)選框即可跳過(guò)選擇以前創(chuàng)建好的數(shù)據(jù)庫(kù)連接,相關(guān)的連接信息將

25、會(huì)自動(dòng)填入到對(duì)話(huà)框中選中后則會(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ō)不要用共一百零一頁(yè)創(chuàng)建(chungjin)SessionFactory這一頁(yè)選擇是否生成Session Factory 類(lèi),去掉復(fù)選框Create SessionFactory class?的選中狀態(tài)(zhungti),最后點(diǎn)擊Finish 按鈕完成整個(gè)添加過(guò)程共一百零一頁(yè)向?qū)ЫY(jié)束后將進(jìn)行(jnxng)的操作如果在第一頁(yè)選擇了復(fù)制類(lèi)庫(kù)到你的項(xiàng)目(xingm), 將復(fù)制 Hibernate 類(lèi)庫(kù)

26、 (JARs) 到項(xiàng)目中更新項(xiàng)目的構(gòu)造路徑來(lái)包含已安裝的 Hibernate 類(lèi)庫(kù)給項(xiàng)目創(chuàng)建并配置 hibernate.cfg.xml 文件共一百零一頁(yè)添加(tin ji)Spring 功能共一百零一頁(yè)給項(xiàng)目加入(jir)Spring 功能項(xiàng)目創(chuàng)建完畢后就可以加入 Spring 開(kāi)發(fā)功能了。要給項(xiàng)目添加Spring 功能,請(qǐng)按照下面的步驟進(jìn)行:在Package Explorer 視圖中選擇 ssh2項(xiàng)目;接下來(lái), 從 MyEclipse 菜單欄選擇MyEclipse Project Capabilities Add Spring Capabilities . 來(lái)啟動(dòng) Add Spring Ca

27、pabilities 向?qū)?xingdo),對(duì)于這個(gè)項(xiàng)目來(lái)說(shuō),你可以直接點(diǎn)擊Finish 按鈕就行了共一百零一頁(yè)加入(jir)Spring 功能向?qū)?duì)話(huà)框的第1頁(yè)Spring 版本(bnbn),一般選擇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)MyEclipse 進(jìn)行開(kāi)發(fā)或者手工管理類(lèi)庫(kù)當(dāng)選中了 Spring Web 的時(shí)候需要指定標(biāo)簽庫(kù)文件的安裝目錄注意有些Myeclipse 的該窗口沒(méi)有 Sprin

28、g2.0 ORM/DAO/hibernate3 libraries類(lèi)庫(kù),要在添加完后手動(dòng)添加,添加方法Build path add libraries共一百零一頁(yè)加入(jir)Spring 功能向?qū)?duì)話(huà)框的第2頁(yè)創(chuàng)建Spring bean 定義(dngy)文件可以修改Spring 配置文件的名字(修改Folder 和File 選項(xiàng))共一百零一頁(yè)加入Spring 功能(gngnng)向?qū)?duì)話(huà)框的第3頁(yè)配置一個(gè)(y )使用現(xiàn)有Hibernate配置文件的Spring下的LocalSessionFactory采用默認(rèn)的sessionFactory就可以了共一百零一頁(yè)Spring 整合(zhn h)

29、Hibernate共一百零一頁(yè)使用反向工程快速生成Java POJO 類(lèi),映射(yngsh)文件和DAO術(shù)語(yǔ)解釋DAO 是Data Access Object,數(shù)據(jù)(shj)訪問(wèn)對(duì)象的縮寫(xiě)POJO 是Plain and Old Java Object,普通和舊式的Java 對(duì)象的縮寫(xiě),也就是普通Java 類(lèi)的意思打開(kāi)MyEclipse Database Explorer透視圖點(diǎn)擊工具欄上的點(diǎn)擊 按鈕可以顯示多個(gè)透視圖供切換Window Open Perspective Other MyEclipse Database Explorer來(lái)顯示打開(kāi)透視圖對(duì)話(huà)框共一百零一頁(yè)DB Browser 視圖

30、(sht)創(chuàng)建連接點(diǎn)右鍵,選擇(xunz)New共一百零一頁(yè)啟動(dòng)反向(fn xin)工程向?qū)c(diǎn)右鍵,選擇(xunz)Open Connection共一百零一頁(yè)Hibernate 反向(fn xin)工程向?qū)У?1 頁(yè)共一百零一頁(yè)Spring 整合(zhn h)Hibernate 的項(xiàng)目文件內(nèi)容共一百零一頁(yè)StudentDAOStudentDAO類(lèi)繼承自HibernateDaoSupport,該類(lèi)來(lái)自于Spring,它提供了獲取HibernateTemplate 的方法(fngf):getHibernateTemplate(),這個(gè)DAO 也實(shí)現(xiàn)了保存,刪除,查找實(shí)體類(lèi)的方法(fngf),在此需

31、要加入對(duì)應(yīng)業(yè)務(wù)處理的分頁(yè)和更新功能public int getTotalCount()public List findPagedAll(int currentPage, int pageSize)public void update(Student1 transientInstance) public List findByUsername(Object username) 另外,它還缺少必要的功能:事務(wù)處理共一百零一頁(yè)用Spring 2.0 的aop 和tx 聲明式配置解決事務(wù)提交(tjio)問(wèn)題共一百零一頁(yè)修改(xigi)applicationContext.xmlSpring 1.2 方

32、式(fngsh)的事務(wù)代理是非常繁瑣的,現(xiàn)在我們用Spring 2.0 的聲明式事務(wù)來(lái)完成。將上面的applicationContext.xml 將其內(nèi)容修改為如下所示“注意這里根據(jù)文件位置來(lái)定”共一百零一頁(yè)測(cè)試(csh)并運(yùn)行寫(xiě)一個(gè)測(cè)試類(lèi) Spring2TransactionDAOTest.java,來(lái)測(cè)試這個(gè)(zh ge)新的基于聲明式的AOP 配置文件public class Spring2TransactionDAOTest public static void main(String args) ApplicationContext ctx = new ClassPathXmlApp

33、licationContext(applicationContext2.xml); Student1DAO dao = (Student1DAO)ctx.getBean(StudentDAO); 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

34、 cannot be cast to dao.Student1DAOat dao.Spring2TransactionDAOTest.main(Spring2TransactionDAOTest.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 吧共一百零一頁(yè)修改(xigi)代碼現(xiàn)在只好按照要求(yoqi),把類(lèi)加入一個(gè)接口定義,先修改Student1DAO.java,讓它實(shí)現(xiàn)一個(gè)接口IStudentDAO:publi

35、c class Student1DAO extends HibernateDaoSupport implements IStudentDAO共一百零一頁(yè)編寫(xiě)(binxi)接口寫(xiě)一個(gè)接口IStudentDAO(可以通過(guò)重構(gòu)功能來(lái)生成,選擇菜單Refactory Extract Interface,在對(duì)話(huà)框的Interface name 處輸入IStudentDAO,然后選中對(duì)話(huà)框中需要加入到接口中的方法(fngf)列表,最后點(diǎn)擊Finish 按鈕即可import java.util.List;public interface IStudentDAO / property constantspub

36、lic static final String USERNAME = username;public static final String PASSWORD = password;public static final String AGE = age;public abstract void save(Student1 transientInstance);public abstract void delete(Student1 persistentInstance);public abstract Student1 findById(java.lang.Integer id);publi

37、c abstract List findByExample(Student1 instance);public abstract List findByProperty(String propertyName, Object value);public abstract List findByUsername(Object username);public abstract List findByPassword(Object password);public abstract List findByAge(Object age);public abstract List findAll();

38、public abstract Student1 merge(Student1 detachedInstance);public abstract void attachDirty(Student1 instance);public abstract void attachClean(Student1 instance);共一百零一頁(yè)再次測(cè)試(csh)并運(yùn)行這時(shí)候?qū)?yīng)的 Spring2TransactionDAOTest.java 里面的代碼已經(jīng)自動(dòng)變成了:IStudentDAO dao = (IStudentDAO)ctx.getBean(StudentDAO);再次運(yùn)行測(cè)試類(lèi)Spring2

39、TransactionDAOTest,然后檢查數(shù)據(jù)庫(kù),可以很高興的看到數(shù)據(jù)已經(jīng)插入進(jìn)來(lái)了這里(zhl)會(huì)出現(xiàn)異常 關(guān)于主鍵是否自增長(zhǎng)的問(wèn)題通過(guò)修改student.hbm.xml 共一百零一頁(yè)開(kāi)發(fā)(kif)業(yè)務(wù)層共一百零一頁(yè)開(kāi)發(fā)(kif)StudentManager類(lèi)代碼創(chuàng)建前面設(shè)計(jì)好的IStudentManager接口修改或者新建類(lèi)service.StudentManager,來(lái)實(shí)現(xiàn)先前定義的IStudentManager 接口中的功能為了便于使用Spring 整合,我們將其中的DAO層設(shè)置成一個(gè)屬性dao,通過(guò)方法(fngf)getDao()和setDao()定義,類(lèi)型為dao.Studen

40、t1DAO。業(yè)務(wù)層的絕大部分功能都是委托給dao 來(lái)實(shí)現(xiàn)的,而對(duì)于那些需要返回布爾值來(lái)確定是否操作成功的方法,我們用try-catch 語(yǔ)句來(lái)實(shí)現(xiàn)這樣的需求,即:沒(méi)有異常時(shí)返回true,否則返回falseprivate IStudentDAO dao;public int getTotalCount() return dao.getTotalCount();public int getTotalPage(int pageSize) int totalCount = getTotalCount(); / 得到頁(yè)面總數(shù) int totalPageCount = (totalCount + page

41、Size) - 1) / pageSize; return totalPageCount;public List findPagedAll(int currentPage, int pageSize) return dao.findPagedAll(currentPage, pageSize);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 的配置

42、文件applicationContext.xml 中加入下面的bean 配置:共一百零一頁(yè)測(cè)試(csh)并運(yùn)行業(yè)務(wù)層編寫(xiě)(binxi)測(cè)試類(lèi)test.StudentBizTest.javapackage test;public class StudentBizTest public static void main(String args) ApplicationContext ctx = new ClassPathXmlApplicationContext(applicationContext.xml); IStudentManager studentBiz = (IStudentManag

43、er)ctx.getBean(studentBiz); List studentList = studentBiz.findPagedAll(1, 3); System.out.println(每頁(yè)三行,第一頁(yè)數(shù)據(jù): ); for(Student1 student :studentList) System.out.println(姓名: + student.getUsername()+密碼: + student.getPassword(); 與前例類(lèi)似,studentManager需要抽象出接口IStudentManager運(yùn)行這個(gè)類(lèi),得到如下的輸出:log4j:WARN No appende

44、rs could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).log4j:WARN Please initialize the log4j system properly.Hibernate: select top 3 student1x0_.id as id0_, student1x0_.Username as Username0_, student1x0_.Password as Password0_, student1x0_.Age as Age0_ fr

45、om myssh.dbo.student1 student1x0_每頁(yè)三行,第一頁(yè)數(shù)據(jù):姓名:dd大多數(shù) 密碼:1234 姓名:spring dao 密碼:pa 姓名:spring dao2 密碼:pa2 共一百零一頁(yè)第五部分 開(kāi)發(fā)前臺(tái)頁(yè)面(y min)流程共一百零一頁(yè)前臺(tái)如何(rh)開(kāi)發(fā)前面我們已經(jīng)完成了必要的功能設(shè)計(jì),在此階段給以編碼實(shí)現(xiàn)對(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è)試,就可以完成了下面(xi mian)我們重溫業(yè)務(wù)流程說(shuō)

46、明及用戶(hù)管理應(yīng)用業(yè)務(wù)流程圖共一百零一頁(yè)重溫(zhn wn)業(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.dosearch.jsp需要說(shuō)明的是為了便于編寫(xiě)一個(gè)默認(rèn)的入口歡迎頁(yè)面,方便用戶(hù)的使用(shyng),我們已經(jīng)把原來(lái)顯示用戶(hù)列表的index.jsp 重命名成了list.jsp。另外,到底這些功能該如何進(jìn)行分工和組織,也沒(méi)有絕對(duì)的標(biāo)準(zhǔn),讀者可以根

47、據(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共一百零一頁(yè)重溫用戶(hù)(yngh)管理應(yīng)用業(yè)務(wù)流程圖共一百零一頁(yè)開(kāi)發(fā)前臺(tái)(qinti)代碼具體的編碼過(guò)程不再贅述,按照流程創(chuàng)建一個(gè)個(gè)JSP頁(yè)面,最后再修改后臺(tái)的Action類(lèi)代碼需要提示大家的是,像EditAction這樣的功能的寫(xiě)法,需要根據(jù)ID查找一個(gè)用戶(hù)然后傳遞給前臺(tái)進(jìn)行修改,

48、雖然沒(méi)有明確的在設(shè)計(jì)圖中反映出來(lái),如果不幸找不到用戶(hù)信息的話(huà),務(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è)面則使用EL表達(dá)式加以顯示。實(shí)現(xiàn)過(guò)程中一定要全面考慮到客戶(hù)端驗(yàn)證(JavaScript表單驗(yàn)證)和服務(wù)器端驗(yàn)證(在Action類(lèi)中進(jìn)行必要(byo)的數(shù)據(jù)驗(yàn)證),共一百零一頁(yè)解決(jiju)中文問(wèn)題加入解

49、決中文(zhngwn)字符編碼的過(guò)濾器TomcatFormFilter在web.xml中進(jìn)行配置/goodbyideal/archive/2006/04/25/676039.aspx共一百零一頁(yè)加入日志(rzh)功能因?yàn)?yn wi)Spring 用了LOG4J 做出錯(cuò)信息的輸出,雖然后臺(tái)有很多的真實(shí)出錯(cuò)信息,然而在這里卻是看不到的。所以需要加入日志處理功能在src 目錄下創(chuàng)建配置文件,選擇菜單File New File,文件名輸入perties,文件內(nèi)容如下所示:log4j.rootLogger=WARN, stdoutlog4j.appender.stdout=org.apache.log

50、4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d %p %c - %m%n共一百零一頁(yè)項(xiàng)目(xingm)ssh2源代碼目錄結(jié)構(gòu)共一百零一頁(yè)表單驗(yàn)證(ynzhng)腳本代碼文件 js/form.js 是抽取(chu q)出來(lái)公用的表單驗(yàn)證功能的腳本代碼,其代碼清單如下所示:function checkForm(form) / 驗(yàn)證表單輸入不為空的腳本代碼 if(form.username.val

51、ue = ) 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;共一百零一頁(yè)開(kāi)發(fā)(kif)error.jsp 出錯(cuò)(ch cu)了! 出錯(cuò)了! 詳細(xì)信息是: $message 返回 出錯(cuò)的信息可以放在 request 的attribute 里面,例如調(diào)用request

52、.setAttribute(“message”,”出錯(cuò)了!”);之后相關(guān)的出錯(cuò)信息就可以顯示在這個(gè)頁(yè)面中。另外還提供了一個(gè)返回鏈接讓用戶(hù)能夠回去繼續(xù)操作共一百零一頁(yè)第一個(gè)流程(lichng) index.jsplist.doindex.jsp源碼分析(fnx) 歡迎使用用戶(hù)管理系統(tǒng) 查看用戶(hù)列表 大家通過(guò)查看運(yùn)行時(shí)的HTML源代碼就可以看到其輸出是:,這句話(huà)可以讓我們的頁(yè)面總能正確找到引用的圖片,CSS等外部資源。假設(shè)頁(yè)面有個(gè)圖片寫(xiě)著:,那么即使這個(gè)頁(yè)面的內(nèi)容通過(guò)forward變成了/ssh2/user/welcome.do,而圖片依然會(huì)從地址http:/localhost:8080/ssh2

53、/gif/a.gif 來(lái)讀取點(diǎn)擊超鏈接,瀏覽過(guò)去的是顯示分頁(yè)的Struts 的控制器ListAction.java共一百零一頁(yè)ListAction.java代碼(di m)/* 分頁(yè)顯示用戶(hù)信息 */public class ListAction extends Action public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) / 分析當(dāng)前(dngqin)頁(yè)碼String pageString=r

54、equest.getParameter(page);if(pageString = null | pageString.length() = 0) pageString = 1;int currentPage= 0 ;try currentPage = Integer.parseInt(pageString);/ 當(dāng)前頁(yè)碼 catch(Exception e) if(currentPage = 0) currentPage = 1;int pageSize = 3;/每頁(yè)顯示的數(shù)據(jù)數(shù) / 讀取數(shù)據(jù)List users = manager.findPagedAll(currentPage, pa

55、geSize);request.setAttribute(users,users);/ 保存用戶(hù)列表request.setAttribute(totalPage, manager.getTotalPage(pageSize);/ 保存總頁(yè)數(shù)request.setAttribute(totalCount, manager.getTotalCount();/ 保存記錄總數(shù)request.setAttribute(currentPage, currentPage);/ 保存當(dāng)前頁(yè)碼return mapping.findForward(display);private IStudentManager

56、manager;public IStudentManager getManager() return manager;public void setManager(IStudentManager 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中注入共一百零一頁(yè)list.jsp代碼(di m)list.jsp 用來(lái)顯示用戶(hù)和功能(gngnng)鏈接它是我們這個(gè)用戶(hù)管理應(yīng)用的中心頁(yè)面,所有的功能都從這里

57、出發(fā) 用戶(hù)列表頁(yè)面 用戶(hù)列表頁(yè)面 用戶(hù)ID 用戶(hù)名 操作 $user.id $user.username 修改 刪除 共$totalCount個(gè)用戶(hù)第$currentPage頁(yè)/共$totalPage頁(yè) 遍歷上頁(yè)ListAction.java代碼存放在request中的users屬性值需傳遞id值到EditAction.java中從ListAction.java存放在request中獲取屬性值共一百零一頁(yè)list.jsp代碼(di m)list.jsp 用來(lái)顯示(xinsh)用戶(hù)和功能鏈接它是我們這個(gè)用戶(hù)管理應(yīng)用的中心頁(yè)面,所有的功能都從這里出發(fā) 1 上一頁(yè) c:if test=$curren

58、tPage 上一頁(yè) c:if test=$currentPage 下一頁(yè) = totalPage 下一頁(yè) / 頁(yè)面跳轉(zhuǎn)函數(shù) / 參數(shù): 包含頁(yè)碼的表單元素,例如輸入框,下拉框等 function jumpPage(input) if(input.value = $currentPage) return; / 頁(yè)碼相同就不做跳轉(zhuǎn) var newUrl = $pageContext.request.contextPath/list.do?page= + input.value; document.location = newUrl; 若上一頁(yè)有數(shù)據(jù),則設(shè)置超鏈接,否則不設(shè)置超鏈接若下一頁(yè)有數(shù)據(jù),則

59、設(shè)置超鏈接,否則不設(shè)置超鏈接使用javascript函數(shù)實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)功能共一百零一頁(yè)list.jsp代碼(di m)list.jsp 用來(lái)顯示(xinsh)用戶(hù)和功能鏈接它是我們這個(gè)用戶(hù)管理應(yīng)用的中心頁(yè)面,所有的功能都從這里出發(fā)轉(zhuǎn)到 option value=$i selected第$i頁(yè) 輸入頁(yè)碼: 添加用戶(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共一百零一頁(yè)用戶(hù)列表(li bio)頁(yè)面外觀當(dāng)點(diǎn)擊添加用戶(hù)鏈接后,我們就

60、進(jìn)入(jnr)另一個(gè)模塊:添加用戶(hù),流程是new.jspnew.dolist.do共一百零一頁(yè)增加用戶(hù)(yngh)流程new.jspnew.dolist.do添加(tin ji)新用戶(hù)表單輸入頁(yè)面new.jspnew.jsp源碼分析 添加用戶(hù) 添加用戶(hù) 用戶(hù)名:td 密碼: 年齡: td 當(dāng)前頁(yè)面引入js/form.js文件提交到NewAction.java,提交前調(diào)用form.js中的checkForm()函數(shù),雖然這里用Struts 標(biāo)簽庫(kù)編寫(xiě),也還是可以加入對(duì)應(yīng)的客戶(hù)端驗(yàn)證代碼的利用document對(duì)象location屬性實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)共一百零一頁(yè)NewAction.java代碼(di m

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論