药品影响网上查询系统的分析与设计_第1页
药品影响网上查询系统的分析与设计_第2页
药品影响网上查询系统的分析与设计_第3页
药品影响网上查询系统的分析与设计_第4页
药品影响网上查询系统的分析与设计_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、. . . . 硕士学位论文网上安全用药查询系统的设计与实现摘要药物影响检测查询是在购买多种药物前的一个必不可少的步骤。网上安全用药查询系统比以往客户向驻店药师和在线医生咨询上具有更多的优势:方便、回复快、药物影响信息详细。网上安全用药查询系统在节省了雇佣在线医生和驻店药师的费用的同时,也保证了每一个消费者不会购买了会引发药物影响的药物组合。本文根据客户对网上安全用药查询系统的具体需求,设计并实现了一个基于经典Java EE的网上安全用药查询系统。本文先是分析了E、JPA和JSF所具有的优秀特性,决定将其整合起来来形成一个基于JPA+E+JSF的经典Java EE架构。之后是从系统的设计和实现

2、两个角度进行阐述。设计部分讲述了网上安全用药查询系统的需求分析和系统设计,进而深入到整个系统的web流程图、关键功能的流程图和时序图。实现部分给出了E和web端的相关类图设计、相关namedQuery实现、JSF的配置过程、JSF通过Spring整合E、E和WEB在开发中碰到的问题和解决办法。本文基于JPA+E+JSF的网上安全用药查询系统最终通过了项目组QA的测试和客户方的验收,成功实现了客户的需求。这同时也为本人这次对基于JPA+E+JSF的经典Java EE框架尝试画上了完美的句号。关键词:网上药店,药品查询,药物影响查询41 / 47AbstractChecking drug inte

3、ractions is a necessary process before buying multiple drugs. Checking drug interactions system has more advantages over consulting with doctor:convenient, fast response, drug interactions information in detail. Checking drug interactions system can save the cost of employing doctors and ensure ever

4、y consumer will not buy drugs that can cause drug reactions.According to the customer's specific needs of Checking drug interaction system, this paper designed and implemented the system based on Java EE. After analyzing the outstanding features of E, JPA and JSF, decide to put JPA, E, JSF into

5、the classic Java EE architecture. This paper describes from design and implementation. Design section describes the influence of Checking drug interaction system's requirements analysis and system design, and then deep into the flow diagram of the entire system ,the key functions' web flow d

6、iagram and senquence diagram.The implementati-on section gives the E and WEB's class diagram., the implementation of related namedQuery, the configuration of JSF, integrating JSF and E with Spring, the problems and solutions in develop E and WEB. The checking drug interaction system that based o

7、n JPA + E + JSF in this article finally passed QA's test and got the acceptance from client side. This system implemented the client's needs. The classic Java EE framework based on JPA + E + JSF is also a milestone for me.Key Words:Online Pharmacy, Drug Search, Check Drug Interaction目录摘要iAbs

8、tractii图目录III表目录IV第1章 绪论11.1 课题背景11.2 国外发展现状11.3 本文研究容和目标21.4 论文结构2第2章 相关技术综述42.1 国相关系统42.2 本系统差异42.3 经典Java EE52.3.1 经典Java EE组件52.3.2 E技术62.3.3 事务和JTA62.3.4 E的事务管理72.3.5 JPA规72.4 JSF应用框架介绍82.5 Mockito介绍92.6 本章小结9第3章 系统的需求分析与设计103.1 需求分析103.2 药物信息结构设计113.3 整体架构和流程序列图123.3.1 整体架构123.3.2 相关流程图和序列图133

9、.4 本章小结16第4章 网上药物影响查询的实现174.1 web端实现174.1.1 JSF开发环境配置174.1.2 JSF Managed Bean实现184.1.3 web端相关实现类图204.1.4 系统展示214.2 E端接口234.2.1 E端包划分234.2.2 业务逻辑层244.3 业务逻辑实现264.3.1 药物名查找药物264.3.2 病症名查找药物274.3.3 药物影响查询284.4 本章小结29第5章 难点和解决方法305.1 控制创建Entity时生成的sql含有的列305.2 编写namedQuery315.2.1 在返回搜索到的药物数量时始终会抛出异常315.

