版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、v 創(chuàng)建新項目v 用Struts 設(shè)計器制作前臺業(yè)務(wù)流程v 設(shè)計業(yè)務(wù)層功能v 開發(fā)業(yè)務(wù)層和DAO 層代碼v 開發(fā)前臺頁面流程v 整合Spring,Struts 和Hibernatev 發(fā)布,運行,測試使用使用SSH開發(fā)增刪改查的綜合用戶管理例子開發(fā)增刪改查的綜合用戶管理例子第一部分第一部分 創(chuàng)建新項目創(chuàng)建新項目創(chuàng)建新項目創(chuàng)建新項目v 創(chuàng)建Web 項目ssh2v 加入 Struts 開發(fā)功能v 使用Struts 工具開發(fā)v 數(shù)據(jù)庫student1v 實現(xiàn)功能:對用戶的增刪改查n 前臺:需要加入增加,修改刪除和查詢用戶所對應(yīng)的頁面n 后臺功能通過調(diào)用Struts Action 來完成,Struts
2、 的Action 再委托給業(yè)務(wù)層StudentManager 類來完成n 根據(jù)個人愛好的不同,你既可以先完成前臺的頁面,也可以先把后臺的業(yè)務(wù)類寫完整,或者是兩個人分工的話一人負責(zé)一部分創(chuàng)建Web 項目v 選擇菜單選擇菜單File New Web Projectv 在在Project Name中輸入中輸入ssh2v 選中選中J2EE Specification Level下面的下面的Java EE 5.0 單選單選鈕鈕n 選擇哪個版本的選擇哪個版本的J2EE Specification Level 取決于你使用的服取決于你使用的服務(wù)器務(wù)器uTomcat4,Weblogic 9 以下版本請選擇以下
3、版本請選擇J2EE 1.4uTomcat 5,JBoss 4可以選擇可以選擇 Java EE 5.0n Java EE 5.0 可以直接使用可以直接使用 EL 表達式和表達式和JSTLv 最后點擊最后點擊Finish按鈕按鈕加入 Struts 開發(fā)功能v 項目根節(jié)點上右鍵點擊,選擇上下文菜單中的項目根節(jié)點上右鍵點擊,選擇上下文菜單中的MyEclipse Add Struts Capabilitiesv 或者選擇菜單或者選擇菜單MyEclipse Project Capabilities Add Struts Capabilitiesv 添加添加 Struts 功能對話框的默認值一般來說不需要修
4、改功能對話框的默認值一般來說不需要修改就可以使用,點擊單選鈕就可以使用,點擊單選鈕 Struts 1.2 選擇選擇Struts 的版本的版本為為1.2 即可即可添加Struts 功能對話框指定了Struts 配置文件的存放位置可選的Struts 的版本指定了位于web.xml 中的Struts 核心Servlet 的名字指定了將會交給Struts 控制的URL 類型指定了生成的類的默認包指定了默認的國際化資源文件包是否安裝Struts 的標簽庫文件添加了 Struts 的目錄結(jié)構(gòu)Struts1.2 的類庫的類庫struts-config.xmlStruts 的的TLD 文件文件驗證器文件驗證器
5、文件在 src 目錄下編寫我們自己的類第二部分第二部分 用用Struts 設(shè)計器制作前臺業(yè)務(wù)流程設(shè)計器制作前臺業(yè)務(wù)流程軟件開發(fā)的設(shè)計階段軟件開發(fā)的設(shè)計階段v 在實際項目開發(fā)中,第一步要做的可能是設(shè)計應(yīng)用的整個流程,而不是立即著手制作JSP 或者編寫Java 代碼v 做實際的項目開發(fā),如果是大中型項目,思考項目到底該使用哪些技術(shù)和架構(gòu),用什么數(shù)據(jù)庫和操作系統(tǒng),最后應(yīng)該實現(xiàn)成何種樣子,有哪些模塊,系統(tǒng)的工作流程如何等等,這些內(nèi)容,相當(dāng)于設(shè)計階段軟件開發(fā)的設(shè)計階段軟件開發(fā)的設(shè)計階段v 對于我們要做的這個項目來說,具體的技術(shù)和系統(tǒng)結(jié)構(gòu)已經(jīng)選好,就是SSH 架構(gòu)。那么現(xiàn)在,在加入Spring 整合功能之
6、前,我們有必要把系統(tǒng)的表示層的工作流程搞清楚v 做這個流程設(shè)計有很多辦法,可以用畫圖工具例如Microsoft Visio,或者UML 建模工具開發(fā)一個活動圖等等都可以。因為我們使用的是MyEclipse,所以我們這里可以用它自帶的Struts 設(shè)計器快速的畫出所有的應(yīng)用流程來Struts 配置文件編輯器v 雙擊 WebRoot/WEB-INF/struts-config.xml 就可以打開Struts 配置文件編輯器v 在設(shè)計器網(wǎng)格面板上點擊右鍵,選擇菜單來創(chuàng)建Action,F(xiàn)orward,JSP 等等v 為了更好的反映系統(tǒng)的工作流程,我們還可以使用設(shè)計器工具欄上的 按鈕來給一些頁面加入連接
7、關(guān)系,但是如果彈出對話框詢問是否設(shè)置為Action 的input 元素時,我們選擇No 按鈕。大致來說,我們的應(yīng)用需要增刪改查四個模塊用戶管理應(yīng)用業(yè)務(wù)流程圖業(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需要說明的是為了便于編寫一個默認的入口歡迎頁面,方便用戶的使用,我們已經(jīng)把原來顯示用戶列表的index.jsp 重命名成
8、了list.jsp。另外,到底這些功能該如何進行分工和組織,也沒有絕對的標準,讀者可以根據(jù)自己的需要或者習(xí)慣來進行分工和命名。例如,新建用戶這個功能的命名可以是new,也可以起名為add 或者create。另外通用或者共用的Forward 路徑可以設(shè)置成Global Forward,即全局轉(zhuǎn)向,例如上圖中所顯示的所有到/error.jsp 的轉(zhuǎn)向,可以統(tǒng)一定義為一個全局的名為error 的Forward文檔規(guī)范化文檔規(guī)范化v 相比較于 Java 源代碼來說,給JSP 頁面加入一些文檔比較困難些,因為Java 文件可以用Javadoc 格式的注釋來加入并生成說明,但是JSP 沒有這方面的規(guī)定和好
9、用的文檔工具v 寫必要的流程說明n 便于自己核對是否全部頁面都按照預(yù)期實現(xiàn)n 方便自己或者別人日后對項目方便進行修改,升級和維護v 軟件開發(fā)本質(zhì)上屬于集體勞動,所以作為其中的一員,盡量不要只把系統(tǒng)的設(shè)計藍圖或者注意事項放在自己的腦子里,一定要想辦法把它表示成可見的文檔來便于大家的交流和日后維護。現(xiàn)在我們把JSP 頁面的功能用表格的方式列出來,如下表所示:頁面名功能描述index.jsp入口頁面list.jsp用戶信息列表顯示頁面(核心頁面)edit.jsp用戶信息修改表單輸入頁面error.jsp出錯信息顯示頁面new.jsp添加新用戶表單輸入頁面search.jsp顯示查找用戶結(jié)果的頁面Ac
10、tion 說明v 還有個問題需要大家解決,就是進入修改和刪除功能的Action 時,需要在URL 里以地址帶參數(shù)的方式來傳遞到底是修改或者刪除哪個用戶v 舉個例子,修改用戶我們用edit.do?id=1 這種形式。另外用戶的ID 是不可修改的,因此如果表單里要傳遞這個參數(shù),一般就以表單的hidden(隱藏)類型的輸入域來表示,具體代碼類似這樣: input type=”hidden” name=”id” value=” 另外如果前臺需要一些數(shù)據(jù),后臺可以通過request.setAttribute()方法來設(shè)置,前臺則需要用request.getAttribute()方法或者EL 表達式來讀取
11、這些值A(chǔ)ction 路徑類名功能描述/listListAction分頁顯示用戶信息/editEditAction根據(jù)ID 獲取用戶信息并傳遞給edit.jsp/saveSaveAction保存對用戶信息的修改/newNewAction創(chuàng)建新用戶/deleteDeleteAction根據(jù)ID 刪除用戶/searchSearchAction根據(jù)用戶名查找用戶,并將結(jié)果返回給search.jsp創(chuàng)建數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫v 數(shù)據(jù)庫: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)用的整個前臺大框架已經(jīng)確定,接下來就是考慮后臺的業(yè)務(wù)層的功能了v 我們已經(jīng)確定要使用Spring + Hibernate 來完成后臺功能。Struts 的Action 將會調(diào)用業(yè)務(wù)層,業(yè)務(wù)層再會去調(diào)用數(shù)據(jù)訪問層和其它的一些輔助功能層(工具類或者第三方類庫)v 整個系統(tǒng)從橫向分層就分成了下面的部分:v 當(dāng)然并沒有人規(guī)定到底怎樣分層才是完全正確的表示層控制層業(yè)務(wù)層數(shù)據(jù)訪問層輔助功能層學(xué)習(xí)方法交流學(xué)習(xí)方法交流v 系統(tǒng)分成一般來說大家可以按照軟件工程書籍上的辦法進行分層,然而更現(xiàn)實的卻是大家都在按照自己公司的方式進行分層。v 這時對于初學(xué)者來說必須避免
13、的一個誤區(qū)就是喋喋不休的對采用何種標準或者為什么教科書上所講的東西和現(xiàn)實不一樣或者說對于某個東西的原理進行一次次的爭論,或者用大家熟悉的話來概括:鉆牛角尖。v 鉆牛角尖表面看是勤奮好學(xué),對某種內(nèi)容具有韌性或者探索精神,然而我們卻不得不面對這樣一個場面:如果我們企圖完全弄懂一個問題,就不得不把和它關(guān)聯(lián)的問題也搞懂。但是尷尬的是,首先我們并不能無限制的得到任何自己需要的資料(大部分技術(shù)都是黑盒子,外人看不到內(nèi)部實現(xiàn)的),另一方面,我們不得不承認人腦的記憶和理解是有限的這個現(xiàn)實。當(dāng)你高高興興的以為自己弄懂了一個又一個問題時,最后卻尷尬的發(fā)現(xiàn)似乎自己高興過后只能記起其中的一兩個(當(dāng)然有個好辦法就是把這
14、些問題都記下來便于以后查找)。學(xué)習(xí)方法交流學(xué)習(xí)方法交流v 我想做程序員首先要有鉆研精神,其次,也得有實用主義的精神。學(xué)技術(shù),就是為了解決實際的問題的,如果你想為技術(shù)而技術(shù),請先填飽肚子。遇到自己不會的東西怎么辦?首先是能用就行,我們把它看成黑盒子就行了,就像用遙控器的人永遠不需要還得懂紅外線,集成電路,振蕩器,發(fā)射器到底是怎么回事一樣。說到這里似乎已經(jīng)扯遠了話題,然而看到過很多學(xué)生天天追求后臺原理或者軟件工程,然而卻連簡單的應(yīng)用也作不出或者設(shè)計圖都畫不好。不是他們不努力,而是他們努力走向了另一個方向:鉆研理論。v 對于初學(xué)者,第一步要的就是:能用。其余的,在這基礎(chǔ)之上才能去談進一步提高。而且,
15、在國內(nèi)的現(xiàn)狀就是,絕大多數(shù)人是開發(fā)應(yīng)用(簡單的說就是編寫固定流程的東西),而不是深入軟件的底層來做開發(fā)工具或者自己動手寫或者改進虛擬機。開發(fā)經(jīng)驗交流開發(fā)經(jīng)驗交流v 對于這個項目來說,當(dāng)前臺的結(jié)構(gòu)設(shè)計的差不多的時候,我們也可以轉(zhuǎn)而先去做后臺的業(yè)務(wù)層,將前臺的功能進行提取,看看后臺能不能先把大部分都實現(xiàn)了v 這也是實際開發(fā)兩人或者多人分工協(xié)作可能出現(xiàn)的情況,例如:一個寫前臺,一個寫后臺v 當(dāng)然我們并不是要讓大家非得按照軟件工程或者項目管理規(guī)范,把所有的文檔都寫好了才能真正開始編碼,我們只需要讓想法表示出來,就可以了v 用代碼來表示自己的想法,其實也是一種很不錯的辦法(一直備受贊揚的敏捷開發(fā)Agil
16、e,就是這樣)第三部分第三部分 設(shè)計業(yè)務(wù)層功能設(shè)計業(yè)務(wù)層功能養(yǎng)成使用接口的習(xí)慣v 對于業(yè)務(wù)層的設(shè)計,我們可以先寫接口,然后再具體實現(xiàn)v 當(dāng)然直接寫成類的方式也是沒人禁止的,尤其是自己學(xué)習(xí)的時候也是很合適的做法v 寫接口就意味著我們并不需要寫好具體的實現(xiàn)代碼,所以設(shè)計階段一般來說還是鼓勵使用接口來做,這樣大家只需要討論好哪些功能需要,哪些不需要就行了v 給這個接口加上足夠多的注釋(或者文檔)進行業(yè)務(wù)層的具體設(shè)計v 首先定義接口IStudentManager(這個以I 開頭的名稱來自于Eclipse 的源碼中的定義接口的習(xí)慣,I 表示Interface,便于開發(fā)人員一眼看出這是個接口,當(dāng)然請不要誤
17、會所有的接口必須以I 開頭才能定義)v 把它放在包service中,用來定義用戶管理模塊應(yīng)有的功能。當(dāng)然用manager 作為業(yè)務(wù)層的包還是別的名稱都是無所謂的v 顯示用戶列表時數(shù)據(jù)量大,需分頁顯示,分頁部分的接口設(shè)計如下所示:n public int getTotalCount(); / 得到用戶總數(shù)n public int getTotalPage(int pageSize) ;/ 獲取總頁面數(shù)n public List findPagedAll(int currentPage, int pageSize);/ 分頁顯示數(shù)據(jù)定義接口IStudentManager方法v 本項目的主要功能是增
18、刪改查,結(jié)合我們前面所討論的業(yè)務(wù)流程,并考慮到方法的參數(shù)和返回值等情況,我們一個個的定義這些功能所對應(yīng)的方法聲明v 新建用戶,我們定義一個方法即可,返回值告訴調(diào)用者是否保存成功。 n public boolean save(Student student)v 保存用戶,我們前面的流程是首先通過ID 找到Student 對象,然后再保存更新,所以一共需要兩個方法的定義:n public Student findById(int id);/ 根據(jù)ID 查找n public boolean update(Student student);/ 更新用戶對象定義接口IStudentManager方法v
19、刪除用戶,根據(jù) ID 進行刪除就可以了,所以定義一個方法即可,返回值同樣是成功時返回true,其它情況下返回falsen public boolean delete(Student student) v 查找用戶,我們則只需要一個方法就可以了,在這里我們只提供根據(jù)用戶名進行查找的功能,方法的參數(shù)是用戶名,返回值則是包含找到的用戶對象的列表,如果找不到的話就返回nulln public List findStudentByUsername(String username);開發(fā)經(jīng)驗交流v 至此,我們所有的初步設(shè)計工作都已完成了,下一步就可以著手進行詳細設(shè)計了。但是因為這個項目相對比較規(guī)模小,所以
20、我們接下來就進入具體的開發(fā)過程中v 對于大型項目實際開發(fā)中一般會進行詳細設(shè)計,要把所有的JSP 頁面的樣子畫出來,每個類的UML 圖也要畫出來,以及每個頁面和類的具體實現(xiàn)思路也得進行說明,例如:頁面中加入的表單驗證腳本代碼,Action 類的工作流程,DAO 層采用何種技術(shù)實現(xiàn)等等(當(dāng)然這里可以使用Spring 中的HibernateDaoSupport 或者HibernateTemplate)v 不過實際開發(fā)中你會發(fā)現(xiàn)基本上所有的詳細設(shè)計都會有紕漏或者錯誤之處,需要在開發(fā)過程中逐步進行必要的修改開發(fā)經(jīng)驗交流v 設(shè)計完成后,到底是先做前臺頁面還是先實現(xiàn)后臺的功能類呢?n 這個問題其實并無標準答
21、案,全依賴于開發(fā)人員的習(xí)慣而決定v 由于前面我們已經(jīng)將業(yè)務(wù)層接口確定,所以如果假設(shè)這個項目有兩個人進行開發(fā)的話,是可以分頭進行的,只需要最后在Spring 配置文件中將接口的具體實現(xiàn)類指定就可以了v 相對來說,這個項目的業(yè)務(wù)層代碼比較簡單,所以我打算先實現(xiàn)后臺功能。前臺的JSP,Struts 的部分則放在后面進行開發(fā)第四部分第四部分 開發(fā)業(yè)務(wù)層和開發(fā)業(yè)務(wù)層和DAO 層代碼層代碼第四部分內(nèi)容v 添加Hibernate功能v 添加Spring 功能v Spring 整合 Hibernatev 用Spring 2.0 的aop 和tx 聲明式配置解決事務(wù)提交問題v 開發(fā)業(yè)務(wù)層添加Hibernate功
22、能添加Hibernate功能v 現(xiàn)在我們要把Hibernate功能添加到當(dāng)前項目,這一步不反向工程生成DAO,因為我們最終的目的是使用Spring整合的Hibernate DAO 類添加 Hibernate Capabilitiesv 添加 Hibernate 類庫 (JARs) 到項目的類路徑v 在項目中創(chuàng)建并配置 hibernate.cfg.xmlv 在項目中創(chuàng)建自定義的 Session Factory 類來簡化 Hibernate 會話處理v 添加 Hibernate 功能的步驟:n 在Package Explorer 中選擇 ssh2 項目n 從 MyEclipse 菜單欄選擇MyEc
23、lipse Project Capabilities Add Hibernate Capabilities . 來啟動 Add Hibernate Capabilities 向?qū)dd Hibernate Capabilities向?qū)нx擇Hibernate 類庫版本可以添加到項目的構(gòu)造路徑的類庫集合選中的類庫將會添加到項目的構(gòu)造路徑中, 但相應(yīng)的JAR 文件將不會復(fù)制到項目中. 這些 JAR 文件會在發(fā)布程序時復(fù)制選中的類庫 JAR 文件將會被復(fù)制到項目并添加到構(gòu)造路徑中去(這個方式在開發(fā)不依賴于MyEclipse 的項目的時候,或者解決JAR 包沖突的時候很有用),此處選用復(fù)制的方式相對于現(xiàn)
24、在項目的路徑, 可以新建或者使用現(xiàn)有目錄,Hibernate 類庫將會被向?qū)?fù)制到這里創(chuàng)建Hibernate XML 配置文件v 上頁選擇Next 按鈕前進到本頁創(chuàng)建 Hibernate XML 配置文件選擇數(shù)據(jù)庫連接如果不想現(xiàn)在就設(shè)置數(shù)據(jù)庫連接屬性,去掉復(fù)選框即可跳過選擇以前創(chuàng)建好的數(shù)據(jù)庫連接,相關(guān)的連接信息將會自動填入到對話框中選中后則會自動加入相應(yīng)的數(shù)據(jù)庫驅(qū)動類庫jar 文件到項目的類路徑中如果選中,那么Hibernate 將會自動根據(jù)映射文件來動態(tài)生成建表語句然后執(zhí)行,然而這種方法不是很可靠,所以一般來說不要用創(chuàng)建SessionFactory這一頁選擇是否生成Session Facto
25、ry 類,去掉復(fù)選框Create SessionFactory class?的選中狀態(tài),最后點擊Finish 按鈕完成整個添加過程向?qū)ЫY(jié)束后將進行的操作v 如果在第一頁選擇了復(fù)制類庫到你的項目, 將復(fù)制 Hibernate 類庫 (JARs) 到項目中v 更新項目的構(gòu)造路徑來包含已安裝的 Hibernate 類庫v 給項目創(chuàng)建并配置 hibernate.cfg.xml 文件添加Spring 功能給項目加入Spring 功能v 項目創(chuàng)建完畢后就可以加入 Spring 開發(fā)功能了。要給項目添加Spring 功能,請按照下面的步驟進行:n 在Package Explorer 視圖中選擇 ssh2項目
26、;n 接下來, 從 MyEclipse 菜單欄選擇MyEclipse Project Capabilities Add Spring Capabilities . 來啟動 Add Spring Capabilities 向?qū)?對于這個項目來說,你可以直接點擊Finish 按鈕就行了加入Spring 功能向?qū)υ捒虻牡?頁Spring 版本,一般選擇Spring 2 單選鈕選擇要加入項目類路徑的類庫點擊此鏈接可以修改類庫設(shè)置選擇JAR 類庫的安裝方式,上面的單選鈕只是把引用的類庫加入類路徑,下面的則需要指定一個目錄把所有的JAR 文件和標簽文件加入到當(dāng)前項目中,這種方式適用于不依賴MyEclip
27、se 進行開發(fā)或者手工管理類庫當(dāng)選中了 Spring Web 的時候需要指定標簽庫文件的安裝目錄注意有些Myeclipse 的該窗口沒有 Spring2.0 ORM/DAO/hibernate3 libraries類庫,要在添加完后手動添加,添加方法Build path add libraries加入Spring 功能向?qū)υ捒虻牡?頁創(chuàng)建Spring bean 定義文件可以修改Spring 配置文件的名字(修改Folder 和File 選項)加入Spring 功能向?qū)υ捒虻牡?頁配置一個使用現(xiàn)有Hibernate配置文件的Spring下的LocalSessionFactory采用默認的se
28、ssionFactory就可以了Spring 整合 Hibernate使用反向工程快速生成Java POJO 類,映射文件和DAOv 術(shù)語解釋n DAO 是Data Access Object,數(shù)據(jù)訪問對象的縮寫n POJO 是Plain and Old Java Object,普通和舊式的Java 對象的縮寫,也就是普通Java 類的意思v 打開MyEclipse Database Explorer透視圖n 點擊工具欄上的點擊 按鈕可以顯示多個透視圖供切換n Window Open Perspective Other MyEclipse Database Explorer來顯示打開透視圖對話
29、框DB Browser 視圖創(chuàng)建連接點右鍵,選擇New啟動反向工程向?qū)c右鍵,選擇Open ConnectionHibernate 反向工程向?qū)У?1 頁Spring 整合Hibernate 的項目文件內(nèi)容StudentDAOv StudentDAO類繼承自HibernateDaoSupport,該類來自于Spring,它提供了獲取HibernateTemplate 的方法:getHibernateTemplate(),這個DAO 也實現(xiàn)了保存,刪除,查找實體類的方法,在此需要加入對應(yīng)業(yè)務(wù)處理的分頁和更新功能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ù)提交問題修改applicationContext.xmlv Spring 1.2 方式的事務(wù)代理是非常繁瑣的,現(xiàn)在我們用Spring 2.0 的聲明式事務(wù)來完成。將上面的applicationContext.xml 將其內(nèi)容修改
31、為如下所示“注意這里根據(jù)文件位置來定”測試并運行v 寫一個測試類 Spring2TransactionDAOTest.java,來測試這個新的基于聲明式的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ù)代理測試); user.setAge(new Integer(200); dao.save(user); 運行結(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 的文檔中明明不是說它的AOP 可以自動根據(jù)要代理的類的類型來選擇是基于JDK 的接口代理還是CGLib 的類代理嘛?然而沒有辦法,出錯了,也許這是Spring 的一個Bug 吧修改代碼v 現(xiàn)在只好按照要求,把類加入一個接口定義,先修改Student1DAO.java,讓它實現(xiàn)一個接口IStudentDAO:public class Student1DAO extends HibernateDaoSupport implements IStudentDAO編寫接口v 寫一個接口IStudentDAO(可以通過重構(gòu)功能來生成,選擇菜單Re
34、factory Extract Interface,在對話框的Interface name 處輸入IStudentDAO,然后選中對話框中需要加入到接口中的方法列表,最后點擊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);再次測試并運行v 這時候?qū)?yīng)的 Spring2TransactionDAOTest.java 里面的代碼已經(jīng)自動變成了:IStudentDAO dao = (IStudentDAO)ctx.getBean(StudentDAO);v 再次運行測試類Spring2TransactionDAOTest,然后檢查數(shù)據(jù)庫,可以很高興的看到數(shù)據(jù)已經(jīng)插入進來了v 這里會出現(xiàn)異常 關(guān)于主鍵是否自增長的問題通過修改student.hbm.xmlv v v v 開發(fā)業(yè)務(wù)層開發(fā)業(yè)務(wù)層開發(fā)StudentManager類代碼v 創(chuàng)建前面設(shè)計好的ISt
38、udentManager接口v 修改或者新建類service.StudentManager,來實現(xiàn)先前定義的IStudentManager 接口中的功能v 為了便于使用Spring 整合,我們將其中的DAO層設(shè)置成一個屬性dao,通過方法getDao()和setDao()定義,類型為dao.Student1DAO。業(yè)務(wù)層的絕大部分功能都是委托給dao 來實現(xiàn)的,而對于那些需要返回布爾值來確定是否操作成功的方法,我們用try-catch 語句來實現(xiàn)這樣的需求,即:沒有異常時返回true,否則返回false-private IStudentDAO dao;public int getTotalCo
39、unt() return dao.getTotalCount();public int getTotalPage(int pageSize) int totalCount = getTotalCount(); / 得到頁面總數(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;因為這個類需要訪問底層的數(shù)據(jù)庫,在這里可以通過Spring 來設(shè)置對應(yīng)的DAO 類的實例,因此我們還要在Spring 的配置文件applicationContext.xml 中加入下面的bean 配置:測試并運行業(yè)務(wù)層v 編寫測試類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(每頁三行,第一頁數(shù)據(jù): ); for(Student1 student :studentList) System.out.prin
42、tln(姓名: + student.getUsername()+密碼: + student.getPassword(); 與前例類似,studentManager需要抽象出接口IStudentManager運行這個類,得到如下的輸出: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_每頁三行,第一頁數(shù)據(jù):姓名:dd大多數(shù) 密碼:1234 姓名:spring dao 密碼:pa 姓名:spring dao2 密碼:pa2 第五部分第五部分 開發(fā)前臺頁面流程開發(fā)前臺頁面流程前臺如何開發(fā)前臺如何開發(fā)v 前面我們已經(jīng)完成了必要的功能設(shè)計,在此階
44、段給以編碼實現(xiàn)v 對于我們來說,按照業(yè)務(wù)流程說明表中的流程進行開發(fā),遇到JSP,就創(chuàng)建或者修改JSP頁面;遇到.do,就根據(jù)用戶管理應(yīng)用業(yè)務(wù)流程圖流程開發(fā)或者修改Action類。這樣一個流程一個流程的開發(fā),最后再進行測試,就可以完成了v 下面我們重溫業(yè)務(wù)流程說明及用戶管理應(yīng)用業(yè)務(wù)流程圖重溫業(yè)務(wù)流程重溫業(yè)務(wù)流程功能模塊流程分頁列出用戶index.jsplist.do創(chuàng)建新用戶(new)new.jspnew.dolist.do刪除用戶(delete)Delete.dolist.do修改用戶(edit)edit.doedit.jspsave.dolist.do查找用戶(search)Search.d
45、osearch.jsp需要說明的是為了便于編寫一個默認的入口歡迎頁面,方便用戶的使用,我們已經(jīng)把原來顯示用戶列表的index.jsp 重命名成了list.jsp。另外,到底這些功能該如何進行分工和組織,也沒有絕對的標準,讀者可以根據(jù)自己的需要或者習(xí)慣來進行分工和命名。例如,新建用戶這個功能的命名可以是new,也可以起名為add 或者create。另外通用或者共用的Forward 路徑可以設(shè)置成Global Forward,即全局轉(zhuǎn)向,例如上圖中所顯示的所有到/error.jsp 的轉(zhuǎn)向,可以統(tǒng)一定義為一個全局的名為error 的Forward重溫用戶管理應(yīng)用業(yè)務(wù)流程圖開發(fā)前臺代碼開發(fā)前臺代碼v
46、 具體的編碼過程不再贅述,按照流程創(chuàng)建一個個JSP頁面,最后再修改后臺的Action類代碼v 需要提示大家的是,像EditAction這樣的功能的寫法,需要根據(jù)ID查找一個用戶然后傳遞給前臺進行修改,雖然沒有明確的在設(shè)計圖中反映出來,如果不幸找不到用戶信息的話,務(wù)必需要告訴使用人員要修改的用戶找不到,可以轉(zhuǎn)向到/error.jsp進行顯示。接下來要做的就是先將傳遞過來的字符串類型的ID參數(shù)通過Integer.parseInt(String)方法轉(zhuǎn)換成int,然后再將通過后臺業(yè)務(wù)層(也即IStudentManager)找到的用戶信息通過request對象設(shè)置屬性傳遞給前臺的JSP頁面,前臺頁面則
47、使用EL表達式加以顯示。v 實現(xiàn)過程中一定要全面考慮到客戶端驗證(JavaScript表單驗證)和服務(wù)器端驗證(在Action類中進行必要的數(shù)據(jù)驗證),解決中文問題解決中文問題v 加入解決中文字符編碼的過濾器TomcatFormFilterv 在web.xml中進行配置v http:/ 因為Spring 用了LOG4J 做出錯信息的輸出,雖然后臺有很多的真實出錯信息,然而在這里卻是看不到的。所以需要加入日志處理功能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項目項目ssh2源代碼目錄結(jié)構(gòu)源代碼目錄結(jié)構(gòu)表單驗證腳本代碼表單驗證腳本代碼v 文件 js/form.js 是抽取出來公用的表單驗證功能的腳本代碼,其代碼清單如下所示:function checkForm(form) / 驗證表單輸入不為空的
49、腳本代碼 if(form.username.value = ) 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ā)開發(fā)error.jsp 出錯了! 出錯了! 詳細信息是: $message 返回 出錯的信息可以放在出錯的信息可以放在 request 的的att
50、ribute 里面,里面,例如調(diào)用例如調(diào)用request.setAttribute(“message”,”出錯了!出錯了!”);之后相關(guān)的出錯信息就可以顯示在之后相關(guān)的出錯信息就可以顯示在這個頁面中。另外還提供了一個返回鏈接讓用戶這個頁面中。另外還提供了一個返回鏈接讓用戶能夠回去繼續(xù)操作能夠回去繼續(xù)操作第一個流程 index.jsplist.dovindex.jsp源碼分析源碼分析 歡迎使用用戶管理系統(tǒng) 查看用戶列表 大家通過查看運行時的大家通過查看運行時的HTML源代碼就可以看到其輸出是:源代碼就可以看到其輸出是:,這句話可以讓我們,這句話可以讓我們的頁面總能正確找到引用的圖片,的頁面總能正
51、確找到引用的圖片,CSS等外部資源。假設(shè)頁面等外部資源。假設(shè)頁面有個圖片寫著:有個圖片寫著:,那么即使這個頁面的內(nèi)那么即使這個頁面的內(nèi)容通過容通過forward變成了變成了/ssh2/user/welcome.do,而圖片依然會從,而圖片依然會從地址地址http:/localhost:8080/ssh2/gif/a.gif 來讀取來讀取點擊超鏈接,瀏覽過去的是顯示分頁點擊超鏈接,瀏覽過去的是顯示分頁的的Struts 的控制器的控制器ListAction.javaListAction.java代碼代碼/* 分頁顯示用戶信息分頁顯示用戶信息 */public class ListAction ex
52、tends Action public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) / 分析當(dāng)前頁碼分析當(dāng)前頁碼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)前頁碼當(dāng)前頁碼 catch(Exception e) if(currentPage = 0) currentPage = 1;int pageSize = 3;/每頁顯示的數(shù)據(jù)數(shù)每頁顯示的數(shù)據(jù)數(shù) / 讀取數(shù)據(jù)讀取數(shù)據(jù)List users = manager.findPagedAll(currentPage, pageSize);request.setAttribute(users,users);/ 保存用戶列表保存用戶列表request.setAttribute(totalPage, manager.getTotalPage(pag
54、eSize);/ 保存總頁數(shù)保存總頁數(shù)request.setAttribute(totalCount, manager.getTotalCount();/ 保存記錄總數(shù)保存記錄總數(shù)request.setAttribute(currentPage, currentPage);/ 保存當(dāng)前頁碼保存當(dāng)前頁碼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ù)和分頁相關(guān)的信息后,我們將其存放在request 的屬性里面,以便在頁面中獲取這些值轉(zhuǎn)到前臺的顯示層用戶列表頁面list.jsp 來顯示用戶和功能鏈接此屬性在Sping中注入list.jsp代碼代碼v list.jsp 用用來顯示用戶和功能鏈接v 它是我們這個用戶管理應(yīng)用的中心頁面,所有的功能都從這里出發(fā) 用戶列表頁面用戶列表頁面 用戶列表頁面用戶列表頁面 用戶用戶ID 用戶名用戶名 操作操作 $user.id $user.username 修改修改 刪除刪除 共共$totalCount個用戶個用戶第
56、第$currentPage頁頁/共共$totalPage頁頁 遍歷上頁ListAction.java代碼存放在request中的users屬性值需傳遞id值到EditAction.java中從ListAction.java存放在request中獲取屬性值list.jsp代碼代碼v list.jsp 用用來顯示用戶和功能鏈接v 它是我們這個用戶管理應(yīng)用的中心頁面,所有的功能都從這里出發(fā) 1 上一頁上一頁 c:if test=$currentPage 上一頁上一頁 c:if test=$currentPage 下一頁下一頁 = totalPage 下一頁下一頁 / 頁面跳轉(zhuǎn)函數(shù)頁面跳轉(zhuǎn)函數(shù) / 參
57、數(shù)參數(shù): 包含頁碼的表單元素,例如輸入框,下拉框等包含頁碼的表單元素,例如輸入框,下拉框等 function jumpPage(input) if(input.value = $currentPage) return; / 頁碼相同就不做跳轉(zhuǎn)頁碼相同就不做跳轉(zhuǎn) var newUrl = $pageContext.request.contextPath/list.do?page= + input.value; document.location = newUrl; 若上一頁有數(shù)據(jù),則設(shè)置超鏈接,否則不設(shè)置超鏈接若下一頁有數(shù)據(jù),則設(shè)置超鏈接,否則不設(shè)置超鏈接使用javascript函數(shù)實現(xiàn)頁面跳轉(zhuǎn)
58、功能list.jsp代碼代碼v list.jsp 用用來顯示用戶和功能鏈接v 它是我們這個用戶管理應(yīng)用的中心頁面,所有的功能都從這里出發(fā)轉(zhuǎn)到轉(zhuǎn)到 option value=$i selected第第$i頁頁 輸入頁碼:輸入頁碼: 添加用戶添加用戶查找用戶查找用戶用戶名用戶名: 下拉框選項變化調(diào)用javascript跳轉(zhuǎn)函數(shù)本段代碼用戶通過選擇下拉框?qū)崿F(xiàn)頁面跳轉(zhuǎn)本段代碼用戶通過輸入文本框并點擊按鈕實現(xiàn)頁面跳轉(zhuǎn)添加用戶超鏈接查找用戶按鈕,調(diào)用SearchAction.java用戶列表頁面外觀當(dāng)點擊添加用戶鏈接后,我們就進入另當(dāng)點擊添加用戶鏈接后,我們就進入另一個模塊:添加用戶,流程是一個模塊:添加
59、用戶,流程是new.jspnew.dolist.do增加用戶流程new.jspnew.dolist.dov 添加新用戶表單輸入頁面new.jspv new.jsp源碼分析 添加用戶添加用戶 添加用戶添加用戶 用戶名用戶名:td 密碼密碼: 年齡年齡: td 當(dāng)前頁面引入當(dāng)前頁面引入js/form.js文件文件提交到提交到NewAction.java,提交前調(diào)用,提交前調(diào)用form.js中的中的checkForm()函數(shù),雖然這里用函數(shù),雖然這里用Struts 標簽庫編寫,也還是標簽庫編寫,也還是可以加入對應(yīng)的客戶端驗證代碼的可以加入對應(yīng)的客戶端驗證代碼的利用利用document對象對象loca
60、tion屬屬性實現(xiàn)頁面跳轉(zhuǎn)性實現(xiàn)頁面跳轉(zhuǎn)NewAction.java代碼代碼/* 創(chuàng)建新用戶創(chuàng)建新用戶 */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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于FPC的多約束下DP船軌跡跟蹤控制方法研究
- 面向地面移動目標無人機跟蹤控制方法研究
- 提前規(guī)劃考試復(fù)習(xí)時間表
- 打造專注力的秘密武器
- 二零二五年度專業(yè)音響設(shè)備租賃服務(wù)協(xié)議4篇
- 網(wǎng)絡(luò)美工工作總結(jié)
- 廚房衛(wèi)生安全管理
- 銀行業(yè)金融科技創(chuàng)新顧問工作總結(jié)
- 2024版毛概知識點
- 【臨床醫(yī)學(xué)】嚴重創(chuàng)傷的緊急救治
- 七年級下冊第六章《人體生命活動的調(diào)節(jié)》作業(yè)設(shè)計
- 特種設(shè)備使用單位日管控、周排查、月調(diào)度示范表
- 2024年重慶市優(yōu)質(zhì)企業(yè)梯度培育政策解讀學(xué)習(xí)培訓(xùn)課件資料(專精特新 專精特新小巨人中小企業(yè) 注意事項)
- 計算機二級wps office公共基礎(chǔ)考試題庫(100題)
- 三年級上冊豎式計算練習(xí)300題及答案
- 點亮生命-大學(xué)生職業(yè)生涯發(fā)展與就業(yè)指導(dǎo)全套教學(xué)課件
- 旅居管家策劃方案
- 華為經(jīng)營管理-華為的研發(fā)管理(6版)
- 鋰離子電池生產(chǎn)工藝流程圖
- 幼兒園小班下學(xué)期期末家長會PPT模板
- 礦山安全培訓(xùn)課件-地下礦山開采安全技術(shù)
評論
0/150
提交評論