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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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ù)層功能開發(fā)業(yè)務(wù)層和DAO 層代碼開發(fā)前臺(tái)頁(yè)面流程(lichng)整合Spring,Struts 和Hibernate發(fā)布,運(yùn)行,測(cè)試使用(shyng)SSH開發(fā)增刪改查的綜合用戶管理例子共一百零一頁(yè)第一(dy)部分 創(chuàng)建新項(xiàng)目共一百零一頁(yè)創(chuàng)建(chungjin)新項(xiàng)目創(chuàng)建Web 項(xiàng)目ssh2加入 Struts 開發(fā)功能(gngnng)使用Struts 工具開發(fā)數(shù)據(jù)庫(kù)student1實(shí)現(xiàn)功能:對(duì)用戶的增刪改查前臺(tái):需要加入增加,修改刪除和查詢用戶所對(duì)應(yīng)的頁(yè)面后臺(tái)功能通過調(diào)用Struts Action 來完成,Struts 的Action 再

2、委托給業(yè)務(wù)層StudentManager 類來完成根據(jù)個(gè)人愛好的不同,你既可以先完成前臺(tái)的頁(yè)面,也可以先把后臺(tái)的業(yè)務(wù)類寫完整,或者是兩個(gè)人分工的話一人負(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 開發(fā)(kif)功能項(xiàng)目根節(jié)點(diǎn)上右鍵點(diǎn)擊(din j),選擇上下文菜單中的MyEclipse Add Struts Capabilities或者選擇菜單MyEclipse Project Capabilities Add Struts Capabilities添加 Struts 功能對(duì)話框的默認(rèn)值一般來說不需要修改就可以使用,點(diǎn)擊單選鈕 Struts 1.2 選擇Struts 的版本為1.2 即可共一百零一頁(yè)添加(tin ji)Struts 功能對(duì)話框指定了Strut

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

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

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

7、程圖共一百零一頁(yè)業(yè)務(wù)流程說明(shumng)功能模塊流程分頁(yè)列出用戶index.jsplist.do創(chuàng)建新用戶(new)new.jspnew.dolist.do刪除用戶(delete)Delete.dolist.do修改用戶(edit)edit.doedit.jspsave.dolist.do查找用戶(search)Search.dosearch.jsp需要說明的是為了便于編寫一個(gè)默認(rèn)的入口歡迎頁(yè)面,方便用戶的使用,我們已經(jīng)把原來顯示用戶列表的index.jsp 重命名成了list.jsp。另外,到底這些功能該如何進(jìn)行分工和組織,也沒有絕對(duì)的標(biāo)準(zhǔn),讀者可以根據(jù)自己(zj)的需要或者習(xí)慣來進(jìn)行分

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

9、件開發(fā)本質(zhì)上屬于集體勞動(dòng),所以作為其中的一員,盡量不要只把系統(tǒng)的設(shè)計(jì)藍(lán)圖或者注意事項(xiàng)放在自己的腦子里,一定要想辦法把它表示成可見的文檔來便于大家(dji)的交流和日后維護(hù)。現(xiàn)在我們把JSP 頁(yè)面的功能用表格的方式列出來,如下表所示:頁(yè)面名功能描述index.jsp入口頁(yè)面list.jsp用戶信息列表顯示頁(yè)面(核心頁(yè)面)edit.jsp用戶信息修改表單輸入頁(yè)面error.jsp出錯(cuò)信息顯示頁(yè)面new.jsp添加新用戶表單輸入頁(yè)面search.jsp顯示查找用戶結(jié)果的頁(yè)面共一百零一頁(yè)Action 說明(shumng)還有個(gè)問題需要大家解決,就是進(jìn)入修改和刪除功能的Action 時(shí),需要在URL 里

10、以地址帶參數(shù)的方式來傳遞到底是修改或者刪除哪個(gè)用戶舉個(gè)例子,修改用戶我們(w men)用edit.do?id=1 這種形式。另外用戶的ID 是不可修改的,因此如果表單里要傳遞這個(gè)參數(shù),一般就以表單的hidden(隱藏)類型的輸入域來表示,具體代碼類似這樣: input type=”hidden” name=”id” value=” 另外如果前臺(tái)需要一些數(shù)據(jù),后臺(tái)可以通過request.setAttribute()方法來設(shè)置,前臺(tái)則需要用request.getAttribute()方法或者EL 表達(dá)式來讀取這些值A(chǔ)ction 路徑類名功能描述/listListAction分頁(yè)顯示用戶信息/edi

11、tEditAction根據(jù)ID 獲取用戶信息并傳遞給edit.jsp/saveSaveAction保存對(duì)用戶信息的修改/newNewAction創(chuàng)建新用戶/deleteDeleteAction根據(jù)ID 刪除用戶/searchSearchAction根據(jù)用戶名查找用戶,并將結(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)確定,接下來就是考慮后臺(tái)的業(yè)務(wù)層的功能了我們已經(jīng)確定要使用Spring + Hibernate 來完成后臺(tái)功能。Struts 的Action 將會(huì)調(diào)用業(yè)務(wù)層,業(yè)務(wù)層再會(huì)去調(diào)用數(shù)據(jù)訪問層和其它的一些輔助功能層(工具類或者第三方類庫(kù))整個(gè)系統(tǒng)從橫向分層就分成了下面的部分:當(dāng)然并沒有人規(guī)定到底怎樣分層才是完全正確的表示層控制層業(yè)務(wù)層數(shù)據(jù)訪問層輔助功能層共一百零一頁(yè)學(xué)習(xí)方法(fngf)交流系統(tǒng)分成一般來說大家可以按照軟件工程書籍上的辦法進(jìn)行分層,然而更現(xiàn)實(shí)的卻是大家都在按照自己公司的方式進(jìn)行分層。這時(shí)對(duì)于初學(xué)者來說必須(bx)避免的一個(gè)誤區(qū)就是喋喋不休的對(duì)采用何種標(biāo)準(zhǔn)或者為什么教科書上所講的東西

13、和現(xiàn)實(shí)不一樣或者說對(duì)于某個(gè)東西的原理進(jìn)行一次次的爭(zhēng)論,或者用大家熟悉的話來概括:鉆牛角尖。鉆牛角尖表面看是勤奮好學(xué),對(duì)某種內(nèi)容具有韌性或者探索精神,然而我們卻不得不面對(duì)這樣一個(gè)場(chǎng)面:如果我們企圖完全弄懂一個(gè)問題,就不得不把和它關(guān)聯(lián)的問題也搞懂。但是尷尬的是,首先我們并不能無限制的得到任何自己需要的資料(大部分技術(shù)都是黑盒子,外人看不到內(nèi)部實(shí)現(xiàn)的),另一方面,我們不得不承認(rèn)人腦的記憶和理解是有限的這個(gè)現(xiàn)實(shí)。當(dāng)你高高興興的以為自己弄懂了一個(gè)又一個(gè)問題時(shí),最后卻尷尬的發(fā)現(xiàn)似乎自己高興過后只能記起其中的一兩個(gè)(當(dāng)然有個(gè)好辦法就是把這些問題都記下來便于以后查找)。共一百零一頁(yè)學(xué)習(xí)(xux)方法交流我想做

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

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

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

17、口必須以I 開頭才能定義)把它放在包service中,用來定義用戶管理模塊應(yīng)有的功能。當(dāng)然用manager 作為業(yè)務(wù)層的包還是別的名稱都是無所謂的顯示用戶列表時(shí)數(shù)據(jù)量大,需分頁(yè)顯示,分頁(yè)部分的接口設(shè)計(jì)如下(rxi)所示:public int getTotalCount(); / 得到用戶總數(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)的方法聲明新建用戶,我們定義一個(gè)方法即可,返回值告訴調(diào)用者是否保存成功。 public boolean save(Student student)保存用戶,我們前面的流程是首先通過ID 找到Student 對(duì)象,然后再保存更新,所以一共需要兩個(gè)方法的定義:public Student findById(int id);/ 根據(jù)ID 查找public boolean update(Student student);/ 更新用戶對(duì)象共一百零一頁(yè)定義(dngy)接口IStude

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

