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

下載本文檔

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

文檔簡介

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

2、委托給業(yè)務(wù)層StudentManager 類來完成根據(jù)個(gè)人愛好的不同,你既可以先完成前臺的頁面,也可以先把后臺的業(yè)務(wù)類寫完整,或者是兩個(gè)人分工的話一人負(fù)責(zé)一部分共一百零一頁創(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 以下版本請選擇J2EE 1.4Tomcat 5,JBoss 4可以選擇 Java

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

4、s 配置文件的存放(cnfng)位置可選的Struts 的版本指定了位于web.xml 中的Struts 核心Servlet 的名字指定了將會交給Struts 控制的URL 類型指定了生成的類的默認(rèn)包指定了默認(rèn)的國際化資源文件包是否安裝Struts 的標(biāo)簽庫文件共一百零一頁添加了 Struts 的目錄(ml)結(jié)構(gòu)Struts1.2 的類庫struts-config.xmlStruts 的TLD 文件(wnjin)驗(yàn)證器文件在 src 目錄下編寫我們自己的類共一百零一頁第二(d r)部分 用Struts 設(shè)計(jì)器制作前臺業(yè)務(wù)流程共一百零一頁軟件開發(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ù)庫和操作系統(tǒng),最后應(yīng)該實(shí)現(xiàn)成何種樣子,有哪些模塊,系統(tǒng)的工作流程如何等等,這些內(nèi)容,相當(dāng)于設(shè)計(jì)階段共一百零一頁軟件開發(fā)的設(shè)計(jì)階段對于我們要做的這個(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)用流程來共一百零一頁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ì)器工具欄上的 按鈕來給一些頁面加入連接關(guān)系,但是如果彈出對話框詢問是否設(shè)置為Action 的input 元素時(shí),我們選擇No 按鈕。大致來說,我們的應(yīng)用需要增刪改查四個(gè)模塊共一百零一頁用戶管理應(yīng)用(yngyng)業(yè)務(wù)流

7、程圖共一百零一頁業(yè)務(wù)流程說明(shumng)功能模塊流程分頁列出用戶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)的入口歡迎頁面,方便用戶的使用,我們已經(jīng)把原來顯示用戶列表的index.jsp 重命名成了list.jsp。另外,到底這些功能該如何進(jìn)行分工和組織,也沒有絕對的標(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共一百零一頁文檔規(guī)范化相比較于 Java 源代碼來說,給JSP 頁面加入一些文檔比較困難些,因?yàn)镴ava 文件可以用Javadoc 格式的注釋來加入并生成說明,但是JSP 沒有這方面的規(guī)定和好用的文檔工具寫必要的流程說明便于自己核對是否全部頁面都按照預(yù)期實(shí)現(xiàn)方便自己或者別人日后對項(xiàng)目方便進(jìn)行修改,升級和維護(hù)軟

9、件開發(fā)本質(zhì)上屬于集體勞動(dòng),所以作為其中的一員,盡量不要只把系統(tǒng)的設(shè)計(jì)藍(lán)圖或者注意事項(xiàng)放在自己的腦子里,一定要想辦法把它表示成可見的文檔來便于大家(dji)的交流和日后維護(hù)。現(xiàn)在我們把JSP 頁面的功能用表格的方式列出來,如下表所示:頁面名功能描述index.jsp入口頁面list.jsp用戶信息列表顯示頁面(核心頁面)edit.jsp用戶信息修改表單輸入頁面error.jsp出錯(cuò)信息顯示頁面new.jsp添加新用戶表單輸入頁面search.jsp顯示查找用戶結(jié)果的頁面共一百零一頁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=” 另外如果前臺需要一些數(shù)據(jù),后臺可以通過request.setAttribute()方法來設(shè)置,前臺則需要用request.getAttribute()方法或者EL 表達(dá)式來讀取這些值A(chǔ)ction 路徑類名功能描述/listListAction分頁顯示用戶信息/edi

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

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

13、和現(xiàn)實(shí)不一樣或者說對于某個(gè)東西的原理進(jìn)行一次次的爭論,或者用大家熟悉的話來概括:鉆牛角尖。鉆牛角尖表面看是勤奮好學(xué),對某種內(nèi)容具有韌性或者探索精神,然而我們卻不得不面對這樣一個(gè)場面:如果我們企圖完全弄懂一個(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è)好辦法就是把這些問題都記下來便于以后查找)。共一百零一頁學(xué)習(xí)(xux)方法交流我想做

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

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

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

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

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

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

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

