版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
學(xué)號:________________密級:________________武漢大學(xué)本科畢業(yè)論文SpreadsheetFunctions'DesignAndImplementationInEnterpriseAssetManagement企業(yè)資產(chǎn)管理系統(tǒng)中電子報表功能的設(shè)計和實現(xiàn)院(系)名稱:國際軟件學(xué)院專業(yè)名稱:軟件工程學(xué)生姓名:周葉勝指導(dǎo)教師:王樹良BACHELOR'SDEGREETHESISOFWUHANUNIVERSITYSpreadsheetFunctions'DesignAndImplementationInEnterpriseAssetManagementCollege:WuHanUniversitySubject:SoftwareEngineeringName:YeshengZhouDirectedby:ShuliangWangJune2008鄭重聲明本人呈交的學(xué)位論文,是在導(dǎo)師的指導(dǎo)下,經(jīng)過小組工程實踐,進行大量研究所取得的成果,所有數(shù)據(jù)、圖片資料真實可靠。盡我所知,除文中已經(jīng)注明引用的內(nèi)容外,本學(xué)位論文的研究成果不包含他人享有著作權(quán)的內(nèi)容。對本論文所涉及的研究工作做出貢獻的其他個人和集體,均已在文中以明確的方式標(biāo)明。本學(xué)位論文的知識產(chǎn)權(quán)歸屬于培養(yǎng)單位。本人簽名:日期:摘要本論文是基于一個小組完成的企業(yè)資產(chǎn)管理系統(tǒng)來撰寫,主要討論了實現(xiàn)這個系統(tǒng)所用到的Struts、Spring、Hibernate技術(shù),它所涉及到的數(shù)據(jù)庫設(shè)計。Struts、Spring、Hibernate技術(shù)到底是什么,三種技術(shù)如何集合在一起,數(shù)據(jù)庫到底應(yīng)該如何設(shè)計等,本文都給出了闡述。本論文的重點是報表系統(tǒng),也是基于項目所實現(xiàn)的功能來討論,主要討論了本人設(shè)計報表的理念和實現(xiàn)報表的原理。報表設(shè)計和實現(xiàn),它與業(yè)務(wù)和用戶的關(guān)系甚密,完全了解業(yè)務(wù)才能設(shè)計出符合要求的報表系統(tǒng)。關(guān)鍵詞:Struts技術(shù);Spring技術(shù);Hibernate技術(shù);SSH框架;數(shù)據(jù)庫;報表:ABSTRACTThispaperiscarriedoutonthebasisoftheEnterpriseAssetManagementsystemwhichisproducedbyourfour-peoplegroup.ThispapermainlyintroducestheStruts,Spring,Hibernateframework.Meanwhile,itgivestheprinceplesabouthowtodesigndatabasebasingonthebusinessyouaretryingtoimplement.Butthepointofthispaperisonthespreadsheet.Howtodesignitandhowtoimplementarethekeysofspreadsheet.Thesekeysshouldbaseontheprogram'susers.Differentcultureordifferenteducationwillaffectyourdesign.Andtheflowofthebusinesswillaffectittoo.Thispapergivedetailsonit.Keywords:Struts;Spring;Hibernate;SSH;database;spreadsheet目錄第1章緒論1.1概述………………………71.2項目技術(shù)構(gòu)架……………71.3項目技術(shù)構(gòu)架……………81.4項目功能簡介……………81.5論文研究方法……………8第2章技術(shù)簡介2.1JSP技術(shù)簡介………………102.2Struts簡介…………………112.3Spring簡介…………………132.4Hibernate簡介……………152.5數(shù)據(jù)庫設(shè)計介紹……………192.6框架整合與配置…………20第3章報表設(shè)計和實現(xiàn)3.1報表設(shè)計……………………223.1.1業(yè)務(wù)流程……………223.1.2報表與人物角色………243.1.1報表設(shè)計………………243.2報表的實現(xiàn)…………………253.2.1報表實現(xiàn)原理…………263.2.2員工購物報表實現(xiàn)……………………283.2.3經(jīng)理報表實現(xiàn)…………293.2.4報表頁面顯示實現(xiàn)……………………30結(jié)論………………32致謝………………33第1章緒論1.1概述企業(yè)資產(chǎn)管理在我國企事業(yè)單位的資產(chǎn)管理中是一個薄弱環(huán)節(jié),也是一個必須要加強的環(huán)節(jié)。企業(yè)資產(chǎn)的流失、閑置、重復(fù)采購及責(zé)任的不明確等,都導(dǎo)致了企業(yè)資產(chǎn)的嚴(yán)重浪費。為了使企業(yè)資產(chǎn)能夠充分有效的利用,必須對企業(yè)資產(chǎn)進行有效的管理。企業(yè)資產(chǎn)管理系統(tǒng)是立足企事業(yè)單位后勤發(fā)展,集數(shù)據(jù)集成、電子報表、分類匯總、自動生成、網(wǎng)絡(luò)傳遞、多極查詢于一體的企業(yè)資產(chǎn)管理系統(tǒng),是與現(xiàn)行住房檔案管理信息系統(tǒng)和企業(yè)資產(chǎn)上報系統(tǒng)相互支持,配套的智能化技術(shù)平臺,整體上建成運作簡便、管理科學(xué)、效率很高、最終能實現(xiàn)無紙化辦公品牌服務(wù)窗口。系統(tǒng)為集中采購提供了技術(shù)手段,從資產(chǎn)采購選型開始,提交采購申報,分配到責(zé)任人管理維護維修,最后的報廢處理的全過程進行管理。記錄資產(chǎn)的各種屬性,記錄資產(chǎn)的變更、報廢的情況,提供個人查詢、領(lǐng)導(dǎo)查詢等多級查詢功能。將資產(chǎn)的登記與財務(wù)報賬連接、資產(chǎn)與責(zé)任人掛鉤,并與人事部門連接,實現(xiàn)動態(tài)實時的查詢功能,防止企業(yè)資產(chǎn)的流失和浪費。系統(tǒng)還提供耗材管理功能,供網(wǎng)上耗材申領(lǐng)和核發(fā),統(tǒng)計耗材領(lǐng)用情況。1.2項目技術(shù)構(gòu)架由我們小組完成的這個企業(yè)資產(chǎn)管理系統(tǒng)所用的框架是比較流行的SSH框架,Struts+Spring+Hibernate這3個框架,Struts我們用的是1.2版本,Spring是2.0版本,Hibernate是3.2的的版本,而我們的數(shù)據(jù)庫使用的是MySQL5.0版本。使用CMMI軟件開發(fā)流程,包括需求分析、系統(tǒng)設(shè)計、編碼實現(xiàn)和測試等。J2EE應(yīng)用開發(fā)技術(shù),應(yīng)用Java語言、JavaScript、XHTML,Eclipse、Tomcat、SVN、Bugzilla等編程環(huán)境和工具;MySQL關(guān)系數(shù)據(jù)庫編程。UML建模語言,需求分析和系統(tǒng)設(shè)計建模工具,以及有關(guān)的軟件工程方法;總的來說是一個傳統(tǒng)的基于MVC框架模式的WEB項目的開發(fā)。1.3企業(yè)資產(chǎn)管理系統(tǒng)國內(nèi)外發(fā)展趨勢在國內(nèi)外,企業(yè)資產(chǎn)管理系統(tǒng)是一個正在蓬勃發(fā)展的新興企業(yè)所必需系統(tǒng),并且越來越多的受到企業(yè)的歡迎和認可。但是,由于還沒有健全,就難免會存在一些問題,且不說企業(yè)資產(chǎn)管理安全等問題,業(yè)務(wù)功能的優(yōu)劣正逐漸成為制約企業(yè)資產(chǎn)管理發(fā)展的重要因素之一。我國現(xiàn)階段企業(yè)資產(chǎn)管理電子報表存在的幾大問題:1.資產(chǎn)目錄不詳細2.資產(chǎn)管理不充分3.資產(chǎn)流動不靈活4.系統(tǒng)操作不人性化1.4項目功能簡介本系統(tǒng)具有的功能1.用戶登陸:包括用戶的登陸,注冊;2.網(wǎng)上超市:包括提供商品的分類瀏覽、查詢及自動生成采購申報表。以及產(chǎn)品信息發(fā)布,項目日志管理,產(chǎn)品報價系統(tǒng);3.資產(chǎn)核查:核查子系統(tǒng)的技術(shù)調(diào)研工作,及子系統(tǒng)的實現(xiàn);4.通用及專用設(shè)備:將專用及通用設(shè)備從購買、維修、處置到最后的報廢過程進行管理。5.車輛管理:將車輛從購買、維修、處置到最后的報廢過程進行管理;6.耗材管理:用戶可通過網(wǎng)上超市提出耗材領(lǐng)用申請,管理員可通過分類統(tǒng)計及查詢功能快速的對申請進行審核,可以有效的避免資產(chǎn)浪費。待審核完成后,用戶在領(lǐng)用耗材時,管理員便將其詳細信息記錄入庫;7.供應(yīng)商管理系統(tǒng):包括集中采購及賬務(wù)報賬;8.系統(tǒng)維護:包括人員信息維護、部門維護、資產(chǎn)編碼維護及耗材類別維護。系統(tǒng)的使用者分為員工、總經(jīng)理、部門經(jīng)理和系統(tǒng)管理員,不同的企業(yè)角色在登陸后所進行的操作和所看到的頁面是不一樣的1.5論文研究方法獨立完成以及參加小組討論合作。運用所學(xué)過的Java知識以及MVC框架的有關(guān)技術(shù),先完成自己所負責(zé)的電子報表系統(tǒng)模塊,然后將小組各成員的成果整合為一個完整的項目。第2章技術(shù)簡介2.1JSP技術(shù)簡介網(wǎng)頁可以分為動態(tài)頁面和靜態(tài)頁面。HTML就是用來寫靜態(tài)頁面的,在靜態(tài)頁面上,你無法和服務(wù)器互動,只能瀏覽頁面信息。動態(tài)頁面就不一樣了,它可以和服務(wù)器端進行交互,你所做的事情不僅僅只是瀏覽信息,比如:搜索、發(fā)帖等。JSP技術(shù)是比較流行的用于制作動態(tài)頁面的一門技術(shù),它涉及到servlet和靜態(tài)頁面的編寫。首先JSP中有page、request、session、application4個范圍的分化,因為動態(tài)變化涉及到頁面的跳轉(zhuǎn)等,在操作中會有無數(shù)的參數(shù)、屬性的出現(xiàn),那么在與服務(wù)器進行信息交互的過程中,你就需要分清參數(shù)、屬性到底是在哪個范圍里面,并且清楚了解4個范圍的分界。在每個范圍里面,都會有取得和設(shè)定參數(shù)或者屬性的方法。JAVA中都是對象調(diào)用方法,而JSP中有8個內(nèi)置對象:pageContext、request、session、application、out、config、page、exception。設(shè)定屬性的方法是:PublicvoidsetAttribute(Stringname,Objectvalue)獲取屬性的方法是:PublicvoidsetAttribute(Stringname)舉個簡單的例子,如:request.setAttribute(username,"zhou")就是在request范圍里面設(shè)置一個屬性username,它的值是zhourequest.getAttribute(username,"zhou")就是獲取username這個屬性的值request.getParameter("password")就是獲取頁面中一個參數(shù)的值。這樣一來,服務(wù)器可以獲得頁面中的任何信息。信息獲得后,需要servlet來處理,所以每個功能你都需要寫一個相應(yīng)的servlet來處理,然后將servlet添加到頁面中來實現(xiàn)各種功能,比如:跳轉(zhuǎn)頁面、根據(jù)你的搜索顯示結(jié)果等等。簡單來講,將servlet和靜態(tài)頁面結(jié)合就是動態(tài)頁面。編寫servlet是最主要的,它決定你的功能,而靜態(tài)頁面主要影響視覺效果,也是很重要的??蛻羲私獾木褪悄懿荒苡?,而第一印象是界面是否符合要求,所以靜態(tài)頁面的設(shè)計也很重要。這2個方面都做好了,JSP技術(shù)也就基本掌握到了。2.2.Struts簡介Struts是一個為開發(fā)基于模型(Model)-視圖(View)-控制器(Controller)(MVC)模式的應(yīng)用架構(gòu)的開源框架,是利用JavaServlet和JSP構(gòu)建Web應(yīng)用的一項非常有用的技術(shù)。由于Struts能充分滿足應(yīng)用開發(fā)的需求,簡單易用,敏捷迅速,因而吸引了眾多的開發(fā)人員的關(guān)注。
首先事件是指從客戶端頁面(瀏覽器)由用戶操作觸發(fā)的事件,Struts使用Action來接受瀏覽器表單提交的事件,這里使用了Command模式,每個繼承Action的子類都必須實現(xiàn)一個方法execute。
struts重要的表單對象ActionForm是一種對象,它代表了一種應(yīng)用,這個對象中至少包含幾個字段,這些字段是Jsp頁面表單中的input字段,因為一個表單對應(yīng)一個事件,所以,當(dāng)我們需要將事件粒度細化到表單中這些字段時,也就是說,一個字段對應(yīng)一個事件時,單純使用Struts就不太可能,當(dāng)然通過結(jié)合JavaScript也是可以轉(zhuǎn)彎實現(xiàn)的。
Struts是一個基于SunJ2EE平臺的MVC框架,主要是采用Servlet和JSP技術(shù)來實現(xiàn)的。Struts把Servlet、JSP、自定義標(biāo)簽和信息資源(messageresources)整合到一個統(tǒng)一的框架中,開發(fā)人員利用其進行開發(fā)時不用再自己編碼實現(xiàn)全套MVC模式,極大的節(jié)省了時間,所以說Struts是一個非常不錯的應(yīng)用框架。
Struts框架可分為以下四個主要部分:
1、模型(Model),本質(zhì)上來說在Struts中Model是一個Action類(這個會在后面詳細討論),開發(fā)者通過其實現(xiàn)商業(yè)邏輯,同時用戶請求通過控制器(Controller)向Action的轉(zhuǎn)發(fā)過程是基于由struts-
config.xml文件描述的配置信息的。
2、視圖(View),View是由與控制器Servlet配合工作的一整套JSP定制標(biāo)簽庫構(gòu)成,利用她們我們可以快速建立應(yīng)用系統(tǒng)的界面。
3、控制器(Controller),本質(zhì)上是一個Servlet,將客戶端請求轉(zhuǎn)發(fā)到相應(yīng)的Action類。
4、一堆用來做XML文件解析的工具包,Struts是用XML來描述如何自動產(chǎn)生一些JavaBean的屬性的,此外Struts還利用XML來描述在國際化應(yīng)用中的用戶提示信息的(這樣一來就實現(xiàn)了應(yīng)用系統(tǒng)的多語言支持)。使用Struts時,在搭建好環(huán)境后,你所做的事情是:a.編寫FORM;b.編寫ACTION;c.編寫JSP頁面;d.改寫Struts的配置文件。ACTION是用來實現(xiàn)功能的,就是控制器。FORM是用來傳遞信息的,它的數(shù)據(jù)來自客戶發(fā)出的請求。Struts的原理和流程大概樣的:讀取配置,總控制器ACTIONSERVLET讀取Struts的配置文件,為各個模塊初始化對象。用戶發(fā)出HTTP請求,同時請求的數(shù)據(jù)會以表單或者URL的形式傳送到服務(wù)器;填充FORM,先將FORM實例化,再將客戶請求的數(shù)據(jù)填充相應(yīng)的FORM中的成員對象,保存;將FORM轉(zhuǎn)發(fā)到相應(yīng)的ACTION中去;處理業(yè)務(wù),然后返回一個ACTIONFORWARD對象;返回響應(yīng),返回的對象可能對用一個JSP頁面也可能是一個ACTION;查找響應(yīng),查找配置文件來找到對象對應(yīng)的是哪個頁面或者哪個ACTION;響應(yīng)用戶,將對象呈現(xiàn)給用戶。FORM就是你所用到的一個表寫成一個類,表中的參數(shù)就是類中的成員變量。它的工作原理大概是這樣的,每次你調(diào)用一個ACTION,它就會查找ACTION對應(yīng)的FORM,如果在scope(request/application)里存在這個FROM,它就會重用。如果沒有,它就會實例化出一個,用提交給服務(wù)器的數(shù)據(jù)來填充這個對象,然后由ACTION來進行相應(yīng)的處理。而ACTION就是負責(zé)業(yè)務(wù)邏輯處理的,類似于JSP中的servlet,,所以寫好FORM,寫好ACTION,配置好配置文件,就能使用Struts框架了。2.3Spring簡介Spring是一個開源框架,目前在開源社區(qū)的人氣很旺,被認為是最有前途的開源框架之一。她是由RodJohnson創(chuàng)建的,她的誕生是為了簡化企業(yè)級系統(tǒng)的開發(fā)。說道Spring就不得不說EJB,因為Spring在某種意義上是EJB的替代品,她是一種輕量級的容器。用過EJB的人都知道EJB很復(fù)雜,為了一個簡單的功能你不得不編寫多個Java文件和部署文件,他是一種重量級的容器。也許你不了解EJB,你可能對“輕(重)量級”和“容器”比較陌生,那么這里我簡單介紹一下。Spring的初步了解如下是Spring框架圖:組成Spring框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯(lián)合實現(xiàn)。每個模塊的功能如下:核心容器:核心容器提供Spring框架的基本功能。核心容器的主要組件是BeanFactory,它是工廠模式的實現(xiàn)。BeanFactory使用控制反轉(zhuǎn)(IOC)模式將應(yīng)用程序的配置和依賴性規(guī)范與實際的應(yīng)用程序代碼分開。Spring上下文:Spring上下文是一個配置文件,向Spring框架提供上下文信息。Spring上下文包括企業(yè)服務(wù),例如JNDI、EJB、電子郵件、國際化、校驗和調(diào)度功能。SpringAOP:通過配置管理特性,SpringAOP模塊直接將面向方面的編程功能集成到了Spring框架中。所以,可以很容易地使Spring框架管理的任何對象支持AOP。SpringAOP模塊為基于Spring的應(yīng)用程序中的對象提供了事務(wù)管理服務(wù)。通過使用SpringAOP,不用依賴EJB組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。SpringDAO:JDBCDAO抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來管理異常處理和不同數(shù)據(jù)庫供應(yīng)商拋出的錯誤消息。異常層次結(jié)構(gòu)簡化了錯誤處理,并且極大地降低了需要編寫的異常代碼數(shù)量(例如打開和關(guān)閉連接)。SpringDAO的面向JDBC的異常遵從通用的DAO異常層次結(jié)構(gòu)。SpringORM:Spring框架插入了若干個ORM框架,從而提供了ORM的對象關(guān)系工具,其中包括JDO、Hibernate和iBatisSQLMap。所有這些都遵從Spring的通用事務(wù)和DAO異常層次結(jié)構(gòu)。SpringWeb模塊:Web上下文模塊建立在應(yīng)用程序上下文模塊之上,為基于Web的應(yīng)用程序提供了上下文。所以,Spring框架支持與JakartaStruts的集成。Web模塊還簡化了處理多部分請求以及將請求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌pringMVC框架:MVC框架是一個全功能的構(gòu)建Web應(yīng)用程序的MVC實現(xiàn)。通過策略接口,MVC框架變成為高度可配置的,MVC容納了大量視圖技術(shù),其中包括JSP、Velocity、Tiles、iText和POI。大家提到Spring時,就會想到“容器”?!叭萜鳌?,這個概念困擾我好久。從學(xué)習(xí)Tomcat開始就一直對此感到困惑。感性的來講,容器就是可以用來裝東西的物品。那么在編程領(lǐng)域就是指用來裝對象(OO的思想,如果你連OO都不了解,建議你去學(xué)習(xí)OO先)的對象。然而這個對象比較特別,它不僅要容納其他對象,還要維護各個對象之間的關(guān)系。所謂“重量級”是相對于“輕量級”來講的,也可以說“輕量級”是相對于重量級來講的。在Spring出現(xiàn)之前,企業(yè)級開發(fā)一般都采用EJB,因為它提供的事務(wù)管理,聲明式事務(wù)支持,持久化,分布計算等等都“簡化”了企業(yè)級應(yīng)用的開發(fā)。我這里的“簡化”打了雙引號,因為這是相對的。重量級容器是一種入侵式的,也就是說你要用EJB提供的功能就必須在你的代碼中體現(xiàn)出來你使用的是EJB,比如繼承一個接口,聲明一個成員變量。這樣就把你的代碼綁定在EJB技術(shù)上了,而且EJB需要JBOSS這樣的容器支持,所以稱之為“重量級”。
相對而言“輕量級”就是非入侵式的,用Spring開發(fā)的系統(tǒng)中的類不需要依賴Spring中的類,不需要容器支持(當(dāng)然Spring本身是一個容器),而且Spring的大小和運行開支都很微量。一般來說,如果系統(tǒng)不需要分布計算或者聲明式事務(wù)支持那么Spring是一個更好的選擇。B.核心概念在我看來Spring的核心就是兩個概念,反向控制(IoC),面向切面編程(AOP)。還有一個相關(guān)的概念是POJO,我也會略帶介紹。
1、POJO
我所看到過的POJO全稱有兩個,PlainOrdinaryJavaObject,PlainOldJavaObject,兩個差不多,意思都是普通的Java類,所以也不用去管誰對誰錯。POJO可以看做是簡單的JavaBean(具有一系列Getter,Setter方法的類)。嚴(yán)格區(qū)分這里面的概念沒有太大意義,了解一下就行。
2、IoC
IoC的全稱是InversionofControl,中文翻譯反向控制或者逆向控制。這里的反向是相對EJB來講的。EJB使用JNDI來查找需要的對象,是主動的,而Spring是把依賴的對象注入給相應(yīng)的類(這里涉及到另外一個概念“依賴注入”,稍后解釋),是被動的,所以稱之為“反向”。3.切面編程(AOP)切面編程就類似于動態(tài)代理,比如你寫了很多方法,在使用這些方法前需要做很多相同的操作,那樣你必須在每個方法前加上很多很多相同的代碼,那樣你的代碼會看起來很冗長,而且寫起來很會很讓人絕望。切面編程(AOP)技術(shù)就能大大的減少你的工作量。AOP技術(shù)涉及到的概念有:aspect,就哪些你要重復(fù)在其他方法前或后或中間執(zhí)行的方法;Pointcut,就是聲明是哪些方法會被插入aspect;c.Advice,就是聲明在pointcut之前還是之后執(zhí)行;在定義好這三點,你就能實現(xiàn)AOP技術(shù)了。2.4Hibernate簡介報表實現(xiàn)和數(shù)據(jù)庫的關(guān)系很密切,對Hibernate的介紹會稍為的全面點。Hibernate是一個免費的開源Java包,它使得與關(guān)系數(shù)據(jù)庫打交道變得十分輕松,就像您的數(shù)據(jù)庫中包含每天使用的普通Java對象一樣,同時不必考慮如何把它們從神秘的數(shù)據(jù)庫表中取出(或放回到數(shù)據(jù)庫表中)。它解放了您,使您可以專注于應(yīng)用程序的對象和功能,而不必擔(dān)心如何保存它們或稍后如何找到它們。
本文討論以下內(nèi)容:
歷史與背景
大多數(shù)應(yīng)用程序都需要處理數(shù)據(jù)。Java應(yīng)用程序運行時,往往把數(shù)據(jù)封裝為相互連接的對象網(wǎng)絡(luò),但是當(dāng)程序結(jié)束時,這些對象就會消失在一團邏輯中,所以需要有一些保存它們的方法。有時候,甚至在編寫應(yīng)用程序之前,數(shù)據(jù)就已經(jīng)存在了,所以需要有讀入它們和將其表示為對象的方法。手動編寫代碼來執(zhí)行這些任務(wù)不僅單調(diào)乏味、易于出錯,而且會占用整個應(yīng)用程序的很大一部分開發(fā)工作量。
優(yōu)秀的面向?qū)ο箝_發(fā)人員厭倦了這種重復(fù)性的勞動,他們開始采用通常的“積極”偷懶做法,即,創(chuàng)建工具,使整個過程自動化。對于關(guān)系數(shù)據(jù)庫來說,這種努力的最大成果就是對象/關(guān)系映射(ORM)工具。
這類工具有很多,從昂貴的商業(yè)產(chǎn)品到內(nèi)置于J2EE中的EJB標(biāo)準(zhǔn)。然而,在很多情況下,這些工具具有自身的復(fù)雜性,使得開發(fā)人員必須學(xué)習(xí)使用它們的詳細規(guī)則,并修改組成應(yīng)用程序的類以滿足映射系統(tǒng)的需要。由于這些工具為應(yīng)付更加嚴(yán)格和復(fù)雜的企業(yè)需求而不斷發(fā)展,于是在比較簡單和常見的場景中,使用它們所面臨的復(fù)雜性反而蓋過了所能獲得的好處。這引起了一場革命,促進了輕量級解決方案的出現(xiàn),而Hibernate就是這樣的一個例子。
Hibernate的工作方式
Hibernate不會對您造成妨礙,也不會強迫您修改對象的行為方式。它們不需要實現(xiàn)任何不可思議的接口以便能夠持續(xù)存在。惟一需要做的就是創(chuàng)建一份XML“映射文檔”,告訴Hibernate您希望能夠保存在數(shù)據(jù)庫中的類,以及它們?nèi)绾侮P(guān)聯(lián)到該數(shù)據(jù)庫中的表和列,然后就可以要求它以對象的形式獲取數(shù)據(jù),或者把對象保存為數(shù)據(jù)。與其他解決方案相比,它幾乎已經(jīng)很完美了。
運行時,Hibernate讀取映射文檔,然后動態(tài)構(gòu)建Java類,以便管理數(shù)據(jù)庫與Java之間的轉(zhuǎn)換。在Hibernate中有一個簡單而直觀的API,用于對數(shù)據(jù)庫所表示的對象執(zhí)行查詢。要修改這些對象,(一般情況下)只需在程序中與它們進行交互,然后告訴Hibernate保存修改即可。類似地,創(chuàng)建新對象也很簡單;只需以常規(guī)方式創(chuàng)建它們,然后告訴Hibernate有關(guān)它們的信息,這樣就能在數(shù)據(jù)庫中保存它們。
HibernateAPI學(xué)習(xí)起來很簡單,而且它與程序流的交互相當(dāng)自然。在適當(dāng)?shù)奈恢谜{(diào)用它,就可以達成目的。它帶來了很多自動化和代碼節(jié)省方面的好處,所以花一點時間學(xué)習(xí)它是值得的。而且還可以獲得另一個好處,即代碼不用關(guān)心要使用的數(shù)據(jù)庫種類(否則的話甚至必須知道)。我所在的公司就曾有過在開發(fā)過程后期被迫更換數(shù)據(jù)庫廠商的經(jīng)歷。這會造成巨大的災(zāi)難,但是借助于Hibernate,只需要簡單地修改Hibernate配置文件即可。
這里的討論假定您已經(jīng)通過創(chuàng)建Hibernate映射文檔,建立了一個關(guān)系數(shù)據(jù)庫,并且擁有要映射的Java類。有一個Hibernate“工具集”可在編譯時使用,以支持不同的工作流。例如,如果您已經(jīng)擁有Java類和映射文檔,Hibernate可以為您創(chuàng)建(或更新)必需的數(shù)據(jù)庫表?;蛘撸瑑H僅從映射文檔開始,Hibernate也能夠生成數(shù)據(jù)類?;蛘?,它可以反向設(shè)計您的數(shù)據(jù)庫和類,從而擬定映射文檔。還有一些用于Eclipse的alpha插件,它們可以在IDE中提供智能的編輯支持以及對這些工具的圖形訪問。
如果您使用的是Hibernate2環(huán)境,這些工具鮮有提供,但是存在可用的第三方工具。
使用Hibernate的場合
既然Hibernate看起來如此靈活好用,為什么還要使用其他的工具呢?下面有一些場景,可以幫助您做出判斷(或許通過提供一些比較和上下文,可以有助于鑒別非常適用Hibernate的場合)。
如果應(yīng)用對于數(shù)據(jù)存儲的需要十分簡單——例如,您只想管理一組用戶優(yōu)先選擇——您根本不需要數(shù)據(jù)庫,更不用說一個優(yōu)秀的對象-關(guān)系映射系統(tǒng)了(即使它也如Hibernate這般易于使用)!從Java1.4開始,有一個標(biāo)準(zhǔn)的JavaPreferencesAPI可以很好地發(fā)揮這個作用。(在ONJava文章中可以找到有關(guān)PreferencesAPI的更多信息。)
對于熟悉使用關(guān)系數(shù)據(jù)庫和了解如何執(zhí)行完美的SQL查詢與企業(yè)數(shù)據(jù)庫交互的人來說,Hibernate似乎有些礙手礙腳,這就像帶有動力和自動排擋的快艇車會使注重性能的賽車駕駛員不耐煩一樣。如果您屬于這種人,如果您所在的項目團隊擁有一個強大的DBA,或者有一些存儲過程要處理,您可能想研究一下iBATIS。Hibernate的創(chuàng)建者本身就把iBATIS當(dāng)作是另一種有趣的選擇。我對它很有興趣,因為我們曾為一個電子商務(wù)站點開發(fā)了一個類似的系統(tǒng)(其功能更為強大),而且從那時到現(xiàn)在,我們已經(jīng)在其他環(huán)境中使用過它,盡管在發(fā)現(xiàn)Hibernate之后,在新項目中我們通常更喜歡使用Hibernate。您可以認為,以SQL為中心的解決方案(比如iBATIS)是“反向的”對象/關(guān)系映射工具,而Hibernate是一個更為傳統(tǒng)的ORM。
當(dāng)然,還有其他的外部原因會導(dǎo)致采用另外的方法。比如,在一個企業(yè)環(huán)境中,必須使用成熟的EJB架構(gòu)(或者其他的一些非普通對象映射系統(tǒng))。可以為提供自己的數(shù)據(jù)存儲工具的平臺量身定做代碼,比如MacOSX'sCoreData。使用的可能是像XMLDTD這樣的存儲規(guī)范,而它根本不涉及關(guān)系數(shù)據(jù)庫。
但是,如果您使用的是富對象模型,而且想要靈活、輕松且高效地保存它(無論您是否正要開始或已經(jīng)決定使用關(guān)系數(shù)據(jù)庫,只要這是一個選擇——而且存在可用的優(yōu)秀免費數(shù)據(jù)庫,比如MySQL,或可嵌入Java的HSQLDB,它就應(yīng)該始終是一個選擇),那么Hibernate很可能就是您理想的選擇。您可能會驚訝于節(jié)省的時間之多,以及您將會多么地喜歡使用它。
經(jīng)過一個月的實踐,Hibernate技術(shù)需要為每張表寫一個對應(yīng)的類,類中的成員變量是表中每個字段對應(yīng)的類型和名字。然后,每個對應(yīng)的類,都需要寫出相應(yīng)的DAO,就是增刪改查的方法。這個DAO方法和JDBC中的DAO方法其實差不對,hibernate的方便之處是它能直接保存一個對象進入數(shù)據(jù)庫,那個對象就會成為數(shù)據(jù)庫中的一條記錄,而不用像JDBC那樣一個字段一個字段的賦值,然后保存。Hibernate的所有操作都是針對對象的,而不是針對表中的某一個字段的,操作簡介方便的,深受歡迎。在Hibernate出現(xiàn)的對象有三種狀態(tài):1.瞬時,就是一個對象剛剛new出來,還沒有關(guān)聯(lián)session;2.持久,就是這個對象與session關(guān)聯(lián),與數(shù)據(jù)庫的數(shù)據(jù)有對應(yīng),session沒有關(guān)閉,但是事務(wù)沒有被提交。一旦事務(wù)提交后,它就會對數(shù)據(jù)庫產(chǎn)生影響;3.托管,session已經(jīng)關(guān)閉,數(shù)據(jù)庫中沒數(shù)據(jù)與之對應(yīng),對它進行改動是不會影響到數(shù)據(jù)庫的。Hibernate的核心接口一共有5個,分別為:Session、SessionFactory、Transaction、Query和Configuration。這5個核心接口在任何開發(fā)中都會用到。通過這些接口,不僅可以對持久化對象進行存取,還能夠進行事務(wù)控制。下面對這五個核心接口分別加以介紹。
·Session接口:Session接口負責(zé)執(zhí)行被持久化對象的CRUD操作(CRUD的任務(wù)是完成與數(shù)據(jù)庫的交流,包含了很多常見的SQL語句。)。但需要注意的是Session對象是非線程安全的。同時,Hibernate的session不同于JSP應(yīng)用中的HttpSession。這里當(dāng)使用session這個術(shù)語時,其實指的是Hibernate中的session,而以后會將HttpSesion對象稱為用戶session。
·SessionFactory接口:SessionFactory接口負責(zé)初始化Hibernate。它充當(dāng)數(shù)據(jù)存儲源的代理,并負責(zé)創(chuàng)建Session對象。這里用到了工廠模式。需要注意的是SessionFactory并不是輕量級的,因為一般情況下,一個項目通常只需要一個SessionFactory就夠,當(dāng)需要操作多個數(shù)據(jù)庫時,可以為每個數(shù)據(jù)庫指定一個SessionFactory。
·Configuration接口:Configuration接口負責(zé)配置并啟動Hibernate,創(chuàng)建SessionFactory對象。在Hibernate的啟動的過程中,Configuration類的實例首先定位映射文檔位置、讀取配置,然后創(chuàng)建SessionFactory對象。
·Transaction接口:Transaction接口負責(zé)事務(wù)相關(guān)的操作。它是可選的,開發(fā)人員也可以設(shè)計編寫自己的底層事務(wù)處理代碼。
·Query和Criteria接口:Query和Criteria接口負責(zé)執(zhí)行各種數(shù)據(jù)庫查詢。它可以使用HQL語言或SQL語句兩種表達方式。在熟悉了解三種狀態(tài)后,你所做的事情就是明確你的業(yè)務(wù)。開始編寫接口,為每個接口寫實現(xiàn)類?;揪幋a流程是:首先,初始化Hibernate,并創(chuàng)建SessionFactory,從中取得Session,開始事務(wù),執(zhí)行數(shù)據(jù)庫操作,關(guān)閉事務(wù),關(guān)閉Session。2.5數(shù)據(jù)庫設(shè)計介紹我們使用的是MSql數(shù)據(jù)庫,它是小型數(shù)據(jù)庫,適合小型工程。任何數(shù)據(jù)庫的構(gòu)建都是需要根據(jù)你的業(yè)務(wù)要求來實現(xiàn)的,比如登陸,看起來就是一個用戶和密碼而已,但是任何一個項目并不是這樣簡單的。業(yè)務(wù)之間的聯(lián)系時非常密切的。不同的用戶,權(quán)限不一樣,進入后的操作是不一樣的。在設(shè)計數(shù)據(jù)庫的時候,你必須經(jīng)過細致的考慮,才能決定庫中到底需要什么表,每張表需要哪些字段,以及表和表之間的關(guān)系來合理的完成你的業(yè)務(wù)流程。下面是我們工程中涉及到的數(shù)據(jù)表:名稱描述EMPLOYEE_INFO員工信息表DEPARTMENT_INFO部門信息表MATERIAL_INFO耗材信息表HOUSE_INFO房產(chǎn)信息表EQUIPMENT_INFO通用及專用設(shè)備信息表VEHICLE_INFO車輛信息表PURCHASING_INFO網(wǎng)上購物信息表MAINTAIN_INFO維護信息表CODE_INFO分類信息表員工信息表:它是用來描述企業(yè)中員工信息的,其中比較重要的字段是名字、密碼、職位、所在部門,它們和業(yè)務(wù)流程關(guān)系甚密;部門信息表:記錄企業(yè)中各個部門的名稱;耗材表:記錄企業(yè)中日常所需的各種耗材使用、儲備情況;房產(chǎn)表:記錄企業(yè)員工的住宿情況和企業(yè)的房產(chǎn)使用情況;通用及專用設(shè)備信息表:記錄企業(yè)中設(shè)備的借用狀況;車輛信息表:記錄企業(yè)中車輛的借用狀況;網(wǎng)上購物信息表:用來記錄員工購物申請;維護信息表:記錄企業(yè)中所有車輛、設(shè)備的維修、遺失、報廢狀況;分類信息表:記錄企業(yè)中每樣物品的所屬類型;對與表之間的關(guān)系,它們主要通過user這個字段聯(lián)系起來,user有部門情況、物品的使用也有使用者等等,這樣通過user所有的表基本都聯(lián)系在一起。數(shù)據(jù)庫中的表不是越多越好,字段不是越多越好,一般表的設(shè)計要做到第三范式就行。設(shè)計者在設(shè)計出數(shù)據(jù)庫后,需要插入各種數(shù)據(jù),插入記錄時,必須要先插入主表中的數(shù)據(jù),再插入其他表中的記錄。2.6框架整合與配置這個項目使用了SSH框架,Struts,Spring,Hibernate三種技術(shù)不是簡單的加在一起,而且在三種框架融合后,你的使用和分別單獨使用時完全不一樣的。Spring和Hibernate結(jié)合后,你只要繼承HibernateDaoSupport這個類,你在使用時數(shù)據(jù)庫時,就無需手動去獲取Hibernate中的Session,不用手寫開啟事務(wù),關(guān)閉事務(wù),它會提供一個HibernateTemplate,直接使用就能對數(shù)據(jù)庫操作,而且他會自動的關(guān)閉Session和事務(wù)。當(dāng)然,你在使用這些簡單的編寫程序的背后,你需要配置一大堆的配置文件;Spring中,你需要為SessionFactory配置bean,為事務(wù)配置等;每個你將會在SSH框架中使用的類和方法,必須在Spring中配置;對于struts,你所有的action都必須寫好配置,而Hibernate方面,你所要做的事情就是配置好數(shù)據(jù)庫連接,添加任何類,基本與Hibernate配置無關(guān)。第3章報表設(shè)計和實現(xiàn)3.1報表設(shè)計3.1.1業(yè)務(wù)流程幾乎在整個業(yè)務(wù)的每個流程中都涉及到了報,我會通過介紹其中最復(fù)雜的員工購物流程來闡述我的設(shè)計理念和實現(xiàn)理念。其流程圖如下:可能出現(xiàn)的流程有:提交采購申請—選擇商品—部門經(jīng)理批準(zhǔn)但超過預(yù)算—總經(jīng)理審核通過—通知部門經(jīng)理—通知后勤部門采購商品—申請人獲得相應(yīng)商品。提交采購申請—選擇商品—部門經(jīng)理不批準(zhǔn)—得到采購失敗通知。提交采購申請—選擇商品—部門經(jīng)理批準(zhǔn)—通知后勤部門采購商品—申請人獲得相應(yīng)商品。3.1.2報表與人物角色在這個企業(yè)資產(chǎn)管理系統(tǒng)中,報表的設(shè)計都是依賴于客戶需求的。在這個系統(tǒng)中,我們了解到企業(yè)中有著不同的角色,有部門經(jīng)理、總經(jīng)理、員工。當(dāng)然,顯示在每個角色面前的報表時有所不同的。那么報表的設(shè)計就必須基于不同角色來進行,報表的實現(xiàn)就要基于不同的功能來進行。員工在系統(tǒng)中主要是提交購物申請、查看自己的申請是否被批準(zhǔn),報表在提交時,會有兩個走向:報到總經(jīng)理和報到部門經(jīng)理處;部門經(jīng)理會查詢員工提交的申請,審核后批準(zhǔn)或不批準(zhǔn);總經(jīng)理一樣會查詢員工提交的申請,審核后批準(zhǔn)或不批準(zhǔn)。人物角色的截然不同,他們所做的操作也截然不同,所以報表在呈現(xiàn)時所提供的操作也是不一樣的。3.1.3報表的設(shè)計報表不僅僅是把數(shù)據(jù)庫中的記錄按你的要求查詢出來,顯示在頁面上這樣的簡單,你需要對記錄進行修改和解釋,還要考慮你需要將報表呈現(xiàn)給哪些群體看,不同文化,不同的教育程度都應(yīng)該在考慮范圍之內(nèi)。報表的呈現(xiàn)必須要做到準(zhǔn)確、易懂。所謂準(zhǔn)確就是,你不能呈現(xiàn)用戶不需要的東西。比如,你在購物時,你只需要關(guān)心你買的東西的名稱、數(shù)量、價格、類型。但是在數(shù)據(jù)庫中,對于一個物品的記錄遠遠不止這些屬性的描述,還會有ID、購入時間、物品狀態(tài)等等。那么,他在選擇商品時,肯定不會關(guān)心我這個商品的ID在數(shù)據(jù)庫中是多少,也不會關(guān)心這個商品的進貨日期是多少。在我們編寫的系統(tǒng)中,是從一張叫equipmentinfo的表中提取出來的,它的數(shù)據(jù)庫表的設(shè)計如下:EQUIPMENT_INFO通用及專用設(shè)備信息表列名數(shù)據(jù)類型主鍵約束默認值對應(yīng)字典數(shù)據(jù)項描述ITEM_IDVARCHAR(10)是必填設(shè)備IDNAMEVARCHAR(20)必填設(shè)備名稱TAG_CODEINT必填分類代碼TYPEVARCHAR(20)必填設(shè)備類型PRICEDOUBLE必填設(shè)備價格元USERVARCHAR(10)必填使用人AMOUNTDOUBLE必填數(shù)量RECEIVEDATEDATE必填領(lǐng)用日期USEDTIMEVARCHAR(10)已用日期STATUSINT必填0:未使用1:預(yù)訂2:使用中3:維護中狀態(tài)由上圖可以看出,這個設(shè)備的描述字段有10個,但是我呈現(xiàn)給用戶的表單如下圖:如圖所示:對于員工在購買時,我顯示出的報表只有NAME,TYPE,AMOUNT,PRICE四個。準(zhǔn)確的含義不僅僅是不顯示出多余的東西,而且對于不同的對象,你顯示出的字段也不一樣。在系統(tǒng)中,有塊功能是提供給員工進行設(shè)備申請的,此時你顯示出來的就和進行購買時的東西是不一樣的,你必須顯示出STATUS這個字段。對于易懂這個概念的理解,大家應(yīng)該從上面的兩張圖可以了解到一點,數(shù)據(jù)庫中的字段都是英文,顯示出來的是中文,而且數(shù)據(jù)庫中對應(yīng)字段的值多是用符號來代表不同的含義??纯瓷厦婺菑埍?,在STATUS的字段中,用數(shù)字代表了一系列的狀態(tài),但是顯示的時候肯定不能直接把數(shù)字填充到報表里。報表,不是直接把記錄從數(shù)據(jù)庫中提取出來顯示,你需要進行精心的思考和設(shè)計。3.2報表的實現(xiàn)3.2.1報表實現(xiàn)原理你到底需要哪些數(shù)據(jù)?哪些數(shù)據(jù)是需要呈現(xiàn)給人而不是那些人?這些問題,我在上面的設(shè)計已經(jīng)說的很清楚了。到底如何從數(shù)據(jù)庫中提取出特定的記錄來實現(xiàn)這個業(yè)務(wù),就需要為每張表設(shè)定特定的字段,用來使用在業(yè)務(wù)邏輯上。我們先來看看我們數(shù)據(jù)庫中的兩張表:PURCHASING_INFO網(wǎng)上購物信息表列名數(shù)據(jù)類型主鍵約束默認值對應(yīng)字典數(shù)據(jù)項描述ITEM_IDVARCHAR(10)是必填數(shù)據(jù)庫ID產(chǎn)品加入數(shù)據(jù)庫自動加上的IDITEM_NAMEVARCHAR(20)必填產(chǎn)品名稱TAG_CODEINT必填分類代碼TYPEVARCHAR(20)必填產(chǎn)品類型PRICEINT必填產(chǎn)品價格AMOUNTVARCHAR(10)必填產(chǎn)品數(shù)量REMARKVARCHAR(20)備注EMPLOYEE_INFO員工信息表列名數(shù)據(jù)類型主鍵約束默認值對應(yīng)字典數(shù)據(jù)項描述EMP_IDVARCHAR(10)是必填員工IDNAMEVARCHAR(10)必填員工姓名SEXCHAR必填M:男F:女性別DEPARTMENTVARCHAR(5)必填部門IDPOSTINT必填0:系統(tǒng)管理員1:總經(jīng)理2:后勤部經(jīng)理3:財務(wù)部經(jīng)理4:技術(shù)部經(jīng)理5:后勤部員工6:財務(wù)部員工7:員工職位PHONEINT必填電話ADDRESSVARCHAR(60)必填地址REMARKVARCHAR(20)備注員工信息表中的“POST”和網(wǎng)上購物信息表中的“REMARK”這兩個字段,和我將要闡述的實現(xiàn)原理是密切相關(guān)的。以員工網(wǎng)上購物的流程為例,員工在提交購物申請表時,他會在purchasinginfo這張表中插入一條記錄,根據(jù)預(yù)算是否超過,更改字段REMARK。如果超出預(yù)算設(shè)置REMARK為b,沒有就設(shè)置REMARK為a。部門經(jīng)理在進行審批時,他在查閱時,會查閱purchasinginfo表中所有REMARK為a的記錄,如果通過,就將REMARK設(shè)置為c,否則設(shè)置為n;總經(jīng)理在進行審批時,他在查閱時,會查閱purchasinginfo表中所有REMARK為b的記錄,如果通過,就將REMARK設(shè)置為c,否則設(shè)置為n;那樣,員工在查閱是否通過的時候,查看的記錄是purchasinginfo表中REMARK為n,且user是自己的記錄;當(dāng)REMARK改為c后,財政部門會查詢到這類記錄,然后將購物所用費用下發(fā)到后勤部門,同時將REMARK改為d;后勤部門經(jīng)理每天也會查詢,并派出相關(guān)人員進行采購,當(dāng)所購買的物品到庫后,會將REMARK的記錄改成e,并且在另一張表中存入相關(guān)的記錄。下面,我將結(jié)合流程來具體闡述我是如何實現(xiàn)的。3.2.2員工購物報表實現(xiàn)首先,員工購物的頁面由兩部分組成,一部分是按物品名稱查詢的查詢欄,下面就是顯示的一條一條的記錄,并每條記錄附帶一個按鈕,點擊就能跳轉(zhuǎn)填寫表格的頁面。這個頁面由2部分構(gòu)成,上面是一個表格,你需要填寫的就是數(shù)量,其他的幾欄會自動生成,然后是一個提交按鈕,提交后自動回到先前查詢的頁面。我這個模糊查詢時基于對象的模糊查詢。比如,我擁有一個對象,然后去數(shù)據(jù)庫中查找和它相似的對象。由于,我們只是按名稱來查詢,那么,我首先用request.getParameter(“name”);來取出提交給服務(wù)器的信息,并且把它存到一個session的屬性中去,我所用的是屬性名稱是searchInfo,因為等會保存后,我還要回到這個頁面,它的查詢結(jié)果還是相同的。取得用戶輸入的名稱后,我new一個對象出來,把用戶輸入的名稱賦給對象的itemName,然后查詢類似的對象,并得到一個List結(jié)果集,通過List來顯示到下面的表格中。對于每條記錄的操作,就是獲取當(dāng)前對象的各個字段值,填寫到跳轉(zhuǎn)到得頁面的對應(yīng)的欄中。其實現(xiàn)時這樣的,首先,我會寫個javascript,里面有兩個function,每個function調(diào)用一個action,。這兩個function中有一個對應(yīng)的就是這個操作按鈕點擊后觸發(fā)的function。不直接用action的原因是,我需要獲得當(dāng)前記錄的id。用function的話,我就能設(shè)置一個參數(shù)來傳遞頁面的當(dāng)前記錄的id。代碼如下:functionpass(id){ document.forms[0].action="<%=path%>/approveTureCCC.do?id="+id; document.forms[0].submit();}而在觸發(fā)按鈕處調(diào)用時獲取id<buttonclass="common_button"onclick="pass('${all.number}');">通過</button>我獲得到id后,通過id在表中得到對應(yīng)的記錄,同時,我把它存放到session中。當(dāng)我跳轉(zhuǎn)到填寫表格的頁面時,我會從session中取出剛才設(shè)置的對象,然后取得相應(yīng)的字段進行賦值。顯然,我是從一張表取出一條記錄,存放到另一張表中,其中肯定有很多缺少的東西,你在提交時,就是根據(jù)表格的內(nèi)容創(chuàng)造出一條字段對應(yīng)好的記錄,插入到表中。3.2.3經(jīng)理報表實現(xiàn)經(jīng)理分為總經(jīng)理和部門經(jīng)理,他們都會對表單進行報表審核,給出批準(zhǔn)還是不批準(zhǔn)的決定。兩個經(jīng)理邏輯流程,對數(shù)據(jù)庫的操作內(nèi)容都是一樣的,只是操作的記錄對象不一樣??偨?jīng)理是面對REMARK為b的記錄,部門經(jīng)理面對的是REMARK為a的記錄。審批報表涉及到的頁面有三個,每個頁面的布局都是一樣的。上面是兩個搜索欄,一個是按部門查詢,一個是按時間段查詢。因為企業(yè)的部門不多,就沒有設(shè)計模糊查詢,下面部分就是顯示記錄的表格,每條記錄會有兩個操作按鈕,通過還是不通過。具體實現(xiàn)是:首先,判斷登陸進來的經(jīng)理室總經(jīng)理還是部門經(jīng)理。在登錄模塊,就已經(jīng)將登錄者的名字存放到session中了,此時,你根據(jù)人物的名字將對應(yīng)的職務(wù)取出,進行判斷從來跳轉(zhuǎn)到不同的頁面。我們以部門經(jīng)理為例來仔細講解一下實現(xiàn)過程,部門經(jīng)理登錄后,進入到報表審批的頁面。此時顯示的是所有待審批的記錄,為了方便經(jīng)理查看,我提供了按時間和按部門查詢。按部門查詢的過程是這樣的:當(dāng)用戶在部門欄里輸入了部門的名稱后,根據(jù)所有REMARK為a的記錄,也就是一個List,將list每個對象取出。在每條記錄中會有一個user字段,通過user獲得他所在的部門名字,如果他所在的部門名字和用戶輸入的名字是一樣的,就將這條記錄放到即將要顯示的結(jié)果集中,也是個List,然后顯示到頁面上。當(dāng)你點擊按部門查詢后,它就會跳轉(zhuǎn)到按部門查詢的頁面。按時間查詢,會要求你輸入兩個時間段,一個是起始時間,一個是結(jié)束時間。查詢原理是這樣的:遍歷所有REMARK為a的記錄,將每條記錄的的時間字段值取出,看它是否在查詢的時間范圍里面,如果在這個時間范圍內(nèi),就將它加入到結(jié)果list中,然后顯示出來。你點擊按時間查詢后,它會跳轉(zhuǎn)到按時間查詢的頁面中。當(dāng)然,DATE這個類型的數(shù)據(jù)是不能直接比較大小的。而且輸入的也是String類型的值,那么你首先就需要將String類型的字符串按一定的格式轉(zhuǎn)化成DATE類型,當(dāng)然比較的三個時間必須用相同的格式,然后將三個時間轉(zhuǎn)化成long類型的數(shù)據(jù),然后進行比較,就能篩選出你所需要的記錄。3.2.4報表頁面顯示實現(xiàn)下面這段代碼是用于將結(jié)果顯示在頁面上,這個比較簡單;<logic:iterateid="all"name="all"scope="request"><trbordercolor="#990099"> <tdclass="list_data_num"><bean:writename="all"property="itemName"/></td> <tdclass="list_data_name"><bean:writename="all"property="price"/></td> <tdclass="list_data_number"><bean:writename="all"property="amount"/></td> <tdclass="list_data_price"><bean:writename="all"property="date"/></td><tdclass="list_data_depart"><bean:writename="all"property="type"/></td><buttonclass="common_button"onclick="pass('${all.number}');">通過</button><buttonclass="common_button"onclick="unpass('${all.number}');">不通過</button></td></tr></logic:iterate><logic:iterateid="all"name="all"scope="request">這個是控制整個顯示的,id表示logic這個標(biāo)簽的標(biāo)示,name是顯示的結(jié)果集,將結(jié)果集傳給它,它就會一條一條的顯示出來。<tdclass="list_data_depart">這個標(biāo)簽是CSS標(biāo)簽控制顯示效果的;<bean:writename="all"property="type"/>這個是控制顯示內(nèi)容的,就是記錄中的哪個字段在這行顯示。這個是解決了如何顯示,我們采用了分頁顯示的方式顯示報表記錄。首先,你獲得你查詢的結(jié)果會有多少條記錄,設(shè)定好一頁顯示幾條記錄,然后順序的分別顯示相應(yīng)的頁面上。結(jié)論報表能做出很多很多種格式和樣式出來,這點是毋庸置疑的,但是如何去選擇正確的,才是報表的關(guān)鍵中的關(guān)鍵;報表的功能也是非常多的,你可以做成表格、柱狀圖、餅狀圖等等。但是,不是說你將每個功能全加上去就是一個完美的報表。如何去選擇,就必須根據(jù)你的客戶需求來做出判斷。如果你的客戶要做出財政報告并要便于對比,那么表格的形式明顯是不太方便的,柱狀是比較理想的,因為它一目了然,容易得出結(jié)論;但是不是說你一個系統(tǒng)中只出現(xiàn)一種形式的報表,應(yīng)該是多種形式相結(jié)合的,柱狀圖適合多階段的對比,而餅狀圖就適合比較同一階段不同元素所占的比例。柱狀和餅狀圖的變化主要在于布局、顏色、形狀的選取。但是表格一類的,則是注重在每個字段的選擇。報表的的設(shè)計和實現(xiàn)是和數(shù)據(jù)庫密切相關(guān)的。對數(shù)據(jù)庫深刻的了解才是你做出報表的關(guān)鍵所在,流程的復(fù)雜性的,功能的多樣性都會指導(dǎo)報表的設(shè)計和實現(xiàn)。與此同時,您的客戶也會直接影響你報表的設(shè)計。報表呈現(xiàn)給相關(guān)專業(yè)人士的話,你可以直接使用相關(guān)領(lǐng)域的專業(yè)術(shù)語,但是對于業(yè)外人士,你就必須注意報表上的字段是否過于專業(yè),而讓用戶覺得自己格格不入。影響報表實現(xiàn)的因素,個人認為主要是性能方面的考慮,數(shù)據(jù)庫設(shè)計的好壞會直接影響到你的報表性能。顯然,報表數(shù)據(jù)來自數(shù)據(jù)庫,檢索的效率就會直接影響到報表的效率,比如,同一張表,你根據(jù)兩個字段來查詢結(jié)果,肯定比只用一個字段查詢更耗時;再者,你編寫程序所用的技術(shù)和框架依然會影響到報表的性能,比如,報表環(huán)節(jié)中最耗時的一件事情就是連接和關(guān)閉數(shù)據(jù),那么連接池的使用和不適用就會直接影響這個數(shù)據(jù)獲得耗時??傊瑘蟊碓O(shè)計和實現(xiàn),必須基于業(yè)務(wù)、數(shù)據(jù)庫、用戶來做,對這三方面有深入調(diào)查和研究,報表的形式和實現(xiàn)也就基本形成了。你涉足越深,所得到的結(jié)果越讓人滿意。第5章致謝首先要感謝我的導(dǎo)師王樹良教授對我的諄諄教導(dǎo)。他的嚴(yán)格要求和在研究方法上對我的指導(dǎo),使我能夠完成這篇論文。王樹良教授嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度、淵博的知識、獨到的眼光、學(xué)者的胸襟和卓越的領(lǐng)導(dǎo)才能是我以后工作、學(xué)習(xí)、生活的楷模。同時還要感謝劉丁峰老師,他在本文的完成過程中,給予我很多的支持和幫助。值此論文完成之際,我謹(jǐn)向我的兩位老師表示崇高的敬意和深深的謝意!最后,謝謝我的父母和我的家人。我們每個人取得的任何成就,都離不開家人父母的辛勤、汗水和默默的支持,在這里我向他們表示我深深的敬愛。參考文獻(美)PaulJ.Perrone,etal.著,張志偉等譯.
J2EE構(gòu)建企業(yè)系統(tǒng)
[M].清華大學(xué)版,
2001.
[美]BrettMcLaughlin著,孫兆林等譯.
JAVA與XML
[M].中國電力出版社,
2001.(美)MarkWutka著,程顯華等譯.
JSP和Servlet程序設(shè)計使用專輯
[M].機械工業(yè)出版社,
2002.田勇,孫新等編著.
最新JBuilder開發(fā)人員指南
[M].機械工業(yè)出版社,
2001.
方美琪主編.
電子商務(wù)概論
[M].清華大學(xué)出版社,
2002.
(美)BruceEckel著,侯捷譯.
Java編程思想
[M].機械工業(yè)出版社,
2002.
基于C8051F單片機直流電動機反饋控制系統(tǒng)的設(shè)計與研究基于單片機的嵌入式Web服務(wù)器的研究MOTOROLA單片機MC68HC(8)05PV8/A內(nèi)嵌EEPROM的工藝和制程方法及對良率的影響研究基于模糊控制的電阻釬焊單片機溫度控制系統(tǒng)的研制基于MCS-51系列單片機的通用控制模塊的研究基于單片機實現(xiàn)的供暖系統(tǒng)最佳啟停自校正(STR)調(diào)節(jié)器單片機控制的二級倒立擺系統(tǒng)的研究基于增強型51系列單片機的TCP/IP協(xié)議棧的實現(xiàn)基于單片機的蓄電池自動監(jiān)測系統(tǒng)基于32位嵌入式單片機系統(tǒng)的圖像采集與處理技術(shù)的研究基于單片機的作物營養(yǎng)診斷專家系統(tǒng)的研究基于單片機的交流伺服電機運動控制系統(tǒng)研究與開發(fā)基于單片機的泵管內(nèi)壁硬度測試儀的研制基于單片機的自動找平控制系統(tǒng)研究基于C8051F040單片機的嵌入式系統(tǒng)開發(fā)基于單片機的液壓動力系統(tǒng)狀態(tài)監(jiān)測儀開發(fā)模糊Smith智能控制方法的研究及其單片機實現(xiàn)一種基于單片機的軸快流CO〈,2〉激光器的手持控制面板的研制基于雙單片機沖床數(shù)控系統(tǒng)的研究基于CYGNAL單片機的在線間歇式濁度儀的研制基于單片機的噴油泵試驗臺控制器的研制基于單片機的軟起動器的研究和設(shè)計基于單片機控制的高速快走絲電火花線切割機床短循環(huán)走絲方式研究基于單片機的機電產(chǎn)品控制系統(tǒng)開發(fā)基于PIC單片機的智能手機充電器基于單片機的實時內(nèi)核設(shè)計及其應(yīng)用研究基于單片機的遠程抄表系統(tǒng)的設(shè)計與研究基于單片機的煙氣二氧化硫濃度檢測儀的研制基于微型光譜儀的單片機系統(tǒng)單片機系統(tǒng)軟件構(gòu)件開發(fā)的技術(shù)研究基于單片機的液體點滴速度自動檢測儀的研制基于單片機系統(tǒng)的多功能溫度測量儀的研制基于PIC單片機的電能采集終端的設(shè)計和應(yīng)用基于單片機的光纖光柵解調(diào)儀的研制氣壓式線性摩擦焊機單片機控制系統(tǒng)的研制基于單片機的數(shù)字磁通門傳感器基于單片機的旋轉(zhuǎn)變壓器-數(shù)字轉(zhuǎn)換器的研究基于單片機的光纖Bragg光柵解調(diào)系統(tǒng)的研究單片機控制的便攜式多功能乳腺治療儀的研制基于C8051F020單片機的多生理信號檢測儀基于單片機的電機運動控制系統(tǒng)設(shè)計Pico專用單片機核的可測性設(shè)計研究基于MCS-51單片機的熱量計基于雙單片機的智能遙測微型氣象站MCS-51單片機構(gòu)建機器人的實踐研究基于單片機的輪軌力檢測基于單片機的GPS定位儀的研究與實現(xiàn)基于單片機的電液伺服控制系統(tǒng)用于單片機系統(tǒng)的MMC卡文件系統(tǒng)研制基于單片機的時控和計數(shù)系統(tǒng)性能優(yōu)化的研究基于單片機和CPLD的粗光柵位移測量系統(tǒng)研究單片機控制的后備式方波UPS提升高職學(xué)生單片機應(yīng)用能力的探究基于單片機控制的自動低頻減載裝置研究基于單片機控制的水下焊接電源的研究基于單片機的多通道數(shù)據(jù)采集系統(tǒng)基于uPSD3234單片機的氚表面污染測量儀的研制基于單片機的紅外測油儀的研究96系列單片機仿真器研究與設(shè)計基于單片機的單晶金剛石刀具刃磨設(shè)備的數(shù)控改造基于單片機的溫度智能控制系統(tǒng)的設(shè)計與實現(xiàn)基于MSP430單片機的電梯門機控制器的研制基于單片機的氣體測漏儀的研究基于三菱M16C/6N系列單片機的CAN/USB協(xié)議轉(zhuǎn)換器基于單片機和DSP的變壓器油色譜在線監(jiān)測技術(shù)研究基于單片機的膛壁溫度報警系統(tǒng)設(shè)計基于AVR單片機的低壓無功補償控制器的設(shè)計基于單片機船舶電力推進電機監(jiān)測系統(tǒng)基于單片機網(wǎng)絡(luò)的振動信號的采集系統(tǒng)基于單片機的大容量數(shù)據(jù)存儲技術(shù)的應(yīng)用研究基于單片機的疊圖機研究與教學(xué)方法實踐基于單片機嵌入式Web服務(wù)器技術(shù)的研究及實現(xiàn)基于AT89S52單片機的通用數(shù)據(jù)采集系統(tǒng)\t"
溫馨提示
- 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《證券銷戶寶典》課件
- 單位管理制度集粹選集【職工管理篇】十篇
- 2024服務(wù)合同范文(32篇)
- 3ds Max動畫制作實戰(zhàn)訓(xùn)練(第3版)教學(xué)教案
- 2024年醫(yī)院個人工作總結(jié)范文
- 探索“兩引四體驗”戲曲教學(xué)模式傳承中華文化基因
- 部編版道德與法治六年級上冊第三單元第7課《權(quán)力受到制約和監(jiān)督》教學(xué)設(shè)計
- 物聯(lián)網(wǎng)認證技術(shù)發(fā)展趨勢-洞察分析
- 虛擬現(xiàn)實時尚產(chǎn)品市場調(diào)研-洞察分析
- 體育課程資源整合創(chuàng)新-洞察分析
- 肌萎縮側(cè)索硬化癥查房課件
- 數(shù)學(xué)與語言學(xué)、語言藝術(shù)的交叉研究
- 醫(yī)院“無陪護”病房試點工作方案
- 清華大學(xué)大學(xué)物理-光的偏振
- 心理健康教育-網(wǎng)絡(luò)與青少年
- 高中英語人教版(2019) 選擇性必修一 Unit 3 課文語法填空(含答案)
- 2021-2022學(xué)年陜西省寶雞市陳倉區(qū)北師大版六年級上冊期末考試數(shù)學(xué)試卷(含答案解析)
- 水工-建筑物課件
- 應(yīng)用PDCA提高入院宣教的知曉率
- 線性系統(tǒng)理論鄭大鐘307張課件
- 2019-2020學(xué)年第一學(xué)期廣東省廣州市天河區(qū)3年級數(shù)學(xué)期末考試卷
評論
0/150
提交評論