【正文】
//引入 bean中的 question類 import 。 import 。以測(cè)試試題的業(yè)務(wù)邏輯為例進(jìn)行分析業(yè)務(wù)邏輯層的實(shí)現(xiàn)。 業(yè)務(wù)邏輯層實(shí)現(xiàn) 業(yè)務(wù)邏輯層實(shí)現(xiàn)是通過(guò) Service 層來(lái)實(shí)現(xiàn)的, Service 層編寫(xiě)不同的業(yè)務(wù)邏輯, 根據(jù)業(yè)務(wù)需要的數(shù)據(jù)來(lái)對(duì) DAO 層的方法進(jìn)行了調(diào)用來(lái)獲取數(shù)據(jù)實(shí)現(xiàn)業(yè)務(wù)功能。 //已經(jīng)測(cè)試 } return SUCCESS。 } public String execute() throws Exception { = new studentSI()。 //學(xué)生學(xué)號(hào) public String getStuNum() { //學(xué)號(hào)的 get方法 return stuNum。 import 。 //引入所需要的包 import 。 !配置歡迎界面 welefilelist welefile/welefile /welefilelist !配置過(guò)濾器 filter !配置過(guò)濾器名稱 filternamestruts2/filtername !過(guò)濾器對(duì)應(yīng)的類 filterclass /filterclass /filter filtermapping filternamestruts2/filtername !設(shè)置過(guò)濾匹配的 URL 模式為所有模式均匹配 26 urlpattern/*/urlpattern /filtermapping 文件配置好后對(duì)所有請(qǐng)求均過(guò)濾,在 中對(duì)不同請(qǐng)求決定對(duì)應(yīng)的是哪個(gè) Action。首先需要對(duì) Struts2 進(jìn)行配置。 ( Web)表示 層實(shí)現(xiàn) Web 表示層的實(shí)現(xiàn)是通過(guò) Struts 調(diào)用對(duì)應(yīng)的 Action 在再 JSP 中體現(xiàn)來(lái)實(shí)現(xiàn)的。打開(kāi) Navicat,新建一個(gè)數(shù)據(jù)庫(kù),通過(guò) Web 項(xiàng)目中 .java 后綴類型的文件中輸入簡(jiǎn)單的數(shù)據(jù)庫(kù)操作語(yǔ)句,運(yùn)行該文件后查看數(shù)據(jù)庫(kù)能否成功連接。啟動(dòng) Tomcat,通過(guò)在瀏覽器中輸入網(wǎng)址: 務(wù)器是否正常運(yùn)行。 首先,從各個(gè)官方網(wǎng)站下載好各個(gè)軟件,因?yàn)檫M(jìn)行 JavaEE 開(kāi)發(fā)時(shí)使用的一系列軟件都需要 JavaSE 的支持,所以首先安裝 JDK 開(kāi)發(fā)環(huán)境。因?yàn)?MySQL數(shù)據(jù)庫(kù)是要通過(guò) SQL 命令來(lái)操作的不是很方便,為了對(duì)數(shù)據(jù)庫(kù)的操作能更簡(jiǎn)便,系統(tǒng)還需安裝 Navicate Lite ,這是一款具有可視化圖形用戶界面,操作安全簡(jiǎn)便的MySQL 數(shù)據(jù)庫(kù)服務(wù)器管理和開(kāi)發(fā)工具。從軟件角度出發(fā),系統(tǒng)需配置 Web 系統(tǒng)開(kāi)發(fā)工具,所以選擇了 Myeclipse 作為開(kāi)發(fā)軟件。所以要從硬件和軟件兩個(gè)方面考慮來(lái)配置系統(tǒng)。系統(tǒng)實(shí)現(xiàn)按功能模塊的劃分來(lái)分別實(shí)現(xiàn),循序漸進(jìn)。只有在對(duì)數(shù)據(jù)庫(kù)設(shè)計(jì)、系統(tǒng)結(jié)構(gòu)充分分析之后進(jìn)行系統(tǒng)開(kāi)發(fā)工作才能符合需求。理解了整個(gè) JavaEE 在系統(tǒng)架構(gòu)中的表現(xiàn)形式。通過(guò)對(duì)系統(tǒng)設(shè)計(jì)的分析知道該從哪個(gè)方面開(kāi)始著手做,并且清楚了每個(gè)角色的操作。 小結(jié): 系統(tǒng)設(shè)計(jì)在軟件工程中占了很重要的角色,并且是占用整個(gè)開(kāi)發(fā)周期中比較長(zhǎng)時(shí) 間的階段。 c o n n e c ts C on n e c t S t ri n g : S t ri n gs U s e r: S t ri n gs P a s s w or d : S t ri n gs D ri v e r: S t ri n g+g e t C on n e c t ion ( ) : C on n e c t ion+c los e C on n e c t ion ( c on : C on n e c t ion , rs : R e s u lt S e t , s t : S t a t e m e n t ) : b ool e a nd bO p e r a t es t : S t a t e m e n t = n u llrs : R e s u lt S e t = n u llre s u lt V a lu e : in t+g e t S t ( ) : S t a t e m e n t+s e t S t ( s t : S t a t e m e n t )+g e t R s ( ) : R e s u lt S e t+s e t R s ( rs : R e s u lt S e t )+i n s e rt ( c on n : C on n e c t ion , s I n s e rt S q l: S t ri n g ) : in t+s e le c t ( c on n : C on n e c t ion , s S e le c t S q l: S t ri n g ) : R e s u lt S e t+d e le t e ( c on n e c t : C on n e c t ion , s D e le t e S q l: S t ri n g ) : in t+u p d a t e ( c on n e c t : C on n e c t ion , s U p d a t e S q l: S t ri n g ) : in tu s eq u e s t io n D I+a d d Q u e ( q u e : q u e s t ion ) : b ool e a n+d e le t e Q u e ( q u e s t ion N u m : in t ) : b ool e a n+s e a rc h Q u e s t ion B y Q A ( c ou rs e N u m : in t , q u e s t ion A m ou n t : in t ) : L is t q u e s t ion +u p d a t e Q u e ( q u e : q u e s t ion ) : b ool e a n+s e a rc h A llB y C ou rs e N u m ( c ou rs e N u m : in t ) : L is t q u e s t ion +g e t Q u e s t ion ( q u e s t ion N u m : in t ) : q u e s t ionu s eq u e s t io nq u e s t ion N u m : in tq u e s t ion C on t : S t ri n gop t ion A : S t ri n gop t ion B : S t ri n gop t ion C : S t ri n gop t ion D : S t ri n gk e y : in ts c or e s : in tc ou rs e N u m : in t+g e t Q u e s t ion N u m ( ) : in t+s e t Q u e s t ion N u m ( q u e s t ion N u m : in t )+g e t Q u e s t ion C on t ( ) : S t ri n g+s e t Q u e s t ion C on t ( q u e s t ion C on t : S t ri n g )+g e t O p t ion A ( ) : S t ri n g+s e t O p t ion A ( op t ion A : S t ri n g )+g e t O p t ion B ( ) : S t ri n g+s e t O p t ion B ( op t ion B : S t ri n g )+g e t O p t ion C ( ) : S t ri n g+s e t O p t ion C ( op t ion C : S t ri n g )+g e t O p t ion D ( ) : S t ri n g+s e t O p t ion D ( op t ion D : S t ri n g )+g e t K e y ( ) : in t+s e t K e y ( k e y : in t )+g e t S c or e s ( ) : in t+s e t S c or e s ( s c or e s : in t )+g e t C ou rs e N u m ( ) : in t+s e t C ou rs e N u m ( c ou rs e N u m : in t ) 圖 47 測(cè)題 DAO操作測(cè)題信息表類圖 測(cè)題 DAO( questionDI)通過(guò)數(shù)據(jù)庫(kù)連接 connect 類中的連接數(shù)據(jù)庫(kù)的方法來(lái)獲取數(shù)據(jù)庫(kù)連接,再將連接和 SQL 語(yǔ)句傳遞給數(shù)據(jù)庫(kù)操作 dbOperator 類中的方法來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)中 question 表的操作。 從數(shù)據(jù)庫(kù)設(shè)計(jì)中得到相應(yīng)的 DAO 層的設(shè)計(jì)如圖 46 所示。 22 ( DAO)數(shù)據(jù)訪問(wèn)層設(shè)計(jì) ( DAO)數(shù)據(jù)訪問(wèn)層主要實(shí)現(xiàn)的功能是對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行操作,簡(jiǎn)而言之就是一系列的對(duì)數(shù)據(jù)庫(kù)中的記錄進(jìn)行增加、刪除、修改、查找操作。 21 當(dāng)學(xué)生申請(qǐng)導(dǎo)師時(shí)要傳遞學(xué)號(hào)和教師號(hào)到 Service 層來(lái)調(diào)用 Service 層的申 請(qǐng)方法, Service 層將參數(shù)傳遞至 DAO 層, DAO 層再調(diào)用數(shù)據(jù)庫(kù)操作方法,操作完成后以 applyInfor 對(duì)象的形式返回申請(qǐng)導(dǎo)師表中的一條記錄,其中 applyInfor 中的學(xué)號(hào)stuNum 和教師號(hào) teacherNum 分別依賴于學(xué)生表 student 中的學(xué)號(hào)和教師表 teacher 中的教師號(hào),具體如圖 45 所示。業(yè)務(wù)邏輯層不需要知道如何操作具體數(shù)據(jù),只要知道通過(guò) DAO 層的什么方法得到什么參數(shù),或者傳遞什么參數(shù)從而能達(dá)到功能的實(shí)現(xiàn)。業(yè)務(wù)邏輯層提供了一系列可提供給用戶的服務(wù),是對(duì)用戶問(wèn)題提供解決的方法。老師同意學(xué)生預(yù)選則可以分配課題給學(xué)生,學(xué)生可以查看課題信息;拒絕則給出拒絕信息,學(xué)生可以查看老師拒絕信息。 20 學(xué)生 教師測(cè)試課程預(yù)選導(dǎo)師查看學(xué)生測(cè)試成績(jī)處理學(xué)生預(yù)選是否同意預(yù)選?查看教師拒絕信息分配課題否是查看課題信息 圖 44學(xué)生選題活動(dòng)圖 學(xué)生首先進(jìn)行測(cè)試,系統(tǒng)根據(jù)學(xué)生擅長(zhǎng)的課程推薦課題及老師,學(xué)生預(yù)選課題對(duì)應(yīng)的老師。 19 登陸開(kāi)始測(cè)試查看個(gè)人信息是否已經(jīng)測(cè)試?進(jìn)行測(cè)試是查看測(cè)試成績(jī)是否測(cè)試完畢?否是查看測(cè)試報(bào)告退出系統(tǒng)預(yù)選老師否 圖 43 學(xué)生活動(dòng)圖 當(dāng)學(xué)生為登陸后可以進(jìn)行測(cè)試或查看個(gè) 人信息,如果還未進(jìn)行測(cè)試則測(cè)試成績(jī)、測(cè)試報(bào)告、預(yù)選老師業(yè)務(wù)都無(wú)數(shù)據(jù)顯示,如果已經(jīng)測(cè)試則可以查看到測(cè)試成績(jī)、測(cè)試報(bào)告、預(yù)選老師、退出系統(tǒng)。在頁(yè)面顯示數(shù)據(jù)時(shí)傳遞的是對(duì)象數(shù)組。 Ajax 技術(shù)實(shí)現(xiàn)了瀏覽器與服務(wù)器之間數(shù)據(jù)的異步傳輸, Ajax 中是使用 JavaScript 來(lái)傳遞數(shù)據(jù)給業(yè)務(wù)邏輯層,業(yè)務(wù)邏輯層將處理后要返回的數(shù)據(jù)傳回給請(qǐng)求數(shù)據(jù)的客戶端 JSP 頁(yè)面,頁(yè)面再通過(guò) DOM( Document Object Model)顯示新數(shù)據(jù),在整個(gè)過(guò)程中用戶可以不手動(dòng)刷新頁(yè)面。當(dāng)業(yè)務(wù)邏輯層將數(shù)據(jù)傳遞給相應(yīng)的 Action 后,通過(guò) 中的映射來(lái)跳轉(zhuǎn)到相應(yīng)的 JSP 頁(yè)面,在頁(yè)面中使用 Struts2 標(biāo)簽就可以將傳遞過(guò)來(lái)的參數(shù)顯示在頁(yè)面中。其中又用到了Struts2 的標(biāo)簽和 Ajax 技術(shù)。根據(jù)所見(jiàn)即所得原理,表示層將業(yè)務(wù)邏輯層返回的數(shù)據(jù)以用戶能理解的形式在頁(yè)面中顯示,用戶通過(guò)表示層提供的接口輸入數(shù)據(jù),通過(guò)頁(yè)面來(lái)傳遞數(shù)據(jù)到后臺(tái)業(yè)務(wù)邏輯層進(jìn)行處理。關(guān)系型數(shù)據(jù)庫(kù)要滿足三類完整性約束,即實(shí)體完整性,參照完整性,用戶自 定義的完整性 [7]。此時(shí)一次請(qǐng)求服務(wù)完成。 DAO 層調(diào)用 Bean 中對(duì)象實(shí)現(xiàn)持久化方法,對(duì)關(guān)系數(shù)據(jù)庫(kù)進(jìn)行操作。 Web 表示層用于獲取提交的數(shù)據(jù)、顯示請(qǐng)求的業(yè)務(wù)功能返回的數(shù)據(jù)。系統(tǒng)體系結(jié)構(gòu)如下圖 41 所示。 ( 3)設(shè)計(jì)應(yīng)該包含數(shù)據(jù)抽象和過(guò)程抽象 ( 4)模塊與外部環(huán)境之間的接口盡量少 ( 5)系統(tǒng)盡量簡(jiǎn)單,減少處理的時(shí)間和費(fèi)用 16 ( 6)系統(tǒng)數(shù)據(jù)的一致性,對(duì)于系統(tǒng)中的相同信息的顯示和存儲(chǔ)要一致 ( 7)系統(tǒng)具備一定的出錯(cuò)處理功能,提高系統(tǒng)的可靠性。為了能設(shè)計(jì)出符合需求的系統(tǒng),設(shè)計(jì)時(shí)要遵守以下原則: ( 1)結(jié)構(gòu)應(yīng)該 分層次,從而建立軟件成分之間的控制 [6]。系統(tǒng)設(shè)計(jì)還應(yīng)該以易于實(shí)現(xiàn)、易于測(cè)試、易于維護(hù)為基本理念。對(duì)于數(shù)據(jù)庫(kù)的設(shè)計(jì),要充分考慮到數(shù)據(jù)的存儲(chǔ)需求并充分利用不同數(shù)據(jù)類型的優(yōu)勢(shì)來(lái)選擇存儲(chǔ)數(shù)據(jù)類型。對(duì)于不同專業(yè)的學(xué)生要評(píng)測(cè)出真實(shí)的水平,測(cè)試系統(tǒng)題型應(yīng)該與學(xué)生所 學(xué)專業(yè)設(shè)置的課程掛鉤,并且有難易程度的過(guò)度。從用戶的使用感受考慮,系統(tǒng)設(shè)計(jì)時(shí)應(yīng)該盡量以使用簡(jiǎn)單、操作一目了然、界面友好、有交互性為主。根據(jù)軟件工程中軟件設(shè)計(jì)的抽象與逐