21、是先做前臺頁面還是先實(shí)現(xiàn)后臺的功能類呢?這個(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)類指定就可以了相對來說,這個(gè)項(xiàng)目的業(yè)務(wù)層代碼比較簡單,所以我打算先實(shí)現(xiàn)后臺功能。前臺的JSP,Struts 的部分則放在后面進(jìn)行開發(fā)共一百零一頁第四部分(b fen) 開發(fā)業(yè)務(wù)層和DAO 層代碼共一百零一頁第四部分(b fen)內(nèi)容添加Hibernate功能添加Spring 功能Spring 整合 Hibernate用Spring 2.0 的aop

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

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

24、AR 文件會在發(fā)布程序時(shí)復(fù)制選中的類庫 JAR 文件將會被復(fù)制到項(xiàng)目并添加到構(gòu)造路徑中去(這個(gè)方式在開發(fā)不依賴于MyEclipse 的項(xiàng)目的時(shí)候,或者解決JAR 包沖突的時(shí)候很有用),此處選用復(fù)制的方式相對于現(xiàn)在項(xiàng)目的路徑, 可以新建或者使用現(xiàn)有目錄,Hibernate 類庫將會被向?qū)?fù)制到這里共一百零一頁創(chuàng)建(chungjin)Hibernate XML 配置文件上頁選擇Next 按鈕前進(jìn)(qinjn)到本頁創(chuàng)建 Hibernate XML 配置文件共一百零一頁選擇(xunz)數(shù)據(jù)庫連接如果(rgu)不想現(xiàn)在就設(shè)置數(shù)據(jù)庫連接屬性,去掉復(fù)選框即可跳過選擇以前創(chuàng)建好的數(shù)據(jù)庫連接,相關(guān)的連接信息將

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

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

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

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

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

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

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

32、式(fngsh)的事務(wù)代理是非常繁瑣的,現(xiàn)在我們用Spring 2.0 的聲明式事務(wù)來完成。將上面的applicationContext.xml 將其內(nèi)容修改為如下所示“注意這里根據(jù)文件位置來定”共一百零一頁測試(csh)并運(yùn)行寫一個(gè)測試類 Spring2TransactionDAOTest.java,來測試這個(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ù)代理測試); 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 吧共一百零一頁修改(xigi)代碼現(xiàn)在只好按照要求(yoqi),把類加入一個(gè)接口定義,先修改Student1DAO.java,讓它實(shí)現(xiàn)一個(gè)接口IStudentDAO:publi

35、c class Student1DAO extends HibernateDaoSupport implements IStudentDAO共一百零一頁編寫(binxi)接口寫一個(gè)接口IStudentDAO(可以通過重構(gòu)功能來生成,選擇菜單Refactory Extract Interface,在對話框的Interface name 處輸入IStudentDAO,然后選中對話框中需要加入到接口中的方法(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);共一百零一頁再次測試(csh)并運(yùn)行這時(shí)候?qū)?yīng)的 Spring2TransactionDAOTest.java 里面的代碼已經(jīng)自動(dòng)變成了:IStudentDAO dao = (IStudentDAO)ctx.getBean(StudentDAO);再次運(yùn)行測試類Spring2

39、TransactionDAOTest,然后檢查數(shù)據(jù)庫,可以很高興的看到數(shù)據(jù)已經(jīng)插入進(jìn)來了這里(zhl)會出現(xiàn)異常 關(guān)于主鍵是否自增長的問題通過修改student.hbm.xml 共一百零一頁開發(fā)(kif)業(yè)務(wù)層共一百零一頁開發(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)的,而對于那些需要返回布爾值來確定是否操作成功的方法,我們用try-catch 語句來實(shí)現(xiàn)這樣的需求,即:沒有異常時(shí)返回true,否則返回falseprivate IStudentDAO dao;public int getTotalCount() return dao.getTotalCount();public int getTotalPage(int pageSize) int totalCount = getTotalCount(); / 得到頁面總數(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ù)庫,在這里可以通過Spring 來設(shè)置對應(yīng)的DAO 類的實(shí)例,因此我們還要在Spring 的配置

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