10、2.2 namedQuery在真实环境下有错315.3 简化E单元测试315.4 简化web在本地部署的依赖345.5 语言的切换355.6 本章小结37第6章 总结与展望386.1 总结386.2 展望38参考文献39作者简历41致42图目录图 3.1整体web流程图11图 3.2 药物信息结构设计11图 3.3 系统整体架构图13图 3.4 药物查询流程图13图 3.5 根据病症名查询药物序列图14图 3.6 根据药物名查询药物序列图14图 3.7 药物影响查询流程图15图 3.8 药物影响查询序列图15图 4.1 pom配置图17图 4.2 FacesServlet在web.xml配置1

11、7图 4.3 Spring在web.xml配置18图 4.4 web端类图21图 4.5 药物查询方式选择页面21图 4.6 病症查询药物搜索页面22图 4.7 药物详细信息页面22图 4.8 已选药物弹出层23图 4.9 药物影响信息页面23图 4.10 E端Logic Service类图24图 4.11 E端底层药物查找service类图25图 4.12 E端药物影响ServiceBean类图25图 4.13 E端药物影响DTO类图26图 4.14药物相关数据库图26图 4.15 通过病症查找药物涉与表28图 5.1 DynamicInsert代码图30图 5.2 DynamicInser

12、tEntityListener代码图30图 5.3 Entity使用DynamicInsert代码图31表目录表 3.1通用名药物信息结构12表 3.2品牌名药物信息结构12第1章 绪论1.1 课题背景随着京东商城和天猫的介入推动,医药B2C的交易规模与消费者需求将逐年增加。同时随着消费者对网购信任度的增加,市场参与者增多从而扩大医药B2C市场投入,医药B2C的市场比重和交易规模会大为提高。预计2013年B2C行业规模还将保持300%的增速,全年可以实现50个亿的销售。中国网上药店理事会更是预测到2015年中国药品B2C行业规模可以达到150亿元。在网上购药这个市场越来越大的同时,消费者在网上

13、因为无法找到需要的药物和不知道同时吃多种药物会有什么反应而需要咨询网上在线药师的情景也越来越多。随着在线咨询越来越频繁,网上药店需要大量的在线药师回答那些重复的问题。所以,目前急需一种系统。该系统可以帮助消费者查找到什么药适用于自己这种病,想要查找的药的有哪些剂型、剂量,同时吃多种药物的时候是否会有药物影响、药物食物反应和用药重复。基于以上需求现状,现在要开发一个具有网上药物查询和药物影响查询功能的系统,用于帮助消费者通过药物搜索查找到适合于自己病症的药物,并在购买多种药物的时候提供药物影响查询服务。1.2 国外发展现状2012年01月,国网上药店数量仅为57家,与美国的千家网上药店数量相比,

14、数量上实在太少。而截至2013年10月15日,从国家食品药品监督管理总局(SFDA)查询到的网上药店数目已达181家。众多传统零售药店和主流电商目前都纷纷进军抢占网上药店的高地。当价格不足以在消费者心中留下深刻印象时,物流、购物与产品分类成了天平上的一颗重要砝码。以药房网为例,为体现保障客户用药安全,通过整合国家食品药品监督管理局(简称SFDA)和国家食品药品监督管理局药品审评中心(简称CDE)的官方数据,将所有配伍禁忌药品在“安全用药警示系统”中进行标识。在消费者没有勾选多人服用的情况下将有配伍禁忌的药品加入同一购物车,安全用药警示系统会提醒“不能同时服用”1。和国相比,国外网上购药要更加严

15、格。通过对药物影响的严重程度分级,用户可以更安全地选择需要的药物。除此之外,国外已有许多药物影响(例如 drugs.)供用户查询所购买的药物是否会发生不同严重程度的药物不良反应,而不仅仅是完全禁忌的配伍禁忌。1.3 本文研究容和目标本文先是分析了E、JPA和JSF所具有的优秀特性,决定将其整合起来来形成一个基于JPA+E+JSF的经典Java EE架构。然后通过药物影响搜索系统的需求分析和系统设计,引出了整个系统的web流程图以与药物查询和药物影响查询的流程图和时序图。在讲述网上安全用药查询系统的具体实现时给出了E和web端的相关类图设计,以与JSF的配置过程和JSF通过Spring整合E的详