20、細(xì)設(shè)計(jì)了。但是因?yàn)檫@個(gè)項(xiàng)目相對(duì)比較規(guī)模小,所以我們接下來就進(jìn)入具體的開發(fā)過程中對(duì)于大型項(xiàng)目實(shí)際(shj)開發(fā)中一般會(huì)進(jìn)行詳細(xì)設(shè)計(jì),要把所有的JSP 頁(yè)面的樣子畫出來,每個(gè)類的UML 圖也要畫出來,以及每個(gè)頁(yè)面和類的具體實(shí)現(xiàn)思路也得進(jìn)行說明,例如:頁(yè)面中加入的表單驗(yàn)證腳本代碼,Action 類的工作流程,DAO 層采用何種技術(shù)實(shí)現(xiàn)等等(當(dāng)然這里可以使用Spring 中的HibernateDaoSupport 或者HibernateTemplate)不過實(shí)際開發(fā)中你會(huì)發(fā)現(xiàn)基本上所有的詳細(xì)設(shè)計(jì)都會(huì)有紕漏或者錯(cuò)誤之處,需要在開發(fā)過程中逐步進(jìn)行必要的修改共一百零一頁(yè)開發(fā)(kif)經(jīng)驗(yàn)交流設(shè)計(jì)完成后,到底

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