46、明及用戶管理應(yīng)用業(yè)務(wù)流程圖共一百零一頁重溫(zhn wn)業(yè)務(wù)流程功能模塊流程分頁列出用戶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)的入口歡迎頁面,方便用戶的使用(shyng),我們已經(jīng)把原來顯示用戶列表的index.jsp 重命名成了list.jsp。另外,到底這些功能該如何進(jìn)行分工和組織,也沒有絕對的標(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共一百零一頁重溫用戶(yngh)管理應(yīng)用業(yè)務(wù)流程圖共一百零一頁開發(fā)前臺(qinti)代碼具體的編碼過程不再贅述,按照流程創(chuàng)建一個(gè)個(gè)JSP頁面,最后再修改后臺的Action類代碼需要提示大家的是,像EditAction這樣的功能的寫法,需要根據(jù)ID查找一個(gè)用戶然后傳遞給前臺進(jìn)行修改,

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

49、決中文(zhngwn)字符編碼的過濾器TomcatFormFilter在web.xml中進(jìn)行配置/goodbyideal/archive/2006/04/25/676039.aspx共一百零一頁加入日志(rzh)功能因?yàn)?yn wi)Spring 用了LOG4J 做出錯(cuò)信息的輸出,雖然后臺有很多的真實(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共一百零一頁項(xiàng)目(xingm)ssh2源代碼目錄結(jié)構(gòu)共一百零一頁表單驗(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(請輸入有效的年齡!); form.age.focus(); return false; return true;共一百零一頁開發(fā)(kif)error.jsp 出錯(cuò)(ch cu)了! 出錯(cuò)了! 詳細(xì)信息是: $message 返回 出錯(cuò)的信息可以放在 request 的attribute 里面,例如調(diào)用request

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

53、/gif/a.gif 來讀取點(diǎn)擊超鏈接,瀏覽過去的是顯示分頁的Struts 的控制器ListAction.java共一百零一頁ListAction.java代碼(di m)/* 分頁顯示用戶信息 */public class ListAction extends Action public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) / 分析當(dāng)前(dngqin)頁碼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)前頁碼 catch(Exception e) if(currentPage = 0) currentPage = 1;int pageSize = 3;/每頁顯示的數(shù)據(jù)數(shù) / 讀取數(shù)據(jù)List users = manager.findPagedAll(currentPage, pa

55、geSize);request.setAttribute(users,users);/ 保存用戶列表request.setAttribute(totalPage, manager.getTotalPage(pageSize);/ 保存總頁數(shù)request.setAttribute(totalCount, manager.getTotalCount();/ 保存記錄總數(shù)request.setAttribute(currentPage, currentPage);/ 保存當(dāng)前頁碼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ù)和分頁相關(guān)的信息后,我們將其存放在request 的屬性里面,以便在頁面中獲取這些值轉(zhuǎn)到前臺的顯示層用戶列表頁面list.jsp 來顯示用戶和功能鏈接此屬性在Sping中注入共一百零一頁list.jsp代碼(di m)list.jsp 用來顯示用戶和功能(gngnng)鏈接它是我們這個(gè)用戶管理應(yīng)用的中心頁面,所有的功能都從這里

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

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

59、設(shè)置超鏈接,否則不設(shè)置超鏈接使用javascript函數(shù)實(shí)現(xiàn)頁面跳轉(zhuǎn)功能共一百零一頁list.jsp代碼(di m)list.jsp 用來顯示(xinsh)用戶和功能鏈接它是我們這個(gè)用戶管理應(yīng)用的中心頁面,所有的功能都從這里出發(fā)轉(zhuǎn)到 option value=$i selected第$i頁 輸入頁碼: 添加用戶查找用戶用戶名: 下拉框選項(xiàng)變化調(diào)用javascript跳轉(zhuǎn)函數(shù)本段代碼用戶通過選擇下拉框?qū)崿F(xiàn)頁面跳轉(zhuǎn)本段代碼用戶通過輸入文本框并點(diǎn)擊按鈕實(shí)現(xiàn)頁面跳轉(zhuǎn)添加用戶超鏈接查找用戶按鈕,調(diào)用SearchAction.java共一百零一頁用戶列表(li bio)頁面外觀當(dāng)點(diǎn)擊添加用戶鏈接后,我們就

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

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論