16、细阐述。最后是介绍了E和WEB的开发中碰到的问题和解决方法:插入数据的时候某些字段需要采用数据库默认值,通过自定义注释来控制JPA在create sql的时候不将该字段纳入。E端进行JUnitTest时,由于数据库测试数据不稳定和返回数据时间过长原因,换用存数据库。为了控制插入数据的主键和真实数据库一致从而减少迁移成本,采用既可以由数据库生成,又可以直接指定的主键生成方式。web端进行本地部署测试时,开发在本地部署时需要依赖大量的E,部署时间和查询数据库时间过长。通过mockito来减少web对某些返回值比较确定的service的依赖,从而简化开发本地的web部署。通过以上一系列的过程,成功实

17、现了基于JPA+E+JSF的网上安全用药查询系统,达成了客户的需求。1.4 论文结构论文共包含六章。第一部分:绪论,详细阐述了课题背景和必要性,国外发展现状和论文的架构。第二部分:国相关系统的功能和本系统实现采用的相关技术综述,主要介绍了目前网上安全用药系统的功能需求和非功能需求,继而提到所用到技术。第三部分:系统的需求分析和功能设计。针对网上安全用药查询系统的需求,给出了详细的流程图和时序图。第四部分:网上安全用药查询系统的实现方法。在展示网上安全用药查询系统使用流程后,系统地介绍了网上安全用药查询系统各个页面的详细功能与实现。第五部分:针对网上安全用药查询系统在实现过程中遇到的问题给出相应

18、的解决方法。第六部分:总结与展望,对网上安全用药查询系统进行了总结并对功能上的拓展方向进行了展望。第2章 相关技术综述2.1 国相关系统目前,中国国医院已有很多采用药物查询系统帮助医生开药,少部分医院已经开始采用ADR监测系统来预防在处方阶段发生不良药物影响。但是这些系统只用于医院,并没有对外开放。这使得老百姓难以安心地自主用药。药物查询方面,国医院系统从普通的快速查询和高级查询两方面入手。在使用快速查询功能时,用户可以按照药物分类、药物通用名、英文名、品牌名等进行快速查找。在使用高级查询功能时,用户则可以添加更加专业的病症名、疾病症状、剂型、药动学等方面信息来准确查找符合要求的药物。通过点击

19、搜索出来的药物连接可以得到药物的药物名、化学结构、适用病症、用法用量、注意事项、相关文献等详细信息。药物不良反应查询功能多见于医院ADR(药物不良反应)监测系统,用于提示医生所开药物间可能发生药物不良影响。药物不良反应除了和药物配方有关外,还和药物的施药途径、剂型、剂量有关。施药途径决定了人体吸收药物的方式,如肌肉吸收、肠胃吸收、表皮吸收。剂型则会影响药剂的吸收速度。剂量对某些药物是否会发生反应产生一定影响。医生通过改变施药途径、剂型、剂量来保证病人安全用药。医院所使用的药物不良反应监测系统通过记录病人的所用药品明细记录来判断是否突然出现了和病人原有病症无关的用药异常,或者药物组合中含有国家药

20、物不良反应中心指出的药物不良反应因果关系。这类系统操作复杂,并不适用于客户只需要简单方便地检测是否发生药物影响的需求。除此之外,由于这些系统只在医院部使用,在B/S结构和web端大批量用户访问上普遍存在着缺陷。2.2 本系统差异针对网上用户不具备医学相关方面知识的特点,本系统在药物搜索、病症搜索、药物和药物影响检测方面做出了一定的简化修改。在进行搜索药物时,系统通过用户搜索药物字段是否和dispensable表的descsearch和descaltsearch字段相似来判断这个dispensable药物是否是用户想要搜索的药物。descsearch和descaltsearch字段一般存放这药物

21、的商品名和药物的学名,去除了复杂的通过剂型、药动学等药物方面的专业搜索。在检测药物和药物间反应时,出于用户方便和减轻数据库压力方面考虑,只是判断带有施药途径的药物(主键rtgenid)和带有施药途径的药物之间是否会发生药物影响,去除了复杂的剂型、剂量等考虑。在通过病症名来搜索正确病症,从而得到可以治疗该病症的药物相关信息时,本系统出于用户很多时候不能够正确输入病症,所以建立了一个medcondsearchfml表,专门存放了用户容易搜索的病症名。之后,系统再根据medcondsearchfml表查找真正的病症名表(medcond表)从而找到对应的正确临床病症名。在药物和药物不良反应检查上,现有