22、和tx 聲明式配置解決事務(wù)(shw)提交問題開發(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 類共一百零一頁(yè)添加(tin ji) Hibernate Capabilities添加 Hibernate 類庫(kù) (JARs) 到項(xiàng)目的類路徑在項(xiàng)目中創(chuàng)建(chungjin)并配置 hibernate.cfg.xml在項(xiàng)目中創(chuàng)建自定義的 Session Factory 類來簡(jiǎn)

23、化 Hibernate 會(huì)話處理添加 Hibernate 功能的步驟:在Package Explorer 中選擇 ssh2 項(xiàng)目從 MyEclipse 菜單欄選擇MyEclipse Project Capabilities Add Hibernate Capabilities . 來啟動(dòng) Add Hibernate Capabilities 向?qū)Ч惨话倭阋豁?yè)Add Hibernate Capabilities向?qū)?xingdo)選擇(xunz)Hibernate 類庫(kù)版本可以添加到項(xiàng)目的構(gòu)造路徑的類庫(kù)集合選中的類庫(kù)將會(huì)添加到項(xiàng)目的構(gòu)造路徑中, 但相應(yīng)的JAR 文件將不會(huì)復(fù)制到項(xiàng)目中. 這些 J

24、AR 文件會(huì)在發(fā)布程序時(shí)復(fù)制選中的類庫(kù) JAR 文件將會(huì)被復(fù)制到項(xiàng)目并添加到構(gòu)造路徑中去(這個(gè)方式在開發(fā)不依賴于MyEclipse 的項(xiàng)目的時(shí)候,或者解決JAR 包沖突的時(shí)候很有用),此處選用復(fù)制的方式相對(duì)于現(xiàn)在項(xiàng)目的路徑, 可以新建或者使用現(xiàn)有目錄,Hibernate 類庫(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ù)選框即可跳過選擇以前創(chuàng)建好的數(shù)據(jù)庫(kù)連接,相關(guān)的連接信息將

