【文章內(nèi)容簡(jiǎn)介】
有效的搜索方法,并在最后監(jiān)測(cè)藥物影響的時(shí)候?yàn)榫W(wǎng)上用戶提供更加詳細(xì)的已選藥物間不良反應(yīng)、飲食禁忌、用藥重復(fù)檢測(cè)。大量的網(wǎng)上用戶訪問促使我們決定使用經(jīng)典 Java EE 架構(gòu)進(jìn)行構(gòu)建。 經(jīng)典 Java EE 組件 經(jīng)典 Java EE 應(yīng)用大致包括以下組件: ( 1)控制器組件: Java EE 的 MVC 框架提供了一個(gè)前端核心控制器,攔截用戶請(qǐng)求,并將請(qǐng)求轉(zhuǎn)發(fā)給用戶實(shí)現(xiàn)的控制器組件。用戶實(shí)現(xiàn)的控制器組件處理調(diào)用業(yè)務(wù)邏輯方法,處理用戶請(qǐng)求。 ( 2)業(yè)務(wù)邏輯組件:業(yè)務(wù)邏輯組件負(fù)責(zé)實(shí)現(xiàn)系統(tǒng)的業(yè)務(wù)邏輯,一般由 Session Bean 實(shí)現(xiàn)。一次用戶操作一般對(duì)應(yīng)一個(gè)業(yè)務(wù)邏輯方法。一個(gè)業(yè)務(wù)邏輯方法是一個(gè)整體的,因此需要對(duì)業(yè)務(wù)邏輯方法增加事務(wù)性。業(yè)務(wù)邏輯方法應(yīng)當(dāng)僅負(fù)責(zé)實(shí)現(xiàn)業(yè)務(wù)邏輯,不進(jìn)行數(shù)據(jù)庫訪問。 浙江大學(xué)碩士學(xué)位論文 第 2 章 相關(guān)技術(shù)綜述 6 ( 3) EAO組件:實(shí)體訪問對(duì)象( Entity Access Object),通常采用 Session Bean 來實(shí)現(xiàn)。相當(dāng)于輕量級(jí) Java EE 的 DAO 對(duì)象,提供對(duì) Entity 對(duì)象的添、讀、修、刪操作。 ( 4) Entity 對(duì)象:系統(tǒng)的對(duì)象模型抽象。領(lǐng)域?qū)ο蟮臓顟B(tài)一般都必須保存在數(shù)據(jù)庫里面。因此,每個(gè) Entity 都映射到一個(gè)或多個(gè)數(shù)據(jù)庫表。 ( 5)表現(xiàn)層組件:收集用戶輸入數(shù)據(jù)或向客戶顯示系統(tǒng)狀態(tài)。表現(xiàn)層組件可以是某種表現(xiàn)層技術(shù),普通的應(yīng)用程序,或者是小型智能設(shè)備。 EJB技術(shù) Enterprise Java Bean 簡(jiǎn)稱 EJB,有時(shí)也稱為企業(yè) Bean 或企業(yè)級(jí) Bean。作為一種可重用的分布式對(duì)象計(jì)算技術(shù), EJB 可用于部署開發(fā)分布式的、多層結(jié)構(gòu)的、面向?qū)ο蟮?Java 應(yīng)用系統(tǒng)的跨平臺(tái)組件體系結(jié)構(gòu) [2]。 EJB組件在使設(shè)計(jì)開發(fā)系統(tǒng)級(jí)應(yīng)用更簡(jiǎn)單的同時(shí)還使得系統(tǒng)具有良好的移植性、擴(kuò)充性和維護(hù)性 [3]。 EJB 運(yùn)行在 EJB 容器中時(shí), EJB 容器會(huì)提供包括持久化、數(shù)據(jù)緩存、聲明性安全、負(fù)載均衡、錯(cuò)誤修復(fù)及事務(wù)性處理的系統(tǒng)級(jí)服務(wù) [4]。 Enterprise Bean 又可分為三種:會(huì)話 Bean、實(shí)體 Bean、消息驅(qū)動(dòng) Bean。 Session Bean(會(huì)話 Bean): 是應(yīng)用的業(yè)務(wù)邏輯層的 Fa231。ade。 Session Bean比 Spring 容器中的 POJO Bean 的功能更加強(qiáng)大,它支持如下功能: ( 1)并發(fā)和線程安全 ( 2)開發(fā)者無需理會(huì)多客戶端并發(fā)的線程安全問題,只要像開發(fā)普通 Java類一樣開發(fā) EJB3 就可, EJB 容器會(huì)為之提供多線程并發(fā)功能和保證線程安全。 ( 3)事務(wù)和安全管理 EJB 容器可以以聲明式的方式來管理其內(nèi)的 Session Bean 的事務(wù)和安全。EJB3 的 Session Bean 分為有狀態(tài)會(huì)話 Bean(Stateful Session Bean)和無狀態(tài)會(huì) 話 Bean(Stateless Session Bean)兩類。 Stateful Session Bean 需要 EJB 容器更高的系統(tǒng)開銷來維護(hù)客戶端狀態(tài),因此性能較 Stateless Session Bean 低。 事務(wù)和 JTA 事務(wù)控制作為 J2EE 應(yīng)用中的一環(huán),保證一系列數(shù)據(jù)庫操作不發(fā)生錯(cuò)誤,從而保證應(yīng)用業(yè)務(wù)邏輯成功執(zhí)行和底層數(shù)據(jù)庫完整。 事務(wù)有四個(gè)特性:原子性、一致性、隔離性和持續(xù)性。 浙江大學(xué)碩士學(xué)位論文 第 2 章 相關(guān)技術(shù)綜述 7 JTA 事務(wù)由 Java EE 事務(wù)管理器負(fù)責(zé)控制,可以保證多個(gè)數(shù)據(jù)庫更新的一致性,通過 JTA即可實(shí)現(xiàn)全局事務(wù)控制。 開發(fā)者可以 通過使用 JTA,用一種與事務(wù)管理器無關(guān)的方式來 start、 mit或 roll back 事務(wù)。 Java EE 應(yīng)用服務(wù)器通過 Java Transaction Service(簡(jiǎn)稱JTS, Java 事務(wù)服務(wù))來實(shí)現(xiàn) Java EE 事務(wù)管理器。應(yīng)用程序不用直接使用 JTS方法,只需面向 JTA 方法就可由 JTA 來調(diào)用底層 JTS進(jìn)行事務(wù)處理。 EJB的事務(wù)管理 EJB 有兩種事務(wù)管理方式,這兩種事務(wù)管理方式通常都建立在 JTA 基礎(chǔ)之上。一種是通過容器管理事務(wù)( CMT)以聲明式方式來管理事務(wù);另一種則在 EJB 內(nèi)部使用事務(wù)管理代碼 由開發(fā)者自己管理事務(wù)( Bean 管理事務(wù),簡(jiǎn)稱 BMT)。 容器管理事務(wù)( CMT): EJB 默認(rèn)使用容器管理事務(wù)。當(dāng)使用 CMT 事務(wù)管理策略時(shí),容器將接管 EJB的事務(wù)管理,為我們完成事務(wù)的 start、 mit 和 roll back。容器總是在業(yè)務(wù)方法的開始、結(jié)束處標(biāo)記事務(wù)邊界,也就是說,容器將在調(diào)用方法之前開始 JTA事務(wù),然后根據(jù)方法的調(diào)用情況來決定提交或回滾事務(wù)。 當(dāng)使用 CMT 事務(wù)管理策略時(shí),開發(fā)者無需為事務(wù)控制編寫任何代碼,只需通過 Annotation 或 XML 配置文件告訴容器如何處理事務(wù)即可。 當(dāng)使用容器管 理事務(wù)時(shí),業(yè)務(wù)方法不應(yīng)該調(diào)用任何可能與容器所設(shè)置事務(wù)注解沖突的方法。 默認(rèn)事務(wù)管理類型為 CMT。因?yàn)?BMT 在實(shí)現(xiàn)事務(wù)管理時(shí)需要大量的硬編碼,導(dǎo)致事務(wù)邏輯難以切換,同時(shí) Session Bean 中業(yè)務(wù)和事務(wù)邏輯也混雜在一起。除此之外,當(dāng)客戶端調(diào)用 BMT 方法時(shí),會(huì)暫停當(dāng)前已有事務(wù),制約了組件的重用。 JPA規(guī)范 原先, Java EE 和 Java SE 應(yīng)用的對(duì)象持久化比較麻煩,同時(shí) ORM 技術(shù)非常多,如果換了一種實(shí)現(xiàn)就必須去重新學(xué)習(xí),然后重新編寫代碼。因而,出于簡(jiǎn)化和標(biāo)準(zhǔn)化考慮, Sun 官方提供了 JPA 用于提供持久化標(biāo)準(zhǔn) 規(guī)范 [5]。通過使用 JPA,可以使得 EAO層更加標(biāo)準(zhǔn)規(guī)范,同時(shí)也擺脫了原先對(duì)各種 ORM實(shí)現(xiàn)的依賴,從而使得系統(tǒng)更加易于維護(hù)和移植。 JPA 是 JSR220 實(shí)現(xiàn)的一部分,開發(fā)人員為 軟件專家組 [6]。但它是一浙江大學(xué)碩士學(xué)位論文 第 2 章 相關(guān)技術(shù)綜述 8 種用于 Java 持久化的輕量級(jí)且基于 POJO 的框架 [7]。除了可以在基于 EJB 的 Java EE 應(yīng)用中使用外, JPA 同時(shí)也完全可以在普通 Java SE 中使用。因?yàn)槭腔?POJO的框架,所以 JPA 非常優(yōu)雅;更為可貴的是它非常簡(jiǎn)單,所以易于學(xué)習(xí)和掌握 [8]。JPA 大致包括以下三種組件: 映射元 數(shù)據(jù) ORM 映射元數(shù)據(jù)有些地方又稱為實(shí)體,只是通過 XML 映射文件或 Annotation建立了和底層數(shù)據(jù)表之間對(duì)應(yīng)關(guān)系的 POJO。 2. Entity Manager 實(shí)體因?yàn)槭瞧胀ǖ?POJO,沒有持久化能力。因而 JPA提供了 Entity Manager來對(duì) Entity 進(jìn)行操作。除此之外,實(shí)體管理器還可以通過與持久化上下文(persistence context)進(jìn)行交互來轉(zhuǎn)換實(shí)體不同狀態(tài) [9]。 查詢 通過面向?qū)ο蟮牟樵冋Z言查詢數(shù)據(jù)來減小程序與 SQL的耦合度 [10]。 JPA 只是制定了一個(gè) API,供應(yīng)商可以做出自己的實(shí)現(xiàn),而且開發(fā)人員也可以對(duì)某些 API 進(jìn)行自定義 [11]。按照 Sun 的預(yù)想,開發(fā)者可以隨意地選擇切換 JPA實(shí)現(xiàn)。 JSF應(yīng)用框架介紹 Java Server Faces 簡(jiǎn)稱 JSF,是一種 SUN 公司在 Java EE 規(guī)范中設(shè)計(jì)的一種搭建 Java Web 應(yīng)用程序的 MVC框架。 JSF 主要有如下五大優(yōu)勢(shì): 。 UI 組件的值綁定到服務(wù)器端的數(shù)據(jù)模型。 。 4. UI 組件具有高度的重用和擴(kuò)展特性,適合構(gòu)造用 戶界面。 UI 狀態(tài)和跨請(qǐng)求保存。 借助于這幾大優(yōu)勢(shì),成功封裝了請(qǐng)求 響應(yīng)模型,允許開發(fā)者采用面向?qū)ο蟮氖录ㄐ拍P瓦M(jìn)行 RAD 方式開發(fā) Web 應(yīng)用,避免了以往基于請(qǐng)求、響應(yīng)和標(biāo)記來考慮問題的弊端 [12]。通過 JSF,用戶可以在頁面中使用 web 組件、捕獲用戶行為產(chǎn)生的事件、進(jìn)行驗(yàn)證和頁面導(dǎo)航等,實(shí)現(xiàn)用戶界面到業(yè)務(wù)邏輯層的直接映射,省去了大部分需要開發(fā)者處理的 HTTP 細(xì)節(jié) [13]。由于 JSF 是一個(gè)開放架構(gòu),開發(fā)浙江大學(xué)碩士學(xué)位論文 第 2 章 相關(guān)技術(shù)綜述 9 人員可以通過自己創(chuàng)建或者繼承已有組件的方式來開發(fā)自己的組件,因而具有很強(qiáng)的靈活性和可擴(kuò)展性 [14]。 Mockito介紹 隨著快速應(yīng)用開發(fā)模式( RAD)和程序規(guī)模越來越大,項(xiàng)目越來越需要借助自動(dòng)軟件測(cè)試來解決測(cè)試繁重、測(cè)試效率低等問題。由于 java單元測(cè)試框架 Junit難以構(gòu)造對(duì)象、方法,于是又引入 Mock Object 來解決這個(gè)問題。但 JMock 和easyMock 這兩種框架的實(shí)現(xiàn)都局限于用 Mock 技術(shù)模擬被測(cè)試方法依賴的外部對(duì)象 ,mocking 是由期望 運(yùn)行 驗(yàn)證庫決定 [15]。 Mockito 提供了一種更簡(jiǎn)單,更直觀的方法: mock 在執(zhí)行后的交互。使用 mockito 可以專心驗(yàn)證想要驗(yàn)證的東西,而不是像 在使用期望 運(yùn)行 驗(yàn)證庫時(shí)被迫經(jīng)常處理無關(guān)交互。沒有期望 運(yùn)行 驗(yàn)證同時(shí)也意味著 Mockito 在 mock 時(shí)通常不需要昂貴的啟動(dòng)前期準(zhǔn)備。他們的目標(biāo)是透明的,從而使開發(fā)人員將精力集中于測(cè)試選定的行為而不是注意力被別的吸走。 Mockito 擁有簡(jiǎn)潔的 API,幾乎不需要花時(shí)間去啟動(dòng)模擬行為。只有一種方法創(chuàng)建模擬。 Mockito 的語法和 jMock 與 EasyMock 類似,因此可以放心重構(gòu)。不同的地方在于通過在執(zhí)行后校驗(yàn)什么已經(jīng)被調(diào)用,消除了對(duì)期望行為的需求。消除了因在執(zhí)行前需要記錄期望行為導(dǎo)致的丑陋初始化代碼。 本章小 結(jié) 本章主要闡述了含有藥物影響搜索功能的系統(tǒng)的功能特點(diǎn),并分析了本項(xiàng)目將會(huì)使用到的主要技術(shù),以及這些技術(shù)所具有的特性和優(yōu)點(diǎn)。 浙江大學(xué)碩士學(xué)位論文 第 3 章 系統(tǒng)的需求分析及設(shè)計(jì) 10 第 3章 系統(tǒng)的需求分析及設(shè)計(jì) 需求分析 客戶要求設(shè)計(jì)一個(gè)網(wǎng)上安全用藥查詢系統(tǒng),可以自動(dòng)幫助用戶查看詳細(xì)的藥物影響。 首先是分析設(shè)計(jì)一種更科學(xué)且更簡(jiǎn)便有效的搜索方法,通過藥品的學(xué)名或者品牌名進(jìn)行搜索。點(diǎn)擊進(jìn)入查看詳細(xì)信息的時(shí)候可以查看這種藥物有哪幾種藥物形式和藥物劑量組合。 最后檢測(cè)藥物影響的時(shí)候提供比用藥配伍禁忌更加詳細(xì)的已選藥物間不良反應(yīng)、飲食禁忌、用藥重復(fù)等檢測(cè)。 舉個(gè)例子來說,消費(fèi)者 在網(wǎng)上買了多種藥物,但是他不知道詳細(xì)的藥物影響或者只知道自己購買的這種組合不屬于國(guó)家藥物配伍禁忌里面的組合,至于所購買的藥物間是否有藥物重復(fù),藥物食物反應(yīng)和輕微的藥物間反應(yīng)則需要消費(fèi)者自己研究復(fù)雜的藥物說明書。 傳統(tǒng)情況下消費(fèi)者可能會(huì)由于麻煩而不去看藥物說明書,或者由于藥物說明書的復(fù)雜性而沒有看出來自己同時(shí)購買的藥物不宜同時(shí)使用。以 2020 年舉辦的“百姓安全用藥調(diào)查”結(jié)果來看,我國(guó)不合理用藥的人占總用藥人數(shù)的 12%32%,情況非常嚴(yán)重 [16]。 有了藥物查詢軟件后,消費(fèi)者可以輕松地根據(jù)藥物名稱和藥物吸收途 徑、劑型、劑量準(zhǔn)確地搜索到自己準(zhǔn)備購買的藥物。系統(tǒng)通過藥物的吸收途徑給出哪幾種藥物間會(huì)發(fā)生什么級(jí)別的藥物影響,是否有用藥重復(fù),以及是否有藥物和食物反應(yīng)。 浙江大學(xué)碩士學(xué)位論文 第 3 章 系統(tǒng)的需求分析及設(shè)計(jì) 11 具體操作流程如圖 所示, S S O w e bS e c u r i t y D e s i g n L o g i cM e m b e r A c c e s s 2 . 0D r u g S e a r c h R e s u l t sD r u g S e a r c h D r u g I n f o r m a t i o nD r u g L i s tD r u g I n t e r a c t i o n S u m m a r yC o n d i t i o n R e s u l t s 圖 web流程 圖 藥物信息結(jié)構(gòu)設(shè)計(jì) 通 過仔細(xì)分析用藥現(xiàn)狀,考慮到藥品具有的劑量大小、藥品形式、吸收方式。同時(shí)市場(chǎng)上流通的藥品使用的多是其商業(yè)名 而非學(xué)術(shù)名,將藥品的信息結(jié)構(gòu)設(shè)計(jì)圖如圖 所示, I n g r e d i e n tG e n e r i cD r u gR o u t e dG e n e r i cR o u t e d D o s eF o r m G e n e r i cD i s p e n s a b l eG e n e r i cD i s p e n s a b l eD r u gR o u t e d D o s eF o r m D r u gR o u t e dD r u gD r u gN a m eN a v i g a t i o n v i a m e t h o d c a l lN a v i g a t i o n v i a I D l o a d 圖 藥物信息結(jié)構(gòu)設(shè)計(jì) 浙江大學(xué)碩士學(xué)位論文 第 3 章 系統(tǒng)的需求分析及設(shè)計(jì) 12 以下是通用名藥的信息結(jié)構(gòu)定義: 表 通用名藥概念 詳細(xì)信息 例子 Ingredient 成分名 華法林鈉 GenericDrug 藥名 華法林鈉 RoutedGe