22、的网上购药只是整合了国家食品药品监督管理局(简称SFDA)和国家食品药品监督管理局药品审评中心(简称CDE)的官方数据,将所有配伍禁忌药品在“安全用药警示系统”中进行标识,缺少对药物严重程度的标识。美国食品药品管理局将用药安全程度分为五级。在使用西药时,医生都会参照用药的安全程度来考虑产生的后果是否可以接受,然后决定是否这样用药。在提供药物和药物不良反应检测的同时,本系统还提供药物和食物、用药重复的检测,使用户能够更安全得使用药物。2.3 经典Java EE本项目旨在通过分析设计一种更科学且更简便有效的搜索方法,并在最后监测药物影响的时候为网上用户提供更加详细的已选药物间不良反应、饮食禁忌、用

23、药重复检测。大量的网上用户访问促使我们决定使用经典Java EE架构进行构建。2.3.1 经典Java EE组件经典Java EE应用大致包括以下组件:(1)控制器组件:Java EE的MVC框架提供了一个前端核心控制器,拦截用户请求,并将请求转发给用户实现的控制器组件。用户实现的控制器组件处理调用业务逻辑方法,处理用户请求。(2)业务逻辑组件:业务逻辑组件负责实现系统的业务逻辑,一般由Session Bean实现。一次用户操作一般对应一个业务逻辑方法。一个业务逻辑方法是一个整体的,因此需要对业务逻辑方法增加事务性。业务逻辑方法应当仅负责实现业务逻辑,不进行数据库访问。(3)EAO组件:实体访

24、问对象(Entity Access Object),通常采用Session Bean来实现。相当于轻量级Java EE的DAO对象,提供对Entity对象的添、读、修、删操作。(4)Entity对象:系统的对象模型抽象。领域对象的状态一般都必须保存在数据库里面。因此,每个Entity都映射到一个或多个数据库表。(5)表现层组件:收集用户输入数据或向客户显示系统状态。表现层组件可以是某种表现层技术,普通的应用程序,或者是小型智能设备。2.3.2 E技术Enterprise Java Bean简称E,有时也称为企业Bean或企业级Bean。作为一种可重用的分布式对象计算技术,E可用于部署开发分布式

25、的、多层结构的、面向对象的Java应用系统的跨平台组件体系结构2。E组件在使设计开发系统级应用更简单的同时还使得系统具有良好的移植性、扩充性和维护性3。E运行在E容器中时,E容器会提供包括持久化、数据缓存、声明性安全、负载均衡、错误修复与事务性处理的系统级服务4。Enterprise Bean又可分为三种:会话Bean、实体Bean、消息驱动Bean。Session Bean(会话Bean):是应用的业务逻辑层的Façade。Session Bean比Spring容器中的POJO Bean的功能更加强大,它支持如下功能:(1)并发和线程安全(2)开发者无需理会多客户端并发的线程安全问

26、题,只要像开发普通Java类一样开发E3就可,E容器会为之提供多线程并发功能和保证线程安全。(3)事务和安全管理E容器可以以声明式的方式来管理其的Session Bean的事务和安全。E3的Session Bean分为有状态会话Bean(Stateful Session Bean)和无状态会话Bean(Stateless Session Bean)两类。Stateful Session Bean需要E容器更高的系统开销来维护客户端状态,因此性能较Stateless Session Bean低。2.3.3 事务和JTA事务控制作为J2EE应用中的一环,保证一系列数据库操作不发生错误,从而保证应用

27、业务逻辑成功执行和底层数据库完整。事务有四个特性:原子性、一致性、隔离性和持续性。JTA事务由Java EE事务管理器负责控制,可以保证多个数据库更新的一致性,通过JTA即可实现全局事务控制。开发者可以通过使用JTA,用一种与事务管理器无关的方式来start、commit或roll back事务。Java EE应用服务器通过Java Transaction Service(简称JTS,Java事务服务)来实现Java EE事务管理器。应用程序不用直接使用JTS方法,只需面向JTA方法就可由JTA来调用底层JTS进行事务处理。2.3.4 E的事务管理E有两种事务管理方式,这两种事务管理方式通常都