25、會(huì)自動(dòng)填入到對(duì)話框中選中后則會(huì)自動(dòng)加入相應(yīng)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)類庫(kù)jar 文件到項(xiàng)目的類路徑中如果選中,那么Hibernate 將會(huì)自動(dòng)根據(jù)映射文件來動(dòng)態(tài)生成建表語(yǔ)句然后執(zhí)行,然而這種方法不是很可靠,所以一般來說不要用共一百零一頁(yè)創(chuàng)建(chungjin)SessionFactory這一頁(yè)選擇是否生成Session Factory 類,去掉復(fù)選框Create SessionFactory class?的選中狀態(tài)(zhungti),最后點(diǎn)擊Finish 按鈕完成整個(gè)添加過程共一百零一頁(yè)向?qū)ЫY(jié)束后將進(jìn)行(jnxng)的操作如果在第一頁(yè)選擇了復(fù)制類庫(kù)到你的項(xiàng)目(xingm), 將復(fù)制 Hibernate 類庫(kù)

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

27、pabilities 向?qū)?xingdo),對(duì)于這個(gè)項(xiàng)目來說,你可以直接點(diǎn)擊Finish 按鈕就行了共一百零一頁(yè)加入(jir)Spring 功能向?qū)?duì)話框的第1頁(yè)Spring 版本(bnbn),一般選擇Spring 2 單選鈕選擇要加入項(xiàng)目類路徑的類庫(kù)點(diǎn)擊此鏈接可以修改類庫(kù)設(shè)置選擇JAR 類庫(kù)的安裝方式,上面的單選鈕只是把引用的類庫(kù)加入類路徑,下面的則需要指定一個(gè)目錄把所有的JAR 文件和標(biāo)簽文件加入到當(dāng)前項(xiàng)目中,這種方式適用于不依賴MyEclipse 進(jìn)行開發(fā)或者手工管理類庫(kù)當(dāng)選中了 Spring Web 的時(shí)候需要指定標(biāo)簽庫(kù)文件的安裝目錄注意有些Myeclipse 的該窗口沒有 Sprin

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

