《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 业界动态 > 基于J2EE & Web Services的电子病历系统的设计与实现

基于J2EE & Web Services的电子病历系统的设计与实现

2009-01-05
作者:朱倩

引?? 言?

??? 醫(yī)院信息系統(tǒng)(Hospital Information System 簡稱HIS)是醫(yī)療機構(gòu)信息化的產(chǎn)物,在一些發(fā)達國家(如美國、日本)中,對HIS的研究和運用已有幾十年的歷史。隨著計算機信息網(wǎng)絡(luò)技術(shù)的提高,人們對信息需求的數(shù)量、質(zhì)量、速度也越來越高,加上國際醫(yī)學(xué)信息標(biāo)準化、電子化的推進,促使人們在HIS的基礎(chǔ)上開始嘗試由現(xiàn)在的紙張醫(yī)療信息管理向電子化(電子病歷系統(tǒng)Computer-based Patient Record systems簡稱CPRs)邁進。它不是簡單地將現(xiàn)有病歷計算機存儲,而是一個多對多的,在Internet上通過Web Services實現(xiàn)各醫(yī)療機構(gòu)信息共享與交互,具有一定智能化的跨平臺系統(tǒng)。CPR將是醫(yī)院計算機網(wǎng)絡(luò)化管理的核心。

??? 對于這樣一個系統(tǒng),必須要求它具有良好的通用性和共享性。JAVA 從誕生到現(xiàn)在其跨平臺優(yōu)越性及其在網(wǎng)絡(luò)編程的出色表現(xiàn)得到了實踐的證明,以Java 2為核心的J2EE提供了一個企業(yè)級的計算模型和運行環(huán)境用于開發(fā)和部署瘦客戶端,多層體系結(jié)構(gòu)的應(yīng)用,滿足了用一種健壯的、安全的、事務(wù)性的方法在 Web 上提供現(xiàn)有的應(yīng)用程序和業(yè)務(wù)流程的需要,因此稱霸企業(yè)信息化平臺;使用XML作為數(shù)據(jù)交換格式,Web Services通過一系列標(biāo)準和協(xié)議(如SOAP,UDDI,WSDL)來保證程序之間的動態(tài)連接,允許應(yīng)用程序可跨編程語言和操作系統(tǒng)進行交互的優(yōu)越性非常明顯。兩者的結(jié)合能使開發(fā)人員輕松構(gòu)架復(fù)雜強大的Web Services應(yīng)用。本文介紹的電子病歷系統(tǒng)正是采用了J2EE架構(gòu)和Web Services技術(shù)。?

需求分析和系統(tǒng)設(shè)計?

??? 電子病歷系統(tǒng)并不是簡單的紙張病歷”電子化”,它至少應(yīng)該具備:1. 信息資源共享:醫(yī)院各個科室的醫(yī)生在任何地方、任何時候只要有聯(lián)網(wǎng)的計算機,就能調(diào)閱到本醫(yī)院的全部病歷記錄, 會診的醫(yī)院之間能查到在任何一個醫(yī)院的病人病歷;2. 強大的提示系統(tǒng):病人能看到醫(yī)生對自己診斷開出的臨時或長期醫(yī)囑,能及時向醫(yī)生反饋用藥情況;對醫(yī)務(wù)工作人員有藥物配伍禁忌,醫(yī)療方法不正當(dāng)?shù)奶崾?是智能化醫(yī)療的一種體現(xiàn);3. 支持醫(yī)療信息資料庫:有電子信息可供學(xué)習(xí),以及關(guān)于病例治療最新方法供醫(yī)療人員在工作時查詢使用。

這樣的設(shè)計完全符合了MVC(Model -view-controller)模式。
當(dāng)J2EE映射到MVC各部分時: 模型(Model)是數(shù)據(jù)源,是鏈接數(shù)據(jù)庫
獲得數(shù)據(jù)的EJB或JavaBean;視圖(View)是JSP或是Servlets;控制
(Controller)它連接選定的視圖到數(shù)據(jù),就是數(shù)據(jù)表。核心業(yè)務(wù)過程應(yīng)
該完全不依賴于特定的客戶端程序。業(yè)務(wù)邏輯和視圖元素之間的數(shù)據(jù)交互分配
給控制器完成,J2EE的業(yè)務(wù)邏輯組件獲得相當(dāng)高的可重用性。

