




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、v 創(chuàng)建新項目v 用Struts 設計器制作前臺業(yè)務流程v 設計業(yè)務層功能v 開發(fā)業(yè)務層和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 數據庫student1v 實現(xiàn)功能:對用戶的增刪改查n 前臺:需要加入增加,修改刪除和查詢用戶所對應的頁面n 后臺功能通過調用Struts Action 來完成,Struts
2、 的Action 再委托給業(yè)務層StudentManager 類來完成n 根據個人愛好的不同,你既可以先完成前臺的頁面,也可以先把后臺的業(yè)務類寫完整,或者是兩個人分工的話一人負責一部分創(chuàng)建Web 項目v 選擇菜單選擇菜單File New Web Projectv 在在Project Name中輸入中輸入ssh2v 選中選中J2EE Specification Level下面的下面的Java EE 5.0 單選單選鈕鈕n 選擇哪個版本的選擇哪個版本的J2EE Specification Level 取決于你使用的服取決于你使用的服務器務器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 的目錄結構Struts1.2 的類庫的類庫struts-config.xmlStruts 的的TLD 文件文件驗證器文件驗證器
5、文件在 src 目錄下編寫我們自己的類第二部分第二部分 用用Struts 設計器制作前臺業(yè)務流程設計器制作前臺業(yè)務流程軟件開發(fā)的設計階段軟件開發(fā)的設計階段v 在實際項目開發(fā)中,第一步要做的可能是設計應用的整個流程,而不是立即著手制作JSP 或者編寫Java 代碼v 做實際的項目開發(fā),如果是大中型項目,思考項目到底該使用哪些技術和架構,用什么數據庫和操作系統(tǒng),最后應該實現(xiàn)成何種樣子,有哪些模塊,系統(tǒng)的工作流程如何等等,這些內容,相當于設計階段軟件開發(fā)的設計階段軟件開發(fā)的設計階段v 對于我們要做的這個項目來說,具體的技術和系統(tǒng)結構已經選好,就是SSH 架構。那么現(xiàn)在,在加入Spring 整合功能之
6、前,我們有必要把系統(tǒng)的表示層的工作流程搞清楚v 做這個流程設計有很多辦法,可以用畫圖工具例如Microsoft Visio,或者UML 建模工具開發(fā)一個活動圖等等都可以。因為我們使用的是MyEclipse,所以我們這里可以用它自帶的Struts 設計器快速的畫出所有的應用流程來Struts 配置文件編輯器v 雙擊 WebRoot/WEB-INF/struts-config.xml 就可以打開Struts 配置文件編輯器v 在設計器網格面板上點擊右鍵,選擇菜單來創(chuàng)建Action,F(xiàn)orward,JSP 等等v 為了更好的反映系統(tǒng)的工作流程,我們還可以使用設計器工具欄上的 按鈕來給一些頁面加入連接
7、關系,但是如果彈出對話框詢問是否設置為Action 的input 元素時,我們選擇No 按鈕。大致來說,我們的應用需要增刪改查四個模塊用戶管理應用業(yè)務流程圖業(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需要說明的是為了便于編寫一個默認的入口歡迎頁面,方便用戶的使用,我們已經把原來顯示用戶列表的index.jsp 重命名成
8、了list.jsp。另外,到底這些功能該如何進行分工和組織,也沒有絕對的標準,讀者可以根據自己的需要或者習慣來進行分工和命名。例如,新建用戶這個功能的命名可以是new,也可以起名為add 或者create。另外通用或者共用的Forward 路徑可以設置成Global Forward,即全局轉向,例如上圖中所顯示的所有到/error.jsp 的轉向,可以統(tǒng)一定義為一個全局的名為error 的Forward文檔規(guī)范化文檔規(guī)范化v 相比較于 Java 源代碼來說,給JSP 頁面加入一些文檔比較困難些,因為Java 文件可以用Javadoc 格式的注釋來加入并生成說明,但是JSP 沒有這方面的規(guī)定和好
9、用的文檔工具v 寫必要的流程說明n 便于自己核對是否全部頁面都按照預期實現(xiàn)n 方便自己或者別人日后對項目方便進行修改,升級和維護v 軟件開發(fā)本質上屬于集體勞動,所以作為其中的一員,盡量不要只把系統(tǒng)的設計藍圖或者注意事項放在自己的腦子里,一定要想辦法把它表示成可見的文檔來便于大家的交流和日后維護?,F(xiàn)在我們把JSP 頁面的功能用表格的方式列出來,如下表所示:頁面名功能描述index.jsp入口頁面list.jsp用戶信息列表顯示頁面(核心頁面)edit.jsp用戶信息修改表單輸入頁面error.jsp出錯信息顯示頁面new.jsp添加新用戶表單輸入頁面search.jsp顯示查找用戶結果的頁面Ac
10、tion 說明v 還有個問題需要大家解決,就是進入修改和刪除功能的Action 時,需要在URL 里以地址帶參數的方式來傳遞到底是修改或者刪除哪個用戶v 舉個例子,修改用戶我們用edit.do?id=1 這種形式。另外用戶的ID 是不可修改的,因此如果表單里要傳遞這個參數,一般就以表單的hidden(隱藏)類型的輸入域來表示,具體代碼類似這樣: input type=”hidden” name=”id” value=” 另外如果前臺需要一些數據,后臺可以通過request.setAttribute()方法來設置,前臺則需要用request.getAttribute()方法或者EL 表達式來讀取
11、這些值Action 路徑類名功能描述/listListAction分頁顯示用戶信息/editEditAction根據ID 獲取用戶信息并傳遞給edit.jsp/saveSaveAction保存對用戶信息的修改/newNewAction創(chuàng)建新用戶/deleteDeleteAction根據ID 刪除用戶/searchSearchAction根據用戶名查找用戶,并將結果返回給search.jsp創(chuàng)建數據庫創(chuàng)建數據庫v 數據庫: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è)務層的功能了v 我們已經確定要使用Spring + Hibernate 來完成后臺功能。Struts 的Action 將會調用業(yè)務層,業(yè)務層再會去調用數據訪問層和其它的一些輔助功能層(工具類或者第三方類庫)v 整個系統(tǒng)從橫向分層就分成了下面的部分:v 當然并沒有人規(guī)定到底怎樣分層才是完全正確的表示層控制層業(yè)務層數據訪問層輔助功能層學習方法交流學習方法交流v 系統(tǒng)分成一般來說大家可以按照軟件工程書籍上的辦法進行分層,然而更現(xiàn)實的卻是大家都在按照自己公司的方式進行分層。v 這時對于初學者來說必須避免
13、的一個誤區(qū)就是喋喋不休的對采用何種標準或者為什么教科書上所講的東西和現(xiàn)實不一樣或者說對于某個東西的原理進行一次次的爭論,或者用大家熟悉的話來概括:鉆牛角尖。v 鉆牛角尖表面看是勤奮好學,對某種內容具有韌性或者探索精神,然而我們卻不得不面對這樣一個場面:如果我們企圖完全弄懂一個問題,就不得不把和它關聯(lián)的問題也搞懂。但是尷尬的是,首先我們并不能無限制的得到任何自己需要的資料(大部分技術都是黑盒子,外人看不到內部實現(xiàn)的),另一方面,我們不得不承認人腦的記憶和理解是有限的這個現(xiàn)實。當你高高興興的以為自己弄懂了一個又一個問題時,最后卻尷尬的發(fā)現(xiàn)似乎自己高興過后只能記起其中的一兩個(當然有個好辦法就是把這
14、些問題都記下來便于以后查找)。學習方法交流學習方法交流v 我想做程序員首先要有鉆研精神,其次,也得有實用主義的精神。學技術,就是為了解決實際的問題的,如果你想為技術而技術,請先填飽肚子。遇到自己不會的東西怎么辦?首先是能用就行,我們把它看成黑盒子就行了,就像用遙控器的人永遠不需要還得懂紅外線,集成電路,振蕩器,發(fā)射器到底是怎么回事一樣。說到這里似乎已經扯遠了話題,然而看到過很多學生天天追求后臺原理或者軟件工程,然而卻連簡單的應用也作不出或者設計圖都畫不好。不是他們不努力,而是他們努力走向了另一個方向:鉆研理論。v 對于初學者,第一步要的就是:能用。其余的,在這基礎之上才能去談進一步提高。而且,
15、在國內的現(xiàn)狀就是,絕大多數人是開發(fā)應用(簡單的說就是編寫固定流程的東西),而不是深入軟件的底層來做開發(fā)工具或者自己動手寫或者改進虛擬機。開發(fā)經驗交流開發(fā)經驗交流v 對于這個項目來說,當前臺的結構設計的差不多的時候,我們也可以轉而先去做后臺的業(yè)務層,將前臺的功能進行提取,看看后臺能不能先把大部分都實現(xiàn)了v 這也是實際開發(fā)兩人或者多人分工協(xié)作可能出現(xiàn)的情況,例如:一個寫前臺,一個寫后臺v 當然我們并不是要讓大家非得按照軟件工程或者項目管理規(guī)范,把所有的文檔都寫好了才能真正開始編碼,我們只需要讓想法表示出來,就可以了v 用代碼來表示自己的想法,其實也是一種很不錯的辦法(一直備受贊揚的敏捷開發(fā)Agil
16、e,就是這樣)第三部分第三部分 設計業(yè)務層功能設計業(yè)務層功能養(yǎng)成使用接口的習慣v 對于業(yè)務層的設計,我們可以先寫接口,然后再具體實現(xiàn)v 當然直接寫成類的方式也是沒人禁止的,尤其是自己學習的時候也是很合適的做法v 寫接口就意味著我們并不需要寫好具體的實現(xiàn)代碼,所以設計階段一般來說還是鼓勵使用接口來做,這樣大家只需要討論好哪些功能需要,哪些不需要就行了v 給這個接口加上足夠多的注釋(或者文檔)進行業(yè)務層的具體設計v 首先定義接口IStudentManager(這個以I 開頭的名稱來自于Eclipse 的源碼中的定義接口的習慣,I 表示Interface,便于開發(fā)人員一眼看出這是個接口,當然請不要誤
17、會所有的接口必須以I 開頭才能定義)v 把它放在包service中,用來定義用戶管理模塊應有的功能。當然用manager 作為業(yè)務層的包還是別的名稱都是無所謂的v 顯示用戶列表時數據量大,需分頁顯示,分頁部分的接口設計如下所示:n public int getTotalCount(); / 得到用戶總數n public int getTotalPage(int pageSize) ;/ 獲取總頁面數n public List findPagedAll(int currentPage, int pageSize);/ 分頁顯示數據定義接口IStudentManager方法v 本項目的主要功能是增
18、刪改查,結合我們前面所討論的業(yè)務流程,并考慮到方法的參數和返回值等情況,我們一個個的定義這些功能所對應的方法聲明v 新建用戶,我們定義一個方法即可,返回值告訴調用者是否保存成功。 n public boolean save(Student student)v 保存用戶,我們前面的流程是首先通過ID 找到Student 對象,然后再保存更新,所以一共需要兩個方法的定義:n public Student findById(int id);/ 根據ID 查找n public boolean update(Student student);/ 更新用戶對象定義接口IStudentManager方法v
19、刪除用戶,根據 ID 進行刪除就可以了,所以定義一個方法即可,返回值同樣是成功時返回true,其它情況下返回falsen public boolean delete(Student student) v 查找用戶,我們則只需要一個方法就可以了,在這里我們只提供根據用戶名進行查找的功能,方法的參數是用戶名,返回值則是包含找到的用戶對象的列表,如果找不到的話就返回nulln public List findStudentByUsername(String username);開發(fā)經驗交流v 至此,我們所有的初步設計工作都已完成了,下一步就可以著手進行詳細設計了。但是因為這個項目相對比較規(guī)模小,所以
20、我們接下來就進入具體的開發(fā)過程中v 對于大型項目實際開發(fā)中一般會進行詳細設計,要把所有的JSP 頁面的樣子畫出來,每個類的UML 圖也要畫出來,以及每個頁面和類的具體實現(xiàn)思路也得進行說明,例如:頁面中加入的表單驗證腳本代碼,Action 類的工作流程,DAO 層采用何種技術實現(xiàn)等等(當然這里可以使用Spring 中的HibernateDaoSupport 或者HibernateTemplate)v 不過實際開發(fā)中你會發(fā)現(xiàn)基本上所有的詳細設計都會有紕漏或者錯誤之處,需要在開發(fā)過程中逐步進行必要的修改開發(fā)經驗交流v 設計完成后,到底是先做前臺頁面還是先實現(xiàn)后臺的功能類呢?n 這個問題其實并無標準答
21、案,全依賴于開發(fā)人員的習慣而決定v 由于前面我們已經將業(yè)務層接口確定,所以如果假設這個項目有兩個人進行開發(fā)的話,是可以分頭進行的,只需要最后在Spring 配置文件中將接口的具體實現(xiàn)類指定就可以了v 相對來說,這個項目的業(yè)務層代碼比較簡單,所以我打算先實現(xiàn)后臺功能。前臺的JSP,Struts 的部分則放在后面進行開發(fā)第四部分第四部分 開發(fā)業(yè)務層和開發(fā)業(yè)務層和DAO 層代碼層代碼第四部分內容v 添加Hibernate功能v 添加Spring 功能v Spring 整合 Hibernatev 用Spring 2.0 的aop 和tx 聲明式配置解決事務提交問題v 開發(fā)業(yè)務層添加Hibernate功
22、能添加Hibernate功能v 現(xiàn)在我們要把Hibernate功能添加到當前項目,這一步不反向工程生成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 向導Add Hibernate Capabilities向導選擇Hibernate 類庫版本可以添加到項目的構造路徑的類庫集合選中的類庫將會添加到項目的構造路徑中, 但相應的JAR 文件將不會復制到項目中. 這些 JAR 文件會在發(fā)布程序時復制選中的類庫 JAR 文件將會被復制到項目并添加到構造路徑中去(這個方式在開發(fā)不依賴于MyEclipse 的項目的時候,或者解決JAR 包沖突的時候很有用),此處選用復制的方式相對于現(xiàn)
24、在項目的路徑, 可以新建或者使用現(xiàn)有目錄,Hibernate 類庫將會被向導復制到這里創(chuàng)建Hibernate XML 配置文件v 上頁選擇Next 按鈕前進到本頁創(chuàng)建 Hibernate XML 配置文件選擇數據庫連接如果不想現(xiàn)在就設置數據庫連接屬性,去掉復選框即可跳過選擇以前創(chuàng)建好的數據庫連接,相關的連接信息將會自動填入到對話框中選中后則會自動加入相應的數據庫驅動類庫jar 文件到項目的類路徑中如果選中,那么Hibernate 將會自動根據映射文件來動態(tài)生成建表語句然后執(zhí)行,然而這種方法不是很可靠,所以一般來說不要用創(chuàng)建SessionFactory這一頁選擇是否生成Session Facto
25、ry 類,去掉復選框Create SessionFactory class?的選中狀態(tài),最后點擊Finish 按鈕完成整個添加過程向導結束后將進行的操作v 如果在第一頁選擇了復制類庫到你的項目, 將復制 Hibernate 類庫 (JARs) 到項目中v 更新項目的構造路徑來包含已安裝的 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 向導,對于這個項目來說,你可以直接點擊Finish 按鈕就行了加入Spring 功能向導對話框的第1頁Spring 版本,一般選擇Spring 2 單選鈕選擇要加入項目類路徑的類庫點擊此鏈接可以修改類庫設置選擇JAR 類庫的安裝方式,上面的單選鈕只是把引用的類庫加入類路徑,下面的則需要指定一個目錄把所有的JAR 文件和標簽文件加入到當前項目中,這種方式適用于不依賴MyEclip
27、se 進行開發(fā)或者手工管理類庫當選中了 Spring Web 的時候需要指定標簽庫文件的安裝目錄注意有些Myeclipse 的該窗口沒有 Spring2.0 ORM/DAO/hibernate3 libraries類庫,要在添加完后手動添加,添加方法Build path add libraries加入Spring 功能向導對話框的第2頁創(chuàng)建Spring bean 定義文件可以修改Spring 配置文件的名字(修改Folder 和File 選項)加入Spring 功能向導對話框的第3頁配置一個使用現(xiàn)有Hibernate配置文件的Spring下的LocalSessionFactory采用默認的se
28、ssionFactory就可以了Spring 整合 Hibernate使用反向工程快速生成Java POJO 類,映射文件和DAOv 術語解釋n DAO 是Data Access Object,數據訪問對象的縮寫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啟動反向工程向導點右鍵,選擇Open ConnectionHibernate 反向工程向導第 1 頁Spring 整合Hibernate 的項目文件內容StudentDAOv StudentDAO類繼承自HibernateDaoSupport,該類來自于Spring,它提供了獲取HibernateTemplate 的方法:getHibernateTemplate(),這個DAO 也實現(xiàn)了保存,刪除,查找實體類的方法,在此需要加入對應業(yè)務處理的分頁和更新功能n public int getTotalCount()n public List f
30、indPagedAll(int currentPage, int pageSize)n public void update(Student1 transientInstance) n public List findByUsername(Object username) v 另外,它還缺少必要的功能:事務處理用Spring 2.0 的aop 和tx 聲明式配置解決事務提交問題修改applicationContext.xmlv Spring 1.2 方式的事務代理是非常繁瑣的,現(xiàn)在我們用Spring 2.0 的聲明式事務來完成。將上面的applicationContext.xml 將其內容修改
31、為如下所示“注意這里根據文件位置來定”測試并運行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 事務代理測試); user.setAge(new Integer(200); dao.save(user); 運行結果: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 可以自動根據要代理的類的類型來選擇是基于JDK 的接口代理還是CGLib 的類代理嘛?然而沒有辦法,出錯了,也許這是Spring 的一個Bug 吧修改代碼v 現(xiàn)在只好按照要求,把類加入一個接口定義,先修改Student1DAO.java,讓它實現(xiàn)一個接口IStudentDAO:public class Student1DAO extends HibernateDaoSupport implements IStudentDAO編寫接口v 寫一個接口IStudentDAO(可以通過重構功能來生成,選擇菜單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 這時候對應的 Spring2TransactionDAOTest.java 里面的代碼已經自動變成了:IStudentDAO dao = (IStudentDAO)ctx.getBean(StudentDAO);v 再次運行測試類Spring2TransactionDAOTest,然后檢查數據庫,可以很高興的看到數據已經插入進來了v 這里會出現(xiàn)異常 關于主鍵是否自增長的問題通過修改student.hbm.xmlv v v v 開發(fā)業(yè)務層開發(fā)業(yè)務層開發(fā)StudentManager類代碼v 創(chuàng)建前面設計好的ISt
38、udentManager接口v 修改或者新建類service.StudentManager,來實現(xiàn)先前定義的IStudentManager 接口中的功能v 為了便于使用Spring 整合,我們將其中的DAO層設置成一個屬性dao,通過方法getDao()和setDao()定義,類型為dao.Student1DAO。業(yè)務層的絕大部分功能都是委托給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(); / 得到頁面總數 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;因為這個類需要訪問底層的數據庫,在這里可以通過Spring 來設置對應的DAO 類的實例,因此我們還要在Spring 的配置文件applicationContext.xml 中加入下面的bean 配置:測試并運行業(yè)務層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(每頁三行,第一頁數據: ); 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_每頁三行,第一頁數據:姓名:dd大多數 密碼:1234 姓名:spring dao 密碼:pa 姓名:spring dao2 密碼:pa2 第五部分第五部分 開發(fā)前臺頁面流程開發(fā)前臺頁面流程前臺如何開發(fā)前臺如何開發(fā)v 前面我們已經完成了必要的功能設計,在此階
44、段給以編碼實現(xiàn)v 對于我們來說,按照業(yè)務流程說明表中的流程進行開發(fā),遇到JSP,就創(chuàng)建或者修改JSP頁面;遇到.do,就根據用戶管理應用業(yè)務流程圖流程開發(fā)或者修改Action類。這樣一個流程一個流程的開發(fā),最后再進行測試,就可以完成了v 下面我們重溫業(yè)務流程說明及用戶管理應用業(yè)務流程圖重溫業(yè)務流程重溫業(yè)務流程功能模塊流程分頁列出用戶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需要說明的是為了便于編寫一個默認的入口歡迎頁面,方便用戶的使用,我們已經把原來顯示用戶列表的index.jsp 重命名成了list.jsp。另外,到底這些功能該如何進行分工和組織,也沒有絕對的標準,讀者可以根據自己的需要或者習慣來進行分工和命名。例如,新建用戶這個功能的命名可以是new,也可以起名為add 或者create。另外通用或者共用的Forward 路徑可以設置成Global Forward,即全局轉向,例如上圖中所顯示的所有到/error.jsp 的轉向,可以統(tǒng)一定義為一個全局的名為error 的Forward重溫用戶管理應用業(yè)務流程圖開發(fā)前臺代碼開發(fā)前臺代碼v
46、 具體的編碼過程不再贅述,按照流程創(chuàng)建一個個JSP頁面,最后再修改后臺的Action類代碼v 需要提示大家的是,像EditAction這樣的功能的寫法,需要根據ID查找一個用戶然后傳遞給前臺進行修改,雖然沒有明確的在設計圖中反映出來,如果不幸找不到用戶信息的話,務必需要告訴使用人員要修改的用戶找不到,可以轉向到/error.jsp進行顯示。接下來要做的就是先將傳遞過來的字符串類型的ID參數通過Integer.parseInt(String)方法轉換成int,然后再將通過后臺業(yè)務層(也即IStudentManager)找到的用戶信息通過request對象設置屬性傳遞給前臺的JSP頁面,前臺頁面則
47、使用EL表達式加以顯示。v 實現(xiàn)過程中一定要全面考慮到客戶端驗證(JavaScript表單驗證)和服務器端驗證(在Action類中進行必要的數據驗證),解決中文問題解決中文問題v 加入解決中文字符編碼的過濾器TomcatFormFilterv 在web.xml中進行配置v http:/ 因為Spring 用了LOG4J 做出錯信息的輸出,雖然后臺有很多的真實出錯信息,然而在這里卻是看不到的。所以需要加入日志處理功能v 在src 目錄下創(chuàng)建配置文件,選擇菜單File New File,文件名輸入perties,文件內容如下所示: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源代碼目錄結構源代碼目錄結構表單驗證腳本代碼表單驗證腳本代碼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 里面,里面,例如調用例如調用request.setAttribute(“message”,”出錯了!出錯了!”);之后相關的出錯信息就可以顯示在之后相關的出錯信息就可以顯示在這個頁面中。另外還提供了一個返回鏈接讓用戶這個頁面中。另外還提供了一個返回鏈接讓用戶能夠回去繼續(xù)操作能夠回去繼續(xù)操作第一個流程 index.jsplist.dovindex.jsp源碼分析源碼分析 歡迎使用用戶管理系統(tǒng) 查看用戶列表 大家通過查看運行時的大家通過查看運行時的HTML源代碼就可以看到其輸出是:源代碼就可以看到其輸出是:,這句話可以讓我們,這句話可以讓我們的頁面總能正確找到引用的圖片,的頁面總能正
51、確找到引用的圖片,CSS等外部資源。假設頁面等外部資源。假設頁面有個圖片寫著:有個圖片寫著:,那么即使這個頁面的內那么即使這個頁面的內容通過容通過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) / 分析當前頁碼分析當前頁碼String pageString=request.getParameter(page);if(pageString = null | pageString.length() = 0) pageString = 1;int currentPage= 0 ;try currentPage = I
53、nteger.parseInt(pageString);/ 當前頁碼當前頁碼 catch(Exception e) if(currentPage = 0) currentPage = 1;int pageSize = 3;/每頁顯示的數據數每頁顯示的數據數 / 讀取數據讀取數據List users = manager.findPagedAll(currentPage, pageSize);request.setAttribute(users,users);/ 保存用戶列表保存用戶列表request.setAttribute(totalPage, manager.getTotalPage(pag
54、eSize);/ 保存總頁數保存總頁數request.setAttribute(totalCount, manager.getTotalCount();/ 保存記錄總數保存記錄總數request.setAttribute(currentPage, currentPage);/ 保存當前頁碼保存當前頁碼return mapping.findForward(display);private IStudentManager manager;public IStudentManager getManager() return manager;public void setManager(IStuden
55、tManager manager) this.manager = manager;當取到了數據和分頁相關的信息后,我們將其存放在request 的屬性里面,以便在頁面中獲取這些值轉到前臺的顯示層用戶列表頁面list.jsp 來顯示用戶和功能鏈接此屬性在Sping中注入list.jsp代碼代碼v list.jsp 用用來顯示用戶和功能鏈接v 它是我們這個用戶管理應用的中心頁面,所有的功能都從這里出發(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 它是我們這個用戶管理應用的中心頁面,所有的功能都從這里出發(fā) 1 上一頁上一頁 c:if test=$currentPage 上一頁上一頁 c:if test=$currentPage 下一頁下一頁 = totalPage 下一頁下一頁 / 頁面跳轉函數頁面跳轉函數 / 參
57、數參數: 包含頁碼的表單元素,例如輸入框,下拉框等包含頁碼的表單元素,例如輸入框,下拉框等 function jumpPage(input) if(input.value = $currentPage) return; / 頁碼相同就不做跳轉頁碼相同就不做跳轉 var newUrl = $pageContext.request.contextPath/list.do?page= + input.value; document.location = newUrl; 若上一頁有數據,則設置超鏈接,否則不設置超鏈接若下一頁有數據,則設置超鏈接,否則不設置超鏈接使用javascript函數實現(xiàn)頁面跳轉
58、功能list.jsp代碼代碼v list.jsp 用用來顯示用戶和功能鏈接v 它是我們這個用戶管理應用的中心頁面,所有的功能都從這里出發(fā)轉到轉到 option value=$i selected第第$i頁頁 輸入頁碼:輸入頁碼: 添加用戶添加用戶查找用戶查找用戶用戶名用戶名: 下拉框選項變化調用javascript跳轉函數本段代碼用戶通過選擇下拉框實現(xiàn)頁面跳轉本段代碼用戶通過輸入文本框并點擊按鈕實現(xiàn)頁面跳轉添加用戶超鏈接查找用戶按鈕,調用SearchAction.java用戶列表頁面外觀當點擊添加用戶鏈接后,我們就進入另當點擊添加用戶鏈接后,我們就進入另一個模塊:添加用戶,流程是一個模塊:添加
59、用戶,流程是new.jspnew.dolist.do增加用戶流程new.jspnew.dolist.dov 添加新用戶表單輸入頁面new.jspv new.jsp源碼分析 添加用戶添加用戶 添加用戶添加用戶 用戶名用戶名:td 密碼密碼: 年齡年齡: td 當前頁面引入當前頁面引入js/form.js文件文件提交到提交到NewAction.java,提交前調用,提交前調用form.js中的中的checkForm()函數,雖然這里用函數,雖然這里用Struts 標簽庫編寫,也還是標簽庫編寫,也還是可以加入對應的客戶端驗證代碼的可以加入對應的客戶端驗證代碼的利用利用document對象對象loca
60、tion屬屬性實現(xiàn)頁面跳轉性實現(xià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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年護師類之護師(初級)基礎試題庫和答案要點
- 教師培訓:校園安全
- 第 4 單元評估檢測題(B卷)(單元測試)(無答案)2024-2025學年二年級下冊數學人教版
- 中國乙丙共聚物市場發(fā)展狀況與投資趨勢預測報告2025-2031年
- 北師大定積分高中知識
- 天然氣知識培訓課件
- 固定資產管理課件
- 小學語文優(yōu)教課件
- 電力安規(guī)考試題及答案
- 教練班鋼管考試題及答案
- a320飛機空調系統(tǒng)工作原理與使用維護分析
- 施工機具進場檢查驗收記錄
- 《液壓與氣動技術項目教程》高職配套教學課件
- 【課件】第3課 象外之境-中國傳統(tǒng)山水畫 課件-2022-2023學年高中美術人教版(2019)美術鑒賞
- 英語滬教版小學五年級下冊Unit6優(yōu)質課課件1
- 誤吸的護理應急預案
- 小件物品寄存和隨車托運登記表
- 2022年七步洗手法操作考核評分標準
- 手壓式手電筒設計(棘輪機構及電路設計)
- 基礎降水井封井方案
- 產品被預警、召回、索賠、退貨及顧客投訴管理程序
評論
0/150
提交評論