引?? 言?
??? 醫院信息系統(Hospital Information System 簡稱HIS)是醫療機構信息化的產物,在一些發達國家(如美國、日本)中,對HIS的研究和運用已有幾十年的歷史。隨著計算機信息網絡技術的提高,人們對信息需求的數量、質量、速度也越來越高,加上國際醫學信息標準化、電子化的推進,促使人們在HIS的基礎上開始嘗試由現在的紙張醫療信息管理向電子化(電子病歷系統Computer-based Patient Record systems簡稱CPRs)邁進。它不是簡單地將現有病歷計算機存儲,而是一個多對多的,在Internet上通過Web Services實現各醫療機構信息共享與交互,具有一定智能化的跨平臺系統。CPR將是醫院計算機網絡化管理的核心。
??? 對于這樣一個系統,必須要求它具有良好的通用性和共享性。JAVA 從誕生到現在其跨平臺優越性及其在網絡編程的出色表現得到了實踐的證明,以Java 2為核心的J2EE提供了一個企業級的計算模型和運行環境用于開發和部署瘦客戶端,多層體系結構的應用,滿足了用一種健壯的、安全的、事務性的方法在 Web 上提供現有的應用程序和業務流程的需要,因此稱霸企業信息化平臺;使用XML作為數據交換格式,Web Services通過一系列標準和協議(如SOAP,UDDI,WSDL)來保證程序之間的動態連接,允許應用程序可跨編程語言和操作系統進行交互的優越性非常明顯。兩者的結合能使開發人員輕松構架復雜強大的Web Services應用。本文介紹的電子病歷系統正是采用了J2EE架構和Web Services技術。?
需求分析和系統設計?
??? 電子病歷系統并不是簡單的紙張病歷”電子化”,它至少應該具備:1. 信息資源共享:醫院各個科室的醫生在任何地方、任何時候只要有聯網的計算機,就能調閱到本醫院的全部病歷記錄, 會診的醫院之間能查到在任何一個醫院的病人病歷;2. 強大的提示系統:病人能看到醫生對自己診斷開出的臨時或長期醫囑,能及時向醫生反饋用藥情況;對醫務工作人員有藥物配伍禁忌,醫療方法不正當的提示,是智能化醫療的一種體現;3. 支持醫療信息資料庫:有電子信息可供學習,以及關于病例治療最新方法供醫療人員在工作時查詢使用。