系統(tǒng)實現(xiàn)關(guān)鍵技術(shù)
1) 本系統(tǒng)的一個EJB----實現(xiàn)病歷管理
??? 一般一個EJB是由Home接口、遠程接口和Bean類,以及輔助的類組成。Remote接口定義EJB組件中提供的可供用戶調(diào)用的方法,及實現(xiàn)商業(yè)邏輯的函數(shù)或過程,以供遠程客戶端調(diào)用;Home接口定義一組方法來創(chuàng)建新的EJB對象,查找,定位和清除已有的EJB對象; EJB Object為網(wǎng)絡(luò)可視對象,包含Stub和Skeleton作為Bean的代理。這樣的結(jié)構(gòu)使得訪問遠程對象就像訪問本地對象一樣,保證分布式的應(yīng)用,增加各組件互操作性。本系統(tǒng)中所有數(shù)據(jù)都封裝到實體Bean中。下面介紹本系統(tǒng)中一個EJB接口,DiagnosisOpr(病歷管理):
import java.util.*;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
import com..diagnosis.tool.*;
public interface DiagnosisOpr extends EJBObject{
?/** 往病歷表中增加病歷信息? *@param ht 保存病歷的字段名稱和值? */
?public void addDiagnosis(Hashtable ht) throws Dexception,RemoteException;
/** 根據(jù)病人id 刪除病歷信息 ?*/
?public void delDiagnosis(String strSufferer Id) throws Dexception,RemoteException;
/** 根據(jù)病人id 得到病歷信息?*/
?public Hashtable getDiagnosis(String strSufferer Id) throws Dexception,RemoteException;
??。。。。。。}
??? 假如醫(yī)生想在查看病人的以往的病歷信息,那么程序就是調(diào)用getDiagnosis()方法,得到病人的病歷信息。在DiagnosisOpr類中,就是:
public Hashtable getDiagnosis(String strSufferer Id) throws Dexception,RemoteException
{?if(找不到病人的ID)
throw new Dexception???????????? //拋出異常
else{? 根據(jù)病人的ID,從數(shù)據(jù)庫中讀取指定的病人的病歷信息,然后按照一定的算法把這些信息壓到Hashtable中。}
}
??? 在頁面展現(xiàn)的時候,jsp頁面得到的是一個Hashtable對象,這樣訪問數(shù)據(jù)庫的處理交給EJB來完成的,jsp只是負責(zé)展現(xiàn)。EJB體現(xiàn)了將商業(yè)邏輯與底層的系統(tǒng)邏輯分開,使開發(fā)者只需關(guān)心商業(yè)邏輯,而由EJB容器實現(xiàn)目錄服務(wù),事務(wù)處理等底層系統(tǒng)邏輯核心思想。
2)?SOAP協(xié)議中傳輸醫(yī)療圖片
??? SOAP協(xié)議是Web Services中的關(guān)鍵技術(shù),它是一種使用XML編碼數(shù)據(jù)的以文本為基礎(chǔ)的關(guān)于消息傳遞的有線協(xié)議,它規(guī)定了Web Services之間是怎樣傳遞信息的。為Java的平臺無關(guān)性,可移植性帶來了更高層次的協(xié)同操作能力。
在電子病歷系統(tǒng)中保存了病人的照片,X光片,以及CT光片等等輔助治療的圖片。當(dāng)其他系統(tǒng)如診斷系統(tǒng)需要這些圖片的時候,就可以通過SOAP協(xié)議傳送這些圖片。實現(xiàn)方法是SOAP消息與一個或多個圖片聯(lián)系起來,并保留圖片的原始格式,作為一個多組分MIME結(jié)構(gòu)來傳輸。這種實現(xiàn)方法是將多組分MIME結(jié)構(gòu)作為傳輸協(xié)議綁定的一個基本組成部分,也就是說,對于SOAP消息而言,它等同于傳輸協(xié)議報頭。下面的例子是帶一個圖片的SOAP1.1消息,其中圖片的內(nèi)容是病人的X光片(username_x1.jpg)。
MIME-Version: 1.0
Content-Type:Multipart/Related;
boundary=MIME_boundary;
type=text/xml;
start="< username_x1.xml@sina.com >"
Content-Description: 病人的X光片
--MIME_boundary?
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: 8bit
Content-ID: < username_x1.xml@sina.com>




href="cid: username_x1.jpg@sina.com"/>



