编 号: 审定成绩:
毕业设计(论文)
基于JAVA的医院门诊信息管理系
设计(论文)题目: 统设计与实现
学 院 名 计算机科学与技术学称 :
院
学 生 姓 名 : 专 业 : 班 级 : 学 号 :
XXXXXXXXX XXXXXXXX 计算机网络技术 XXX
指 导 教 XXX
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
师 :
答辩组 负责人 :
填表时间:
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
摘 要
医院门诊信息管理系统是一个基于Internet的应用系统,它是一个面对当前的医院门诊管理工作基本还处于手工和半信息自动化处理状态而应运而生的一个基于Internet的一个信息自动化的系统,整个系统从符合操作简便、界面友好、灵活、实用、安全的要求出发,完成预约、诊断、开具处方、保存病历管理的全过程。医疗事业单位只需具备访问Internet的条件即可在系统发布的站点上进行医疗门诊的管理。在图型化的人机界面中完成日常的医疗门诊管理工作.一方面摆脱了时间和空间的限制,另一方面有效的解决的数据共享的问题。经过实际使用证明,本文所设计的医院门诊信息管理系统可以满足医院在门诊管理方面的需要。
【关键词】 JSP 医院门诊 信息管理系统
ABSTRACT
I
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
Hospital outpatient information management system is an Internet-based application system. It is an Internet-based automated information system that solves the outpatient medical management of the basic work is still in the manual and semi-automated processing of information. The entire system is simple, friendly interface, flexible, practical and safe, and complete the entire process of booking, diagnosis, prescribing and medical records management preservation. Medical institutions only need visit the Internet can use the system for the release site medical clinic management. Using the pattern of the man-machine interface complete routine outpatient medical management. While out of time and space constraints, on the other hand, it is an effective solution to the data sharing problem. Through practical show that JSP-based hospital outpatient information management system to meet the hospital in-patient management needs.
【Key Words】 JSP Hospital Outpatient Information Management System
目 录
II
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
第一章 绪论................................................................................................................1 第一节 课题研究现状分析....................................................................................1 第二节 技术发展的趋势.......................................................................................1 第二章 医院门诊信息管理系统需求分析................................................................2 第一节 业务分析....................................................................................................2
一、业务角色......................................................................................................2 二、业务词汇.......................................................................................................3 第二节 系统需求定义...........................................................................................3 第三章 医院门诊信息管理系统技术解决方案比较................................................5 第一节 Web应用解决方案...................................................................................5 第二节 基于JSP + JavaBean的解决方案.............................................................5 一、什么是JSP......................................................................................................5 二、使用JSP的好处............................................................................................6 三、什么是JavaBean............................................................................................6 四、使用JavaBean的好处...................................................................................6 五、使用JSP+JavaBea的好处.............................................................................7 第三节 JSP及JavaBean工作原理介绍................................................................8 一、JSP内置对象.................................................................................................8 二、JSP+JavaBean的运行环境...........................................................................11 第四章 医院门诊信息管理系统概要设计..............................................................13 第一节 医院门诊信息管理系统文档结构定义..................................................13 第二节 数据组织与定义......................................................................................14 一、数据库概念设计...........................................................................................14 二、数据库逻辑设计...........................................................................................15 第五章 基于JSP与JavaBean的医院门诊信息管理系统详细设计.......................16 第一节 系统功能模块设计..................................................................................16 第二节 系统功能模块实现..................................................................................17 一、hospital.db包的类........................................................................................17 二、hospital.db.opreation包................................................................................22 第六章 测试................................................................................................................15 第一节 测试基本方法..........................................................................................47 一、界面测试......................................................................................................47 二、功能测试......................................................................................................47 第二节 测试用例及测试结果..............................................................................48
III
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
结 论......................................................................................................................56 致 谢......................................................................................................................57 参考文献......................................................................................................................58 附 录......................................................................................................................59
IV
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
绪 论
医院门诊信息管理系统是信息管理系统在医院门诊部门中的应用。随着Internet技术的发展,其被广泛应用与各行各业,医院门诊部门是其一个重要的应用领域。伴随着医院的改革,医院信息化进程的加速,建立基于Web的医院门诊信息管理系统显得尤为重要。
第一节 课题研究现状分析
随着医疗卫生事业的发展,医院改革的深入,信息的有效、高效利用,已受到人们的关注。充分利用现代科技手段,加强各种信息的利用开发,是医院信息管理的一个重要内容,也是当今医院的需要。目前的医院仅仅把医院的信息管理系统作为微机工具系统,而没有发挥其管理的真正功能;系统分散设计,各部门独立实施,没有考虑信息的关联和共享,存在信息孤岛现象;医院管理错综复杂,从而形成了医院信息管理系统数据的多样化,数据量大等特点[1]。
通过本次医院门诊信息系统的设计,解决医院系统中各种信息管理的集成问题,使医院系统的各种信息管理一体化。同时,了解医院门诊的流程,把握信息管理系统开发概念,掌握动态网站技术,熟悉系统开发的进程,做到会用相关工具设计和开发相关系统,并实现。
第二节 技术发展趋势
随着Internet技术的普及和发展基本上各种不同操作系统平台上都有相应的Web浏览器程序,这就使得医院门诊信息管理系统具有非常广泛的平台兼容性。客户端仅需一个Web浏览器程序,不再需要安装其它软件。客户程序主要包括HTML页面和一些特殊的数据库访问程序,它们都存放在Web服务器上,客户应用系统的设计、维护和更新工作只需在Web服务器上进行,这样就大大降低了系统安装、测试、维护的工作量[2]。通过基于Web的医院门诊信息管理系统的开发,可以实现对医院门诊相关信息的整合管理以及共享,并且通过组件技术的应用,可以使得本医院门诊信息管理系统具有很大的可扩展性和可移植性[3]。
第二章 医院门诊信息管理系统需求分析
1
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
第一节 业务分析一、业务角色
(1) 患者角色
可联机注册成为用户,设定自己的登陆名及密码; 可按医生姓名自定义查询;
可基于查询结果进行预约,若指定医生当日预约量已满,则预约失随机返回给患者;
可对已经进行的预约情况查看或撤销。
图2.1 患者用例图
(2) 医生角色
可查看预约患者的情况; 可查询患者病历;
2
败。预约结果
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
可创建患者病历;
可对患者的病历进行修改。
图2.2 医生用例图
(3) 管理员角色
可添加或删除医生账号。
图2.3 管理员用例图
3
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
二、业务词汇
(1) 医院门诊:门诊是医院接诊病人的场所。病人到医院之后首先在门诊由医护人员进行接诊,经过一整套的诊断手段,给病人得出初步诊断,并且进行进一步治疗的指导。 (2) 预约:由于医院某些专家的就诊患者多,医生为了确保有时间问诊患者并且患者为了确定来医院就诊时可以准时接收医生的诊断而采用的一种手段。
(3) 电子病历:由于传统的纸质病历不利于保存和查询,而且浪费资源,所以采用将病历信息电子化,便于整个医院信息的共享和交流。
(4) 医生基本信息:记录医生编号、姓名、年龄、登录时的密码、职称、所属科室和专家门诊科目等医生相关信息。
(5) 患者基本信息:记录注册患者的编号、姓名、登录时用户名、登录时密码、年龄、性别、家庭住址和联系电话等患者相关信息。
(6) 病历基本信息:记录病历记录的编号、主治医生编号、症状、诊断、患者编号、处方等病历相关的信息。
(7) 预约信息:记录预约记录的编号、主治医生的编号、患者编号、预约时间、预约就诊时间等预约相关信息。
第二节 系统需求定义
本系统是基于JSP的医疗门诊信息管理系统,要求实现对医院里医生信息、病人、病历以及医药信息进行有效管理及其开发,主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面[4],重点解决的问题包括:
(1) 病历基本信息管理:病历信息包括病历记录的编号、主治医生的编号、症状、诊断、患者编号、处方等内容,医生可以创建病历并且可以添加病历信息和修改病历信息,病人可以查询自己的病历信息。
(2) 患者基本信息管理:患者基本信息包括患者编号、姓名、登录系统的用户名、登录密码、年龄、性别、家庭住址和联系电话等。患者注册时向患者表中插入一条记录。
(3) 医生基本信息管理:医生基本信息包括医生的编号、姓名、年龄、性别、职称、所属科室、学历等内容,管理员通过登录可以添加和删除医生信息。
(4) 预约信息管理:预约信息包括记录编号、主治医生编号、患者编号、预约就诊时间等内容,病人可以预约医生和取消预约,医生登录后可以查询自己的预约信息。
本课题的应用难点有:
(1) 病历基本信息管理:传统的纸质病历既不便于患者、医生查询信息,也不便于保存,本系统才用电子病历[5]。病历基本信息管理系统选择基于三层结构的C/S、B/S混合模式,三层结
4
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
构中,底层是电子病历数据库服务器,用于存储和管理病历等数据;中间层是应用服务器和Web服务器,其中应用服务器用于实现系统的业务逻辑,完成各种复杂的管理操作和数据存取,Web服务器用于提供系统的Web服务,还可以通过网关与外部系统进行数据交换和信息传递;最上层是客户端,位于门诊大厅,Windows用户通过专用程序完成相关操作,IE用户通过浏览器使用。
(2) 预约信息管理:患者登录系统预约医生,信息插入预约表,或者取消预约,即从预约表中删除相关预约信息;医生通过登录可以创建病历,通过给预约的患者看病在病历表中添加病历信息。
第三章
解决方案比较
5
医院门诊信息管理系统技术(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
第一节 Web应用解决方案
本系统采用动态网站技术。早期的动态网站开发技术使用的是CGI-BIN接口。这种开发技术存在着严重的扩展性问题:每一个新的CGI程序要求在服务器上新增一个进程。为克服这一弊端,微软公司提出了Active Server Pages(ASP)技术,该技术利用“插件”和API简化了Web应用程序的开发。Hypertext Preprocessor(超文本预处理器),即PHP动态网站开发技术与ASP相似,也是一种嵌入HTML文档的服务器端脚本语言。还有一些技术,如Java Servlets技术,利用该技术可以很容易地用Java语言编写交互式的服务器端代码。太阳微系统公司(Sun Microsystems Inc.)在Web服务器、应用服务器、交易系统以及开发工具供应商间广泛支持与合作下,整合并平衡了已经存在的对Java编程环境(例如Java Servlets和JavaBeans)进行支持的技术和工具后产生了一种新的、开发基于Web应用程序的方法JavaServer Pages技术(JSP)。这种动态网站开发技术能够在任何的Web或应用服务器上运行,而且分离了应用程序的逻辑和页面显示,能够进行快速的开发和测试,并且简化了开发基于Web的交互式应用程序的过程。基于此,我们选择JSP+JavaBean技术来实现相应模块的开发。
第二节 基于JSP + JavaBean的解决方案
一、 什么是JSP
JSP(Java Server Pages)是Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。 JSP技术是用JAVA语言作为脚本语言的,JSP网页为整个服务器端的JAVA库单元提供了一个接口来服务于HTTP的应用程序[6]。
在传统的网页HTML文件(*.htm,*.html)中加入Java程序片段(Scriptlet)和JSP标记(tag),就构成了JSP网页(*.jsp)。Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序片段,然后将执行结果以HTML格式返回给客户。
程序片段可以操作数据库、重新定向网页以及发送 email 等等,这就是建立动态网站所需要的功能。所有程序操作都在服务器端执行,网络上传送给客户端的仅是得到的结果,对客户浏览器的要求最低,可以实现无Plugin,无ActiveX,无Java Applet,甚至无Frame。
二、使用JSP的好处
JSP的设计目标主要是提供一种更为简便、有效的动态网页编写手段,并且增强网页程序它是通过以下几个方面加以实现的:
的独立性、兼容性和可重用性。 (1) 简便性和有效性
JSP动态网页的编写与一般的静态HTML的网页的编写十分相似,只是在原来的HTML网
6
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
页中加入一些JSP专有的标签,或是一些脚本程序(而且此项不是必需的)。这样,一个熟悉HTML网页编写的设计人员可以很容易进行JSP网页的开发。而且开发人员完全可以不自己编写脚本程序,而只是通过JSP独有的标签利用别人已写好的部件来实现动态网页的编写。这样,一个不熟悉脚本语言的网页开发者,完全可以利用JSP做出漂亮的动态网页,而这在其他的动态网页开发中是不可思议的。 (2) 程序的独立性
JSP是Java API家族的一部分,它拥有一般的Java程序的跨平台的特性,换句话说,就是拥有程序的对平台的独立性。即:Write once, Run anywhere! (3) 程序的兼容性
因为 JSP中的动态内容可以各种形式进行显示,所以它可以为各种客户提供服务:从使用HTML/DHTML的浏览器,到使用WML的各种手提无线设备(如,移动电话和个人数字设备PDA),再到使用XML的B2B应用,都可以使用JSP的动态页面。
三、什么是JavaBean
JavaBean是一种可重复用、跨平台的软件组件。JavaBean可以为两种:一种是有用户界
面(UI,User Interface)的JavaBean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。
四、使用JavaBean的好处
JavaBean最大的优点在于可以实现代码的可重用性。同时,JavaBean又具有一下特性:
JavaBean是一个公共的(public)类; JavaBean有一个不带数的构造方法;
JavaBean通过get方法没置属性,通过set方法获取属性; 易于维护、使用、编写;
可移植性强,但仅限于Java工作平台; 便于传输,不论是本地还是网络; 可以以其它部件的模式进行工作。
五、使用JSP + JavaBean的好处
JSP与JavaBean搭配使用,有3个好处:
使得html与Java程序分离,这样便于维护代码。如果把所有的程序 代码都写到
JSP网中,会使得代码繁杂,难以维护。
可以降低开发JSP网页人员对java编程能力的要求。
JSP侧重于生成动态网页,事务处理由JavaBean来完成,这样可以充分利用JavaBean组
件的可重用性特点,提高开发网站的效率。
7
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
一、 JSP内置对象
JSP有九种内置对象:request,reponse,out,session,application,config,pagecontext,page,exception[7]。
(1) request对象:request对象代表请求对象,它被包装在HttpServletRequest接口。通过getParameter方法可以得到request的参数,通过GET、POST、HEAD等方法可以得到request的类型,通过Cookies、Referer等可以得到请求的HTTP头。来自客户端的请求经Servlet容器处理后,有Request对象进行封装。它作为jspService()方法的一个参数有容器传递给JSP页面。
Request对象主要方法:
getAttribute(String name) 返回name属性值。 getAttributeNames() 返回request对象所有属性名字。 getCookies() 返回客户端的cookies对象。
getHeader(String name) 获得HTTP协议定义的文件头信息。
getHeaders(String name) 返回指定名字的request Header的所有值。 getMethod() 获得客户端向服务器端传送数据的方法。
getParameter(String name) 获得客户端传送给服务器端的参数值。 getParameterNames() 获得客户端传送给服务器端的所有参数的名字。 getParameterValue(String name) 获得指定参数的所有值。 getProtocol() 获取客户端向服务器端传送数据所依据的协议名称。 getQueryString() 获得查询字符串。
getRequestURI() 获取发出请求字符串的客户端地址。 getRemoteAddr() 获取客户端的IP地址。 getRemoteHost() 获取客户端的名字。 getServerName() 获取服务器的名字。
getServletPath() 获取客户端所请求的脚本文件的文件路径。 getServerPort() 获取服务器的端口号。
setAttribute(String name, java.lang.Object objt) 设置名字为name的request参数
第三节 JSP及JavaBean工作原理介绍
的值,该值是由java.lang.Object类型的objt指定。
(2) response对象:response被包装成HttpServletResponse接口,它封装了JSP产生响应,然后被发送到客户端以响应客户的请求。和Request对象一样,它由容器生成,作为jspService()方法的参数被传入JSP。因为输出流是缓冲的,所以可以设置HTTP状态码
8
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
和response头。
Response对象的主要方法有:
addCookie(Cookie cook) 添加一个cookie对象,用来保存客户端的用户信息。 addHeader(String name , String value) 添加HTTP文件头信息。
containsHeader(String name) 判断指定名字的HTTP文件头是否已经存在。 sendError(int) 向客户端发送错误的信息。
setHeader(String name , String value) 设置指定名字的HTTP文件头的值。
(3) pageContext对象:pageContext对象被封装成javax.servlet.jsp.pageContext接口,它为JSP页面包装页面的上下文,管理对属于JSP中特殊可见部分中以命名对象的访问。它的创建和初始化都是由容器完成的。 pageContext对象中常用的方法有:
getAttribute scope() 检索一个特定的已经命名对象的范围。
findAttribute() 用来按照页面请求、会话以及应用程序范围的顺序实现对某个已经命名
属性的搜索。
setAttribute() 用来设置默认页面的范围或特定范围之中的已命名对象。 removeAttribute() 用来删除默认页面范围或特定范围之中已命名的对象。
(4) session对象:session对象用来保存每个用户的信息,以便跟踪每个用户的操作状态。其中,session信息保存在容器里,session的ID保存在客户机的Cookie中。 session对象的主要方法:
getAttribute(String name) 获取与指定名字name相联系的信息。 getAttributeNames() 返回session对象中存储的每一个属性对象。 getCreationTime() 返回session被创建的时间。 getId() 返回唯一的标识,为每一个session而产生。
getLastAccessedTime() 返回当前session对象最后被客户发送的时间。 getMaxInactiveInterval() 返回总时间(秒)。
removeAttribute(String name) 删除与指定名字name的相联系的信息。
setAttribute(String name , java.lang.object value) 设置指定名字name的属性值
value,并存储在session对象中。
(5) application对象:application对象为多个应用程序保存信息。 application对象的主要方法:
getAttribute(String name) 返回由name指定的名字application对象的属性的值。 getAttributeNames() 返回所有application对象的属性的名字。
getInitParameter(String name) 返回由name指定的名字的application对象的某个
属性的初始值。
getServletInfo() 返回servlet编译器当前版本信息。
9
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
setAttribute(String name , Object object) 设置指定名字name的application对象
的属性值object.
(6) out对象:out对象被封装成javax.servlet.jsp.JspWriter接口。他主要用来向客户端输出数据,代表输出流的对象。 out对象的主要方法:
out.print/println (boolean | char | char[] | double | float | int | long | object | string
|) 输出各种类型的数据。
out.newLine() 输出一个换行字符。 out.flush() 输出缓冲区里的数据。 out.close() 关闭输出流。
out.clearBuffer() 清除缓冲区里的是数据,并把数据输出到客户端。 out.clear() 清除缓冲区里的是数据,但不会把数据输出到客户端。 out.getBufferSize() 获得缓冲区的大小。
out.getRemaining() 获取缓冲区中没有被占用的空间的大小。 out.isAutoFlush() 返回布尔值。
(7) config对象:config对象被封装成javax.servlet.ServletConfig接口,它表示Servlet的配置。
config对象的主要方法:
getServletContext() 返回执行者的Servlet上下文。 getServletName() 返回Servlet的名字。
getInitParameter(String name) 返回名字为name的初始参数的值。 getInitParameterNames() 返回这个JSP的所有的初始参数的名字。
(8) page对象:page对象是类java.lang.Object类的一个实例,它是JSP本身,通过这个可以对它进行访问。
(9) exception对象:exception对象是java.lang.Throwable类的一个实例。它指的是运行时的异常,也就是被调用的错误页面的结果,只在错误页面(在页面指令里有isErrorPage=true的页面)中才可以使用。
二、JSP + JavaBean运行环境
本系统建立在Windows XP平台上,用Apache+Tomcat作为JSP服务端引擎,采用Eclipse作为后台设计开发环境。
Apache是一个web服务器环境程序启用他可以作为web服务器使用。不过只支持静态网页,不支持动态网页,如(.asp,.jsp)等。如果要在Apache环境下运行jsp网页,就需要一个解释器来执行jsp网页,而这个jsp解释器就是Tomcat。
Tomcat是一个免费且开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个
10
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
核心项目,由Apache、Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和jsp规范总能在Tomcat中得到体现。与传统的桌面应用程序不同,Tomcat中的应用程序是一个WAR(Web Archive)文件。在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压。
Eclipse是替代IBM Visual Age for Java的下一代IDE开发环境。根据Eclipse的体系结构,通过开发插件,它能扩展到任何语言的开发,甚至能成为图片绘制的工具。Eclipse是开放源代码的项目,其本身是用Java语言编写,但下载的压缩包中并不包含Java运行环境,需要用户自己另行安装JRE,并且要在操作系统的环境变量中指明JRE中bin的路径。Eclipse提供的核心框架和可扩展的插件机制给广大的程序员提供了无限的想象和创造空间。
第四章 医院门诊信息管理系统概要设计
第一节 医院门诊信息管理系统文档结构定义
本系统包括两个逻辑层包hospital.db包和hospital.db.operation包以及一些.jsp文件。
(1) hospital.db包封装了整个网站用于完成基础功能的类,具体包括:
hospital.db.Util:辅助类,用于完成一些JSP中常用的功能,比如字符集的转换。 hospital.db.InitServlet:初始化整个Servlet环境。
hospital.db.DBConnection:与整个数据库连接,返回Connection对象。 hospital.db.Debug:记录日志,将信息写入指定的日志文件中。 (2) hospital.db.operation包封装了所有用户角色有关的模型,具体如下:
hospital.db.dboperation.DBOperation:建立用户的抽象模型,供子类继承。 hospital.db.dboperation.Admin:继承自DBOperation,定义管理员模型。 hospital.db.dboperation.Doctor:继承自DBOperation,定义医生模型。 hospital.db.dboperation.Patient:继承自DBOperation,定义患者模型。
hospital.db.dboperation.InvalidUserException:继承自Exception,用以封装一个表示“非法用户名”的异常。
(3) jsp文件:以适当的方式通过逻辑层与数据层交互及一些页面代码。
第二节 数据组织与定义
一、数据库概念设计
11
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
医院门诊信息管理系统的数据库功能主要体现在对各种信息的提供、保存、更新和查找操作上,主要包括患者信息、医生信息、预约信息[8]。因此:
患者和医生有不同的权限因此身份不同。 用户信息记录不同的用户资料。 预约信息有预约时间、预约用户等。
经过上述功能分析和需求总结,考虑到将来功能上的扩展,设计如下的数据项和数据结构:
管理员信息:包括数据项管理员名、密码等。 医生信息:包括数据项医生名、密码等。 患者信息:包括数据项用户名、密码等。 预约信息:包括数据项医生名、预约时间等。
二、数据库逻辑设计
根据以上分析知,系统需要的基本信息表有:管理员信息表、医生信息表、患者信息表、病历记录表和预约记录表。本系统是一个多用户系统,牵涉多个管理人员和多用户,因此需要针对不同类别的用户进行密码认证和权限限制,防止出现越权现象。部分具体数据库设计如下:
(1) 医生表:用于存储医生的个人信息。
表4.1 医生表的结构 字段名 DID Name Age Password Sex Level Section Specialism Phone 类型 varcher(5) varchar(12) tinyint(3) unsigned varchar(20) tinyint(3) unsigned varchar(12) varchar(12) varchar(20) varchar(15) 备注 医生编号 姓名 年龄 密码 性别 医生职称 所属科室 专家门诊科目 联系电话 约束条 主键 索引 — 初始:=DID 1 - 男 2 - 女 — 索引 — 可为空 默认值 — — 0 1 — — — — (2) 患者表:用于存储患者的个人信息。
表4.2 患者表的结构 字段名 PID
类型 mediumint(8) unsigned 备注 患者编号 约束条 主键 12
默认值 — (完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
auto_increment Name UserName Password Age Sex Address Phone varchar varchar varchar tinyint(3) unsigned tinyint(1) unsigned TinyText varchar 姓名 登录时用户名 密码 年龄 性别 家庭住址 联系电话 — 唯一索引 — — 1 – 男 2 – 女 可为空 可为空 — — — 0 1 — — (3) 病历记录表:病历记录表记录了患者的病历信息。
表4.3 病历记录表的结构 字段名 类型 int HID unsigned(10) 病历记录编auto_increment Doctor Description Diagnose Patient Rx Sdate Fdate Finished varchar(5) TinyText TinyText mediumint(8) unsigned TinyText Datetime Datetime tinyint(1) unsigned 主治医生编号 症状 诊断 患者编号 处方 开始时间 结束时间 就诊过程是否结束 索引 — — 索引 — — 可为空 1 – 是 2 – 否 — — — 0 — 0000-00-00 00:00:00 0000-00-00 00:00:00 0 号 主键 — 备注 约束条 默认值 (4) 预约记录表:预约记录表记录了已预约但尚未创建病历的患者信息。
13
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
表4.4 预约记录表的结构 字段名 类型 int QID unsigned(10) auto_increment Doctor Patient Date varchar(5) mediumint(8) unsigned Datetime 主治医生编号 患者编号 预约时间 索引 索引 — 0 - 周日 1 – 周一 Day tinyint(1) unsigned 预约就诊时间 2 – 周二 3 – 周三 4 – 周四 5 – 周五 6 – 周六 AP tinyint(1) unsigned 预约就诊时间 0 – 上午 1 – 下午 表4.5 管理员表结构 字段名 类型 tinyint(2) AID unsigned auto_increment Username Password Email Name Phone
14
备注 约束条 默认值 记录编号 主键 — — 0 0000-00-00 00:00:00 0 0 (5) 管理员表:管理员表存储了与管理员有关的信息。
备注 约束条 默认值 管理员编号 主键 — varchar(20) Varchar(20) Varchar(20) Varchar(12) Varchar(15) 登录时的用户名 登录时密码 电子邮件 姓名 联系电话 唯一索引 — — — 可为空 — — — — — (完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
第五章 基于JSP与JavaBean的医院门诊信息管理系
统详细设计
第一节 系统功能模块设计
根据客户要求,操作者的权限层次要有明确的分类,进入软件时需要进行身份验证;出于对患者个人隐私的负责,患者的病历记录只能在患者就医期间有主治医生条约,其它任何人包括管理员无权查阅。整个系统需要实现以下功能,如图所示:
医疗门诊信息管理系统 病历基本信息管理医生基本信息管理患者基本信息管理15
预约信息管理模块 (完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
图 5.1 系统功能模块图
第二节 系统功能模块实现
一、hospital.db包中的类
图5.2 hospital.db包的UML图
与数据库建立连接类DBConnection
本类位于hospital.db包中,由于Connection是一个非常耗费资源的对象,因此在这里使用单例模式设计DBConnection类,保证了真个生命周期内只存在一个Connection对象,该对象可以被其它类重复利用,这样可以大大节省系统资源。DBConnection类核心代码如下:
public abstract class DBConnection{ public static Connection getConnection(){
Connection conn=null; try{
if(conn == null){
Class.forName(\"org.gjt.mm.mysql.Driver\"); //
16
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
conn=DriverManager.getConnection(\"jdbc:mysql://localhost:3306/hospital\
\
} else{
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery(\"SELECT COUNT(*) FROM if(rs==null||!rs.next()){
Class.forName(\"com.mysql.jdbc.Driver\"); ospital\
}
return conn; }
}
Debug.log(Debug.getExceptionMsg(ex));
}
Debug.log(\"Connecion re-created.\");
conn=DriverManager.getConnection(\"jdbc:mysql://localhost:3306/hDebug.log(\"Connecion created.\");
administrator\");
}catch(Exception ex){
记录日志的Debug类
本类位于hospital.db包中,本系统的一个亮点是日志记录,这里也是用单例模式实现的。Debug类的核心代码如下:
public final class Debug{
private static Debug instance=null;
private static SimpleDateFormat dateFormat=null; private static FileOutputStream fos=null; private Debug(){ }
static synchronized Debug init(String path){ }
public static synchronized void log(String msg){ }
17
……
……
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
private String writeFile(String msg){ }
public static String getExceptionMsg(Exception e){
StackTraceElement ste=e.getStackTrace()[0];
String msg=ste.getClassName() + \".\" + ste.getMethodName() + \"() Ln \" + ste.getLineNumber() + \": \" + e.getMessage(); } }
下面对Debug类中一些关键原理和值得注意的地方加以说明。
程序中将构造器定义为私有也是为了防止以构造器的方式生成对象。大 多数情
……
return msg;
况下以这种方式实现单例模式。
为了便于调试,在Debug类中定义了一个专门用来处理异常的方法
getExceptionMsg(),在返回的字符串中包括了抛出异常的类名、方法名和所在行数。
初始化Servelet的InitServlet类
本类位于hospital.db包中,继承自javax.servlet.http.HttpServlet,配合Tomcat中的设置,使服务器启动后首先按生成一个InitServlet的实例,然后调用其init()方法,对Servlet环境进行初始化。InitServlet的核心代码如下:
public class InitServlet
extends HttpServlet{
throws ServletException{
public void init()
String logPath=getServletContext().getRealPath(\"/log/\"); Debug.init(logPath);
Debug.log(\"Server started.\");
}
public void destroy(){ }
Debug.log(\"Server shutted down.\"); }
辅助类Util
本类位于hospital.db包中,本类只有三个方法,其中encode()和decode()方法负责对带有中文字符的数据惊醒转码工作,而parseSpDays()方法则是用来处理医生的预约人数信息。Util的核心代码如下:
18
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
public abstract class Util{
19
public static String decode(String str) }
public static String encode(String str) }
public static int[] parseSpDays(String dayPattern) }
throws NumberFormatException{ int[] spDays=new int[14];
StringTokenizer token=new StringTokenizer(dayPattern.trim(),\ if(token.countTokens() != 14)
throw new NumberFormatException(); spDays[i]=Integer.parseInt(token.nextToken()); for(int i=0;i < 14;i++) return spDays;
throws UnsupportedEncodingException{ return new String(str.getBytes(\"gbk\"),\"iso-8859-1\");
throws UnsupportedEncodingException{ return new String(str.getBytes(\"iso-8859-1\"),\"gbk\");
}
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
二、hospital.db.operation包
图5.3 hospital.db.operation包的UML图
医生模型Doctor类
本类位于hospital.db.dboperation包中,Doctor类封装了医生角色可执行的所有操作,核心代码如下:
public class Doctor
extends DBOperation{
public static final String NAME=\"Name\"; public static final String DATE=\"Date\";
public Doctor(String id)throws InvalidUserException{ /**
* 用户登录 * * 参数:
* password-密码 *
* 返回值:操作结果
20
super(id);}
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
* 1-登录成功 * 0-抛出一般异常 * -1-抛出数据库异常 * -2-登录失败 */
public int login(String password , String id){
int res=0;
conn=DBConnection.getConnection(); try{
}
public int getPatientsHistory(String orderBy){ }
21
strSQL=\"SELECT DID,Password FROM doctor WHERE DID=\"+this.id +\"
AND Password=\"+password; }
catch(SQLException sqle){ }
catch(IllegalAccessException iae){ }
catch(Exception e){ } finally{ }
return res; res=0;
Debug.log(Debug.getExceptionMsg(iae)); res= -2;
Debug.log(Debug.getExceptionMsg(sqle)); res= -1;
stmt=conn.createStatement(); rs=stmt.executeQuery(strSQL); if(!rs.next())
throw new IllegalAccessException(\"Password invalid.\"); res=1;
……
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
public int getPatientHistory(int hid){ }
public int getPatientInQueueInfo(){ }
public synchronized int createHistory(int qid,String diagnose,String rx,String …… ……
description){
…… }
public synchronized int updateHistory(int hid,String description,String rx,String diagnose){
…… }
public synchronized int finishHistory(int hid){ …… }
public synchronized int updatePassword(String password){ …… }
/**
* 检查用户名合法性 * * 参数: * id-医生编号 */
protected void checkUser(String id)
throws InvalidUserException{ conn=DBConnection.getConnection();
strSQL=\"SELECT DID FROM doctor WHERE DID='\" + id + \"'\"; try{
stmt=conn.createStatement(); rs=stmt.executeQuery(strSQL); if(!rs.next())
throw new InvalidUserException();
22
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
}
catch(SQLException sqle){ } }
下面对Doctor类中一些关键方法的功能和原理加以说明。 (1) 查询患者病历:getPatientsHistory(String orderBy)
本方法用于医生查询其所有就诊患者的所有病历记录(数据库中的Finished值为“0”的记
Debug.log(Debug.getExceptionMsg(sqle));
录)。
参数
orderBy:结果的排序方法。
返回值:
➢ 1:操作成功。 ➢ 0:抛出一般异常。 ➢ -1:抛出数据库异常。
Doctor.getPatientHistory实现代码如下所示: public int getPatientsHistory(String orderBy){
conn=DBConnection.getConnection(); int res=0;
if(orderBy == null || orderBy.equals(\"\"))
orderBy=Doctor.NAME; \"SELECT
history.HID,history.Diagnose,history.Description,history.Rx,history.SDate,history.FDate,history.Finished,patient.Name,patient.Age,patient.Sex,patient.Address,patient.Phone\" +
\" FROM patient,doctor,history WHERE history.Doctor='\" + this.id + \"' AND doctor.DID='\" + this.id +
\"' AND history.Patient=patient.PID AND Finished=0
ORDER BY \" + orderBy; //医生只能查询当前患者的当前病历
(“Finished=0”)
stmt=conn.createStatement(); rs=stmt.executeQuery(strSQL);
result=rs; //将局部变量中的内容复制给类变量result,使外部类可以通过
getResult()
try{strSQL=
//访问
23
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
res=1;
}
(2) 查询与hid匹配的患者病历:getPatientHistory(int hid)
本方法重载了“getPatientHistory(String orderBy)”,只返回与参数hid匹配的一条记录。
参数
}
catch(SQLException sqle){ }
catch(Exception e){ } finally{ }
return res; res=0;
Debug.log(Debug.getExceptionMsg(sqle)); //记录异常日志 res= -1;
hid:病历号。
返回值 ➢ 1:操作成功 ➢ 2:抛出一般异常 ➢ 3:抛出数据库异常
(3) 查询预约队列中的患者信息:getPatientInQueueInfo() 本方法返回预约队列中预约当前医生的所有病人信息。 返回值
➢ 1:操作成功 ➢ 0:抛出一般异常 ➢ -1:抛出数据库异常
(4) 创建病历:createHistory(int qid,String diagnose,String rx,String description) 本方法用于医生从预约队列中创建患者病历,其流程如下。
向history表添加病历记录 从pinqueue表删除预约记录 更新curappointment表中当前可预约数量。
参数
➢ qid:患者在预约队列中的编号。 ➢ diagnose:诊断。 ➢ rx:处方。
24
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
➢ description:症状。 返回值
➢ 1:操作成功。 ➢ 0:抛出一般异常。 ➢ -1:抛出数据库异常。 ➢ -2:非法qid值。
Doctor.createHistory实现代码如下:
public synchronized int createHistory(int qid,String diagnose,String rx,String description){
int res=0;
Connection conn=DBConnection.getConnection();
SimpleDateFormat dateFormat=new SimpleDateFormat(\"yyyy-MM-dd String date=dateFormat.format(new java.util.Date()); String[]
days={\"SunA\P\
int index,curpc,day,ap; int pid; String did; try{
strSQL=\"SELECT * FROM pinqueue WHERE QID=\" + qid + \" AND Doctor='\" + this.id + \"'\"; stmt=conn.createStatement(); rs=stmt.executeQuery(strSQL); if(!rs.next())
throw new IllegalArgumentException(\"Invalid QID or permission denied.\"); pid=rs.getInt(\"Patient\"); day=rs.getInt(\"Day\"); ap=rs.getInt(\"AP\");
did=rs.getString(\"Doctor\"); index=day * 2 + ap;
strSQL=\"SELECT * FROM curappointment WHERE DID='\" + did + \"'\"; rs=stmt.executeQuery(strSQL);
25
HH:mm:ss\");
//不匹配
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
的
rs.next();
curpc=rs.getInt(days[index]); //由于后面将由JDBC接手处理事务,所以数据库
//“autocommit”设为false
conn.setAutoCommit(false); stmt=conn.createStatement(); strSQL=\"INSERT INTO
history(Diagnose,Patient,Doctor,Rx,Description,Finished,SDate) VALUES ('\" + diagnose + \"',\" +pid + his.id + \"','\" + rx + \"','\" + description + \"',0,'\" + date + \"')\"; //将history表插入记录
stmt.addBatch(strSQL); //将SQL语句加入Batch中
strSQL=\"DELETE FROM pinqueue WHERE QID=\" + qid;
//从pinqueue表中删除记录
stmt.addBatch(strSQL);
strSQL=\"UPDATE curappointment SET \" + days[index] + \"=\" + (curpc + 1) + \" WHERE DID='\" + did + \"'\"; //将curappointment表中相应的可预约数量加1
}
stmt.addBatch(strSQL); //执行批处理SQL语句 stmt.executeBatch(); //通知数据库执行Bach conn.commit(); res=1;
catch(SQLException sqle){ }
catch(IllegalArgumentException iae){ }
catch(Exception e){ } finally{
26
res= -1;
conn.rollback(); //数据库出错,回滚事务 Debug.log(Debug.getExceptionMsg(sqle));
Debug.log(Debug.getExceptionMsg(iae)); res= -2;
res=0;
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
} }
return res;
(5) 修改病历:updateHistory(int hid, String description, String rx, String diagnose) 本方法供医生修改病历。
参数
➢ hid:病历编号。 ➢ diagnose:诊断。 ➢ rx:处方。
➢ description:症状。 返回值
➢ 1:操作成功。 ➢ 0:抛出一般异常。 ➢ -1:抛出数据异常。 ➢ -2:非法hid值。
(6) 结束治疗:finishedHistory(int hid)
本方法将结束患者的治疗过程(即将数据库中的“Finished”字段设置为“1”)。
参数
hid:病历编号
返回值
1:操作成功。 0:抛出一般异常。 -1:抛出数据库异常。 -2:非法hid值。
(7) 更改密码:updatePassword(String password) 本方法用于修改医生的密码。
参数
password:新密码。
返回值
➢ 1:操作成功。 ➢ 0:抛出一般异常。 ➢ -1:抛出数据库异常。
患者模型Patient类
本类位于hospital.db.operation包中,Patient类封装了患者角色可执行的所有操作,部分代码如下:
27
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
public class Patient
extends DBOperation{
public static final String NAME=\"Name\"; //封装“Name”字段名 public static final String SECTION=\"Section\"; //封装“Section”字段名 public static final String ANONYMOUS=\"anonymous\"; //封装匿名用户 private int PID; //存储患者表的“PID”字段 public Patient(String id)
}
public int login(String password){ …… }
public synchronized int addPatient(String username, String name, String password, int age,
int sex,String address,String phone){ ……
}
public int getDoctorInfo(String orderBy){ …… }
public int getCurrentDoctorInfo(){ …… }
public int getHistory(){ …… }
public synchronized int makeAppointment(String did,int day,int ap){ …… }
public synchronized int cancleAppointment(int qid){ …… }
public int getAppointmentInfo(){ ……
28
throws InvalidUserException{
super(id); //调用父类构造器
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
}
public int getDoctorAppointmentInfo(String did){ …… }
protected void checkUser(String id)
}
下面对Patient类中的一些关键方法的功能和原理加以说明。 (1) 患者注册:addPatient
本方法用于患者注册,即向数据库中插入患者信息记录。
第六节 参数
➢ username:用户名。 ➢ name:姓名。 ➢ password:密码。 ➢ age:年龄。 ➢ sex:性别。
➢ address:联系地址。 ➢ phone:联系电话。 第七节 返回值
➢ 1:操作成功。 ➢ 0:抛出一般异常。
29
throws InvalidUserException{
conn=DBConnection.getConnection();
strSQL=\"SELECT Username FROM patient WHERE Username='\" + id + \"'\"; if(id.equals(Patient.ANONYMOUS)) }
catch(SQLException sqle){
Debug.log(Debug.getExceptionMsg(sqle)); } }
return;
stmt=conn.createStatement(); rs=stmt.executeQuery(strSQL); if(!rs.next())
throw new InvalidUserException();
try{
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
➢ -1:抛出数据库异常。 ➢ -2:账户已存在。
Patient.addPatient实现代码如下:
public synchronized int addPatient(String username, String name, String password, int age,
int sex, String address, String phone){
System.out.println(\"Name,Username,Password,Age,Sex,Address,Phone\"+name +\
int res=0;
conn=DBConnection.getConnection(); if(conn!=null){ } try{
String insertSQL = \"INSERT INTO patient
(Name,Username,Password,Age,Sex,Address,Phone)VALUES(?, ? , ? , ? , ? , ? , ?)\";
System.out.println(\"conn isnot null\"); System.out.println(\"conn is null\");
}else{
}
PreparedStatement ps = conn.prepareStatement(insertSQL); ps.setString(1 , name); ps.setString(2 , username); ps.setString(3 , password); ps.setInt(4 , age); ps.setInt(5 ,sex);
ps.setString(6 , address); ps.setString(7 , phone); ps.execute(); res=1;
catch(SQLException sqle){ }
30
Debug.log(Debug.getExceptionMsg(sqle)); res= -1;
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
}
catch(IllegalArgumentException iae){ }
catch(Exception e){ } finally{
Debug.log(Debug.getExceptionMsg(iae)); res= -2;
res=0;
}
return res;
(2) 查询医生信息:getDoctorInfo(String orderBy) 本方法查询所有医生的全部信息。
参数
orderBy:结果集排序方式。
返回值
1:操作成功。 2:抛出一般异常。 -1:抛出数据库异常。
Patient.getDoctorInfo实现代码如下: public int getDoctorInfo(String orderBy){
if(orderBy == null || orderBy.equals(\"\"))
orderBy=Patient.NAME; int res=0;
conn=DBConnection.getConnection();
strSQL=\"SELECT DID,Name,Age,Sex,Level,Section,Specialism,Phone FROM doctor ORDER BY \" + orderBy;
try{ }
catch(SQLException sqle){
31
stmt=conn.createStatement(); rs=stmt.executeQuery(strSQL); result=rs; res=1;
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
}
Debug.log(Debug.getExceptionMsg(sqle)); res= -1;
catch(Exception e){ } finally{ } }
(3) 获取主治医生信息:getCurrentDoctorInfo()
本方法返回当前患者的主治医生的信息。其中“主治医生”指已创建该患者病历且治疗过程未结束的医生。 返回值如下:
return res; res=0;
➢ 1:操作成功。 ➢ 0:抛出一般异常。 ➢ -1:抛出数据库异常。
(4) 查询病历:getHistory() 本方法返回当前患者的所有病历。 返回值如下:
➢ 1:操作结果。 ➢ 0:抛出一般异常。 ➢ -1:抛出数据库异常。
(5) 预约:makeAppointment(String did, int day, int ap)
本方法用于患者预约,即向数据库中插入一条预约记录,其流程如下:
向pinqueue表插入预约记录 将curappointment表中相应的可预约数量减1。
参数
➢ did:医生编号。
➢ day:预约日(0为周日,1为周一……)。 ➢ ap:上下午(0为上午,1为下午)。 返回值
➢ 1:操作成功。 ➢ 0:抛出一般异常。 ➢ -1:抛出数据库异常。
➢ -2:已在相同的时间预约相同的医生。
32
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
➢ -3:day或ap格式错误。
Patient.makeAppointment的实现代码如下:
public synchronized int makeAppointment(String did,int day,int ap){
int res=0;
conn=DBConnection.getConnection();
SimpleDateFormat dateFormat=new SimpleDateFormat(\"yyyy-MM-dd String[]
days={\"SunA\\"ThuP\
int index=0,curpc=0; try{
if(day < 0 || day > 6 || ap < 0 || ap > 1) //day必须是0~6之间的整数,ap必须
throw new NumberFormatException();
HH:mm:ss\");
是0或1
index=day * 2 + ap;
stmt=conn.createStatement(); strSQL=
\"SELECT * FROM curappointment WHERE DID='\" + did + \"'\";
rs=stmt.executeQuery(strSQL);
if(!rs.next() || (curpc=rs.getInt(days[index])) == 0)
throw new NumberFormatException();
strSQL=\"SELECT Doctor FROM pinqueue WHERE Doctor='\" + did + \"' \" AND AP=\" + ap;
AND Patient=\" + this.PID + \" AND Day=\" + day + rs=stmt.executeQuery(strSQL); if(rs.next())
throw new IllegalArgumentException(); conn.setAutoCommit(false); //事务处理开始 stmt=conn.createStatement();
strSQL=\"INSERT INTO pinqueue (Patient,Doctor,Day,AP,Date) VALUES ap + \new java.util.Date()) + \"')\";
//向pinqueue表插入预约记录
(\" + this.PID + \
33
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
stmt.addBatch(strSQL); 减1
strSQL=\"UPDATE curappointment SET \" + days[index] + \"=\" + (curpc - 1) + \" WHERE DID='\" + did + \"'\"; //将curappointment表中相应可预约数量
}
}
stmt.addBatch(strSQL); stmt.executeBatch(); conn.commit(); res=1;
catch(NumberFormatException nfe){ }
catch(SQLException sqle){ }
catch(IllegalArgumentException iae){ }
catch(Exception e){ } finally{ }
(6) 取消预约:cancleAppointment(int qid)
本方法用于患者取消预约信息,即从数据库中删除相应的预约记录,其流程如下。
return res;
Debug.log(Debug.getExceptionMsg(e)); res=0; res= -2; conn.rollback(); res= -1;
Debug.log(Debug.getExceptionMsg(sqle)); res= -3;
删除pinqueue表中记录 将curappointment表中相应可预约数量加1。
参数
qid:预约编号。
返回值
➢ 1:操作结果。
34
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
➢ 0:抛出一般异常。 ➢ -1:抛出数据库异常。
Patient.cancleAppointment实现代码:
public synchronized int cancleAppointment(int qid){
int res=0;
conn=DBConnection.getConnection(); String[]
days={\"SunA\,\"ThuP\
int index,curpc,day,ap; String did=\"\"; try{
strSQL=\"SELECT * FROM pinqueue WHERE QID=\" + qid; stmt=conn.createStatement(); rs=stmt.executeQuery(strSQL); if(!rs.next())
throw new SQLException(\"QID does not exist.\"); day=rs.getInt(\"Day\"); ap=rs.getInt(\"AP\");
did=rs.getString(\"Doctor\"); index=day * 2 + ap;
strSQL=\"SELECT * FROM curappointment WHERE DID='\" + did + \"'\"; rs=stmt.executeQuery(strSQL); rs.next();
curpc=rs.getInt(days[index]); conn.setAutoCommit(false); stmt=conn.createStatement();
strSQL=\"DELETE FROM pinqueue WHERE QID=\" + qid; stmt.addBatch(strSQL);
strSQL=\"UPDATE curappointment SET \" + days[index] + \"=\" + (curpc + 1) + \" WHERE DID='\" + did + \"'\";
stmt.addBatch(strSQL); stmt.executeBatch(); conn.commit(); res=1;
35
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
}
}
catch(SQLException sqle){ }
catch(Exception e){ } finally{ }
(7) 查询预约信息:getAppointmentInfo() 本方法返回当前患者的所有预约信息。 返回值如下:
return res; res=0;
Debug.log(Debug.getExceptionMsg(e)); Debug.log(e.getMessage()); conn.rollback(); res= -1;
Debug.log(Debug.getExceptionMsg(sqle));
➢ 1:操作成功。 ➢ 0:抛出一般异常。 ➢ -1:抛出数据库异常。 ➢ -2:用户未预约。
Patient.getAppointmentInfo实现代码如下: public int getAppointmentInfo(){
conn=DBConnection.getConnection(); int res=0;
strSQL=\"SELECT * FROM pinqueue WHERE Patient=\" + this.PID; try{
stmt=conn.createStatement(); rs=stmt.executeQuery(strSQL); if(!rs.next())
throw new IllegalArgumentException();
res=1;
rs.beforeFirst();
36
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
}
}
result=rs;
catch(SQLException sqle){ }
catch(IllegalArgumentException iae){ }
catch(Exception e){ } finally{ }
(8) 查询医生预约信息:getDoctorAppointmentInfo(String did) 本方法返回某位医生的当前可预约信息。
return res; res=0; res= -2; res= -1;
Debug.log(Debug.getExceptionMsg(sqle));
参数
did:医生编号。
返回值
➢ 1:操作成功。 ➢ 0:抛出一般异常。 ➢ -1:抛出数据库异常。 ➢ -2:did不存在。
管理员模型类Admin类
本类位于hospital.db.dboperation包中,Admin类封装了管理员角色可执行的所有操作,部分代码如下:
public class Admin
}
extends DBOperation{
throws InvalidUserException{
public Admin(String id)
super(id); //调用父类构造器
public int login(String password){
37
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
}
……
public synchronized int addDoctor(String did, String name, String password, int int sex, String level, String spe, int[] pPerDay, String phone, String section){
age,
}
……
public int getDoctorInfo(){ }
protected void checkUser(String id) }
public synchronized int removeDoctor(String did){ } }
下面对Admin类中的一些关键方法的功能和原理加以说明。 (1) 添加医生账户:addDoctor
本方法用于添加医生账户,其流程如下。
向doctor表中插入记录 向appointment表中插入记录 向curappointment表中插入记录。
参数
……
throws InvalidUserException{
conn=DBConnection.getConnection();
strSQL=\"SELECT Username FROM administrator WHERE Username='\" + id + \"'\"; try{ }
catch(SQLException sqle){ }
Debug.log(Debug.getExceptionMsg(sqle)); stmt=conn.createStatement(); rs=stmt.executeQuery(strSQL); if(!rs.next())
throw new InvalidUserException();
……
38
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
➢ did:医生编号。 ➢ name:姓名。 ➢ age:年龄。 ➢ sex:性别。 ➢ level:职称。 ➢ spe:特长。
➢ pPerDay:每天最大可预约数量(周日上午、周日下午、周一上午……)。 ➢ phone:联系电话。 ➢ section:科室。 返回值
➢ 1:操作成功。 ➢ 0:抛出一般异常。 ➢ -1:抛出数据库异常。 ➢ -2:医生账户信息已存在。
Admin.addDoctor的实现代码如下:
public synchronized int addDoctor(String did, String name, String password, int age,
int sex, String level, String spe, int[] pPerDay, String phone, String section){
int res=0;
conn=DBConnection.getConnection(); try{
strSQL=\"select DID from doctor where DID='\" + did + \"'\"; stmt=conn.createStatement(); rs=stmt.executeQuery(strSQL); conn.setAutoCommit(false); if(rs.next()) //医生账户已存在
throw new IllegalArgumentException(\"Doctor ID '\" + did + \"' already
exists.\");
stmt=conn.createStatement(); //向doctor表中插入记录
strSQL=\"INSERT INTO doctor
did + \"','\" + password + \"','\" + name + \"',\" + age + \(DID,Password,Name,Age,Sex,Level,Specialism,Phone,Section) VALUES ('\" + level + \"','\" + spe + \"','\" + phone + \"','\" + section + \"')\";
(DID,Name,Password,Age,Sex,Level,Specialism,Phone,Section)VALUES(?, ? , ? , ? , ? , ? , ? , ? , ?)\";
39
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
stmt.addBatch(strSQL); //向appointment表中插入记录 strSQL=
\"INSERT INTO appointment
(DID,SunA,SunP,MonA,MonP,TueA,TueP,WedA,WedP,ThuA,ThuP,FriA,FriP,SatA,SatP) VALUES ('\" +
}
did + \"')\";
for(int i=0;i < 14;i++){
strSQL+=\
strSQL+=pPerDay[i];
strSQL+=\")\";
stmt.addBatch(strSQL); //向curappointment表中插入记录 strSQL=
\"INSERT INTO curappointment
(DID,SunA,SunP,MonA,MonP,TueA,TueP,WedA,WedP,ThuA,ThuP,FriA,FriP,SatA,SatP) VALUES ('\" +did + \"'\";
}
for(int i=0;i < 14;i++){ }
strSQL+=\")\";
stmt.addBatch(strSQL); stmt.executeBatch(); conn.commit(); res=1;
strSQL+=\
strSQL+=pPerDay[i];
catch(SQLException sqle){ }
catch(IllegalArgumentException iae){ }
40
Debug.log(Debug.getExceptionMsg(sqle)); conn.rollback(); res= -1;
Debug.log(Debug.getExceptionMsg(iae)); res= -2;
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
catch(Exception e){ } finally{ } }
(2) 获取医生账户信息:getDoctorInfo() 本方法返回所有医生信息。 返回值如下:
return res; res=0;
➢ 1:查询成功。 ➢ 0:抛出一般异常。 ➢ -1:抛出数据库异常。 ➢ -2:医生账户不存在。
(3) 删除医生账户信息:removeDoctor(String did) 本方法删除医生账户,其流程如下:
从doctor表中删除记录 从appointment表中删除记录 从curappointment表中删除记录 从pinqueue表中删除记录 从history表中删除记录。
参数
did:医生编号。
返回值
➢ 1:操作成功。 ➢ 0:抛出一般异常。 ➢ -1:抛出数据库异常。 ➢ -2:医生账户不存在。
5.2.2.4 抽象用户模型DBOperation类
本类位于hospital.db.dboperation包中,定义了一个抽象的用户模型,系统中所有的角色(patient,doctor,admin)都是它的子类。DBOperation的核心代码如下: abstract class DBOperation{
protected Statement stmt; protected ResultSet rs; protected ResultSet result; protected String strSQL; protected String id;
protected Connection conn;
41
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
public DBOperation(){}
protected DBOperation(String id)
throws InvalidUserException{ this.id=id; this.result=null; try{ }
catch(InvalidUserException iue){
throw iue; }
this.checkUser(id);
}
public ResultSet getResultSet(){
return result; }
protected abstract int login(String password); public void closeConnection(){
try{ }
catch(SQLException sqle){ }
Debug.log(Debug.getExceptionMsg(sqle)); if(rs!=null){ }
if(stmt!=null){ }
this.stmt.close(); this.rs.close();
}
protected abstract void checkUser(String id) }
下面对DBOperation中的一些关键方法的功能和原理加以说明。 (1) 构造器:DBOperation(String id) 此类构造器中需要完成以下工作。
throws InvalidUserException;
42
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
由参数id初始化私有标志符变量id。 初始化ResultSet对象result为null。
调用抽象方法checkUser(String id)(需由子类实现)判断用户名是否合法。若用户名不合
法,则抛出自定义异常“InvalidUserException”。 (2) 释放数据库资源:closeConnection() 本方法完成以下工作。
关闭ResultSet对象rs。 关闭Statement对象stmt。
由于Connection对象conn是单例对象,可以被其它类重用,所以不在这里关闭。
(3) 用户登录:login(String password)
本方法处理用户的登录操作,由于有些操作不需要用户登录就可以完成(比如患者查询医生信息),所以从构造器中把跟登录有关的内容分离出来放在这个方法中,当需要登录时只要使用密码为参数(用户名已被记录在类变量id中)调用login()方法就行了。另外,各个子类对用户登录操作的实现不一样,所以把此方法定义成抽象方法,由各个子类去实现。
(4) 判断用户名的合法性:checkUser(String id)
这个方法被构造器调用,检查用户名的合法性(即用户名是否存在于数据库中)。由于各个子类实现的方式各不相同,所以将此方法定义为抽象方法,由各个子类去实现。
43
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
第六章 测试
第一节 测试基本方法
一、界面测试
中经常实现的几种Bug:
(1) 错别字,即界面中的标题或者文本内容中出现了错别字。
这种Bug如果测试人员不细心,很难找出来,可能会出现在提示信息或界面中。 (2) 出现了一些根本读不懂的内容,一般多出现在程序的提示信息和一些较长的文本中。 这种情况基本上出现在拼起来显示的提示中,比如程序员为了调试程序,会alert出来一些xml或者SQL的信息,还有页面的简单陈述是通过变量拼组起来的,通过程序将字一个一个地输出出来。通常是因为程序中的控制错误或是程序开发人员对程序没有认真的自测,导致出现这种Bug。
(3) 程序员自创的词语,虽然意思对,但不符合界面的标准及要求。
这种情况基本上是由于开发人员使用一些专用术语,并且混杂着自己的理解出现Bug,主要是由于开发过程中团队合作没有明确的分工,没有统一的规范用语。
(4)页面类似的内容中,明显有字体、字号不同的情况,使界面整体风格看上去不一致。 这种情况只出现在没有CSS定义的情况下,或是已经定义的CSS,开发人员在开发过程中没有调用。
(5)标题相近的程序及模块,把标题弄混。
这种情况多是因为业务方面的定义名称很相似或很类似,并且业务实体方面也很类似,开发人员在开发过程中忽略了开发名称和模块,只单独地实现其功能。
界面测试是测试过程中比较简单直观的一种测试方法,只要细心地按界面要求核对就行了。可这块往往是程序开发人员容易忽视和遗漏的地方,也常常是出Bug的地方。下面是界面测试
二、功能测试
顾名思义,功能测试主要是测试程序模块是否实现了设计中所要求的功能。功能测试中需要注意的有:
(1) 查询功能中,有按单一查询条件进行查询的,也有按多个查询条件组合查询的。这里要注意的多个查询条件之间的关系。还有一些常识性的问题,比如按月查询,闰月中二月的天数。
(2) 录入功能中,需要注意的是前台设置的数值长度是否大于后台数值长度,以及前台和后台的数据结构是否相符,很多时候录入功能无法实现是由于这些原因。还有就是必须录入的字段的设置时候有误。
(3) 测试删除功能中需要注意的是单击“删除”按钮后,一般会出现提示信息,询问是否确
44
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
定删除。通常情况下,我们单击“确认”按钮查看信息是否被删除掉了,而忽略了单击“取消”按钮后程序的反应:这时有可能的是没有删除,还有一种可能是即便单击了“取消”按钮,也一样删除了数据。另外,在删除多条记录的时候,要注意连续选中的几条记录是否真正都被删除掉了,即如果再按照这种查询方式查询,时候还能查询出来。有的时候需要在数据库中设立一个标志位,而不是真正的物理删除。所以在下一次查询中,可能还会被查询出来,这主要是因为在查询条件中没有将标志位考虑在内。
(4) 关于修改功能的测试主要是看修改确认后是否数据真正已被修改了。这是最基本的功能,需要注意的是看是否能把不应该修改的数据也修改成功了。
除此之外,还有:
时常有这样的情况发生,每个模块都能单独工作,但这些模块集成在一起之后却不能正
常工作。其主要原因是,模块相互调用时接口会引入许多新问题。这就要求在进行程序设计和编码的时候要尽可能地从整体考虑。
引用某些控件,实现了程序中未实现功能的同时,也容易引发新的Bug。
错误本身出现在程序设计阶段,并非由于程序员编码造成的问题。这就要求我们无论是
在开发还是测试阶段,对需求或程序设计存在疑问,应及时提出,及时解决。
由于一些模块被修改了,对其他模块造成了影响而出现了新的Bug。发现这些Bug要求
我们对程序整体的结构有基本的了解,清楚模块之间的一些联系。
第二节 测试用例及测试结果
(1) 测试患者用户功能模块的实现情况
用户通过注册成为患者用户,通过注册的账号和密码登录到该系统。测试时创建nemo患
者用户,患者nemo登录系统,登录密码为123456,nemo登录后可以查询医生信息、预约医生、查询医生预约信息、查询主治医生信息和查询病历等。
查询医生信息,如图所示:
45
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
图 6.1 患者登录后查询医生信息图
查看LiuRufeng医生的预约信息
图 6.2 患者查看医生预约信息图
同时,患者还可以预约医生,如图所示:
46
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
图 6.3 患者预约医生图
(2) 测试医生用户功能模块的实现情况
医生Dido Fido的登录系统,用户名为00001,登录密码为123456,医生登录后可更改密码、查看患者病历信息、查看预约信息、创建病历、更改病历、结束治疗等。
创建病历,如图所示:
47
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
图 6.4 医生创建病历图
查询患者病历,如图所示:
图 6.5 医生查询患者病历图
48
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
更改患者病历,如图所示:
图 6.6 医生更改患者病历图
(3) 测试管理员用户功能模块实现情况
管理员admin登录,登录密码为:123456,管理员登录后可以添加医生账户、删除医生账户、查询医生信息。
添加医生账户,如图所示:
49
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
图 6.7 管理员添加医生账户图
本系统功能基本可以实现,但仍存在需要改进的地方,如: (1) 使用连接池(DataSource Pool)
本系统的DBConnection类负责与数据库进行连接,并返回一个Connection对象,其内部具体是调用了JDBC的DriverManger.getConnection()方法来建立连接。尽管设计时使用了单例模式来提高性能,但是当逻辑层分布在多个服务器上时,系统将同时运行在不只一个JVM上,这样Connection对象的数量将不只一个,而其中一个JVM上的Connection对象也不能被其他JVM使用,这样就造成了资源的浪费,我们应该更提倡使用“连接池”。 (2) 使用存储过程(Stored Procedure)
本系统中所有与数据库相关的方法都是通过返回值来标志其操作结果的,而这些返回值大多都是来自于捕捉不同的异常得到的。有些操作,比如添加医生账号,必须先向数据库发送一条请求,得到一个记录集,然后查找记录集。如果要添加的用户名没有在记录集中,那么可以
50
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
将记录插入到数据库中,但这样又得发送一条SQL语句。如果使用存储过程,返回值的问题将由数据库处理,而类似于添加医生账号这样的操作也只需发送一条语句去调用服务器上的存储过程。
结 论
回顾系统创建的前后过程,我感受了到基于网络的数据库系统开发的一些软件工程思想,比如B/S三层结构模式、模块化程序设计、自顶向下的系统分析等。
在系统开发的早期,经过调查详细的了解用户需求对系统的成败以及使系统能够最大限度的满足用户需求起着至关重要的作用。在了解了系统的功能要求后着手考虑系统的开发模式和开发中采用的技术。B/S 模式是当前开发网络数据库系统的潮流,考虑到数据库操作和数据更新的特点,JSP技术是理想的开发工具。采用自顶向下的思想,将系统划分为管理员部分、患者和医生三部分,然后对这三部分的功能加以细化,得到更小的功能模块。结合系统的功能进行数据库设计,充分考虑数据库的完整性和安全性,尽量减少数据的冗余度。在代码测试过程中先对每个功能模块进行单独测试,然后不断扩大组合成上一级模块并对其进行测试,最后整合为一个完整的系统,从而减少了代码测试和系统维护的难度。
51
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
致 谢
首先我要感谢的是重庆邮电大学所有辛勤工作的老师们,尤其是计算机网络的各位授业恩师,在几年的学习和生活中,通过他们时时处处的言传身教,训练了我的思维,开阔了我的视野,才使得我们能够在知识的海洋里去畅游、去探索、发现、解决遇到的各种难题。不但使我学到了许多有益的知识,而且培养了我思考问题的方法和随时观察社会的良好习惯,我将终身铭记。
其次,向我的毕业论文指导老师李红娟老师致以我发自肺腑的感激和谢意!从我在李红娟老师的指导之下做毕业论文以来,从论文的选题到论文提纲的确立,无论是从论文内容到论文格式,在这几个月的论文撰写过程中,李老师都给予了我极大的帮助和指导。承蒙李老师悉心指导,使我的论文质量有了很大的提高。
最后,要向在研究过程中对我提供帮助的同学表达的谢意。我希望能用这篇毕业论文向他们致谢,感谢他们对我的支持和鼓励。
52
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
参考文献
[1] 张奕珠. 医院信息管理系统存在的问题及设想[J]. 辽宁师专学报,2001,3(1):107-108. [2] 黄晓红,王思贤,何楚. 基于Web医疗信息管理系统的设计与实现[J]. 计算机应用研
究,2000,29(10):99-102.
[3] 尚武,杨涌. 我国医疗信息系统及发展趋势[J]. 中华医学图书情报杂志,2002,11(4):14-17. [4] 陈康,彭浩文,余俊蓉. 医疗门诊系统的设计与应用[J]. 计算技术与自动化,1998,17(4),35-36. [5] 肖春玲,陈彦方. 医疗信息系统与电子病历[J]. 国际精神病学杂志,
2006,33(1):12-15.
[6] 马迪芳,宋泾舸,王芳. Java程序设计实例[M]. 北京:清华大学出版社,2002. [7] 刘晓华,张健,周慧贞. JSP应用开发详解[M]. 北京:电子工业出版社,2007,1 [8] 萨师煊,王珊. 数据库系统概论[M]. 北京:高等教育出版社,2000,2.
[9] 邓子云,张赐. JSP网络编程从基础到实践[M]. 北京:电子工业出版社,2005.9.
[10] 汪孝宣,刘中兵,徐佳晶. JSP数据库开发实例精粹[M]. 北京:电子工业出版社,2005,1. [11] Walter Savitch. Java an introduction to computer science&programming. 北京:清华
大学出版社,2005,1.
[12] Bruce Eckel. Thinking in Java. Pearson Education,2005,5.
[13] Luo yan. Design and Implementation of E-Learning System Based on j2ee[J].
Journal of Electronic Science and Technology of China, 2005,3.. [14] 张孝祥. Java就业培训教程[M]. 清华大学出版社, 2003,7.
[15](美)梁, 万波. Java语言程序设计基础篇[M]. 机械工业出版社, 2008,9.
53
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
附录 程序代码
hospital.db.dbconnection: package hospital.db.java: import java.sql.*; /**
* 本类用于与数据库建立连接 */
public abstract class DBConnection{
/**
* 与数据库建立连接 *
* 返回值-Connection对象 */
public static Connection getConnection(){
Connection conn=null; try{
if(conn == null){
Class.forName(\"org.gjt.mm.mysql.Driver\");
conn=DriverManager.getConnection(\"jdbc:mysql://localhost:3306/hospital\
} else{
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery(\"SELECT COUNT(*) FROM if(rs==null||!rs.next()){
Class.forName(\"com.mysql.jdbc.Driver\"); Debug.log(\"Connecion created.\");
\"nemo\");
administrator\");
conn=DriverManager.getConnection(\"jdbc:mysql://localhost:3306/hospital\
}
54
\"nemo\");
Debug.log(\"Connecion re-created.\");
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
}
}
}
}
System.out.println(\"连接不上\");
Debug.log(Debug.getExceptionMsg(ex));
}catch(Exception ex){
return conn;
Hospital.db.Debug.java: package hospital.db; import java.io.*; import java.util.Date;
import java.text.SimpleDateFormat; /**
* 本类用于将网站运行时遇到的异常信息记录到文件中 */
public final class Debug{
private static Debug instance=null;
private static SimpleDateFormat dateFormat=null; private static FileOutputStream fos=null; private Debug(){ } /**
* 初始化Debug对象 * * 参数:
* path-日志文件存储路径 *
* 返回值-Debug单例对象 */
static synchronized Debug init(String path){
String file=\"\"; String fullPath=\"\"; if(instance == null){
55
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
} /**
}
instance=new Debug();
dateFormat=new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");
file=\"\" + (new SimpleDateFormat(\"yyyy-MM-dd\"))
.format(new Date()) + \".log\";
try{ }
catch(IOException ioe){ }
System.err.println(\"Cannot open file \" + file + \ fullPath=path + \"\\\\\" + file;
fos=new FileOutputStream(fullPath,true);
return instance;
* 将信息记入日志文件 * * 参数: * msg-信息 */
public static synchronized void log(String msg){ } /**
* 将信息记入日志文件,供log(String msg)调用 */
private String writeFile(String msg){
if(fos == null){
return \"Log file cannot be opened\";
56
String s2=dateFormat.format(new Date()) + \" \" + msg + \"\\n\"; if(instance != null)
instance.writeFile(s2);
System.err.println(s2);
else
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
}
} /**
} try{ }
catch(IOException ex){ }
return null;
return ex.getMessage();
fos.write(msg.getBytes()); fos.flush();
* 生成格式化异常信息 * * 参数: * e-异常 *
* 返回值-格式化后的异常信息 */
public static String getExceptionMsg(Exception e){ }
StackTraceElement ste=e.getStackTrace()[0];
String msg=ste.getClassName() + \".\" + ste.getMethodName() + \"() Ln \" + return msg;
ste.getLineNumber() + \": \" + e.getMessage();
Hospital.db.InitServlet.java: package hospital.db; import javax.servlet.*; import javax.servlet.http.*; /**
* 本类用于初始化Servlet */
public class InitServlet
/**
extends HttpServlet{
57
(完整word版)基于JAVA的医院门诊信息管理系统设计与实现(含源文件)
}
* 该方法从HttpServlet类继承,在初始化Servlet会自动调用 */
public void init() } /**
* 该方法从HttpServlet类继承,销毁Servlet对象时会自动调用 */
public void destroy(){ }
Debug.log(\"Server shutted down.\");
throws ServletException{
String logPath=getServletContext().getRealPath(\"/log/\"); Debug.init(logPath);
Debug.log(\"Server started.\");
58
因篇幅问题不能全部显示,请点此查看更多更全内容