28、建立在JTA基础之上。一种是通过容器管理事务(CMT)以声明式方式来管理事务;另一种则在E部使用事务管理代码由开发者自己管理事务(Bean管理事务,简称BMT)。容器管理事务(CMT):E默认使用容器管理事务。当使用CMT事务管理策略时,容器将接管E的事务管理,为我们完成事务的start、commit和roll back。容器总是在业务方法的开始、结束处标记事务边界,也就是说,容器将在调用方法之前开始JTA事务,然后根据方法的调用情况来决定提交或回滚事务。当使用CMT事务管理策略时,开发者无需为事务控制编写任何代码,只需通过Annotation或XML配置文件告诉容器如何处理事务即可。当使用容

29、器管理事务时,业务方法不应该调用任何可能与容器所设置事务注解冲突的方法。默认事务管理类型为CMT。因为BMT在实现事务管理时需要大量的硬编码,导致事务逻辑难以切换,同时Session Bean中业务和事务逻辑也混杂在一起。除此之外,当客户端调用BMT方法时,会暂停当前已有事务,制约了组件的重用。2.3.5 JPA规原先,Java EE和Java SE应用的对象持久化比较麻烦,同时ORM技术非常多,如果换了一种实现就必须去重新学习,然后重新编写代码。因而,出于简化和标准化考虑,Sun官方提供了JPA用于提供持久化标准规5。通过使用JPA,可以使得EAO层更加标准规,同时也摆脱了原先对各种ORM实

30、现的依赖,从而使得系统更加易于维护和移植。JPA是JSR-220实现的一部分,开发人员为E3.0软件专家组6。但它是一种用于Java持久化的轻量级且基于POJO的框架7。除了可以在基于E的Java EE应用中使用外,JPA同时也完全可以在普通Java SE中使用。因为是基于POJO的框架,所以JPA非常优雅;更为可贵的是它非常简单,所以易于学习和掌握8。JPA大致包括以下三种组件:1.ORM映射元数据ORM映射元数据有些地方又称为实体,只是通过XML映射文件或Annotation建立了和底层数据表之间对应关系的POJO。2. Entity Manager实体因为是普通的POJO,没有持久化能力

31、。因而JPA提供了Entity Manager来对Entity进行操作。除此之外,实体管理器还可以通过与持久化上下文(persistence context)进行交互来转换实体不同状态9。3.JPQL查询通过面向对象的查询语言查询数据来减小程序与SQL的耦合度10。JPA只是制定了一个API,供应商可以做出自己的实现,而且开发人员也可以对某些API进行自定义11。按照Sun的预想,开发者可以随意地选择切换JPA实现。2.4 JSF应用框架介绍Java Server Faces简称JSF,是一种SUN公司在Java EE规中设计的一种搭建Java Web应用程序的MVC框架。JSF主要有如下五大

32、优势:1.可以通过拖放组件方式快速开发页面。2.将页面上的UI组件的值绑定到服务器端的数据模型。3.可以使用服务器端业务代码来响应客户端事件。4. UI组件具有高度的重用和扩展特性,适合构造用户界面。5.恢复UI状态和跨请求保存。借助于这几大优势,成功封装了请求-响应模型,允许开发者采用面向对象的事件通信模型进行RAD方式开发Web应用,避免了以往基于请求、响应和标记来考虑问题的弊端12。通过JSF,用户可以在页面中使用web组件、捕获用户行为产生的事件、进行验证和页面导航等,实现用户界面到业务逻辑层的直接映射,省去了大部分需要开发者处理的 细节13。由于JSF是一个开放架构,开发人员可以通过

33、自己创建或者继承已有组件的方式来开发自己的组件,因而具有很强的灵活性和可扩展性14。2.5 Mockito介绍随着快速应用开发模式(RAD)和程序规模越来越大,项目越来越需要借助自动软件测试来解决测试繁重、测试效率低等问题。由于java单元测试框架Junit难以构造对象、方法,于是又引入Mock Object来解决这个问题。但JMock和easyMock这两种框架的实现都局限于用Mock技术模拟被测试方法依赖的外部对象,mocking是由期望-运行-验证库决定15。Mockito提供了一种更简单,更直观的方法:mock在执行后的交互。使用mockito可以专心验证想要验证的东西,而不是像在使用

34、期望-运行-验证库时被迫经常处理无关交互。没有期望-运行-验证同时也意味着Mockito在mock时通常不需要昂贵的启动前期准备。他们的目标是透明的,从而使开发人员将精力集中于测试选定的行为而不是注意力被别的吸走。Mockito拥有简洁的API,几乎不需要花时间去启动模拟行为。只有一种方法创建模拟。Mockito的语法和jMock与EasyMock类似,因此可以放心重构。不同的地方在于通过在执行后校验什么已经被调用,消除了对期望行为的需求。消除了因在执行前需要记录期望行为导致的丑陋初始化代码。2.6 本章小结本章主要阐述了含有药物影响搜索功能的系统的功能特点,并分析了本项目将会使用到的主要技术