--MIME_boundary
Content-Type: image/jpg
Content-Transfer-Encoding: binary
Content-ID:
...二進制jpg圖片...
--MIME_boundary--
??? 后端服務(wù)實現(xiàn):后端服務(wù)實現(xiàn)是在類 PicManagementImpl 中使用公共可訪問的服務(wù)方法如 SubmitArrayOfPics 和 FetchPics 處理的。這里的 SubmitArrayOfPics 服務(wù),是一個基于 RPC 的 SOAP 服務(wù)方法,參數(shù)包括 SOAPContext(用來處理圖片)、User(用戶信息,用來認證訪問者的信息)和一個 PicInfo 數(shù)組(提交到服務(wù)器的圖片)。FetchPics 方法是一個基于 RPC 的服務(wù),用戶信息和文檔引用對象都作為其參數(shù)。文檔引用對象包含有關(guān)已經(jīng)提交給服務(wù)器并保存在服務(wù)器中的文檔的信息(picRefId)。?程序片斷如下:
/*apache soap*/? import org.apache.soap.*;???? import org.apache.soap.rpc.*;
import org.apache.soap.util.xml.XMLParserUtils;??? import org.apache.soap.encoding.SOAPMappingRegistry;
/* MIME*/ import javax.activation.*;?? import javax.mail.*;? import javax.mail.internet.*;
/* java*/ import java.util.*;????????? import java.io.*;
public class PicManagementImpl implements PicManagement{
/** 發(fā)送一段圖片數(shù)組,圖片數(shù)據(jù)必須從SOAPContext中返回,一旦數(shù)據(jù)返回就保存到數(shù)據(jù)庫中,并給用戶返回圖片的reference */
?public PicReference[] SubmitArrayOfPics(SOAPContext requestContext, User user,
PicInfo[] localPicInfo) ? ?throws Dexception ,Exception?{}
??? /** 根據(jù)PicReference返回服務(wù)器上的圖片信息(數(shù)據(jù)庫中的圖片信息),所有
的圖片信息作為附件返回給用戶 */
public void FetchPics (PicReference[] picRef) throws Dexception ,Exception{}
??? /** 在服務(wù)器上保存圖片,并返回操作結(jié)果(PicReference)*/
private synchronized PicReference savePic(User user, PicInfo userDefinedPicName,
Object content)??? throws Dexception ,Exception{}?
?。。。。。。}
??? 如上面服務(wù)代碼中所示,使用 SOAPContext 請求對象來獲取附件信息。這個對象包含主體部件,主體部件是一組 MIME 部件,其中根部件包含 SOAP 信封。接受到這個MIME消息后,可以從 MIME 主體部件抽取許多信息,包括內(nèi)容標(biāo)識、內(nèi)容類型和位置。
????客戶機服務(wù)實現(xiàn):客戶機代碼在 SOAPMappingRegistry 中創(chuàng)建類型映射信息來組織和解組 Java 技術(shù)類如 User(用戶信息類)、PictInfo(圖片信息類) 和 PicReference(圖片的引用) 并將其和請求對象綁定在一起,代碼如下所示:
?BeanSerializer beanSer = new BeanSerializer();? // 以下為設(shè)置 SOAP mapping registry
?SOAPMappingRegistry smr = new SOAPMappingRegistry();
?smr.mapTypes(Constants.NS_URI_SOAP_ENC,new QName
?("urn:xml-docmanger-webservice", "user"),User.class, beanSer, beanSer);?
request.setSoapMappingRegistry(smr);?????? // 設(shè)置 mapping registry
?? 如上代碼使用 bean 序列化器類(BeanSerializer)對類(如 User,遵守 JavaBean 的設(shè)計模式)進行序列化和反序列化。
?? 下面是發(fā)送圖片的部分代碼:byteStream 是從數(shù)據(jù)庫中讀出來的圖片字節(jié)流
?DataSource ds = new ByteArrayDataSource(byteStream.toByteArray(), null);
DataHandler dh = new DataHandler(ds);
??? MimeBodyPart mbp = new MimeBodyPart();
??? mbp.setDataHandler(dh);
request.addAttachment(mbp);????????????? // 把圖片加入到服務(wù)請求上
3)?連接數(shù)據(jù)庫
??? Java中連接數(shù)據(jù)庫的技術(shù)是JDBC,本系統(tǒng)采用JDBC2.0標(biāo)準,通過使用 DataSource 接口(javax.sql.ConnectionPoolDataSource該接口充當(dāng)合用的 java.sql.Connection 對象的資源管理器連接 factory),J2EE 組件可以獲得物理數(shù)據(jù)庫連接對象:
Context?ctx?=?new?InitialContext();
DataSource?ds?=?(DataSource)?ctx.lookup("jdbc/UserDB");//用UserDB對應(yīng)DataSource對象Connection?conn?=?ds.getConnection("password","username");? //獲得Connection對象
JDBC2.0的另一個新規(guī)范是Connection?Pooling,( javax.sql.PooledConnection)每一個連接
池對象管理一組JDBC連接對象,每一個連接對象可以被任意數(shù)量的Servlet共享。finally{if(con?!=?null)?con.close();}保證了連接的循環(huán)利用,減小建立連接開銷。為了減少與服務(wù)器以及數(shù)據(jù)庫之間的連接次數(shù),可把從數(shù)據(jù)庫中讀取的內(nèi)容存到一個HashTable或者一個XML文件中以備使用。本系統(tǒng)創(chuàng)建一個公用的JavaBean,封裝與數(shù)據(jù)庫的連接操作。
結(jié)束語
??? 早在1994年第6屆醫(yī)藥信息學(xué)大會上,國家衛(wèi)生部提出“希望到本世紀末,全國將有若干家醫(yī)院能夠真正實現(xiàn)完整的CPR系統(tǒng)”,足以證明CPR的重要地位。如今,J2EE已成為眾多企業(yè)平臺架構(gòu)的標(biāo)準,而Web Services被認為是下一代的web應(yīng)用開發(fā),前景良好。本文只是對用基于J2EE架構(gòu)的Web Services實現(xiàn)電子病歷系統(tǒng)有一個初步的探索,相信基于Web Services的電子病歷系統(tǒng)必定會有一個美好的未來,期待國內(nèi)醫(yī)院早日實現(xiàn)CPR!
參考文獻
1.陳文彬主編.診斷學(xué)(第五版).人民衛(wèi)生出版社,
2.http://java.sun.com/j2ee?????????????
3.http://www.w3.org/TR/SOAP/
4.http://www-900.ibm.com/developerWorks/cn/index.shtml

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。