這樣的設計完全符合了MVC(Model -view-controller)模式。
當J2EE映射到MVC各部分時: 模型(Model)是數據源,是鏈接數據庫
獲得數據的EJB或JavaBean;視圖(View)是JSP或是Servlets;控制
(Controller)它連接選定的視圖到數據,就是數據表。核心業務過程應
該完全不依賴于特定的客戶端程序。業務邏輯和視圖元素之間的數據交互分配
給控制器完成,J2EE的業務邏輯組件獲得相當高的可重用性。
系統實現關鍵技術
1) 本系統的一個EJB----實現病歷管理
??? 一般一個EJB是由Home接口、遠程接口和Bean類,以及輔助的類組成。Remote接口定義EJB組件中提供的可供用戶調用的方法,及實現商業邏輯的函數或過程,以供遠程客戶端調用;Home接口定義一組方法來創建新的EJB對象,查找,定位和清除已有的EJB對象; EJB Object為網絡可視對象,包含Stub和Skeleton作為Bean的代理。這樣的結構使得訪問遠程對象就像訪問本地對象一樣,保證分布式的應用,增加各組件互操作性。本系統中所有數據都封裝到實體Bean中。下面介紹本系統中一個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;
/** 根據病人id 刪除病歷信息 ?*/
?public void delDiagnosis(String strSufferer Id) throws Dexception,RemoteException;
/** 根據病人id 得到病歷信息?*/
?public Hashtable getDiagnosis(String strSufferer Id) throws Dexception,RemoteException;
??。。。。。。}
??? 假如醫生想在查看病人的以往的病歷信息,那么程序就是調用getDiagnosis()方法,得到病人的病歷信息。在DiagnosisOpr類中,就是:
public Hashtable getDiagnosis(String strSufferer Id) throws Dexception,RemoteException
{?if(找不到病人的ID)
throw new Dexception???????????? //拋出異常
else{? 根據病人的ID,從數據庫中讀取指定的病人的病歷信息,然后按照一定的算法把這些信息壓到Hashtable中。}
}
??? 在頁面展現的時候,jsp頁面得到的是一個Hashtable對象,這樣訪問數據庫的處理交給EJB來完成的,jsp只是負責展現。EJB體現了將商業邏輯與底層的系統邏輯分開,使開發者只需關心商業邏輯,而由EJB容器實現目錄服務,事務處理等底層系統邏輯核心思想。
2)?SOAP協議中傳輸醫療圖片
??? SOAP協議是Web Services中的關鍵技術,它是一種使用XML編碼數據的以文本為基礎的關于消息傳遞的有線協議,它規定了Web Services之間是怎樣傳遞信息的。為Java的平臺無關性,可移植性帶來了更高層次的協同操作能力。
在電子病歷系統中保存了病人的照片,X光片,以及CT光片等等輔助治療的圖片。當其他系統如診斷系統需要這些圖片的時候,就可以通過SOAP協議傳送這些圖片。實現方法是SOAP消息與一個或多個圖片聯系起來,并保留圖片的原始格式,作為一個多組分MIME結構來傳輸。這種實現方法是將多組分MIME結構作為傳輸協議綁定的一個基本組成部分,也就是說,對于SOAP消息而言,它等同于傳輸協議報頭。下面的例子是帶一個圖片的SOAP1.1消息,其中圖片的內容是病人的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>
…
…
--MIME_boundary
Content-Type: image/jpg
Content-Transfer-Encoding: binary
Content-ID:
...二進制jpg圖片...
--MIME_boundary--
??? 后端服務實現:后端服務實現是在類 PicManagementImpl 中使用公共可訪問的服務方法如 SubmitArrayOfPics 和 FetchPics 處理的。這里的 SubmitArrayOfPics 服務,是一個基于 RPC 的 SOAP 服務方法,參數包括 SOAPContext(用來處理圖片)、User(用戶信息,用來認證訪問者的信息)和一個 PicInfo 數組(提交到服務器的圖片)。FetchPics 方法是一個基于 RPC 的服務,用戶信息和文檔引用對象都作為其參數。文檔引用對象包含有關已經提交給服務器并保存在服務器中的文檔的信息(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{
/** 發送一段圖片數組,圖片數據必須從SOAPContext中返回,一旦數據返回就保存到數據庫中,并給用戶返回圖片的reference */
?public PicReference[] SubmitArrayOfPics(SOAPContext requestContext, User user,
PicInfo[] localPicInfo) ? ?throws Dexception ,Exception?{}
??? /** 根據PicReference返回服務器上的圖片信息(數據庫中的圖片信息),所有
的圖片信息作為附件返回給用戶 */
public void FetchPics (PicReference[] picRef) throws Dexception ,Exception{}
??? /** 在服務器上保存圖片,并返回操作結果(PicReference)*/
private synchronized PicReference savePic(User user, PicInfo userDefinedPicName,
Object content)??? throws Dexception ,Exception{}?
?。。。。。。}
??? 如上面服務代碼中所示,使用 SOAPContext 請求對象來獲取附件信息。這個對象包含主體部件,主體部件是一組 MIME 部件,其中根部件包含 SOAP 信封。接受到這個MIME消息后,可以從 MIME 主體部件抽取許多信息,包括內容標識、內容類型和位置。
????客戶機服務實現:客戶機代碼在 SOAPMappingRegistry 中創建類型映射信息來組織和解組 Java 技術類如 User(用戶信息類)、PictInfo(圖片信息類) 和 PicReference(圖片的引用) 并將其和請求對象綁定在一起,代碼如下所示:
?BeanSerializer beanSer = new BeanSerializer();? // 以下為設置 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);?????? // 設置 mapping registry
?? 如上代碼使用 bean 序列化器類(BeanSerializer)對類(如 User,遵守 JavaBean 的設計模式)進行序列化和反序列化。
?? 下面是發送圖片的部分代碼:byteStream 是從數據庫中讀出來的圖片字節流
?DataSource ds = new ByteArrayDataSource(byteStream.toByteArray(), null);
DataHandler dh = new DataHandler(ds);
??? MimeBodyPart mbp = new MimeBodyPart();
??? mbp.setDataHandler(dh);
request.addAttachment(mbp);????????????? // 把圖片加入到服務請求上
3)?連接數據庫
??? Java中連接數據庫的技術是JDBC,本系統采用JDBC2.0標準,通過使用 DataSource 接口(javax.sql.ConnectionPoolDataSource該接口充當合用的 java.sql.Connection 對象的資源管理器連接 factory),J2EE 組件可以獲得物理數據庫連接對象:
Context?ctx?=?new?InitialContext();
DataSource?ds?=?(DataSource)?ctx.lookup("jdbc/UserDB");//用UserDB對應DataSource對象Connection?conn?=?ds.getConnection("password","username");? //獲得Connection對象
JDBC2.0的另一個新規范是Connection?Pooling,( javax.sql.PooledConnection)每一個連接
池對象管理一組JDBC連接對象,每一個連接對象可以被任意數量的Servlet共享。finally{if(con?!=?null)?con.close();}保證了連接的循環利用,減小建立連接開銷。為了減少與服務器以及數據庫之間的連接次數,可把從數據庫中讀取的內容存到一個HashTable或者一個XML文件中以備使用。本系統創建一個公用的JavaBean,封裝與數據庫的連接操作。
結束語
??? 早在1994年第6屆醫藥信息學大會上,國家衛生部提出“希望到本世紀末,全國將有若干家醫院能夠真正實現完整的CPR系統”,足以證明CPR的重要地位。如今,J2EE已成為眾多企業平臺架構的標準,而Web Services被認為是下一代的web應用開發,前景良好。本文只是對用基于J2EE架構的Web Services實現電子病歷系統有一個初步的探索,相信基于Web Services的電子病歷系統必定會有一個美好的未來,期待國內醫院早日實現CPR!
參考文獻
1.陳文彬主編.診斷學(第五版).人民衛生出版社,
2.http://java.sun.com/j2ee?????????????
3.http://www.w3.org/TR/SOAP/
4.http://www-900.ibm.com/developerWorks/cn/index.shtml
