黃帥 韓春霞
摘要:該文采用JavaEE技術(shù),使用servlet進(jìn)行邏輯控制及運(yùn)用MyBatis框架進(jìn)行數(shù)據(jù)庫訪問,以銅仁學(xué)院大數(shù)據(jù)學(xué)院為例,開發(fā)設(shè)計(jì)了一個(gè)學(xué)生成績管理系統(tǒng),有助于教師和學(xué)生使用,適用于高校推廣應(yīng)用。該文主要介紹系統(tǒng)的具體設(shè)計(jì)與實(shí)現(xiàn)。
關(guān)鍵詞:JavaEE;學(xué)生成績管理; MyBatis
中圖分類號:TP315? ? ? 文獻(xiàn)標(biāo)識碼:A? ? ? 文章編號:1009-3044(2019)02-0053-03
1 系統(tǒng)概要設(shè)計(jì)
1.1總體架構(gòu)
學(xué)生成績管理系統(tǒng)采用B/S結(jié)構(gòu)、模塊化的開發(fā)方式進(jìn)行開發(fā)。如圖1,整個(gè)系統(tǒng)由三個(gè)模塊組成,分別是公共模塊、學(xué)生模塊和管理模塊。公共模塊是整個(gè)系統(tǒng)的核心,在該模塊中放置著實(shí)現(xiàn)好的功能與工具,模塊中的service層是其它模塊使用模塊的入口,而管理模塊和學(xué)生模塊主要功能是為管理用戶和學(xué)生用戶提供一個(gè)使用平臺。這樣的設(shè)計(jì)模式可以提高開發(fā)效率,后續(xù)也十分便于維護(hù)和擴(kuò)展系統(tǒng)。
1.2需求分析
隨著計(jì)算機(jī)技術(shù)應(yīng)用的普及,越來越多的高校使用學(xué)生成績管理系統(tǒng)來完成學(xué)生成績的管理工作。用以前的傳統(tǒng)人工方式來進(jìn)行學(xué)生成績的管理,工作效率不僅低下,在工作過程中也很容易造成錯(cuò)誤。用JavaEE技術(shù)實(shí)現(xiàn)的學(xué)生成績管理系統(tǒng),可以讓管理者高效地對學(xué)生信息和成績進(jìn)行錄入、修改、查詢等,既大大簡化了學(xué)生成績的管理工作,同時(shí)也方便了學(xué)生們對自己成績的查詢。
1.3 模塊基本功能
公共模塊:也是核心模塊,其中Service層實(shí)現(xiàn)了對DAO層的調(diào)用、圖片的上傳與加載等功能,其他模塊只需調(diào)用Service層中的類就能使用該模塊的功能。
管理模塊:能夠使用專有的管理員賬號的登錄訪問,在管理頁面中可以錄入學(xué)生、課程的信息、修改學(xué)生、課程的信息,在成績修改頁修改學(xué)生成績等功能呢。
學(xué)生模塊:實(shí)現(xiàn)學(xué)生的登錄,學(xué)生可以通過自己賬號和密碼進(jìn)行登錄查看自己的個(gè)人信息和查詢個(gè)人成績。
1.4運(yùn)行環(huán)境與開發(fā)工具
IntelliJ IDEA,是由JetBrains公司推出的一款I(lǐng)DE(集成開發(fā)環(huán)境)。這款開發(fā)工具不管在代碼編寫、代碼分析、GUI設(shè)計(jì)方面都是超常的,使用這款工具可以大大提高開發(fā)效率。
MyBatis,是一個(gè)基于Java的持久層框架,這款框架支持定制化SQL、存儲過程、高級映射等,最主要的是這款框架可以將Java代碼與SQL語句完全分離,有利于維護(hù)。
BootStrap,是由美國Twitter公司的設(shè)計(jì)師開發(fā)的一款基于Html、Css、JavaScript的前端框架,這款框架具有簡潔、優(yōu)雅、強(qiáng)悍等特性,使用BootStrap開發(fā)出的前端頁面簡約美觀,而且使用起來非常容易上手。
MySQL,是最流行的關(guān)系型數(shù)據(jù)庫之一,具有速度快、體積小、開源免費(fèi)等特點(diǎn),是開發(fā)中小型項(xiàng)目的最佳選擇。2? 系統(tǒng)的詳細(xì)設(shè)計(jì)
2.1數(shù)據(jù)表的設(shè)計(jì)
數(shù)據(jù)庫設(shè)計(jì)的好壞會影響整個(gè)開發(fā)過程和開發(fā)成果,本次設(shè)計(jì)主要包含以下幾個(gè)數(shù)據(jù)表
1)學(xué)生表:用于存儲、管理學(xué)生信息的數(shù)據(jù)表。
2)管理員表:存儲管理員的賬號和密碼等信息,用于登錄管理后臺頁面。
3)專業(yè)表:存儲專業(yè)的信息,該表是分類學(xué)生、課程和成績記錄的標(biāo)識。
4)課程表:存儲課程對象的信息。
5)成績記錄表:用于存儲學(xué)生的成績、學(xué)生的學(xué)號和分?jǐn)?shù),成績管理的工作基本上是在該數(shù)據(jù)表上完成的。
2.2 E-R圖
E-R 圖包含三個(gè)要素: 實(shí)體、屬性和關(guān)系, 是用來描述某一單位、組織的概念模型,本系統(tǒng)設(shè)計(jì)的E-R圖如圖2所示。
3? 系統(tǒng)的實(shí)現(xiàn)
3.1 DAO層的實(shí)現(xiàn)及MyBatis的實(shí)現(xiàn)
DAO層,也稱數(shù)據(jù)訪問層,在使用整個(gè)系統(tǒng)的過程中幾乎都會經(jīng)過DAO層,使用MyBatis實(shí)現(xiàn)DAO層十分方便,只需以下幾步:
1)在pom.xml中添加MyBatis 以及數(shù)據(jù)庫驅(qū)動(dòng)的依賴,并編寫MyBatis的工具類,用于加載MyBatis和SqlSeesion。
2)在資源文件夾中添加MyBatis的配置文件和屬性文件,并指明映射文件或者包的路徑。在本次開發(fā),作者使用的是MyBatis的注解方式操作數(shù)據(jù)庫所以在配置文件中指明的是含映射關(guān)系接口類的包路徑。
3)在指明的包路徑下編寫接口類中帶注解的方法,整個(gè)DAO層準(zhǔn)備工作基本完成。
例如
/**
* 得到所有該專業(yè)下的學(xué)生
* @param categoryId
* @return
*/
@Select("select * from student where categoryId = #{categoryId}")
List
(1) 在service層中使用代碼如下:
/**
* 得到該專業(yè)下的所有學(xué)生
*
* @param categoryId
* @return
*/
public List
SqlSession sqlSession = MyBatisUtil.getSession();? //得到sqlSession
try {
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
return studentMapper.getStudentsByCategory(categoryId);
} finally {
sqlSession.close(); //關(guān)閉sqlSession
}
}
3.2 用戶界面設(shè)計(jì)與實(shí)現(xiàn)
用戶界面是用戶與系統(tǒng)交互的載體,好的用戶界面既能給用戶留下深刻的印象,又能給用戶帶來更好的使用體驗(yàn)。所以,用戶界面的開發(fā)也是整個(gè)項(xiàng)目中極其重要的一部分。
1)管理模塊所進(jìn)入的主頁如圖3所示。
當(dāng)管理員用戶登錄成功后所進(jìn)入的主頁,該主頁主要顯示的是每個(gè)專業(yè)的板塊,當(dāng)用戶點(diǎn)擊某一個(gè)專業(yè)的板塊就會進(jìn)入該專業(yè)的主頁,在該專業(yè)主頁就可以進(jìn)行查詢、修改該專業(yè)下的課程和學(xué)生。若想添加一個(gè)新專業(yè)、課程或者學(xué)生都可以在主頁中的導(dǎo)航欄進(jìn)入相關(guān)頁面。
2)學(xué)生模塊所進(jìn)入的主頁如圖4所示
學(xué)生使用自己的學(xué)號和密碼登錄學(xué)生模塊后進(jìn)入該主頁,學(xué)生就可以自行查看自己的成績、個(gè)人信息。
3.3 管理模塊的設(shè)計(jì)與實(shí)現(xiàn)
1)添加課程
當(dāng)用戶進(jìn)入添加課程頁面后,如圖5所示,只需填好頁面中的各個(gè)表單項(xiàng),點(diǎn)擊提交,負(fù)責(zé)此功能的servlet就可以通過request對象獲取表單中的各個(gè)參數(shù),并將這些參數(shù)打包成一個(gè)課程對象,再通過調(diào)用公共模塊中service層的添加課程方法,以課程對象為參數(shù),即可完成添加。添加完成后,系統(tǒng)會跳轉(zhuǎn)到該專業(yè)、年級的課程顯示區(qū),并在數(shù)據(jù)庫學(xué)生成績表中給該專業(yè)下的所有學(xué)生添加課程記錄。
2)添加學(xué)生
添加學(xué)生需要上傳學(xué)生的照片,所以添加學(xué)生的表單具有文件上傳項(xiàng),與添加課程不同,此時(shí)表單標(biāo)簽的enctype屬性需要修改為enctype="multipart/form-data"。當(dāng)用戶填好表單、選好上傳文件并提交到添加學(xué)生的servlet后,在servlet中就需要先從service層調(diào)用一個(gè)解析request的方法。在該方法中,使用到了ServletFileUpload類,在這個(gè)類中,使用parseRequest()方法就可以對request進(jìn)行解析,解析完成后,得到方法的返回值,一個(gè)FileItem類型的集合,該集合里實(shí)際上就是表單項(xiàng)的值。直接使用迭代器對集合進(jìn)行遍歷,在整個(gè)遍歷中,首先要考慮兩層判斷,第一層,通過isFormField()方法判斷是否為普通表單項(xiàng),如果是則進(jìn)入第二層判斷,如果不是,則說明該表單項(xiàng)為文件上傳項(xiàng),直接通過FileItem對象的get()方法得到文件的字節(jié)流并給學(xué)生對象的“照片”屬性賦值(該屬性的類型為 byte[])。第二層判斷的目的是為了給學(xué)生對象除“照片”屬性外的其他屬性賦值,每一個(gè)表單項(xiàng)均與學(xué)生的每一個(gè)屬性一一對應(yīng),所以判斷的條件是表單項(xiàng)標(biāo)簽中的name屬性值,遍歷完成后,就能得到一個(gè)完整的學(xué)生對象,對象的屬性值都與用戶所填的表單項(xiàng)一一對應(yīng),將學(xué)生對象返回給servlet,servlet拿到學(xué)生對象后就可以調(diào)用添加學(xué)生的方法,以學(xué)生對象為參數(shù),完成添加。添加成功后會和添加課程一樣跳轉(zhuǎn)到相應(yīng)頁面,并在數(shù)據(jù)庫學(xué)生成績表中添加相應(yīng)記錄。添加學(xué)生頁面如圖6所示。
3)分類顯示課程或?qū)W生
當(dāng)用戶點(diǎn)擊相應(yīng)的專業(yè)模塊,就能進(jìn)入到相應(yīng)課程列表頁面或?qū)W學(xué)生列表頁面。在跳轉(zhuǎn)到這些頁面之前,servlet會做一系列的工作:首先會request對象能得到兩個(gè)參數(shù),專業(yè)ID和年級,通過調(diào)用service層的查詢課程或者學(xué)生方法,以專業(yè)ID和年級參數(shù),就能得到該專業(yè)、年級下的課程或者學(xué)生對象集合。將集合通過request傳給將要跳轉(zhuǎn)的JSP頁面。在JSP中,通過EL表達(dá)式可以很輕松地拿到這個(gè)集合對象,通過c:forEach標(biāo)簽遍歷JSP拿到的集合對象就可以將每一項(xiàng)展示在頁面中了。
4)修改學(xué)生成績
當(dāng)用戶在專業(yè)模塊的學(xué)生顯示區(qū)點(diǎn)擊某個(gè)學(xué)生的姓名就能進(jìn)入該學(xué)生的管理頁,點(diǎn)擊學(xué)生成績按鈕該頁面會呈現(xiàn)該學(xué)生在該專業(yè)、該年級下的所有課程,點(diǎn)擊修改按鈕觸發(fā)js函數(shù)就能使學(xué)生成績列表變成可編輯狀態(tài),當(dāng)用戶輸入完學(xué)生的學(xué)生課程分?jǐn)?shù)并進(jìn)行提交,servlet就開始工作了。想完成這個(gè)功能首先需要考慮兩個(gè)問題,如何讓servlet知道用戶修改的是哪些課程的分?jǐn)?shù)?如何讓用戶修改的分?jǐn)?shù)與顯示的分?jǐn)?shù)一一對應(yīng)?首先要解決第一個(gè)問題,在用戶修改的成績表單中添加兩個(gè)隱藏的Input標(biāo)簽,這兩個(gè)標(biāo)簽負(fù)責(zé)向servlet傳學(xué)生的學(xué)號、年級這兩個(gè)參數(shù),系統(tǒng)就能知道需要修改的是哪位同學(xué)、哪個(gè)年級下的課程,就可以先從數(shù)據(jù)庫中取出符合這個(gè)條件的成績記錄集合。解決第二個(gè)問題,首先可以在JSP頁面中的輸入成績的標(biāo)簽中添加name屬性,屬性的值為成績記錄具唯一性的主鍵。在servlet中遍歷拿到的集合,在遍歷中以集合中的成績記錄對象的ID屬性(與主鍵對應(yīng))為參數(shù),使用request的 getParameter()方法獲取用戶輸入的分?jǐn)?shù),如果能取到,說明用戶修改的是當(dāng)前課程的分?jǐn)?shù),如果取不到任何值,說明沒有修改該課程,直接跳過。得到該分?jǐn)?shù)后,進(jìn)行分?jǐn)?shù)計(jì)算,看看該成績是優(yōu)秀、合格、掛科還是無效,最后將評級、分?jǐn)?shù)傳給service層中的修改成績方法,以主鍵為條件,完成修改。遍歷完成后,整個(gè)頁面的成績就會如我們所想的得到一一對應(yīng)的修改。最后會跳轉(zhuǎn)到已經(jīng)修改好的不可編輯的學(xué)生成績頁面。補(bǔ)充:雖然可以跳過第一個(gè)問題,使用所有的學(xué)生成績記錄進(jìn)行遍歷,但一旦學(xué)生增多、課程增多,計(jì)算量就會增大,性能就會下降。
3.4? 學(xué)生模塊的設(shè)計(jì)與實(shí)現(xiàn)
1)登錄問題
學(xué)生可以通過自己的學(xué)號和密碼進(jìn)行登錄,完成登錄后,servlet會首先使用學(xué)生輸入的賬號在數(shù)據(jù)庫進(jìn)行查找,如果查找不到,request會向登錄的頁面返回一個(gè)參數(shù),如果頁面能接收到這個(gè)參數(shù),就會提示用戶輸入的賬號或密碼錯(cuò)誤。如果查找得到,servlet就能得到這個(gè)學(xué)生對象,通過這個(gè)學(xué)生對象的password屬性值與學(xué)生用戶輸入的密碼比較,如果相同則登錄成功,不同則返回參數(shù)。一旦登錄成功,在servlet中會在session對象的作用域中存放該學(xué)生對象、該生的所有課程成績記錄集合對象。這么做的目的有兩點(diǎn):一是在學(xué)生模塊的每個(gè)JSP頁面都可以直接通過EL表達(dá)式獲取學(xué)生和成績的信息。二是如果學(xué)生用戶未登錄,想直接在地址欄中輸入地址進(jìn)入某個(gè)頁面,作用在服務(wù)器中的filter會檢測這一行為,如果沒有檢測到session對象,說明學(xué)生用戶并沒有登錄成功,filter會強(qiáng)行使系統(tǒng)跳轉(zhuǎn)登錄頁。
2)顯示問題
當(dāng)學(xué)生用戶在導(dǎo)航欄點(diǎn)擊“我的”,就會在該頁面看到個(gè)人信息。在這一頁面可以看到一些基本信息,以及在管理模塊中上傳的照片。顯示個(gè)人的基本信息只需要通過EL表達(dá)式獲取session作用域中的學(xué)生對象即可。顯示指定的照片需要先創(chuàng)建一個(gè)servlet,這個(gè)servlet只負(fù)責(zé)一件事,那就是加載我們需要的圖片。首先,直接在servlet中通過session獲取當(dāng)前學(xué)生對象,這個(gè)對象實(shí)際上已經(jīng)存好了我們想要的照片。在上文提到,這個(gè)“照片”其實(shí)就是一個(gè)byte[]數(shù)組,在servlet中將數(shù)組讀到輸入流,通過response對象獲取輸出流對象(ServletOutputStream),通過輸出流的寫操作將流輸出到瀏覽器中,最后,只需將負(fù)責(zé)顯示圖片的img標(biāo)簽 中的src屬性修改為該servlet的映射地址,即可完成指定圖片的顯示。
當(dāng)學(xué)生用戶在導(dǎo)航中點(diǎn)擊“成績”,就會按照年級來分別顯示課程的成績。在顯示所有的個(gè)人成績前,servlet通過學(xué)生的學(xué)號、年級在service層中調(diào)用相應(yīng)的方法。與管理模塊的顯示方式不同,在學(xué)生模塊中成績是無法修改的,所以可以將該學(xué)生所有年級的成績?nèi)慷紓鞯揭粋€(gè)JSP頁面中, 通過4次調(diào)用方法獲取4個(gè)年級不同的集合對象,通過request對象傳到成績頁,學(xué)生用戶就可以選擇點(diǎn)擊二級導(dǎo)航來決定顯示哪個(gè)年級的成績。
4 結(jié)束語
本論文主要采用JavaEE技術(shù),設(shè)計(jì)并實(shí)現(xiàn)了學(xué)生成績管理系統(tǒng),在文中介紹了各功能模塊的實(shí)現(xiàn),即管理端:可以對學(xué)生的信息、課程的信息、學(xué)生成績信息進(jìn)行編輯與修改。學(xué)生端:每個(gè)學(xué)生可以依據(jù)自己的賬戶登錄并對個(gè)人信息及個(gè)人成績信息進(jìn)行查詢等。該系統(tǒng)的設(shè)計(jì)可以達(dá)到學(xué)生成績信息化的管理目標(biāo),方便教師與學(xué)生的使用,可以在高校推廣運(yùn)用。經(jīng)測試,系統(tǒng)運(yùn)行穩(wěn)定,但在前端部分,可以使用JavaScript進(jìn)行多方面的優(yōu)化,如添加用戶輸入判空、驗(yàn)證碼、用戶提示等功能,在后續(xù)會繼續(xù)完善。
參考文獻(xiàn):
[1] 郭博,舒娟,史曉鳳,等.基于 C#的學(xué)生成績管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 隴東學(xué)院學(xué)報(bào),2018, 29(5):13-15
[2] 葉小芹,張靜.基于C語言的學(xué)生成績管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn). 電腦知識與技術(shù),2017,13(4):59-62.
[3] 田文濤,張釗,張笑冰. 基于 SSH 的學(xué)生成績信息管理系統(tǒng)的具體設(shè)計(jì)與實(shí)現(xiàn)[J]. 軟件,2018,39(2):212-217.
[4] 譚少娟. 高校學(xué)生成績管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)探析[J].知識經(jīng)濟(jì), 2018(3):143-144.
[5] 馬強(qiáng). 學(xué)生成績管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].數(shù)字技術(shù)與應(yīng)用,2017(10):156-158.