《J2EE程序设计》课程设计大作业-医药管理系统设计.doc_第1页
《J2EE程序设计》课程设计大作业-医药管理系统设计.doc_第2页
《J2EE程序设计》课程设计大作业-医药管理系统设计.doc_第3页
《J2EE程序设计》课程设计大作业-医药管理系统设计.doc_第4页
《J2EE程序设计》课程设计大作业-医药管理系统设计.doc_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

J2EE程序设计课程大作业题目名称: 医药管理系统 学院名称: 计算机科学与信息工程学院 专业班级: 10级软件工程专业 学号姓名: 2013 年 12 月目录一、选题意义1二、需求分析2三、总体设计4四、详细设计12五、系统测试35六、总结38七、参考文献39全套设计加扣 3012250582一、选题意义医药管理系统是药品管理的核心,对药品进行进货、需求购买、维护管理的操作,是节流增收最有潜力的环节,本系统开发设计思想是实现药品管理的数字化,大大提高了医务人员的工作效率,节省许多资源,使药品进销存管理工作系统化,规范化,自动化,防止数据遗漏,造成损失,从而达到减少开支、增加收入、提高管理效率的目的。医药管理系统的设计理念是,让企业能够拥有更高效的管理工具,使企业在21世纪异常激烈的竞争中脱颖而出。我国的最大药品销售的企业是分布在全国各地的中小型销售企业。所以,此次开发的药品管理系统功能乃是汲取了其他药品管理系统的优点,同时又创新了更符合客户功能需求的一个综合信息管理系统。经过自己的努力,此管理系统的实现方法是基于java基础、struts框架和hibernate框架技术,利用MYECLIPSE J2SE 开发平台,MySQL5.0数据库的相关技术,利用MVC开发模式来设计医药管理系统。药品管理系统的功能主要分为四大模块,分别为基本信息管理模块,进货需求管理模块,药品销售管理模块,系统管理模块。该四大功能模块设计合理,功能全面,同时界面友好,非常符合我国各大小型药品销售企业的管理需求。本系统具有以下特点:良好的系统性能、有好的用户界面,较高的处理效率、便于维护。二、需求分析医药管理系统的需求比较严格,需要良好的环境搭建,良好的电脑性能,这对于开发大型软件来说是必不可少的,如果合适,将会达到良好的系统性能、友好的用户界面,较高的处理效率、便于维护的效果。2.1 需求分析概述药品管理系统是为了加强药品管理,以便更好地对药品进行监督和管理,对售药机构人员的工作,起到了高效性、准确性管理而开发。本系统主要包含系统管理员模块,基本信息管理模块,进货需求管理模块,药品销售管理模块,系统管理模块。药品管理系统是以合理、全面、准确的药品编码体系为基础,提供了对药品数量、金额、有效期的全面管理,统一的药价管理机制规范了药品的价格。系统能随时提供药库的库存、药品流向和消耗,还能根据现有库存,药品有效期提供采购计划或应暂停采购的药品清单,以提高资金的利用率,避免不必要的损失,方便快捷的途径对药基本信息进行定期的更新和删除等管理。 2.2 性能需求为了保证系统能够长期、安全、稳定、可靠、高效的运行,药品管理系统应该满足以下的性能需求:1系统处理的准确性和及时性系统处理的准确性和及时性是系统的必要性能。在系统设计和开发过程中,要充分考虑系统当前和将来可能承受的工作量,使系统的处理能力和响应时间能够满足对信息处理的需求。2系统的标准性系统在设计开发使用过程中都要涉及到很多计算机硬件、软件。所有这些都要符合主流国际、国家和行业标准。3系统的响应速度药品管理系统系统在日常处理中的响应速度为秒级,达到实时要求,以及时反馈信息。在进行统计分析时,根据所需数据量的不同而从秒级到分钟级,原则是保证操作人员不会因为速度问题而影响工作效率。2.3 系统开发相关技术1JSP(Java Server Pages)是一种动态网页技术标准,在传统的HTML静态网页中插入Java程序代码(Scriptlet)和JSP标签,从而形成动态网页文件(*.jsp)。其中JSP继承了Java编程语言的简单、易用特点,完整的面向对象,具有平台无关性且安全可靠。 2MySQL是一个小型的关系型数据库系统。除了具有许多其它数据库所不具备的功能和选择之外,MySQL数据库是一种完全免费的数据库产品,用户可以直接从网上下载并使用于个人或商业用途。MySQL开放源码的特点,许多中小型网站为了降低网站成本而选择了其作为网站数据库。另外,MySQL因为其执行速度、可靠性和适应性而备受关注。3MVC是三个单词的缩写,分别为:模型(Model)、视图(View)和控制(Controller)。 MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。模型层实现系统中的业务逻辑,接受视图请求的数据,并返回最终的处理结果通过视图层进行显示。4Struts是一个基于Java的开源软件。使用Struts的主要目的是减少在运用MVC模型进行WEB系统设计的时间。尤其是在混合使用Servlet和JSP的来建立可扩展的应用设计时,Struts是一个不错的选择。5Hibernate是一个开放源代码的对象关系映射框架,是把对象与对象之间的关系映射到数据库表中表格与表格之间的关系映射,它对JDBC进行了轻量级的对象封装,使得Java程序员可以随意的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的WEB应用中使用。Hibernate解决了传统JDBC对数据库操作的一些弊病,比如代码重复率高、表间级联关系问题、执行效率低等问题。三、总体设计对于一个大型的项目,良好的系统构架是必不可少的东西,只有系统构架成功,才能按照这样的思路一步一步的顺利完成。而且可以了解功能模块,实时开发和维护,达到一目了然的效果。3.1 系统功能结构经过调研发现,一个药店最基本的工作流程是进货和销售。本系统主要大的功能包括基础信息管理、进货需求管理、医药销售管理、系统管理、系统登录模块。而每个模块对应具体的功能实现,如基础信息管理里面包括药品信息管理和药品类别信息管理,进货/需求管理包括库存信息管理、药品需求管理和药品进货管理,医药销售管理包括销售明细和销售排行,系统管理包括管理员账户管理和系统初始化,功能模块图如图3-1所示。 图3-1 系统主要功能模块图3.2 系统流程管理在此系统流程模块,这个模块主要是程序的主要运行流程讲解,在这个医药管理系统里面,首先是管理员登陆权限,当管理员登陆成功之后,进入主要的医药管理模块,这里主要就是四个模块,主要有基础信息管理、进货需求管理、医药销售管理、系统管理,这些模块具体的功能实现如图3-2所示。 图3-2 系统流程图3.3 逻辑分层设计医药管理系统由4层结构组成,并遵循MVC结构进行设计。4层结构分别为表示层、业务逻辑层、持久层、数据库层,系统分层设计图如图3-3所示。 图3-3 系统分层设计图其中表示层与业务逻辑层均使用的是Struts框架组成,表示层用于提供程序与用户之间交互的界面,项目中主要通过JSP、ActionForm、及Struts标签库进行展现;业务逻辑层用于处理程序中的各种业务逻辑,项目中通过Struts框架的中央处理器及Action对象对业务请求进行处理;持久层由hibernate框架组成,MySQL数据库,对于4层结构的具体实现如下所示:1视图层(JSP)用户交互界面,负责业务数据的收集和表示客户端校验2控制层(SERVLET)负责表现层与业务逻辑层的交互,调用业务逻辑层,并将业务数据返回给表现层显示。3业务逻辑层(BEAN)数据访问对象层,负责与数据库服务层交互,封装增、删、查、改操作。4数据库层(MySQL5.0)在设计中通过实体-关系图的方法分析系统的数据库各实体的关系,推导出相关表结构和相应的内、外主键,并可结合业务进一步设计相关存储过程和约束条件等实现方法。系统中所有的数据表主要分为药品信息数据库表、药品类别数据库表、销售明细数据库表、用户管理数据库表。 3.4 数据库设计3.4.1 数据库的运行要求为防止数据访问量增加造成系统资源不足导致的系统崩溃,医药管理系统的数据库采用了独立的MySQL数据服务器,将数据库单独放在一个服务器中。这样即使服务器系统崩溃了数据库服务也不会受影响;另外一个好处就是能够更快、更好地处理更多的数据,其数据库运行环境如下:1硬件平台CPU: P43.2GHZ内存:2GB以上硬盘空间:160GB2软件平台操作系统:Window2003数据库:MySQL 5.03.4.2 数据库的表的分析设计分析系统功能结构图,每个功能模块都需要操作一个或多个数据实体,如药品实体对象、药品类别实体对象和销售明细实体对象等,最终这些数据实体对象将创建成对应的数据表结构。 数据库设计有几个范式,一般我们要做到的是第三范式,即数据表中没有冗余字段以及同一个表中的字段没有函数依赖关系,冗余字段即在一个表中已经保存过的信息,在另一个表中就不应该存在,如果需要的话,可以通过表间的关联来得到,函数依赖性就是一个表中的字段间不应该有计算关系,如一个表中有单价字段、数量字段,就不应该有一个总金额字段。如果程序运行过程中需要总金额,可以实时计算。不过在一些较常用的表中,我们可以适当地保留冗余字段,这样,在程序运行过程中可以减少由于表间互相关联而使用速度降低等问题。这就是所谓的第四范式。数据表设计时,最好不要使用用户输入的信息作为主键,每一个数据表自己定义一个主键,添加信息是由程序自动添加,这样就可以减少数据更新时产生的错误。表与表相关联的外键最好是由程序自动生成的主键,这样数据库就比较规范了。数据库初期设计时一定要谨慎,把所有可能的情况都考虑进去,即使当时没有用到,也要将它留在数据库中作为备用字段以便将来扩充。程序一旦开始编码,就应该尽量避免再修改数据库。因为如果数据库结构一旦改变,所有与修改的数据表相关的业务都有可能受到影响,而某些影响还很难看到,这样就容易形成一个恶性循环。错误越改越多,越改越乱,最终导致程序的失败。即使一个模块已经调试无误,但只要数据库结构改动。相应的模块就一定要重新修改,否则一定会出问题。1药品实体药品实体包括药品编号、名称、药品编码、出场地址、描述等属性。药品编号是识别不同药品的唯一编号,其数据类型是int,并且是数据库自增的。其余属性都是药品通用的特性,例如药品名称、类别、价格、出场地址和药品描述等。药品E-R图如图3-4所示。 图3-4 药品E-R图在创建表的过程中我们还得需要知道每个属性的数据类型,这点我们可以自己根据情况进行相应的定义,并且对于主键一般要求是不能为空的,所以表里面的N代表不能为空,如果空值将无法操作数据库,程序里面将会出现错误的,虽然这些都是小的细节,但是都是必须注意的,都是创建数据库表的前提条件,药品信息表如表3-1所示。表3-1 药品信息表(tb_medicine)MedicineidINTEGERN主键medNo VARCHAR(100)N药品编码nameVARCHAR(200)N名称factoryAddVARCHAR(200)Y出厂地址decriptionTEXTY描述信息priceDOUBLEN单价medCountINTEGERY0库存数量redCountINTEGERY0需求数量photoPathVARCHAR(255) Y0图片categoryIdINTEGERY所属类型2药品类别实体对象药品类别实体对象对应着药品类别的分类信息,其中包括类别编号、类别名称、类别描述、类别创建时间等,药品类别E-R图如图3-5所示。 图3-5 药品类别E-R图 根据上如所示的E-R图可以看出创建此表的一些属性,需要根据属性来确定数据类型,以及空值的设定操作,药品类别表如表3-2所示。 表3-2 药品类别表(tb_category)MedicinecategoryidINTEGERN 主键nameVARCHAR(100)N 类别名称descriptionTEXTN类别描述createTimeVARCHAR(100)Y创建时间categoryNoVARCHAR(100)N类别编号3销售明细实体对象销售明细实体对象用于描述药品在销售时刻的具体情况,如药品名称、价格、数量、销售时间、操作人员等信息。这些信息十分重要,需要记录到数据库之中。药品明细E-R图如图3-6所示。 图3-6 药品明细E-R图根据上如所示的E-R图可以看出创建此表的一些属性,我们需要根据属性来确定数据类型,以及空值的设定操作,药品销售表如表3-3所示。表3-3 药品销售表(tb_selldetail)MedicineidINTEGERN主键sellName VARCHAR(100)N药品名称sellPriceDOUBLEN销售单价sellCountINTEGERN销售数量sellTimeDATETIMEN销售时间medidINTEGERY药品iduseridINTEGERY0用户id4系统用户实体对象用于描述系统用户具体情况,如管理员名称、登录密码、创建时间等信息。这些信息十分重要,需要记录到数据库之中。系统用户E-R图如图3-7所示。3-7 系统用户E-R图系统用户表(tb_user)用于管理系统管理员的基本信息。在线管理员用户在添加信息用户之后,需要对新用户的登录名及密码进行保存,该表主要为完成本功能并对用户的创建时间进行记录。系统用户表具体情况如表3-4所示。表3-4 系统用户表(tb_user)列名数据类型长度主键否允许空功能描述IdINTEGER 11是否用户idusernameVARCHAR 50否否管理员名称passwordVARCHAR50否否登录密码createTimeDATETIME0否是创建时间四、详细设计系统的详细实现,主要是给我们介绍了系统具体功能模块的实现的一个构思,可以顺着这样的思路来实现医药管理系统的功能,也让人容易理解,容易接受。4.1 数据库的实现MySQL数据库的连接主要是通过配置文件hibernate.cfg.xml里面进行配置连接,这样的连接可以代替JDBC的连接操作,配置文件里面还可以设置实现数据库连接、自动创建表和显示SQ语句的作用,这样可以简化很多代码,具体实现如下所示:org.hibernate.dialect.MySQLDialect jdbc:mysql:/localhost:3306/db_database25 root admin com.mysql.jdbc.Driver update trueMySQL数据库的创建可以再命令行完成,也可以使用命令符工具来完成。本设计用的是脚本文件创建数据库,执行命令,就会自动导入数据库创建脚本,从而完成数据库的创建,主要创建了tb_medicine(药品信息表)、tb_category(药品类别表)、tb_selldetail(药品销售表)、tb_user(系统用户表)以及实现数据库里面数据的增加、删除和更新操作,具体实现如下所示:CREATE DATABASE IF NOT EXISTS db_database25; /创建数据库CREATE TABLE tb_category ( /创建数据库表id int(11) not null auto_increment, name varchar(100) not null, description text, createTime datetime default null, PRIMARY KEY (id) INSERT INTO tb_category (id,name,description,createTime) VALUES (1,感冒用药,主治感冒、发烧、头痛。,2009-06-10 08:41:25), (2,胃肠用药,胃炎、肠炎专用药。,2009-06-10 08:41:25), (3,儿童用药,慎用,儿童用药。,2009-06-10 08:41:25);UPDATE tb_category SET name = 肠胃,description = 主治肠胃疼,createTime =2012-06-02 where id = 1; /更新数据操作以上只是以一个创建表的例子来演示说明数据库表的创建及数据的插入、更新操作。可以用CREATE TABLE 表名来数据库的表的以及用INSERT INTO tb_category的方法来向数据库表里面加入数据,如果需要删表则需要利用DROP TABLE IF EXISTS tb_category的方法来实现删除数据库的操作。 4.2 主要功能模块描述4.2.1 系统登录模块设计系统登录是一个对用户身份进行验证的过程,只有登录成功的用户才可以对系统进行操作,否则,不能对系统进行管理维护,它是系统的一道安全门。1查询用户创建UsrDao类,封装对用户及系统及数据的操作。此类中编写login()方法,用于根据用户名及密码查询用户对象。在登录的过程,需要到数据库里面查看用户对象是否存在,当用户提交登录信息时,调用此方法可返回查询后的对象,若查询不到将返回null值,关键代码如下:session = HibernateFilter.getSession(); /获取session对象session.beginTransaction(); /开启事物String hql = from User u where u.username=? and u.password=?;Query query = session.createQuery(hql) /创建query对象 .setParameter(0, userName) /动态赋值 .setParameter(1, password); /动态赋值user = (User)query.uniqueResult(); /返回user对象session.getTransaction().commit(); /提交事物2用户登录请求是由LoginAction类进行处理,此类继承了Action对象,它重载execute()方法对用户登录进行验证。UserForm对象为用户ActionForm对象,struts自动将JSP页面表单信息等封装在此对象之中,所以可以直接获取ActionForm对象中的属性信息。LoginAction类通过UserForm中的用户名及密码属性,调用UserDao对象中的login()方法对用户进行查询,当数据库中存在与之匹配的数据时,则登录成功,否则登录失败;页面显示效果的代码通过login.jsp来具体实现。登录页面的设计主要是login.jsp里面实现的,首先需要连接数据库,其实现的关键代码如下所示:UserForm uf = (UserForm) form; / 获取ActionFormString userName = uf.getUsername(); / 用户名String password = uf.getPassword(); / 密码以上是通过页面获得输入的账户和密码,然后与从数据库获取的user信息进行比较,如果输入的用户信息和数据库里面的用户信息相匹配,那么通过如下方法:request.getSession().setAttribute(user, user);return mapping.findForward(manage);这段代码跳转到名字为manage这个页面,从而实现登陆,获取相应的页面效果;若果输入的用户信息和数据库里面的信息不匹配,此时会登录失败,返回到登陆页面从新输入通过login.jsp页面运行效果如图4-1所示。图4-1 登陆界面图登陆成功后,将显示主界面,登录成功主界面如图4-2所示。 图4-2 系统登陆成功主页面4.2.2 药品类别信息管理模块1药品类别持久层设计这个层中的CategoryDao类是药品类别的数据库操作类,它继承公共类SupperDao类,提供对药品类别的数据操作方法。 其中loadCategory()方法用于查询指定id的药品类别信息,其入口参数为int型的药品id,关键代码如下:session = HibernateFilter.getSession(); /获取Session对象session.beginTransaction(); /开启事物c = (Category)session.load(Category.class, new Integer(id); /加载信息session.getTransaction().commit(); /提交事物return c;在添加药品信息时需要添加与之对应的类别信息,所以还需要提供一个查询所有药品类别的方法,此方法的名称为findAllCategory(),在这个方法中,还是首先获取session对象,开启事物,创建Query对象,通过from Category c语句获取结果集,存入list里面,然后返回list结果集里面的数据,为方便药品类别数据的统计,本例中将药品类别中的药品数量进行统计。此操作通过findCategoryAndCount()方法实现,在此方法中首先还是需要获取session对象,开启事物,然后利用HQL语句hql = select ,count(*) from Medicine m join m.category c group by c进行查询实现,并将结果集存入list里面,在查询后,返回其结果集对象。2药品类别的添加通过以上持久层的设计,下面将实现药品的添加功能,所谓药品的添加就是将药品类别信息写入数据库的操作过程,具体实现过程如下:(1) 类别添加、修改处理,本系统中将药品类别的相关请求封装在CategoryAction类中,此继承了BaseAction对象,所以在对类别信息进行处理时,不必考虑用户是否登录安全问题。此类中处理添加类别信息请求的方法为add()。在此方法中,首先需要通CategoryForm获取类别信息,再通过此方法调用了CategoryDao对象的saveOrUpdate()方法,所以药品类别信息的添加与修改操作均可以通过此方法实现,当所传递的CategoryForm对象含id值时,则进行修改操作。然后跳转到名字为paging的页面,进行相对应的显示。(2) 类别添加页面,此页面为category_add.jsp文件,它位于web文件夹中,此段程序通过代码获取添加信息,并进行相对应的页面显示。此页面中使用struts的标签设置药品类别的id属性值,如果此属性不为空,则意味着操作为修改操作,页面运行效果如图4-3所示。 图4-3 添加类别图3分页查看类别信息 在添加药品信息后,页面跳转到类别信息列表页面,此页面将对类别信息进行分页显示,同时,此页面还提供了药品类别修改与删除的超链接。那么相应的操作主要通过如下几个方面进行具体的实现:(1) 查询与删除请求处理在CategoryAction类中,分页查询药品类别信息的方法为paging()。由于此类继承于类BaseAction,所以分页查询可以通过getPage()方法即可实现,此方法首先需要获取当前的分页码,并进行分页查询,分页查询操作的方法在前面已经说过,然后将查询到得结果集放到request中去然后通过下面的方法:request.setAttribute(pagingBar, map.get(bar);return mapping.findForward(findAllSuccess);此方法将结果集放到分页条中,然后进行跳转,转到配置文件里面name=findAllSuccess的页面上去。(2) 类信息列表页面category_list.jsp页面是类别信息的列表页面,此页面完全使用的是struts的标签里面的对药品类别信息进行迭代输出,里面通过超链接标签进行对应的修改删除操作。4类别的修改与删除在CategoryAction类中,可以实现类别的修改与删除操作。其中处理删除类别请求的方法为delete(),此方法通过指定的药品类别id删除类别对象,首先要判断药品id是否存在,其关键代码如下:if(cf.getId() 0) /判断id是否存在CategoryDao dao = new CategoryDao();Category c = dao.loadCategory(cf.getId();dao.delete(c); /删除类别return mapping.findForward(paging);然后进行删除操作,并将删除后的结果通过页面显示,主要通过struts配置文件里面的name=paging映射到相应的界面。处理修改类别信息请求的方法为edit(),此方法通过id加载药品类别对象,将此类别信息保存到CategoryForm对象中,最后转发到编辑页面,此过程也是需要判断id是否有效,然后根据id的有效与否进行编辑操作,然后将编辑后的结果通过jsp页面进行相应的显示操作。通过以上方法可以实现页面的查询、修改和删除操作,此页面的修改删除操作使用了超链接,类别信息图如图4-4所示。 图4-4 类别信息图5药品类别统计呢首先需要用到JFreeChart工具类,这是一个自定义的制图工具类,这个类的主要作用是,用于生成制图对象JFreeChart。其中categoryChart()方法用于生成类别统计的饼型图对象,其入口参数为装载结果集的List对象,这个方法中,首先需要创建饼形图的数据集合,然后再项数据集合中添加数据,在这个过程中还可以设置字体、设置图例类别字体及获取绘图区对象,利用 plot.setLabelFont(new Font(宋体,Font.PLAIN,12)方法设置分类标签的字体,利用 plot.setCircular(true) 的方法设置饼形为正圆通过传递的List集合对象生成DefaultPieDataset数据集合,然后使用制图工厂CategoryFactory创建饼型图JFreeChart对象,将其返回,而获取药品类别信息并进行处理的操作还是需要action请求进行处理。此请求由Categoryaction类的findCategoryAndCount()方法进行统计药品类别数量的处理,此方法首先通过实例化CategoryDao对象,查询药品类别的数量,统计药品类别信息,获取结果集对象之后通过categoryChart()方法生成制图对象,最后将生成的图片名及地址放在request之中,并将结果信息利用category_graph.jsp页面进行显示,此页通过标签获取所生成图片的路径,其关键代码如下:img src=为了避免空指针,category_graph.jsp使用了标签判断所生成的图像路径是否存在,类别统计图如图4-5所示。 图4-5 类别统计图4.2.3 药品信息管理模块1药品对象持久层设计MedicineDao类是药品对象的数据库操作类,继承自SupperDao类。此类主要包含3个方法,分别为loadMedicine()、loadMedicineAndCategory()、findMedicineByMedNo()。其中,loadMedicine()与findMedicineByMedNo()用于根据药品id及药品编码查询药品信息;loadMedicineAndCategory()用于查询药品信息与药品类别信息。此方法是用内连接的sql语句hql = select a from Medicine a join fetch a.category b where a.id = + id对药品信息表与药品类别表进行联合查询,它可以减少SQL语句的数量,此查询过程使用了单值检索,将结果集存入对象med中,然后返回这个对象数据。当一次查看药品信息与药品类别信息时,Hibernate将发出两条SQL语句,分别为查询药品信息的SQL语句与查询药品类别的SQL语句。由于药品实体与药品类别实体存在多对一的关联关系,因此本例中采用内联接将药品信息与类别信息一次加载出来,减少了SQL语句的数量,提高了数据库的性能。2药品信息的添加与修改药品编码是药品对象的一个标识,当添加一个药品信息时,需要判断此药品是否已经在数据库中存在,如果存在则只需要更新药品的数量即可,药品添加流程图如图4-6所示。 图4-6 药品添加流程图(1) 药品添加的请求处理药品管理的Action类为MedicineAction,它集成了BaseAction类,是一个DispachAction对象。此类的findMedicineByMedNo()方法用于根据药品编码medNo查询药品信息是否存在,主要通过MedicineForm获取数据,当所添加的药品编码存在时,更新数量,否则添加将跳转到药品更新页面,否则跳转到药品添加页面,其关键代码如下:MedicineForm df = (MedicineForm) form; / 获取MedicineFormMedicine med = null;if (df != null & df.getMedNo() != null) / 查询药品MedicineDao dao = new MedicineDao();med = dao.findMedicineByMedNo(df.getMedNo();if (med != null) / 如果药品存在,更新数量,否则添加新药BeanUtils.copyProperties(df, med);request.setAttribute(med, med);return mapping.findForward(medUpdate); else CategoryDao cd = new CategoryDao();List list = cd.findByHQL(from Category);request.setAttribute(cs, list);return mapping.findForward(medSave);MedicineAction类的add()方法用于添加或修改药品信息。此方法所做的工作比较多,其中包含判断药品信息是否存在、图片上传、保存药品、更新药品等操作,在这个方法中首先需要获取MedicineForm,然后利用FormFile photo = df.getPhoto()方法上传图片,如果图片存在,然后将图片放到指定的文件夹下面,然后利用String fname = photo.getFileName()方法获取上传文件的名称,并将文件名称保存到数据库中,通过如下方法实现:dao.saveOrUpdate(med); /数据的保存和更新return mapping.findForward(addSuccess); /跳转路径将上传的图片显示在页面上去,则需要调用MedicineDao类中的saveOrUpdate()方法,因此适用于药品对象的添加与修改操作。其中上传文件采用日期时间对其命名,为防止重复本例中加入了时间毫秒,上传的文件保存在Web目录中的upload文件下。(2) 药品添加页面药品添加3个页面,其中med_add.jsp页面提供输入药品编号的表单,当添加的药品信息在数据量中不存在时,将通过med_save.jsp录入药品的详细信息,当所添加的药品信息存在于数据库中,将通过med_update.jsp页面更新药品数量。药品添加页面如图4-7所示。 图4-7 药品添加页面3分页查看所有药品在添加药品信息后,将请求转发到查看所有药品的页面,对所有药品信息进行分页显示。此操作通过MedicineAction类的paging()方法进行处理,在此方法中首先需要通过request.getParameter(currPage)获取页码,利用request.getContextPath()+ aseData/med.do?command=paging的方法构建Action地址,其关键代码如下:String hql = from Medicine; / HQL查询语句分页查询,返回Map对象Map map = this.getPage(hql, recPerPage, currPage, action, null);request.setAttribute(list, map.get(list); /将结果集放到requestrequest.setAttribute(pagingBar, map.get(bar); /将结果集放到分页return mapping.findForward(findAllSuccess);此方法通过调用MedicineAction类已继承的getPage()方法进行分页查询,在查询后分别将结果集与分页条放置到request之中,并转发到med_list.jsp页面进行显示,分页查看页面如图4-8所示。图4-8 分页查看页面4查看药品的详细信息在药品的列表信息中提供了查看药品详细信息的超链接,此超链接作用于药品名称上,单击它将进入药品查看页面中。这个 请求由MedicineAction类的view()方法进行处理。在view()方法中首先通过传递药品id值查询药品对象,然后将所有查询的药品信息放置在request中,转发到med_view.jsp页面中进行显示。在med_view.jsp页面中,通过标签输出图片路径,否则输出提示信息,其关键代码如下:img src=./upload/ width=320 height=220 /5模糊查询药品为方便每个户查询药品,药品信息管理模块还提供了药品的模糊查询。此操作将根据用户所输入的关键字信息,对药品名称、药品描述等多个药品属性进行模糊匹配,并以分页显示的方式返回模糊查询后的结果集。(1) 药品模糊查询请求处理药品模糊查询通过MedicineAction类的blurQuery()方法进行处理,此方法根据提交的关键词keyWord拼接HQL语句,如下代码所示:String keyWord = request.getParameter(keyWord); / 获取关键词String currPage = request.getParameter(currPage); / 获取当前页String hql = from Medicine d ; /拼接的SQL语句调用getPage()方法将查询后的结果信息对象与分页对象放到request里面,然后进行分页查询的实现。HQL的模糊查询使用了like关键字,此方法中分别对药品名称、药品编码、出场地址及药品描述进行模糊匹配。(2) 药品模糊查询页面药品查询页面是通过med_list.jsp实现的,其关键代码如下:form name=medFormaction = method = post onsubmit = return blurQuery(); class = blur_form:为简化程序中的代码,此表单并没有使用Struts标签中的form表单,而采用了普通标签进行了定义。此段代码在项目中是一段可重用的代码,设计模糊查询时可以通过更改表单中的action进行实现。在此表单中输入模糊查询的关键词时,单击“查询”按钮,系统将进行模糊查询,如查询的关键词为“感冒”,其查询结果如图4-9所示。图4-9 模糊查询页面6高级查询使用模糊查询返回的数据结果集将会非常大,查找起来不方便。当需要查询一个确切的药品时,可使用高级查询模式。此查询可以根据药品的多个属性信息来查询一个确切的药品对象,比如输入一个药品的名称、药品编码及其题属性,可进行更为具体的查询。本例中通过MedicineAction类的query()方法对高级查询请求进行处理,此方法通过MedicineForm对象构造多条件查询,分页显示结果,并调用getPage()方法对查询后的结果集进行分页显示,在此方法中,

温馨提示

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

最新文档

评论

0/150

提交评论