《电子技术应用》
您所在的位置:首页 > 其他 > 业界动态 > 基于J2EE & Web Services的电子病历系统的设计与实现

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

2009-01-05
作者:朱倩

引   言 

    医院信息系统(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>




href="cid: username_x1.jpg@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

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。