畢業(yè)設(shè)計(論文)-企業(yè)員工信息管理系統(tǒng)設(shè)計_第1頁
畢業(yè)設(shè)計(論文)-企業(yè)員工信息管理系統(tǒng)設(shè)計_第2頁
畢業(yè)設(shè)計(論文)-企業(yè)員工信息管理系統(tǒng)設(shè)計_第3頁
畢業(yè)設(shè)計(論文)-企業(yè)員工信息管理系統(tǒng)設(shè)計_第4頁
畢業(yè)設(shè)計(論文)-企業(yè)員工信息管理系統(tǒng)設(shè)計_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

圖2.2MVC設(shè)計模式的結(jié)構(gòu)作為基于MVC設(shè)計模式的Web應(yīng)用的一種典型體現(xiàn),Struts架構(gòu)實際上是建立在Model2基礎(chǔ)上的,對Model,View和Controller都提供了現(xiàn)成的實現(xiàn)組建。Struts中的Controller控制器部分是通過專門的Servlet來實現(xiàn)的,該Servlet是一個StrutsAPI中提供的ActionServlet類型的實例,ActionServlet類繼承了javax.servlet.http.HttpServlet類,因此該類的實例可以和普通的Servlet一樣工作,其作用是接收客戶端瀏覽器的請求,然后選擇執(zhí)行相應(yīng)的業(yè)務(wù)邏輯,再把響應(yīng)結(jié)果送回到客戶端。Action對象是開發(fā)者定義的類(該類必須是StrutsAPI中提供的Action類的子類)的實例。在繼承該類的過程中開發(fā)者可以加入具體業(yè)務(wù)邏輯或調(diào)用業(yè)務(wù)邏輯模塊。Action對象在進(jìn)行了業(yè)務(wù)邏輯或調(diào)用業(yè)務(wù)邏輯模塊。Action對象在進(jìn)行了業(yè)務(wù)邏輯的處理以后會將應(yīng)用程序流程轉(zhuǎn)到合適的View組件,最終將響應(yīng)送回瀏覽器客戶端。Struts中提倡Action對象只用來決定”做什么”,相當(dāng)于一個低層面的控制器,因此也可以將Action歸納為Controller的組成部分。MVC系統(tǒng)中的Model模型部分從概念上可以分為兩類:系統(tǒng)的內(nèi)部狀態(tài)和改變系統(tǒng)狀態(tài)的動作.Struts中的Model部分一般由JavaBean以及EJB組成。在Struts架構(gòu)中使用JavaBean來提供具體的業(yè)務(wù)邏輯,即”怎么做”,對于復(fù)雜的系統(tǒng)也可以使用EJB等組件來實現(xiàn)系統(tǒng)狀態(tài)維護(hù)。這種業(yè)務(wù)邏輯的細(xì)分可以增強(qiáng)可以代碼的可重用性。Struts中的View視圖部分依然可以采用JSP來實現(xiàn)。此外,Struts還提供了豐富的自定義標(biāo)記庫,View部分使用這些自定義標(biāo)簽同樣可以實現(xiàn)與Model部分的有效交互并能夠增強(qiáng)顯示功能。3企業(yè)信息管理系統(tǒng)設(shè)計系統(tǒng)設(shè)計是在系統(tǒng)分析的基礎(chǔ)上由抽象到具體的過程,主要目標(biāo)是將系統(tǒng)分析階段所提出的反映到信息需求的系統(tǒng)邏輯方案并轉(zhuǎn)換成可以實施的基于計算機(jī)與通信系統(tǒng)的物理(技術(shù))方案,為下一階段系統(tǒng)實施提供必要的技術(shù)資料,應(yīng)符合系統(tǒng)性、靈活性、可靠性,經(jīng)濟(jì)性的要求。3.1數(shù)據(jù)庫設(shè)計3.1.1數(shù)據(jù)庫的需求分析依據(jù)項目的處理需求,對應(yīng)數(shù)據(jù)表的設(shè)計及功能如下:·培訓(xùn)信息表:主要用于保存培訓(xùn)信息·獎懲表:主要用于保存獎懲信息·應(yīng)聘信息表:主要用于保存應(yīng)聘信息·薪金表:主要用于保存薪金信息·用戶表:主要用于保存用戶信息員工登記員工登記員工基本信息管理考勤信息管理員工工資設(shè)置員工考核管理結(jié)束基本信息錄入員工工資管理考勤信息管理計算員工工資基本信息錄入圖3.1數(shù)據(jù)庫需求分析流程圖數(shù)據(jù)庫設(shè)計數(shù)據(jù)庫設(shè)計登陸統(tǒng)計查詢存儲數(shù)據(jù)頁面應(yīng)用顯示數(shù)據(jù)退出判斷選擇存儲數(shù)據(jù)數(shù)據(jù)錄入統(tǒng)計查詢一般查詢圖3.2數(shù)據(jù)庫訪問數(shù)據(jù)流圖用戶登記用戶登記說明:輸入用戶信息數(shù)據(jù)流來源:用戶輸入數(shù)據(jù)流去向:數(shù)據(jù)庫存儲方式:人工操作存儲員工基本信息管理員工基本信息管理說明:用于員工基本信息的修改,刪除,添加數(shù)據(jù)流的輸入:當(dāng)前登錄用戶數(shù)據(jù)流的輸出:操作界面存儲方式:數(shù)據(jù)庫直接存儲員工考勤信息管理員工考勤信息管理說明:用于對員工考勤的管理數(shù)據(jù)流的輸入:當(dāng)前登錄用戶數(shù)據(jù)流的輸出:操作界面存儲方式:數(shù)據(jù)庫直接存儲員工考核信息管理員工考核信息管理說明:用于對員工考核的管理數(shù)據(jù)流的輸入:當(dāng)前登錄用戶數(shù)據(jù)流的輸出:操作界面存儲方式:數(shù)據(jù)庫直接存儲員工工資信息管理員工工資信息管理說明:用于對員工工資信息的管理數(shù)據(jù)流的輸入:當(dāng)前登錄用戶數(shù)據(jù)流的輸出:操作界面存儲方式:數(shù)據(jù)庫直接存儲圖3.3系統(tǒng)模塊數(shù)據(jù)字典3.1.2數(shù)據(jù)庫表的具體設(shè)計表3.2.2培訓(xùn)信息表字段名數(shù)據(jù)類型長度是否主鍵描述idint4是數(shù)據(jù)庫流水號namevarchar100培訓(xùn)名稱purposevarchar500培訓(xùn)目的begintimedatetime8開始培訓(xùn)時間endtimedatetime8結(jié)束培訓(xùn)時間datumvarchar2000培訓(xùn)人員teachervarchar50培訓(xùn)講師studentvarchar50學(xué)生createtimedatetime8創(chuàng)建時間educatebit1培訓(xùn)級別effectvarchar500培訓(xùn)影響度summarizevarchar2000培訓(xùn)材料表3.2.字段名數(shù)據(jù)類型長度是否主鍵描述Idint4是數(shù)據(jù)庫流水號Namevarchar2000獎懲名稱Reasonvarchar50獎懲原因explainvarchar50描述createtimedatetime8創(chuàng)建時間表3.2.4字段名數(shù)據(jù)類型長度是否主鍵描述idint4是數(shù)據(jù)庫流水號namevarchar50姓名sexbit1性別ageint4年齡jobvarchar50應(yīng)聘職位specialtyvarchar50所學(xué)專業(yè)experiencevarchar50工作經(jīng)驗studyeffortvarchar50在校所學(xué)專業(yè)schoolvarchar50畢業(yè)學(xué)校telvarchar50電話emailvarchar50電子郵件createtimedatetime8創(chuàng)建時間contentntext16詳細(xì)經(jīng)歷isstockbit1標(biāo)識表3.2.字段名數(shù)據(jù)類型長度是否主鍵描述idint4是數(shù)據(jù)庫流水號namevarchar50員工姓名basicfloat8基本薪資eatfloat8飯補(bǔ)housefloat8房補(bǔ)dutyfloat8全勤獎scotfloat8賦稅punishmentfloat8額外補(bǔ)助otherfloat8罰款granttimedatetime8發(fā)放時間totalizefloat8總計表3.2.字段名數(shù)據(jù)類型長度是否主鍵描述idint4是數(shù)據(jù)庫流水號usernamevarchar50用戶名稱passwordvarchar50用戶密碼sexbit1用戶性別birthdaydatetime8用戶出生年月日createtimedatetime8用戶創(chuàng)建的時間isadminbit1是否超級管理員contentvarchar2000管理員級別3.2系統(tǒng)功能模塊詳細(xì)設(shè)計3.2.1功能設(shè)計本系統(tǒng)主要用于對企業(yè)中的“人”進(jìn)行管理。具體地講,企業(yè)員工信息管理系統(tǒng)就是通過企業(yè)員工信息規(guī)劃、員工考核、薪酬管理、員工激勵、人才培訓(xùn)和開發(fā)等一系列手段來提高勞動生產(chǎn)率,最終達(dá)到發(fā)展目標(biāo)的一種管理行為。具體實現(xiàn)目標(biāo)如下。實現(xiàn)對員工信息進(jìn)行全面管理的功能。設(shè)置企業(yè)員工基礎(chǔ)信息管理功能。設(shè)置員工考勤管理功能模塊。員工薪酬信息管理。實現(xiàn)企業(yè)員工培訓(xùn)信息全程跟蹤的功能。實現(xiàn)企業(yè)的招聘信息、應(yīng)聘信息的管理功能。企業(yè)人才庫管理功能。系統(tǒng)用戶信息的管理。系統(tǒng)最大限度地實現(xiàn)了易安裝性、易維護(hù)性和易操作性。系統(tǒng)運行穩(wěn)定、安全可靠。3.2.2模塊企業(yè)員工信息管理系統(tǒng)是針對中小企業(yè)對現(xiàn)有員工和新聘員工的一個WEB管理平臺。主頁功能模塊主要包括以下功能模塊:人員管理:主要包括瀏覽人員信息、添加人員信息、人員信息的添加、人員信息的修改。招聘管理:主要包括應(yīng)聘人員信息的詳細(xì)查看、刪除、添加以及信息入庫。培訓(xùn)管理:主要包括培訓(xùn)計劃的詳細(xì)信息、信息刪除、添加培訓(xùn)計劃和填寫培訓(xùn)總結(jié)。獎懲管理:主要包括獎懲詳細(xì)信息、刪除詳細(xì)信息、添加詳細(xì)信息、修改詳細(xì)信息。薪金管理:主要包括薪金的修改、添加、刪除。基本信息管理功能集合包括部門信息管理和員工信息管理等功能模塊。此集合中功能模塊的關(guān)系如圖3.4所示。員工基本管理員工基本管理員工業(yè)績信息管理員工工作經(jīng)歷管理員工基本信息管理部門信息管理圖3.4員工基本信息管理模塊關(guān)系圖員工基本信息管理模塊是整個系統(tǒng)的核心。除了部門管理模塊外,其他各個模塊都針對每一個員工的一個方面進(jìn)行管理,都需要提供員工編號等基本信息作為索引??己伺c待遇管理功能集合包括考勤管理,工作考評管理和工資管理模塊。此集合中功能模塊的關(guān)系如圖3.5所示。員工基本信息管理員工基本信息管理員工工資管理員工考評管理員工考勤管理圖3.5考核與待遇管理功能集合模塊關(guān)系圖用戶管理及權(quán)限控制功能集合包括用戶信息管理、權(quán)限控制等模塊。權(quán)限控制對于企業(yè)員工信息系統(tǒng)來說是非常必要的。部門與員工基本信息數(shù)據(jù),包括考勤,考核工作和工資等信息都不是一般的員工可以隨意添加和改動的。這些操作只有人力資源主管才有此權(quán)限。在本系統(tǒng)中,我們將系統(tǒng)用戶劃分了3大類:人力資源主管:此類型用戶是本系統(tǒng)中權(quán)限最高的用戶。在本系統(tǒng)中的任何模塊中,都可以進(jìn)行添加,刪除,修改等記錄,并對所有數(shù)據(jù)進(jìn)行查詢顯示的權(quán)限。系統(tǒng)管理員:是為了維護(hù)本系統(tǒng)而創(chuàng)建的用戶,可以對除“人力資源主管”用戶以外的其他類型用戶進(jìn)行管理。普通用戶:權(quán)限最低的一類用戶,除了可以修改自身的用戶名和密碼外,幾乎沒有其他數(shù)據(jù)庫操作權(quán)限。在其他的模塊中,此類用戶只能瀏覽到與自己或自己的下屬相關(guān)的數(shù)據(jù),但是不能對數(shù)據(jù)進(jìn)行修改或刪除操作。在員工工作考評模塊中,普通用戶可以輸入對自己下屬員工的工作評價和資金系數(shù)等數(shù)據(jù)。此集合中功能模塊的關(guān)系如圖3.6所示超級超級HR主管用戶普通HR主管用戶修改自身用戶名和密碼普通系統(tǒng)管理員用戶創(chuàng)建和管理普通HR主管用戶超級系統(tǒng)管理員用戶創(chuàng)建和管理普通用戶創(chuàng)建和管理普通用戶修改超級HR主管的密碼修改自身的用戶名和密碼創(chuàng)建和管理普通系統(tǒng)管理員修改自身的用戶名和密碼系統(tǒng)用戶信息系統(tǒng)創(chuàng)建和管理普通用戶圖3.6用戶管理功能集合模塊關(guān)系圖用戶登錄模塊開始,對系統(tǒng)的身份進(jìn)行認(rèn)證。身份認(rèn)證可以分為以下兩個過程:確認(rèn)用戶是否為有效的系統(tǒng)用戶;確定用戶的類型;第一個過程決定用戶能否進(jìn)入系統(tǒng)。第二個過程根據(jù)用戶的類型決定用戶的操作權(quán)限,從而決定用戶的工作界面。開始開始退出系統(tǒng)登錄進(jìn)入系統(tǒng)主界面錯誤3次NY圖3.7系統(tǒng)登錄驗證流程圖在圖3.7中可以看到,每個用戶有3次機(jī)會進(jìn)行身份認(rèn)證。如果3次輸入的用戶名和密碼都無法與數(shù)據(jù)庫中的數(shù)據(jù)匹配,則強(qiáng)制退出系統(tǒng)。進(jìn)入系統(tǒng)后,不同類型的用戶所能進(jìn)行的操作也不一樣。這些操作籠統(tǒng)可以分為用戶管理模塊和人事管理模塊。由于篇幅所限,五法完整地描述人事管理模塊的系統(tǒng)流程,只是把它分為兩個部分:考評信息的高級管理和查詢;普通用戶考評信息管理查詢。普通用戶對考評管理和查詢。普通用戶人事考評信息管理和查詢部分非常簡單,,因此在很讀模塊中,普通用戶只有查詢功能。系統(tǒng)流程見圖3.8所示:進(jìn)入系統(tǒng)進(jìn)入系統(tǒng)工作考評管理部門信息管理員工信息管理下屬工作考評信息管理查詢部門信息查詢員工新名列表圖3.8考評管理和查詢流程圖“人事主管”用戶對考評信息的高級管理和查詢。系統(tǒng)流程如圖3.9所示:員工信息員工信息部門信息管理進(jìn)入系統(tǒng)進(jìn)入系統(tǒng)刪除考評信息添加考評信息查詢考評信息修改考評信息工作經(jīng)歷信息家庭成員信息查詢部門信息員工照片管理員工基本信息刪除用戶信息修改用戶信息添加用戶信息部門信息管理員工信息是否存在員工部門是夠存在圖3.9考評模塊查詢流程圖4系統(tǒng)實現(xiàn)4.1用戶操作文件總體架構(gòu)用戶操作模塊主要包括用戶登錄和人員管理模塊,具體功能如下:用戶登錄模塊:用于登錄系統(tǒng)。人員管理模塊:用于瀏覽、添加和修改人員信息。4.1.1用戶登錄模塊設(shè)計用戶登錄模塊是用戶進(jìn)入主頁面的入口,其運行結(jié)果如圖4.1所示。圖4.1用戶登錄模塊運行結(jié)果系統(tǒng)登陸是企業(yè)員工信息管理中最先使用的功能,因為用戶登陸在數(shù)據(jù)庫中使用的是人員表,人員表中有一個isadmin字段,是來標(biāo)識是否是管理員的。在登陸時要根據(jù)數(shù)據(jù)庫的這個字段來判斷此用戶是否具有管理員的權(quán)限。在網(wǎng)頁里添寫用戶名和密碼后點擊【登陸】按鈕,網(wǎng)頁會訪問一個URL,這個URL是“l(fā)ogon.do?action=logon”,代碼如下: <formname="usersForm"method="post"action="logon.do?action=logon"><tr><tdwidth="170"height="40"align="center">用戶名:</td><tdwidth="230"height="40"><inputname="username"type="text"class="input"></td></tr><tr><tdheight="40"align="center">密  碼:</td><tdheight="40"><inputname="password"type="password"class="input"></td></tr><tr><tdheight="40"colspan="2"align="center"><inputtype="submit"name="Submit"value="登陸"class="button"> <inputtype="reset"name="Submit2"value="重置"class="button"></td></tr> </form>在這個表單的name的值是usersForm,它是Struts的ActoinForm的實現(xiàn)類在配置文件中的名字,如下所示:<form-beanname="userForm"type="com.bOS.bPRO_PersonManage.actionform.UsersForm"/>action是Struts的Action的URL,他們在Struts的配置文件中都是已經(jīng)配好的,如下所示:<actionpath="/logon"type="com.bOS.bPRO_PersonManage.action.UsersAction"name="userForm"scope="request"><forwardname="success"path="/manage.jsp"/><forwardname="failed"path="/failed.jsp"/></action>在這個配置文件中,可以了解到如下信息:根據(jù)name="userForm"可以找到與之相對應(yīng)的ActionForm的實現(xiàn)類“com.bOS.bPRO_PersonManage.actionform.UsersForm”。根據(jù)type="com.bOS.bPRO_PersonManage.action.UsersAction"可以找到處理用戶數(shù)據(jù)的Action類。根據(jù)<forwardname="success"path="/manage.jsp"/>和<forwardname="failed"path="/failed.jsp"/>可以了解,這個Action返回success時,頁面會被轉(zhuǎn)到manage.jsp文件,這就是登陸成功的頁面。如果當(dāng)Action返回failed時,頁面會被轉(zhuǎn)到failed.jsp文件,這個文件是當(dāng)用戶登陸失敗將要轉(zhuǎn)到的頁面。Struts的Action實現(xiàn)類的execute()方法是最先被執(zhí)行的,這個方法本身也沒有具體的事務(wù),而是根據(jù)action的參數(shù)不同執(zhí)行相應(yīng)的方法。在登陸頁里面可以找到有一個“action=logon”的字樣,它的目的就是在這里做邏輯判斷。當(dāng)action=logon時調(diào)用logon()方法。logon()方法從UsersForm中得到用戶提交的數(shù)據(jù),然后在調(diào)用UsersDao()的logonUsers()方法。并且把UsersForm轉(zhuǎn)成Users類做為logonUsers()方法的參數(shù)。調(diào)用后會返回一個boolean型的值。如果為真,則返回“mapping.findForward("success");”否則返回“mapping.findForward("failed");”也就是當(dāng)用戶登陸成功后,返回給用戶登陸成功的頁面,登陸失敗后返回用戶一個登陸失敗的頁面。那么UsersDao的logonUsers()方法是根據(jù)什么得到的返回值呢,現(xiàn)在就讓我們看看這個方法。這個方法先通過HibSessionFactory得到一個Hibernate的Session并且開始一個事務(wù),Session再像使用一個欲編譯似的命令似的東西,設(shè)定參數(shù)、提交事務(wù)和最后在關(guān)閉Session.。得到一個List里面就存儲著所有查詢出的結(jié)果。根據(jù)這個結(jié)果就可以判斷出該用戶是否有登陸的權(quán)根了,在返回true或者false。就這樣合法的用戶就可以順利的登陸了。那剛才那些有些類似于欲編譯的東西是什么呢,這些就是Hibernate特有的查詢語言,被稱為Hibernate查詢語言(HQL),而它本身也就是使用的JDBC的欲編譯技術(shù)。4.1.2人員管理模塊設(shè)計人員管理模塊主要包括瀏覽人員信息、添加人員信息、人員信息的添加、人員信息的修改。此模塊文件架構(gòu)如圖4所示。各項管理工作都是在用戶成功登陸后的管理頁面進(jìn)行的,在管理控制頁面的左側(cè)是各項的相關(guān)鏈接,右側(cè)是操作平臺。管理控制頁面右側(cè)實際上是一個iframe,如下所示:<tdheight="550"valign="top"><iframename="frame"src="main.do"width="100%"height="100%"frameborder="0"hspace="0"></iframe></td>在左側(cè)的鏈接中使用target="frame"就可以在這個iframe中打開新的鏈接了。單擊“添加人員信息”,即打開添加人員信息的頁面如圖4.2所示。圖4.2添加人員信息頁面添加人員信息的鏈接是這樣的,如下所示:<tdheight="22"align="center"><ahref="adduser.do"target="frame">添加人員信息</a></td>在Struts配置文件中,添加人員信息的鏈接沒有使用ActionForm類,也沒有使用Action的實現(xiàn)類,如下所示:<actionpath="/adduser"forward="/adduser.jsp"/>adduser.jsp文件,只是一個普通的JSP文件,但是它的表單元素都是與UsersForm相對應(yīng)的,UsersForm如下所示:packagecom.bOS.bPRO_PersonManage.actionform;importcom.bOS.bUtil.DateUtil;importjavax.servlet.http.HttpServletRequest;importorg.apache.struts.action.ActionErrors;importorg.apache.struts.action.ActionForm;importorg.apache.struts.action.ActionMapping;importcom.bOS.bPRO_PersonManage.en.Users;publicclassUsersFormextendsActionForm{publicStringgetContent(){returncontent;}publicvoidsetContent(Stringcontent){this.content=content;}privateLongid;privateStringusername;privateStringpassword;privateBytesex;privateStringbirthday;privateStringcreatetime;privateByteisadmin;privateStringcontent;publicStringgetCreatetime(){returncreatetime;}publicvoidsetCreatetime(Stringcreatetime){this.createtime=createtime;}publicLonggetId(){returnid;}publicvoidsetId(Longid){this.id=id;}publicBytegetIsadmin(){returnisadmin;}publicvoidsetIsadmin(Byteisadmin){this.isadmin=isadmin;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this.username=username;}publicvoidreset(ActionMappingarg0,HttpServletRequestarg1){this.id=null;this.username=null;this.password=null;this.isadmin=null;this.createtime=null;this.content=null;this.sex=null;this.birthday=null;}publicActionErrorsvalidate(ActionMappingarg0,HttpServletRequestarg1){returnnull;}publicStringtoString(){StringBuffertoStr=newStringBuffer();toStr.append("[UsersForm]=[\n");toStr.append("id="+this.id+";\n");toStr.append("username="+this.username+";\n");toStr.append("password="+this.password+";\n");toStr.append("sex="+this.sex+";\n");toStr.append("birthday="+this.birthday+";\n");toStr.append("createtime="+this.createtime+";\n");toStr.append("isadmin="+this.isadmin+";\n");toStr.append("content="+this.content+";\n");toStr.append("];\n");returntoStr.toString();}publicStringgetBirthday(){returnbirthday;}publicvoidsetBirthday(Stringbirthday){this.birthday=birthday;}publicBytegetSex(){returnsex;}publicvoidsetSex(Bytesex){this.sex=sex;}publicUserspopulate(){Usersu=newUsers();u.setId(getId());u.setIsadmin(getIsadmin());u.setContent(getContent());u.setUsername(getUsername());u.setPassword(getPassword());u.setSex(getSex());u.setBirthday(DateUtil.parseToDate(getBirthday(),DateUtil.yyyyMMdd));u.setCreatetime(DateUtil.parseToDate(getCreatetime(),DateUtil.yyyyMMddHHmmss));returnu;}}UsersForm類中的reset()方法作用是當(dāng)用戶點擊“重置”按鈕時,清空input輸入框的內(nèi)容,toString()方法覆蓋了Object和toString()方法,populate()方法很有,它把UsersForm轉(zhuǎn)化成Users實體類,大大方便了程序在對數(shù)據(jù)庫操作時使用的方便。而且這個方法中還把用戶的生日等表單元素的值由字符型轉(zhuǎn)成日期類型。在adduser.jsp頁面中的action上可以看到它要提交的URL,如下所示:<formname="userForm"method="post"action="modifyuser.do?action=adduser"onSubmit="returnuserValidate();">配置文件中modifyuser的Action實現(xiàn)類是“com.bOS.bPRO_PersonManage.action.UsersAction”,如下所示:<actionpath="/modifyuser"type="com.bOS.bPRO_PersonManage.action.UsersAction"name="userForm"scope="session"> <forwardname="success"path="/user.do?action=listuser"/></action>在UsersAction找到參數(shù)action等于adduser時所調(diào)用的方法addUsers(),它只是把從UserForm表單轉(zhuǎn)化成的User類做為參數(shù)傳給了UsersDao的addUsers()方法。在由這個方法向數(shù)據(jù)庫添加人員信息,如下所示:publicvoidaddUsers(Usersusers)throwsHibernateException{users.setCreatetime(newjava.util.Date());Sessionsession=HibSessionFactory.currentSession();Transactiontx=session.beginTransaction();session.save(users);mit();HibSessionFactory.closeSession();}如果添加成功頁面會被發(fā)轉(zhuǎn)到user.do?action=listuser的URL。user.do的配置文件如下所示:<actionpath="/user"type="com.bOS.bPRO_PersonManage.action.UsersAction"name="userForm"scope="request"><forwardname="success"path="/listuser.jsp"/></action>這樣就在頁面做一次提交時它訪問了二次UsersAction,第一次的作用是向數(shù)據(jù)庫中添加信息,隨后又把所有人員信息取出來顯示給用戶,同樣UsersAction還只是調(diào)用UsersDao,取數(shù)據(jù)庫的具體操作在UsersDao文件中,他這次調(diào)用的是listUser()方法,如下所示:publicListlistUser()throwsHibernateException{Sessionsession=HibSessionFactory.currentSession();Transactiontx=session.beginTransaction();Queryquery=session.createQuery("selectufromUsersasuorderbycreatetime");Listlist=query.list();mit();HibSessionFactory.closeSession();returnlist;}UsersAction取出從UsersDao中數(shù)據(jù),在把它存到request里,然后返回returnmapping.findForward("success");在Strutsr的配置文件里返回頁是listuser.jsp。所有用戶的信息都在這個頁中顯示出來。如下所示:<tr><tdheight="22"colspan="7"align="left"><strongclass="text13">瀏覽人員信息</strong></td></tr><trclass="tdhui"><tdheight="22"align="center">人員姓名</td><tdalign="center">登陸密碼</td><tdheight="22"align="center">性別</td><tdheight="22"align="center">出生日期</td><tdheight="22"align="center">是否管理員</td><tdheight="22"align="center">簡介</td><tdalign="center">執(zhí)行操作</td></tr><%Listlist=(List)request.getAttribute("list"); if(list!=null&&list.size()>0){ Iteratorit=list.iterator();while(it.hasNext()){Usersu=(Users)it.next();%><tr><tdheight="22"align="center"><%=StringUtil.notNull(u.getUsername())%> </td><tdheight="22"align="center"><%=StringUtil.notNull(u.getPassword())%> </td><tdheight="22"align="center"><%=newByte("1").equals(u.getSex())?"男":"女"%></td><tdheight="22"align="center"><%=StringUtil.notNull(DateUtil.parseToString(u.getBirthday(),DateUtil.yyyyMMdd))%> </td><tdheight="22"align="center"><%=newByte("1").equals(u.getIsadmin())?"是":"否"%></td><tdheight="22"align="center"><%=StringUtil.notNull(u.getContent())%> </td><tdheight="22"align="center"><ahref="selectuser.do?action=selectuser&id=<%=u.getId()%>">修改</a>  <ahref="modifyuser.do?action=deleteuser&id=<%=u.getId()%>">刪除</a></td></tr><% }}else{%><tr><tdheight="22"colspan="7"align="center">對不起,沒有添加人員信息!??!</td></tr><%}%>在顯示頁中,從request里面的取出數(shù)據(jù),如果有則顯示在頁面上,使用“l(fā)ist!=null&&list.size()>0”判斷如果在沒有數(shù)據(jù)的情況下,將對用戶提示說“對不起,沒有添加人員信息?。。 边@是添加人員信息的整個過程,在這個過程中,有一部分是用于顯示人員信息的,就是“user.do?action=listuser”,它是顯示人員信息的地址。如果在網(wǎng)頁中直接點擊這個鏈接地址,同樣也會調(diào)用出所有用戶的信息。這就是“瀏覽人員信息”的鏈接。頁面執(zhí)行后如圖4.4所示。圖4.4瀏覽人員信息頁面人員信息的列表的最后一列可以對該條記錄做刪除和修改。刪除的鏈接地址是“modifyuser.do?action=deleteuser&id=<%=u.getId()%>”它向Action的實現(xiàn)類提交了兩個參數(shù),一個是action=deleteuser是固定不變的,另一個是該用戶的id這是根據(jù)不同記錄取出來的。在UsersAction類中根據(jù)action的值可以找到與其相對的方法,如下所示:privateActionForwarddeleteUser(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsHibernateException{Longid=newLong(request.getParameter("id"));Usersusers=newUsers();users.setId(id);dao.deleteUsers(users);returnmapping.findForward("success");}在這個方法里得到頁面提交過來的用戶ID,把這個id存在Users表中的實例中,傳給dao的deleteUsers()方法,我們可以看到關(guān)于數(shù)據(jù)庫方面的操作都被封裝在Dao中。具體的刪除操作的代碼如下所示:publicvoiddeleteUsers(Usersusers)throwsHibernateException{Sessionsession=HibSessionFactory.currentSession();Transactiontx=session.beginTransaction();session.delete(users);mit();HibSessionFactory.closeSession();}刪除用戶時和添加用戶一樣都是先得到一個Hibernate的Session,后調(diào)用它的delete()方法就可以了,操作完成后千萬記得要提交事務(wù),即調(diào)用commit()方法,和關(guān)閉Session。修改人員的信息時必須先把要修改的人員信息先查找出來,讓用戶可以直觀的根據(jù)以前的信息修改。這樣在點擊修改時也要傳給Action一個用戶ID,用來查詢出用戶信息,如下所示:<ahref="selectuser.do?action=selectuser&id=<%=u.getId()%>">修改</a>根據(jù)頁面的鏈接可以在Struts的配置文件里找到相應(yīng)的配置信息,如下所示:<actionpath="/selectuser"type="com.bOS.bPRO_PersonManage.action.UsersAction"scope="request"><forwardname="success"path="/updateuser.jsp"/></action>它調(diào)用了UsersAction類,返回到updateuser.jsp文件,在UsserAction中同前面一樣也是根據(jù)action的參數(shù)來識別出調(diào)用selectUser()方法的,方法實現(xiàn)如下所示:privateActionForwardselectUser(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsHibernateException{Longid=newLong(request.getParameter("id"));Usersu=dao.loadUsers(id.longValue());request.setAttribute("user",u);returnmapping.findForward("success");}這個方法使在調(diào)用Dao的loadUsres()的方法后,得到一個Users的返回值,里面存著與此id相對應(yīng)的人員信息,然后在把它存在request里。loadUsres()方法實現(xiàn)如下所示:publicUsersloadUsers(longid)throwsHibernateException{Sessionsession=HibSessionFactory.currentSession();Transactiontx=session.beginTransaction();Usersu=(Users)session.load(Users.class,newLong(id));mit();HibSessionFactory.closeSession(); returnu;}Hibernate在使用這個load()方法時比較特別,需要傳入實體類的class,和要查詢的用戶ID。得到的返回值需要做一下強(qiáng)制類型轉(zhuǎn)換。顯示用戶信息的頁面在updateuser.jsp中,如圖4.5所示。圖4.5修改用戶信息頁面首先要從request中取出人員信息,在轉(zhuǎn)化成Users類型,然后顯示在頁面中。在顯示是否是管理員的項時比較人特別。如下所示:<tdwidth="33%"height="22"align="center">是否管理員:</td><tdwidth="67%"height="22"align="left"><inputname="isadminhelp"type="checkbox"<%=newByte("1").equals(u.getIsadmin())?"checked":""%>onClick="javascript:adminChecked();"value="<%=u.getIsadmin()%>"></td> <inputtype="hidden"name="isadmin"value="<%=u.getIsadmin()%>">>實際想要提交的表單的名字是isadmin,而在顯示checkbox時用的name是isadminhelp。Isadmin確使用hidden類型做為表單提交名字,這和checkbox的特性有關(guān)。在使用javascrip對checkbox的value控制時。當(dāng)value的值如果像這樣“value="<%=u.getIsadmin()%>"”被寫死時,使用javascrip是對value的值改變后,在提交表單時是無效的。于是我們就用hidden做為表單提交項,而<inputname="isadminhelp"type="checkbox"<%=newByte("1").equals(u.getIsadmin())?"checked":""%>onClick="javascript:adminChecked();"value="<%=u.getIsadmin()%>">只是在顯示給用戶的看的。在表單不接收isadminhelp的value,只接收isadmin的value。4.2技術(shù)難點4.3.1參數(shù)傳遞中的中文亂碼由于瀏覽器中的參數(shù)傳遞是按字節(jié)傳送,因此英文和數(shù)字不會有任何的問題,而中文漢字則由兩個字節(jié)組成。為了解決這個問題,使用了下面的兩種方法:①<%request.setCharacterEncoding(“gb2312”);%>②request.getParameter("Password").getBytes("ISO-8849-1"),"GB2312");4.3.2圖片處理在SQLServer2000的數(shù)據(jù)庫中可以存放任何格式的圖片,但是要將其轉(zhuǎn)換為二進(jìn)制的數(shù)據(jù)存入數(shù)據(jù)庫,在調(diào)用時再將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為圖片,這樣雖然便于管理,但是在當(dāng)前國內(nèi)的網(wǎng)速來看,這樣的方法是在是不可取。因此本系統(tǒng)的圖片均是存放的相對路徑,將圖片放在系統(tǒng)根目錄下的image文件夾中,按類分好,然后將其相對路徑存入數(shù)據(jù)庫的對應(yīng)列中,這樣可以大大提高網(wǎng)頁瀏覽的速度。4.3.3HQL語言本系統(tǒng)中,所有對數(shù)據(jù)庫的操作都由Hibernate來完成,因此用到了大量的HQL語言。HQL是Hibernate設(shè)計的一套完整而實用高效的查詢語言,它通過面向?qū)ο蟮恼Z句結(jié)構(gòu)實現(xiàn)了和SQL語言類似的功能。如果向表里插入一條數(shù)據(jù)的話,直接調(diào)用save()方法即可,但如果要使用查詢功能的話,我按照一般的SQL語句的方法:from表名where條件,卻總是找不到預(yù)期的數(shù)據(jù),后來看書中發(fā)現(xiàn),from后跟的是表對應(yīng)映射的類文件名,而非表名,比如招聘表為invite,它對應(yīng)的類為Invite.java,所以在from后要根Invite而不是invite。4.3.4安全性將項目發(fā)布到互聯(lián)網(wǎng)上后,有些用戶不是點擊超鏈接打開網(wǎng)站的某個頁面,而是在地址欄中直接寫,而后進(jìn)入,試圖避開身份驗證,處于對安全性的考慮,本項目在用戶登陸后才能進(jìn)入的頁面中,加入了一行判斷,如果用戶非法進(jìn)入,則看到的將是一片空白頁。5系統(tǒng)測試在完成了程序的編寫工作后,接下來將進(jìn)行軟件的測試,這里說的軟件,并不單單是指程序本身,還包括其他方面。測試和開發(fā)一樣,也是一項技術(shù)性很強(qiáng)的工作,有著很多的技巧。軟件測試是軟件質(zhì)量保證的主要活動之一,因此,測試的質(zhì)量直接影響軟件的質(zhì)量。依據(jù)前面所說的測試對象,我們把測試劃分為幾個方面來進(jìn)行測試。5.1界面測試界面測試是測試過程中比較簡單直觀的一種測試方法,只要細(xì)心地按界面要求核對就行了。可這快往往是程序開發(fā)人員容易忽視和遺漏的地方。也是常常出Bug的地方。下面是界面測試中經(jīng)常出現(xiàn)的幾種Bug:錯別字,即界面中的標(biāo)題或者文本內(nèi)容中出現(xiàn)了錯別字。這種Bug如果測試人員不細(xì)心,和難找出來,可能會出現(xiàn)在提示信息或界面中。出現(xiàn)了一些根本讀不懂的內(nèi)容,一般多出現(xiàn)在程序的提示信息和一些較長的文本中。這種情況基本上出現(xiàn)在拼起來顯示的提示中,頁面的簡單陳述是通過變量拼組起來的,通過程序?qū)⒆忠粋€一個地輸出出來。通常是因為程序中的控制錯誤或是程序開發(fā)人員對程序沒有進(jìn)行認(rèn)真的自測,導(dǎo)致出現(xiàn)這種Bug。程序員自創(chuàng)的詞語,雖然意思對,但不符合界面的標(biāo)準(zhǔn)及需求。這種情況基本上是由于開發(fā)人員使用一些專業(yè)術(shù)語,并且混雜著自己的理解出現(xiàn)Bug,主要是由于開發(fā)過程中團(tuán)隊合作沒又明確的分工,沒有統(tǒng)一的規(guī)范用語。頁面類似的內(nèi)容中,明顯有字體,字號不同的情況,使界面整體風(fēng)格看上去不一致,這種情況只出現(xiàn)在沒有CSS定義的情況下,或是已經(jīng)定義的CSS,開發(fā)人員在開發(fā)過程中沒有調(diào)用。標(biāo)題相近的程序及模塊,把標(biāo)題弄混。這種情況多是因為業(yè)務(wù)方面的定義名稱很相似或很類似,并且業(yè)務(wù)實體方面也很類似,開發(fā)人員在開發(fā)過程中忽略了開發(fā)名稱和模塊,只單獨地實現(xiàn)其功能。5.2功能測試顧名思義,功能測試主要是測試程序模塊是否實現(xiàn)了設(shè)計中所有要求的功能。功能測試中需要注意的有:查詢功能中,有按單一查詢條件進(jìn)行查詢的,也有按多個查詢條件組合查詢的,這里要注意多個查詢條件之間的關(guān)系,還有一些常識性的問題,比如按月查詢,閏年中二月的天數(shù)。錄入功能中,需要注意的是前臺設(shè)置的數(shù)值長度是否大于后臺數(shù)值長度,以及前臺與后臺的數(shù)據(jù)結(jié)構(gòu)是否相符,很多時候錄入功能無法實現(xiàn)是由于這些原因。還有就是必須錄入的字段的設(shè)置是否有誤。測試刪除功能中需要注意的是單擊”刪除”按鈕后,一般會出現(xiàn)提示信息,詢問是否確定刪除。通常情況下,我們單擊”確認(rèn)”按鈕查看信息是否被刪除掉了,而忽略了單擊“取消”按鈕后程序的反應(yīng),這時有可能的是沒有刪除,還有一種可能是即便單擊了“取消”按鈕,也一樣刪除了數(shù)據(jù)。另外,在刪除多條記錄的時候,要注意連續(xù)選中的幾條記錄是否真正都被刪除了,即如果再按照這種查詢方式查詢,是否還能查詢出來。有的時候需要在數(shù)據(jù)庫中設(shè)一個標(biāo)志位,而不是真正的物理刪除。所以在下一次查詢中,可能還會被查詢出來,這主要是因為在查詢條件中沒有將標(biāo)志位考慮在內(nèi)。關(guān)于修改功能的測試,主要是看修改確認(rèn)后是否數(shù)據(jù)真正已被修改了。這是最基本的功能,需要注意的是看是否能把不應(yīng)該修改的數(shù)據(jù)也修改成功了。5.3需求測

溫馨提示

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

評論

0/150

提交評論