35、,以与这些技术所具有的特性和优点。第3章 系统的需求分析与设计3.1 需求分析客户要求设计一个网上安全用药查询系统,可以自动帮助用户查看详细的药物影响。首先是分析设计一种更科学且更简便有效的搜索方法,通过药品的学名或者品牌名进行搜索。点击进入查看详细信息的时候可以查看这种药物有哪几种药物形式和药物剂量组合。最后检测药物影响的时候提供比用药配伍禁忌更加详细的已选药物间不良反应、饮食禁忌、用药重复等检测。举个例子来说,消费者在网上买了多种药物,但是他不知道详细的药物影响或者只知道自己购买的这种组合不属于国家药物配伍禁忌里面的组合,至于所购买的药物间是否有药物重复,药物食物反应和轻微的药物间反应则需

36、要消费者自己研究复杂的药物说明书。传统情况下消费者可能会由于麻烦而不去看药物说明书,或者由于药物说明书的复杂性而没有看出来自己同时购买的药物不宜同时使用。以2005年举办的“百姓安全用药调查”结果来看,我国不合理用药的人占总用药人数的12%-32%,情况非常严重16。有了药物查询软件后,消费者可以轻松地根据药物名称和药物吸收途径、剂型、剂量准确地搜索到自己准备购买的药物。系统通过药物的吸收途径给出哪几种药物间会发生什么级别的药物影响,是否有用药重复,以与是否有药物和食物反应。具体操作流程如图3.1所示,图 3.1整体web流程图3.2 药物信息结构设计通过仔细分析用药现状,考虑到药品具有的剂量

37、大小、药品形式、吸收方式。同时市场上流通的药品使用的多是其商业名而非学术名,将药品的信息结构设计图如图3.2所示,图 3.2 药物信息结构设计以下是通用名药的信息结构定义:表 3.1通用名药物信息结构通用名药概念详细信息例子Ingredient成分名华法林钠GenericDrug药名华法林钠RoutedGeneric药名 + 施药途径华法林钠口服RoutedDoseFormGeneric药名+施药途径+剂型华法林钠口服片DispensableGeneric药名+施药途径+剂型+剂量华法林钠口服片10毫克品牌名药和通用名药对应,但是使用的是品牌名。以下是品牌名药的信息结构:表 3.2品牌名药物信

38、息结构品牌名药概念详细信息例子DrugName品牌名香豆素RoutedDrug品牌名 + 施药途径香豆素口服RoutedDoseFormDrug品牌名+施药途径+剂型香豆素口服片DispensableDrug品牌名+施药途径+剂型+剂量香豆素口服片10毫克3.3 整体架构和流程序列图3.3.1 整体架构系统整体基本上是用经典Java EE架构。Java EE架构和轻量级Java EE应用的分层架构基本一致,只是业务逻辑层和DAO层换成了由Session Bean,DAO层换成了EAO层,还有Domain Object层换成了由JPA的Entity充当的Entity层。web端JSF和Sprin

39、g结合则通过使用Spring的ContextLoaderListener和DelegatingVariableResolver来实现通过配置文件将对象依赖注入到JSF管理的bean。E、JSF、JPA整合架构图如3.3所示,图 3.3 系统整体架构图3.3.2 相关流程图和序列图用户进入药物影响搜索系统后,可以根据病症名查找到相似病症名,然后通过搜索出来的准确临床病症名来查找治疗药物。用户也可以直接通过输入药物名来进行搜索。后台会返回所有以用户输入的药名开头并且没有超过废弃时间的药物名。药物查询流程图如图3.4所示,图 3.4 药物查询流程图通过病症名查询药物时需要先在左侧显示搜索出来的病症列

40、表供用户选择。由于病症Condition是另外一个E项目中的类。为了避免无谓地引入E,通过XStream转化Condition为xml进行传输。其时序图如图3.5所示,图 3.5 根据病症名查询药物序列图除了通过病症名查询药物,用户也可以通过药物名查询药物。药物名查询的序列图如图3.6所示,图 3.6 根据药物名查询药物序列图用户在点击查看药物详细信息后,可以将选择的药物加入到药橱。通过页面目前选择的语言id和点击的药物id得到药物的用法、副作用、不可和哪些药物同时使用、预防措施、过量和漏服处理、储存方式、备注等药物详细信息。药物影响查询流程图如图3.7所示,图 3.7 药物影响查询流程图用户