29、Hibernate共一百零一頁(yè)使用反向工程快速生成Java POJO 類,映射(yngsh)文件和DAO術(shù)語(yǔ)解釋DAO 是Data Access Object,數(shù)據(jù)(shj)訪問對(duì)象的縮寫POJO 是Plain and Old Java Object,普通和舊式的Java 對(duì)象的縮寫,也就是普通Java 類的意思打開MyEclipse Database Explorer透視圖點(diǎn)擊工具欄上的點(diǎn)擊 按鈕可以顯示多個(gè)透視圖供切換Window Open Perspective Other MyEclipse Database Explorer來顯示打開透視圖對(duì)話框共一百零一頁(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類繼承自HibernateDaoSupport,該類來自于Spring,它提供了獲取HibernateTemplate 的方法(fngf):getHibernateTemplate(),這個(gè)DAO 也實(shí)現(xiàn)了保存,刪除,查找實(shí)體類的方法(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)問題共一百零一頁(yè)修改(xigi)applicationContext.xmlSpring 1.2 方

32、式(fngsh)的事務(wù)代理是非常繁瑣的,現(xiàn)在我們用Spring 2.0 的聲明式事務(wù)來完成。將上面的applicationContext.xml 將其內(nèi)容修改為如下所示“注意這里根據(jù)文件位置來定”共一百零一頁(yè)測(cè)試(csh)并運(yùn)行寫一個(gè)測(cè)試類 Spring2TransactionDAOTest.java,來測(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 的文檔中明明不是說它的AOP 可以自動(dòng)根據(jù)要代理的類的類型來選擇是基于JDK 的接口代理還是CGLib 的類代理嘛?然而沒有辦法,出錯(cuò)了,也許這是Spring 的一個(gè)Bug 吧共一百零一頁(yè)修改(xigi)代碼現(xiàn)在只好按照要求(yoqi),把類加入一個(gè)接口定義,先修改Student1DAO.java,讓它實(shí)現(xiàn)一個(gè)接口IStudentDAO:publi

35、c class Student1DAO extends HibernateDaoSupport implements IStudentDAO共一百零一頁(yè)編寫(binxi)接口寫一個(gè)接口IStudentDAO(可以通過重構(gòu)功能來生成,選擇菜單Refactory Extract Interface,在對(duì)話框的Interface name 處輸入IStudentDAO,然后選中對(duì)話框中需要加入到接口中的方法(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è)試類Spring2

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

40、t1DAO。業(yè)務(wù)層的絕大部分功能都是委托給dao 來實(shí)現(xiàn)的,而對(duì)于那些需要返回布爾值來確定是否操作成功的方法,我們用try-catch 語(yǔ)句來實(shí)現(xiàn)這樣的需求,即:沒有異常時(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è)類需要訪問底層的數(shù)據(jù)庫(kù),在這里可以通過Spring 來設(shè)置對(duì)應(yīng)的DAO 類的實(shí)例,因此我們還要在Spring 的配置

42、文件applicationContext.xml 中加入下面的bean 配置:共一百零一頁(yè)測(cè)試(csh)并運(yùn)行業(yè)務(wù)層編寫(binxi)測(cè)試類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(); 與前例類似,studentManager需要抽象出接口IStudentManager運(yùn)行這個(gè)類,得到如下的輸出: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è)第五部分 開發(fā)前臺(tái)頁(yè)面(y min)流程共一百零一頁(yè)前臺(tái)如何(rh)開發(fā)前面我們已經(jīng)完成了必要的功能設(shè)計(jì),在此階段給以編碼實(shí)現(xiàn)對(duì)于我們來說,按照業(yè)務(wù)流程說明表中的流程進(jìn)行開發(fā),遇到JSP,就創(chuàng)建或者修改JSP頁(yè)面;遇到.do,就根據(jù)用戶管理應(yīng)用業(yè)務(wù)流程圖流程開發(fā)或者修改Action類。這樣一個(gè)流程一個(gè)流程的開發(fā),最后再進(jìn)行測(cè)試,就可以完成了下面(xi mian)我們重溫業(yè)務(wù)流程說

46、明及用戶管理應(yīng)用業(yè)務(wù)流程圖共一百零一頁(yè)重溫(zhn wn)業(yè)務(wù)流程功能模塊流程分頁(yè)列出用戶index.jsplist.do創(chuàng)建新用戶(new)new.jspnew.dolist.do刪除用戶(delete)Delete.dolist.do修改用戶(edit)edit.doedit.jspsave.dolist.do查找用戶(search)Search.dosearch.jsp需要說明的是為了便于編寫一個(gè)默認(rèn)的入口歡迎頁(yè)面,方便用戶的使用(shyng),我們已經(jīng)把原來顯示用戶列表的index.jsp 重命名成了list.jsp。另外,到底這些功能該如何進(jìn)行分工和組織,也沒有絕對(duì)的標(biāo)準(zhǔn),讀者可以根

47、據(jù)自己的需要或者習(xí)慣來進(jìn)行分工和命名。例如,新建用戶這個(gè)功能的命名可以是new,也可以起名為add 或者create。另外通用或者共用的Forward 路徑可以設(shè)置成Global Forward,即全局轉(zhuǎn)向,例如上圖中所顯示的所有到/error.jsp 的轉(zhuǎn)向,可以統(tǒng)一定義為一個(gè)全局的名為error 的Forward共一百零一頁(yè)重溫用戶(yngh)管理應(yīng)用業(yè)務(wù)流程圖共一百零一頁(yè)開發(fā)前臺(tái)(qinti)代碼具體的編碼過程不再贅述,按照流程創(chuàng)建一個(gè)個(gè)JSP頁(yè)面,最后再修改后臺(tái)的Action類代碼需要提示大家的是,像EditAction這樣的功能的寫法,需要根據(jù)ID查找一個(gè)用戶然后傳遞給前臺(tái)進(jìn)行修改,

48、雖然沒有明確的在設(shè)計(jì)圖中反映出來,如果不幸找不到用戶信息的話,務(wù)必需要告訴使用人員要修改的用戶找不到,可以轉(zhuǎn)向到/error.jsp進(jìn)行顯示。接下來要做的就是先將傳遞過來的字符串類型的ID參數(shù)通過Integer.parseInt(String)方法轉(zhuǎn)換成int,然后再將通過后臺(tái)業(yè)務(wù)層(也即IStudentManager)找到的用戶信息通過request對(duì)象設(shè)置屬性傳遞給前臺(tái)的JSP頁(yè)面,前臺(tái)頁(yè)面則使用EL表達(dá)式加以顯示。實(shí)現(xiàn)過程中一定要全面考慮到客戶端驗(yàn)證(JavaScript表單驗(yàn)證)和服務(wù)器端驗(yàn)證(在Action類中進(jìn)行必要(byo)的數(shù)據(jù)驗(yàn)證),共一百零一頁(yè)解決(jiju)中文問題加入解

49、決中文(zhngwn)字符編碼的過濾器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)出來公用的表單驗(yàn)證功能的腳本代碼,其代碼清單如下所示:function checkForm(form) / 驗(yàn)證表單輸入不為空的腳本代碼 if(form.username.val

51、ue = ) alert(用戶名不能為空!); 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è)開發(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è)返回鏈接讓用戶能夠回去繼續(xù)操作共一百零一頁(yè)第一個(gè)流程(lichng) index.jsplist.doindex.jsp源碼分析(fnx) 歡迎使用用戶管理系統(tǒng) 查看用戶列表 大家通過查看運(yùn)行時(shí)的HTML源代碼就可以看到其輸出是:,這句話可以讓我們的頁(yè)面總能正確找到引用的圖片,CSS等外部資源。假設(shè)頁(yè)面有個(gè)圖片寫著:,那么即使這個(gè)頁(yè)面的內(nèi)容通過forward變成了/ssh2/user/welcome.do,而圖片依然會(huì)從地址http:/localhost:8080/ssh2