41、在药物影响查询弹出层对已选药物做出增删操作后,通过JSF的ManagedBean(DrugInteractionMB)来调用DrugCabinetService查找药物和药物影响、用药重复与药物食物反应信息。序列图如图3.8所示,图 3.8 药物影响查询序列图3.4 本章小结首先,本章对药物影响查询的需求进行了细致的分析,给出了客户想要的web流程图。然后整体架构将JPA、E3、JSF较好地衔接了起来,发挥了各自的优势。最后给出了功能模块的流程图和序列图,并在图中给出了其功能具体实现所调用的主要接口。第4章 网上药物影响查询的实现4.1 web端实现4.1.1 JSF开发环境配置首先,引入需要

42、的jar包。由于JSF是建立在Servlet基础上的,所以在引入jsf的同时还需要引入servlet的jar包。对一个项目来说,它是依赖的jar包非常重要,既不能少,也不能够版本不正确。早期很多公司都是不得不将其提交到SVN中17。Maven是基于项目对象模型(POM,Project Object Model),通过描述信息管理项目构建,报告和文档的软件项目管理工具18。pom.xml配置如图4.1所示,图 4.1pom配置图FacesServlet在web.xml的配置如图4.2所示,图 4.2FacesServlet在web.xml配置每个Java EE应用服务器都包含E容器和Web容器,

43、使得E和Web都可以部在同一个应用服务器上19。JSF的托管Bean处于应用服务器的管理之下,因而服务器可以很容易地将业务逻辑组件注入到JSF的托管Bean中20。在JSF端需要使用E端的service。由于J2EE 官方并没有给出一个标准API,我们通过添加Spring启动监视器,然后在Spring配置文件采用jee:remote-slsb方式远程调用E。在此之前需要添加下Spring的支持。Spring在web.xml文件中配置如图4.3所示,图 4.3Spring在web.xml配置spring配置文件如下,<jee:remote-slsbid="drugSearchLo

44、gicService"business-interface=".drug.search.service.DrugSearchLogicService"jndi-name=".drug.search.service.DrugSearchLogicService"home-interface=".drug.search.service.DrugSearchLogicService"cache-home="false"refresh-home-on-connect-failure="true"

45、;environment-ref="jndiEnv" />最后,在JSF托管Bean只需添加drugSearchLogicService对象、ManagedProperty("#drugSearchLogicService")注释和其get、set方法就可以得到想要的service了。4.1.2 JSF Managed Bean实现Managed Bean在这个项目里面主要分为了六个包:(1).memberaccess.validation,主要负责验证页面输入容是否正确,如输入的药物名、病症名是否符合长度规等。用户自己编写的validator类需

46、要实现JSF的Validator接口。同时FacesValidator注释需要保证里面的值与web页面调用的值一样,不然就会无法查找到。除此之外还要保证在页面调用的唯一标示,否则也会报错。其书写形式有FacesValidator("")和FacesValidator(value ="")两种。如下是一个简单的validator,FacesValidator("drugNameValidator")publicclass DrugNameValidator implements Validator privatestaticfinal

47、Logger log = LoggerFactory.getLogger(DrugNameValidator.class);privatestaticfinal String DRUG_NAME_REQUIRED= "three_chars_least_drug_search"privatestaticfinalintLIMIT_LENGTH= 3;Overridepublicvoid validate(FacesContext facesContext, UIComponent component, Object value) ("validat

48、e() invoked");UIInput inputDrugName =(UIInput) facesContext.getViewRoot().findComponent("drugSearchForm").findComponent("drugSearchForm:drugEntry");("drugName: ", inputDrugName);String drugName = inputDrugName = null ? "" : (String) inputDrugName.

49、getSubmittedValue().trim();("drugName: ", drugName);String msg = ""if (isEmpty(drugName) | drugName.length() < LIMIT_LENGTH) msg = DRUG_NAME_REQUIRED;log.debug("validate Complete");(2).memberaccess.converter,主要负责页面下拉框需要显示的容、数字、等需要在Object和页面所显示的String之间转换的情况。用

50、户自定义converter需要实现getAsObject和getAsString方法。和validator一样,需要保证其在页面调用中是唯一标示。如下是一个简单的converter,FacesConverter("zipCodeConverter")publicclass ZipCodeConverter implements Converter privatestaticfinal Logger log = LoggerFactory.getLogger(ZipCodeConverter.class);privatestaticfinal Integer INDEX_ZE

51、RO = 0;privatestaticfinal Integer INDEX_FIVE = 5;privatestaticfinal String SYMBOL_HYPHEN = "-"privatestaticfinalInteger LENGTH_CONDITION = 5;Overridepublic Object getAsObject(FacesContext context, UIComponent component,String str) returnnull;Overridepublic String getAsString(FacesContext f

52、acescontext,UIComponent uicomponent, Object obj) ("getAsString() invoked");String fomattedZipCode = ""if (obj != null) fomattedZipCode = (String) obj;log.debug("fomattedZipCode:", fomattedZipCode);if (fomattedZipCode.length() > LENGTH_CONDITION) StringBuffer

53、buffer = new StringBuffer();fomattedZipCode = buffer.append(fomattedZipCode.substring(INDEX_ZERO, INDEX_FIVE).append(SYMBOL_HYPHEN).append(fomattedZipCode.substring(INDEX_FIVE).toString();log.debug("getAsString() Complete");return fomattedZipCode;(3).memberaccess.userstate.drugsearch,主要用于放

54、Managed Bean包。其和写在页面上的页面逻辑部分一起构成了基本所有的页面逻辑。当某个公共ServiceBean被多个ManagedBean调用的时候,多将其统一存放于CommonBusinessControlMB部,这样便于注入修改,和java中Façade的思想一致。managedBean多使用SessionScoped或者是通过CustomScoped(value="")使用项目部自定义的围。除了作用周期标签外,ManagedBean标签是所有ManagedBean必不可少的。(4).memberaccess.util,放置用于存放各个项目都会用到的工

55、具,如项目中用到的XProperties文件读取工具以与用于JSF Component的ComponentUtil工具。(5).memberaccess.web,用于存放读取web具体配置属性相关的工具类、继承了JSF的ExceptionHandlerFactory的自定义exception-handler-factory、以与web中用到的切面类等和web密切相关的类。4.1.3 web端相关实现类图以下是web端用到的主要类图与类间关系。由于病情搜索和药物搜索都是通过drugSearchLogicService进行搜索的,所以就一同写在了DrugSearchMB里面。Condition里面

56、装载了病情的编号,是否有药物治疗或预防等信息。FdbDrug里面包含了一个药物的主要id和药物名称、剂型、剂量主键等信息。MemberAccessExceptionHandler继承ExceptionHandlerWrapper,在前台提示用户由于后台哪些错误,该如何解决等信息。LocalizationFilter类用于解决不同语言切换后语言的properties文件切换问题。web端主要类图如图4.4所示,图 4.4 web端类图4.1.4 系统展示在用户输入账户信息通过验证后,就可进入药物查找页面。药物查找可以通过药物开头名和症状名两种方式。药物查询方式选择界面如图4.5所示,图 4.5药

57、物查询方式选择页面通过病症名和直接通过药物开头名查询在页面显示上的区别并不大,只是通过病症名查找时是通过一存储了用户经常搜索的病症名对应正确病症名表进行搜索,然后在左侧列出正确病症名列供用户选择。选择后右侧的搜索出该病症的治疗药物列表。用户选择High Cholesterol(高胆固醇)病症后搜索出的页面如图4.6所示,图 4.6 病症查询药物搜索页面在将Lipitor药物前面的多选框勾上后,用户再搜索vfend药物并点击右侧药物名查看药物详细信息。用户可以点击Add Drugto Drug List to 计算药物服用时间、服用频率等信息后统计出的费用。药物详细信息页面提供了药物的剂型、剂量、药物图片、作用、服用方式、副作用、药物影响、预警、过量服用后果、错过服用时的信息、保存以与备注说明等信息。药物详细信息页面如图4.7所示,图 4.7 药物详细信息页面点击“Add Drug to Drug List to Check interactions”,弹出显示有已选药物的弹出层供用户修改。已选药物弹出层如图4.8所示,图 4.8已选药物弹出层点击Check Interactions按钮,跳转到药物影响信息页面,提供给用户药物和药物影响

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论