53、/gif/a.gif 來讀取點(diǎn)擊超鏈接,瀏覽過去的是顯示分頁(yè)的Struts 的控制器ListAction.java共一百零一頁(yè)ListAction.java代碼(di m)/* 分頁(yè)顯示用戶信息 */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);/ 保存用戶列表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)的顯示層用戶列表頁(yè)面list.jsp 來顯示用戶和功能鏈接此屬性在Sping中注入共一百零一頁(yè)list.jsp代碼(di m)list.jsp 用來顯示用戶和功能(gngnng)鏈接它是我們這個(gè)用戶管理應(yīng)用的中心頁(yè)面,所有的功能都從這里

57、出發(fā) 用戶列表頁(yè)面 用戶列表頁(yè)面 用戶ID 用戶名 操作 $user.id $user.username 修改 刪除 共$totalCount個(gè)用戶第$currentPage頁(yè)/共$totalPage頁(yè) 遍歷上頁(yè)ListAction.java代碼存放在request中的users屬性值需傳遞id值到EditAction.java中從ListAction.java存放在request中獲取屬性值共一百零一頁(yè)list.jsp代碼(di m)list.jsp 用來顯示(xinsh)用戶和功能鏈接它是我們這個(gè)用戶管理應(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 用來顯示(xinsh)用戶和功能鏈接它是我們這個(gè)用戶管理應(yīng)用的中心頁(yè)面,所有的功能都從這里出發(fā)轉(zhuǎn)到 option value=$i selected第$i頁(yè) 輸入頁(yè)碼: 添加用戶查找用戶用戶名: 下拉框選項(xiàng)變化調(diào)用javascript跳轉(zhuǎn)函數(shù)本段代碼用戶通過選擇下拉框?qū)崿F(xiàn)頁(yè)面跳轉(zhuǎn)本段代碼用戶通過輸入文本框并點(diǎn)擊按鈕實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)添加用戶超鏈接查找用戶按鈕,調(diào)用SearchAction.java共一百零一頁(yè)用戶列表(li bio)頁(yè)面外觀當(dāng)點(diǎn)擊添加用戶鏈接后,我們就

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論