固定资产管理系统
摘 要
随着计算机信息技术的发展以及对资产、设备的管理科学化、合理化的高要求,利用计算机实现设备及资产的信息化管理已经显得非常重要。
固定资产管理系统是一个单位不可缺少的部分。但一直以来人们使用传统的人工方式管理固定资产的信息,这种管理方式存在着许多缺点,这对于查找、更新和维护都带来了不小的困难。因此,开发一个界面友好,易操作的资产管理软件进行自动化管理变得十分重要。这正是本系统开发的目的和意义。本文所阐述的固定资产管理系统,以浏览器/服务器模式高效地实现了固定资产管理的各项功能,可进行资产的添加,删除、修改、查询、打印报表等功能;还可以对每位职工的添加、删除、修改、查询基本操作;本系统还对权限进行限制,操作员只可对资产和用户进行基本操作,管理员可以为每位员工赋权限。
使用本系统,不仅提升了效率,而且满足现代高校资产管理的需要。
关键词:资产管理 JSP Struts Hibernate Spring
Fixed-assets Manager System
Abstract
With the development of computer information technology and the high demand of scientific management and rationalization of assets and equipment, using computer to achieve the information management of equipment and assets has become very important.
Fixed assets management system is an indispensable part of a unit, However, we have been using the traditional manual to manage the information of fixed assets, and there are many shortcomings of this approach, which has brought a lot of difficulties to find and update and maintenance .Therefore, to develop a as set management software with friendly interface and easy operation to carry out automated management become very important. This is the purpose and significance of the development of the system. The fixed asset management system decried in this article achieves functions of efficient management of fixed assets using browser / server model. In this system, we can use the function of assets add, delete edits and inquiry, statements printing and so on; we can also use the basic operation of workers add, delete, modify and check. The system also limit the authority so that operators can only do some basic operations to users and assets and the administrator give permissions to every employee.
With the help of this system, the university not only enhances the efficiency but also meets the needs of modern management of asset.
Keywords:Fixed-assets JSP Struts Hibernate Spring
目 录
固定资产管理系统II
摘 要II
AbstractIIII
前 言VV
第1章 绪 论11
1.1 项目背景11
1.2 项目设计原则11
1.2.1 实用性原则11
1.2.2 经济性原则11
1.2.3 扩充性原则22
1.2.4 社会可行性原则22
1.3 本章小结22
第2章 系统分析33
2.1 需求分析33
2.2 技术可行性33
2.2.1 动态网站技术介绍33
2.2.2 程序语言的选择33
2.3 软件可行性分析44
2.3.1 软件环境44
2.3.2 硬件环境77
2.4 系统结构可行性分析77
2.4.1 B/S模式简介77
2.4.2 B/S模式的优点88
2.5 本章小结88
第3章 关键技术99
3.1 开发架构99
3.1.1 软件开发架构的意义99
3.1.2 Struts架构简介99
3.2 数据持久层1111
3.2.1 持久层主流方案1111
3.2.2 持久层主流方案1212
3.2.3 持久化技术1212
3.3 本章小结1313
第4章 总体设计1414
4.1 总体设计1414
4.2 数据库设计1515
4.2.1 数据库的需求分析1515
4.2.2 数据库表的具体设计1515
4.3 详细设计1717
4.3.1 功能设计1717
4.3.2 系统登陆1818
4.3.3 系统用户管理2020
4.3.4 员工信息管理2323
4.3.5 资产入库管理2424
4.3.6 资产维护管理2828
4.3.7 资产借还管理2929
4.3.8 打印报表3131
4.3.9 密码修改3434
4.4 技术难点3434
4.4.1 中文乱码3434
4.4.2 图片处理3434
4.4.3 HQL语言3535
4.4.4 安全性3535
4.5 本章小结3636
第5章 系统测试3737
5.1 测试的定义及目的3737
5.2 测试的原则3737
5.3 系统的方法3737
5.3.1 界面测试3737
5.3.2 功能测试3838
5.3.3 需求测试3838
5.3.4 性能测试3838
5.4 系统中其它要注意的地方3838
5.5 固定资产管理系统的测试3939
5.6 本章小结3939
结 论4040
致 谢4141
参考文献4242
前 言
随着社会经济的迅速发展和科学技术的全面进步,计算机事业的飞速发展,以计算机与通信技术为基础的信息系统正处于蓬勃发展的时期。随着企业的发展,企业的规模也逐渐发生变化,其管理难度也越来越大,如何优化企业设备、资产的日常管理也就成为了一个大众化的课题。如何更好的提高生产效率,相关的企业资产管理系统的研发在社会中越来越受到重视。
固定资产已成为公司管理中不可或缺的一部分,在许多国家得到了广泛的研究与应用。总的说来,固定资产管理系统就是通过集中固定资产信息,对公司的资产进行调控。实现固定资产管理系统现代化的根本途径是信息化、系统化。
作为计算机应用的一部分,使用计算机对固定资产进行管理,具有手工管理所无法比拟的优点。例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高固定资产管理的效率,也是科学化、正规化管理的重要条件。固定资产管理系统通过采集固定资产日常工作中所产生的各种原始数据,根据资产管理的要求,对数据进行分类、统计、汇总、分析,建立程序化、制度化、规范化的固定资产计算机软件管理系统,包括了固定资产的一般特性、固定资产状态数据和固定资产能力数据,及时准确地报出各种报表,为固定资产管理提供了一个现代化的管理手段,这一手段可以强化和规范对固定资产的管理。便于计划、财务、审计等管理部门的介入,形成严格的监督、约束机制。
本章主要介绍固定资产的管理在过去有很大的弊端,急需一个系统高效的管理系统。并且以实际角度出发,根据固定资产具有的相关特点对项目进行实用性、经济性、扩充性和社会可行性等多方面做到深层次的分析,达到管理容易、更新信息方便、操作简便、信息透明化等目的,从而解决以往存在的问题。
设备不仅是高校固定资产的重要组成部分,也是一个高校技术装备水平的重要标志,赖以正常经营和参与市场竞争的物质技术基础。根据高校的实际需求本系统具有以下的功能需求:
JSP(Java Server Pages)是由Sun公司倡导,许多别的公司参与一起创建的一种新动态网页技术标准,类似其他技术标准。在传统的网页HTML文件(*.htm,*.html)中加入Java程序片断(Script let)和JSP标签,构成了JSP网页(*.jsp)Servlet/JSP Container收到客户端发出的请求时,首先执行其中的程序片断,然后将执行结果以HTML格式响应给客户端,其中程序片断可以是:操作数据库,重新定向网页以及发送E-Mail等等,这些都是建立动态网站所需要的功能。所有程序操作都在服务器端运行,网络上传送给客户端的仅是得到的结果,与客户端的浏览器无关,因此,JSP被称为Server-side Language,所以被许多人认为是未来最有发展前途的动态网站技术之一。
经过如上的程序语言的比较,PHP功能相对简单,不适合作大程序,而CGI效率相对较低,所以也不考虑,因为该系统并没有原有的基础平台需要扩展,也不需要与其他系统进行太多的交互,所以使用J2EE的模式并不能够体现出J2EE本身的优势,而JSP又是J2EE的核心技术之一,可以随时升级为J2EE程序,这里暂时不考虑采用J2EE,这样只需要在ASP和JSP中进行选择.在进行了诸多因素的比较之后,最终认为目前这个阶段比较合适的是JSP,而选择Struts架构作为开发的主体框架,选用Hibernate作为数据持续性处理层,则是考虑到了其高速的开发效率,及代码重用性高,易于维护等各种优势。其最终目的是希望提高系统底层业务逻辑的可重用性,增加系统的可扩展性,降低系统维护成本。
开发一个固定资产管理系统需相应的前段开发工具和数据管理系统,还需要一个服务器等。本系统根据Struts+Spring+Hibernate组合结构设计而成,利用Hibernate进行持久层开发,Struts进行业务逻辑控制,利用Spring进行Bean的管理,依赖注入。MVC模式贯穿了整个设计流程,Model层的使用spring的核心技术IOC控制依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间的依赖关系管理,如此减少代码冗余,View层主要运用Ajax无刷新提交,充分增加了客户体验,JSTL的应用使各个层之间的联系更加容易,JavaScript进行多种页面的验证,判断是否符合逻辑要求,若不符合验证需要重新填写,为后台服务器节省资源,已达到提高效率减轻服务器压力,继承使得我们可以对持久层的对象进行抽象,方便理解易于管理,可以简化创建用户界面的过程。Controller层中的action主要负责接受HTTP请求信息,可以接管用户请求并对异常进行处理。根据配置文件struts-config.xml的配置信息,把请求转发给合适的Action对象。Action类负责调用模型的方法,更新模型的状态,并帮助控制应用程序的流程。本文开发的固定资产管理系统所需要的环境如下:
开发工具:Myeclipse8.0,PowerDesigner12.5,Rational Rose
数据库:MySQL5.1
Web服务器:Tomcat 6.0
操作系统:Windows 7
外部包:Struts.jar,Hibernate.jar,JavaReport-V3-Enterprise-Released.jar
Java是一种跨平台,适合于分布式计算环境的面向对象编程语言。具体来说,它具有如下特性:面向对象、多态性、分布式、可靠、安全、多线程等如下:
面向对象:面向对象其实是现实世界模型的自然延伸。现实世界中任何实体都可以看作是对象。对象之间通过消息相互作用。另外,现实世界中任何实体都可归属于某类事物,任何对象都是某一类事物的实例。如果说传统的过程式编程语言是以过程为中心以算法为驱动的话,面向对象的编程语言则是以对象为中心以消息为驱动。用公式表示,过程式编程语言为:程序=算法+数据;面向对象编程语言为:程序=对象+消息。
所有面向对象编程语言都支持三个概念:封装、多态性和继承,Java也不例外。现实世界中的对象均有属性和行为,映射到计算机程序上,属性则表示对象的数据,行为表示对象的方法(其作用是处理数据或同外界交互)。所谓封装,就是用一个自主式框架把对象的数据和方法联在一起形成一个整体。可以说,对象是支持封装的手段,是封装的基本单位。Java语言的封装性较强,因为Java无全程变量,无主函数,在Java中绝大部分成员是对象,只有简单的数字类型、字符类型和布尔类型除外。而对于这些类型,Java也提供了相应的对象类型以便与其他对象交互操作。
多态性:就是多种表现形式,具体来说,可以用“一个对外接口,多个内在实现方法”表示。举一个例子,计算机中的堆栈可以存储各种格式的数据,包括整型,浮点或字符。不管存储的是何种数据,堆栈的算法实现是一样的。针对不同的数据类型,编程人员不必手工选择,只需使用统一接口名,系统可自动选择。运算符重载(operator overload)一直被认为是一种优秀的多态机制体现,但由于考虑到它会使程序变得难以理解,所以Java最后还是把它取消了。继承是指一个对象直接使用另一对象的属性和方法。事实上,我们遇到的很多实体都有继承的含义。例如,若把汽车看成一个实体,它可以分成多个子实体,如:卡车、公共汽车等。这些子实体都具有汽车的特性,因此,汽车是它们的“父亲”,而这些子实体则是汽车的“孩子”。Java提供给用户一系列类(class),Java的类有层次结构,子类可以继承父类的属性和方法。与另外一些面向对象编程语言不同,Java只支持单一继承。
平台无关性:Java是平台无关的语言是指用Java写的应用程序不用修改就可在不同的软硬件平台上运行。平台无关有两种:源代码级和目标代码级。C和C++具有一定程度的源代码级平台无关,表明用C或C++写的应用程序不用修改只需重新编译就可以在不同平台上运行。Java主要靠Java虚拟机(JVM)在目标码级实现平台无关性。JVM是一种抽象机器,它附着在具体操作系统之上,本身具有一套虚机器指令,并有自己的栈、寄存器组等。但JVM通常是在软件上而不是在硬件上实现。(目前,SUN系统公司已经设计实现了Java芯片,主要使用在网络计算机NC上。另外,Java芯片的出现也会使Java更容易嵌入到家用电器中。)JVM是Java平台无关的基础,在JVM上,有一个Java解释器用来解释Java编译器编译后的程序。Java编程人员在编写完软件后,通过Java编译器将Java源程序编译为JVM的字节代码。任何一台机器只要配备了Java解释器,就可以运行这个程序,而不管这种字节码是在何种平台上生成的。另外,Java采用的是基于IEEE标准的数据类型。通过JVM保证数据类型的一致性,也确保了Java的平台无关性。Java的平台无关性具有深远意义。首先,它使得编程人员所梦寐以求的事情(开发一次软件在任意平台上运行)变成事实,这将大大加快和促进软件产品的开发。其次Java的平台无关性正好迎合了“网络计算机”思想。如果大量常用的应用软件(如字处理软件等)都用Java重新编写,并且放在某个Internet服务器上,那么具有NC的用户将不需要占用大量空间安装软件,他们只需要一个Java解释器,每当需要使用某种应用软件时,下载该软件的字节代码即可,运行结果也可以发回服务器。目前,已有数家公司开始使用这种新型的计算模式构筑自己的企业信息系统。
分布式:分布式包括数据分布和操作分布。数据分布是指数据可以分散在网络的不同主机上,操作分布是指把一个计算分散在不同主机上处理。Java支持WWW客户机/服务器计算模式,因此,它支持这两种分布性。对于前者,Java提供了一个叫做URL的对象,利用这个对象,你可以打开并访问具有相同URL地址上的对象,访问方式与访问本地文件系统相同。对于后者,Java的applet小程序可以从服务器下载到客户端,即部分计算在客户端进行,提高系统执行效率。Java提供了一整套网络类库,开发人员可以利用类库进行网络程序设计,方便得实现Java的分布式特性。
可靠性和安全性:Java最初设计目的是应用于电子类消费产品,因此要求较高的可靠性。Java虽然源于C++,但它消除了许多C++不可靠因素,可以防止许多编程错误。首先,Java是强类型的语言,要求显式的方法声明,这保证了编译器可以发现方法调用错误,保证程序更加可靠;其次,Java不支持指针,这杜绝了内存的非法访问;第三,Java的自动单元收集防止了内存丢失等动态内存分配导致的问题;第四,Java解释器运行时实施检查,可以发现数组和字符串访问的越界,最后,Java提供了异常处理机制,程序员可以把一组错误代码放在一个地方,这样可以简化错误处理任务便于恢复。
由于Java主要用于网络应用程序开发,因此对安全性有较高的要求。如果没有安全保证,用户从网络下载程序执行就非常危险。Java通过自己的安全机制防止了有病程序的产生和下载程序对本地系统的威胁破坏。当Java字节码进入解释器时,首先必须经过字节码校验器的检查,然后,Java解释器将决定程序中类的内存布局,随后,类装载器负责把来自网络的类装载到单独的内存区域,避免应用程序之间相互干扰破坏。最后,客户端用户还可以限制从网络上装载的类只能访问某些文件系统。上述几种机制结合起来,使得Java成为安全的编程语言。
多线程:线程是操作系统的一种新概念,它又被称作轻量进程,是比传统进程更小的可并发执行的单位。C和C++采用单线程体系结构,而Java却提供了多线程支持。Java在两方面支持多线程。一方面,Java环境本身就是多线程的。若干个系统线程运行负责必要的无用单元回收,系统维护等系统级操作;另一方面,Java语言内置多线程控制,可以大大简化多线程应用程序开发。Java提供了一个类Thread,由它负责启动运行,终止线程,并可检查线程状态。Java的线程还包括一组同步原语。这些原语负责对线程实行并发控制。利用Java的多线程编程接口,开发人员可以方便得写出支持多线程的应用程序,提高程序执行效率。必须注意地是,Java的多线程支持在一定程度上受运行时支持平台的限制。例如,如果操作系统本身不支持多线程,Java的多线程特性可能就表现不出来。
客户端由于不涉及到系统的开发和维护等问题,因此可以不用安装过多的软件,只要能够实现对服务器端的访问就可以,一般来说普通PC机即可。
客户端主要用于浏览系统界面、同web数据库进行数据交互等基本操作,因此客户端对硬件要求不高,主要由所安装的Windows的要求来决定。但若期望性能更好,需要的配置应该高于以下配置:
处理器:双核2.1GHz
内存:2GB
硬盘:320G
显卡:SVGA显示适配器
网卡:PCI和ISA接口均可
大家都知道windows操作系统在平常应用上几乎一统天下,浏览器成为了标准配置,但在服务器操作系统上windows并不是处于绝对的统治地位。现在的趋势是凡使用B/S架构的应用管理软件,只需安装在Linux服务器上即可,而且安全性高。所以服务器操作系统的选择是很多的,不管选用哪种操作系统都可以让大部分人使用windows作为桌面操作系统,电脑不受影响,这就使得最流行免费的Linux操作系统快速发展起来,Linux除了操作系统是免费的以外,连数据库也是免费的,这种选择非常盛行。
比如说很多人每天上“网易”网,只要安装了浏览器就可以了,并不需要了解“网易”的服务器用的是什么操作系统,而事实上大部分网站确实没有使用windows操作系统,但用户的电脑本身安装的大部分是windows操作系统。
本章节首先对项目所要实现的功能进行分析,应主要包含对资产的录入、销毁、维修、借入借出和多功能查询,和对相关工作人员的管理和权限的分配。然后介绍一下本系统所涉及到的技术知识,及对系统所需要的软硬件环境进行说明。最后阐述为何会选择B/S结构和诸多好处。
随着Web开发技术的日益成熟,在Web开发领域中出现了许多设计好的软件开发框架,Struts就是一种基于MVC经典设计模式的框架,也是当前Web开发中比较成熟的一种框架。
在Tomcat安装完成后,即可将Struts框架工具安装到对应的WEB Container中。可以通过Struts的二进制发布包安装Struts框架,具体操作步骤:
(1)下载二进制发布版;
(2)将下载的Struts二进制发布包进行解包,将解包目录下的lib目录下的所有.jar文件全部复制到项目目录的WEB-INF/lib下,如果在多个项目中都用到了Struts,则将上述文件直接复制到Tomcat目录下的common/lib下;
(3)将对应的lib目录下的struts.jar文件添加到环境变量CLASSPATH中即可。以上资源可以从http://jakarta.apache.org/struts/userGuide/index.html获得更多关于Struts安装和相关配置的说明信息。
数据是我们软件开发人员必须考虑的对象。无论你使用哪种技术,借助哪种工具,以及购买哪种软件平台产品,当接受一个实际的问题时,你都需要面对实际的数据,考虑实际数据的各种问题。在这些问题中往往都包含数据持久化的问题,这不仅是因为我们的计算机内存有限,更主要的原是业务逻辑的需要,作为一个接触软件技术,尝试写程序的人,我们要接触各种类型的数据。下面列举了三种常见的数据类型:
现在很多网络上的应用程序都使用XML类型的数据,或者说是一种树状的数据,如何将这两种数据持久化保存下来呢?一种方法是将XML数据拆分为属性数据,然后存储到关系型数据库中。另一种方式比较新,是将XML数据存储到XML数据库中,在XML数据库中存储这种数据时,数据的结构不变,XML数据在XML数据库中以文档对象形式保存,使用XPaht和XQuery查询语言来查询XML数据中的节点数据,或者多个XML文档中的多个节点数据。
JDO是一个存储java对象的规范,JDO规范1.0的提出可以使你将精力集中在设计Java对象模型,然后在企业应用软件架构的不同层面中存储传统的Java对象(Plain Old Java Objects,简称POJOs),采用JDOQL语言进行SQL操作。一些公司(包括sun)企图根据JDO规范进行设计并实现JDO产品,然而他们都不能很好的进行实现,并且性能优化上比较差。
本章节阐述了Struts框架有何优点,并将MVC模式以图形加文字的双重方式进行介绍,充分展现其好处,引出固定资产管理系统选取Struts1.2为开发框架,采用经典的MVC模式对项目进行整体的分层,让项目层次分明、代码规范。再由框架引出数据库同样是系统中不可分割的一部分,然后提出通过Hibernate的映射文件简化对数据库的操作,从而达到更好的面向对象进行开发。
系统设计是在系统分析的基础上由抽象到具体的过程。主要目标是将系统分析阶段所提出的反映了信息需求的系统逻辑方案转换成可以实施的基于计算机与通信系统的物理(技术)方案,为下一阶段系统实施提供必要的技术资料,应符合系统性、灵活性、可靠性、经济性的要求。根据系统分析阶段能确定新系统的逻辑模型、功能要求,在可实现的环境下设计出一个能在计算机网络环境上实施的方案,即建立新系统的物理模型。本阶段的任务是设计软件系统的模型层次结构,设计数据库的结构以及涉及模块的控制流程,其目的是明确系统具体怎么实现。这个阶段又分为两个步骤:概要设计和详细设计。概要设计解决软件系统的模块划分和模块的层次机构以及数据库设计;详细设计解决每个模块的控制流程,内部算法和数据结构的设计。根据种种分析设计在逐步实现各个功能,完成一个完整的固定资产管理系统。
依据项目的处理需求,对应数据表的设计及功能如下:
字段名
数据类型
长度
是否主键
描述
inout_no
int
10
是
借用流水号
ic_id
varchar
30
资产编号
comployee_no
varchar
30
员工编号
out_time
varchar
20
借出时间
should_time
varchar
20
应还时间
back_time
varchar
20
归还时间
用户表是依附于员工表而存在的一张管理员表,此表中根据competence字段区分管理员及操作员两种权限,管理员具有最高权限,操作员可对资产进行全方位的管理和信息查询。表结构如表4-2用户表。表4-2 用户表
字段名
数据类型
长度
是否主键
描述
userName
varchar
30
是
用户名
pwd
varchar
20
密码
comployee_no
varchar
30
员工编号
competence
varchar
15
权限
员工信息表是跟资产基本表密切相关的一张相关操作表,员工编号为唯一主键,能够标识员工身份。每一次对资产的操作都应该落实到具体的员工头上,让所有的操作都可查,使业务更加清晰,方便应用。表结构如表4-3员工信息表。表4-3 员工信息表
字段名
数据类型
长度
是否主键
描述
comployee_no
varchar
30
是
员工编号
comployee_name
varchar
25
员工姓名
sex
varchar
5
性别
age
int
10
年龄
dept
varchar
45
部门
profession
varchar
20
现任职务
address
varchar
60
家庭地址
phone
varchar
20
联系方式
comployee_statu
varchar
10
员工状态
设备借出归还表是由资产表和员工表根据实际需求衍生出来的一张业务表,此表用于保存某位员工于某个时间借出了某个编号的资产借,并打算在什么时间归还及实际的归还时间的全部信息,使得用户对资产的管理更加方便简单。表结构如表4-4资产设备借出归还表。表4-4 资产设备借出归还表
字段名
数据类型
长度
是否主键
描述
inout_no
int
10
是
借用流水号
ic_id
varchar
30
资产编号
comployee_no
varchar
30
员工编号
out_time
varchar
20
借出时间
should_time
varchar
20
应还时间
back_time
varchar
20
归还时间
部门表的存在是专门为了方便使用单而存在的表,其主要用于区分不同部门而方便操作,每个员工都有一个字段叫做dept,使得不同部门的人员,进行不同的归拢,方便管理。具体表结构如表4-5部门表。表4-5 部门表
字段名
数据类型
长度
是否主键
描述
dept
varchar
45
是
部门名称
资产设备维修信息表也是由资产基本表衍生出来的一张业务表,它用于管理哪些设备因为何种原因而需要维修,其中有由谁送去维修并经过谁手而修,维修流水号应该为唯一主键,包含所有的维修相关信息。表结构如表4-6资产设备维修信息表。表4-6 资产设备维修信息表
字段名
数据类型
长度
是否主键
描述
repair_no
int
10
是
维修流水号
zc_id
varchar
30
资产编号
send_time
varchar
30
送修时间
sender
varchar
50
送修人
Login_user
varchar
50
经手人
reason
varchar
50
送修原因
wx_time
varchar
30
维修时间
wx_result
varchar
45
维修结果
cost
float
30
花费金额
wx_comment
varchar
45
维修备注
本系统主要用于高校中的“资产”进行管理。具体地讲,固定资产管理系统就是通过资产的增加、删除、查看、借出、归还、维修等一系列手段来提高效率,最终达到发展目标的一种管理行为。总体来说就是解决固定资产管理中经常出现的实物与财务账目不符的情况,以实物管理为特点,以简化为目的,实现信息流和实物流的统一,并且提高工作效率减轻工作负担。本系统中各种功能操作都非常简单方便,操作员无须专门的培训就可以使用,大大的减少了误操作的几率。具体实现目标如下:
系统经过严格的测试并实际运行无误,可以安全稳定上线运行;根据权限拦截器防止越过登陆对本系统进行操作,所以安全可靠,能保证正常的工作运转。
图4-2 用户登录系统登陆是固定资产管理系统中最先使用的功能,因为用户登陆在数据库中使用的是用户表,人员表中有一个competence字段,是来标识用户权限的。在登陆时要根据数据库的这个字段来判断此用户是否具有管理员的权限。在网页里添写用户名和密码和验证码后点击【确定】按钮,网页通过actinotallow="login"进Struts配置文件中,代码如下:<html:form method="post" actinotallow="login"> 这个html:form与loginForm相绑定,在struts配置文件中的代码如下:<form-beans><form-bean name="loginForm" type="com.jdy.gdzc.web.struts.form.LoginForm" /><form-beans><action path="/login" scope="request" name="loginForm"type="org.springframework.web.struts.DelegatingActionProxy"><forward name="success" path="/mainframe/framework.jsp" /><forward name="fail" path="/index.jsp" /></action>在这个配置文件中,可以了解到如下信息:根据type="org.springframework.web.struts.DelegatingActionProxy"可以找到Spring配置文件中对应的具体Action类是class="com.jdy.gdzc.web.struts.action.LoginAction"。根据<forwardname="success"path="/mainframe/framework.jsp"/>和<forward name="fail" path="/index.jsp"/>可以了解, Action返回success时页面会被转到mainframe/framework.jsp文件,这就是登陆成功的页面。如果当Action返回fail时,页面会被转到index.jsp文件,这个文件是当用户登陆失败将要转到的页面。Struts的Action的实现类是这个登陆页的核心内容,就来看看它是怎么实现的吧,如下所示:import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import com.jdy.gdzc.web.struts.form.LoginForm;public class LoginAction extends BaseAction {public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {String err = "";HttpSession sessinotallow=(HttpSession)request.getSession();//获得图片上的验证码String randCode = (String) session.getAttribute("code");LoginForm lf=(LoginForm)form;String username=lf.getUsername();String password=lf.getPassword();if (lf.getCheckcode().equals(randCode)) {if (assetManagerImpl.login(username, password)) {// 把登录成功的用户名,放在cookie中Cookie c = new Cookie("username",username);c.setMaxAge(60 * 60 * 24);response.addCookie(c);// 登录成功,跳到显示所有课程的页面String competence=userManaManagerImpl.competence(username);session.setAttribute("username", username);session.setAttribute("competence", competence);return mapping.findForward("success");} else {err = "用户名或密码错误!";}} else {err = "验证码错误!";}request.setAttribute("gdzc.login.error", err);return mapping.findForward("fail");}}Struts的Action实现类的execute()方法是最先被执行的,这个方法本身也没有具体的事务,而是根据action的参数不同执行相应的方法。在登陆页里面可以找到有一个“actinotallow=login” 的字样,它的目的就是在这里做逻辑判断。当actinotallow=login时进入Action中执行execute()方法。execute()方法从LoginForm中得到用户提交的数据,然后在调用控制层中的login()方法,并将从LoginForm中得到的username, password做为参数传给控制层,调用后会返回一个boolean型的值。控制层再继续调用DAO层,DAO层得到从上层传进来的username, password并进行处理,调用后会返回一个boolean型的值并传给上层。如果为真则将username用户名放到session范围中,并返回“mapping.findForward("success")”,进入系统主页;否则返回“mapping.findForward("fail")”,将错误信息存到request范围中,跳到登陆界面并提示登陆错误信息:用户名或者密码错误、验证码错误。需要用户重新正确输入才能完成登录。接下来看一下DAO层是如何实现登陆:import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import com.jdy.gdzc.dao.IUserDAO;public class UserDAOImpl implements IUserDAO {private SessionFactory sessionFactory;public void setSessionFactory(SessionFactory sessionFactory) {this.sessionFactory = sessionFactory;}protected Session getSession() {return sessionFactory.getCurrentSession();}public boolean login(String userName, String password) {boolean flag = false;Session session = this.getSession();String hql = "select pwd from UserInfo where userName=:userName";try {Query query = session.createQuery(hql);query.setString("userName", userName);String pwd = (String) query.setMaxResults(1).uniqueResult();if (password.equals(pwd)) {flag = true;}} catch (Exception e) {e.printStackTrace();}return flag;}}
图4-3 用户管理界面当点击【用户管理】时,系统会通过Stuts框架,找到userManaAction.do 从后台取出数据库中所有的员工信息,并将信息返回到界面显示出来,具体的表现代码实现如下:<input name="addUser" type="button" class="button" id="addUser" value="添加用户" notallow="window.locatinotallow='/gdzc/user_info/user_add.jsp'"><input name="edit" type="button" class="button" id="edit" value="修改权限"notallow="this.style.color='red'"notallow="this.style.color='#1e7977'" notallow="window.locatinotallow='findUserbyname.do?username=${item.userName}'"><input name="delete" type="button" class="button" id="delete" value="删除"notallow="this.style.color='red'"notallow="this.style.color='#1e7977'"notallow="if(confirm('您确定要删除编号为${item.comployee.comployeeNo}的用户吗?'))window.locatinotallow='deleteUserAction.do?userName=${item.userName}'">在点击【添加用户】时,会出现添加用户界面如图4-4所示。
图4-4 添加系统用户在这个功能里可以增加新的用户并且为他分配相应的权限,用户必须是本系统中的员工,由当前用户通过添加系统用户功能,使其具有登陆系统的权限成为用户,但是这个权限分为管理员或者是操作员。按照提示输入完毕后点击【保存】按钮系统首先进行表单验证,若验证不通过给予相应的提示,如验证通过后,则获取表单数据,再将表单数据保存到后台数据库中,【返回】按钮会将用户带回用户管理界面,添加用户的具体代码如下:public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {AddUserForm auf= (AddUserForm)form;UserInfo user=new UserInfo();Comployee com=new Comployee();user.setUserName(auf.getUserName());user.setPwd(auf.getPassword());user.setCompetence(auf.getCompetence());String eno=auf.getComployeeNo();com.setComployeeNo(eno);user.setComployee(com);if(!employeeManagerImpl.isEmployeebyno(eno)){request.setAttribute("error", "*员工编号不存在");return mapping.findForward("fail");}if(userManaManagerImpl.insertUser(user)){return mapping.findForward("success");}else {return mapping.findForward("fail");}
图4-5 员工信息管理查询员工信息的具体代码如下:public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {HttpSession session = request.getSession();// 分页int pageCount = 10; //int totalCount = 0; // 总记录数int currrentPage = 1;int totalPage = 0;String tempStr = request.getParameter("currentPage");if (tempStr != null) {currrentPage = Integer.parseInt(tempStr);totalCount = employeeManagerImpl.showAllEmployee().size();totalPage = (totalCount % pageCount == 0) ? (totalCount / pageCount): (totalCount / pageCount + 1);if (totalPage= = 0) {totalPage = 1;}// 修正当前页面编号,确保: 1<=currrentPage<=totalPageif (currrentPage > totalPage) {currrentPage = totalPage;}else if (currrentPage < 1) {currrentPage = 1;}// 计算当前页面所显示的第一个记录的索引int pageStartRow = (currrentPage - 1) * pageCount;List list = employeeManagerImpl.findPageEmployee(pageStartRow, pageCount);request.setAttribute("totalCount", totalCount);request.setAttribute("pageCount", pageCount);session.setAttribute("countpage", totalPage);request.setAttribute("pages", currrentPage);request.setAttribute("list", list);return mapping.findForward("success");}
图4-6 资产入库管理默认资产查询操作具体代码如下:public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {HttpSession session = request.getSession();// 分页int pageCount = 10; int totalCount = 0;int currrentPage = 1; int totalPage = 0;String tempStr = request.getParameter("currentPage");if (tempStr != null) {currrentPage = Integer.parseInt(tempStr);}totalCount = assetManagerImpl.showAllAssets().size();totalPage = (totalCount % pageCount == 0) ? (totalCount / pageCount): (totalCount / pageCount + 1);if (totalPage == 0) {totalPage = 1;}// 修正当前页面编号,确保: 1<=currrentPage<=totalPageif (currrentPage > totalPage) {currrentPage = totalPage;}else if (currrentPage < 1) {currrentPage = 1;}int pageStartRow = (currrentPage - 1) * pageCount;List list = assetManagerImpl.findPageAssets(pageStartRow, pageCount);request.setAttribute("totalCount", totalCount);request.setAttribute("pageCount", pageCount);session.setAttribute("countpage", totalPage);request.setAttribute("pages", currrentPage);request.setAttribute("list", list);return mapping.findForward("success");}点击【添加资产】后出现如图4-7所示。
图4-7 添加资产此系统从前台获取数据,首先进行表单验证,若所填不符合逻辑则给予提示,如正确则将数据封装到javaBean中,将对像传到底层,最后保存到数据库中,实现资产的添加。【重置】和【返回】两个按钮可尽最大程度的满足用户需求,简化添加资产的操作。具体代码实现如下://添加资产public boolean addAssets(ZcInfo zcinfo){boolean flag=false;Session session = this.getSession();try {session.save(zcinfo);flag=true;} catch (Exception e) {e.printStackTrace();}return flag;}在点击【修改】后,出现界面如图4-8所示。
图4-8 资产修改修改主要是对当前行的数据进行修改,首先将相关信息带回到修改页面,然后再根据更改后的信息对数据库中的数据进行一次更新操作,具体代码如下://保存修改资产信息public void saveUpdate(ZcInfo zcinfo){boolean flag=false;Session session = this.getSession();try {session.update(zcinfo);flag=true;} catch (Exception e) {e.printStackTrace();}}若要对库存资产进行查询,可以选择菜单栏中的【资产查询】,出现界面如图4-9所示。
图4-9 资产查询查询主要是对库存的资产进行按条件查询,可以根据所输入的查询条件不同,进行不同条件的多种组合,然后点击【查询】,就会按条件索引数据。此功能大大方便了用户对资产管理的查询操作,只需要根据实际需求的不同,输入不同的查询条件进行查询操作,即可查询出相应的结果。具体代码如下:public List checkZC(String zcId,String zcFactory,String zcNo,String zcName,String zcType,String zcStatus,String zcBuyer){List list=null;Session session = this.getSession();String sql = "from ZcInfo where zcId=:zcId or zcNo=:zcNo or zcName=:zcName or zcType=:zcType or zcStatus=:zcStatus or zcFactory=:zcFactory or zcBuyer=:zcBuyer";try {Query query = session.createQuery(sql);query.setString("zcId", zcId);query.setString("zcNo", zcNo);query.setString("zcName", zcName);query.setString("zcType", zcType);query.setString("zcStatus", zcStatus);query.setString("zcBuyer", zcBuyer);query.setString("zcFactory", zcFactory);list = query.list();} catch (Exception e) {e.printStackTrace();}return list;}
图4-10 资产维护管理维修操作页面里的经手人一栏是有系统将当前登陆的用户名默认填上,并且不能修改,在这里当用户输入相应的维修信息后,点击【确定送修】后,系统会先进行表单验证,验证通过后会将表单的数据提交到后台数据库中,实现维修操作。具体的代码如下:public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {HttpSession session = request.getSession();// 分页int pageCount = 10; // 每页显示的记录数int totalCount = 0; // 总记录数int currrentPage = 1; // 当前页面编号int totalPage = 0; // 页面总数String tempStr = request.getParameter("currentPage");if (tempStr != null) {currrentPage = Integer.parseInt(tempStr);}// 计算总记录数totalCount = assetPerManagerImpl.showAllPerAssets().size();// 计算总页数totalPage = (totalCount % pageCount == 0) ?(totalCount / pageCount): (totalCount / pageCount + 1);if (totalPage == 0) {totalPage = 1;}// 修正当前页面编号,确保: 1<=currrentPage<=totalPageif (currrentPage > totalPage) {currrentPage = totalPage;} else if (currrentPage < 1) {currrentPage = 1;}// 计算当前页面所显示的第一个记录的索引int pageStartRow = (currrentPage - 1) * pageCount;List list = assetPerManagerImpl.findPagePerAssets(pageStartRow, pageCount);request.setAttribute("totalCount", totalCount);request.setAttribute("pageCount", pageCount);session.setAttribute("countpage", totalPage);request.setAttribute("pages", currrentPage);request.setAttribute("list", list);return mapping.findForward("success");}
图4-11 资产借还管理具体的代码如下:public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {String message="";HttpSession sessinotallow=(HttpSession)request.getSession();String zcId=request.getParameter("zc_id");String comployeeNo=request.getParameter("em_id");String status=inOutAssetManagerImpl.zcStatus(zcId);if(!employeeManagerImpl.isEmployeebyno(comployeeNo)){message="此员工编号不存在!";}else if(status==null){message="此物品 不存在!";}else if(status.equals("维修")){message="此物品正在维修,无法借出!请选择其他资产!";}else if(status.equals("报废")){message="对不起,此物品已经报废!请选择其他资产!";}else if(status.equals("借出")){message="对不起,此物品已经借出!请选择其他资产!";}else{return mapping.findForward("success");}request.setAttribute("gdzc.status.message", message);return mapping.findForward("fail");}
图4-12 打印报表具体实现代码如下:public Report createReport(HttpServletRequest request) throws Exception{ArrayList<ZcInfo> list =(ArrayList)request.getAttribute("list");//实例化报表对象Report report = new Report();//在页眉中添加文本信息内容report.addHeaderText("打印入库单");//在报表的页眉添加一条横直线report.addHeaderSeparator(1);//在页尾添加一条横直线report.addFooterSeparator(1);//在页尾添加文本信息内容report.addFooterText("第{P}页, 共{N}页");//在报表中添加文本信息内容report.addText("入库单一览表:");//在报表中添加换行符号report.addBreak();//在报表中添加表格report.addTable(getTableA(list));//在报表中添加换行符号report.addBreak();//在报表中添加文本信息内容//report.addText("销售情况一览表(合并表格):");//在报表中添加换行符号//report.addBreak();//在报表中添加表格//report.addTable(getTableB());//在报表中添加换行符号//report.addBreak();return report;}//------得到销售情况一览表对象------public Table getTableA(ArrayList<ZcInfo> list){String[][] data = getData(list);Table table = new Table(data);table.setColBorder(0);table.setRowBorder(0);table.setRowBorder(0,1);table.setRowBackground(0,new Color(128,0,0));table.setRowForeground(0,Color.white);for(int i =1 ;i<=list.size() ;i++){if(i%2==0) {table.setRowBackground(i,new Color(188,224,222));}table.setRowForeground(i,Color.black);}return table;}//------得到销售情况一览表(合并表格)对象------public Table getTableB(){String[][] data = getTotalData();Table table = new Table(data);table.setAlignment(Table.H_CENTER + Table.V_CENTER);table.setColAutoSize(true);table.setRowBackground(0,Color.LIGHT_GRAY);table.setRowBackground(1,Color.LIGHT_GRAY);table.setColBackground(0,Color.LIGHT_GRAY);table.setRowBackground(7,new Color(255,255,128));table.setHeaderRowCount(2);table.setHeaderColCount(1);table.setRowBorder(table.LINE_THIN);table.setColBorder(table.LINE_THIN);table.setCellSpan(0,0,new Dimension(1,2));table.setCellSpan(0,1,new Dimension(2,1));table.setCellSpan(0,3,new Dimension(2,1));table.setCellSpan(0,3,new Dimension(2,1));return table;}//生成销售情况数据,实际工程中一般从数据库中获取public String[][] getData(ArrayList<ZcInfo> list){String[][] data = new String[list.size()+1][9];data[0][0] = "资产编号"; data[0][1] = "资产名称"; data[0][2] = "资产类型";data[0][3] = "供应商";data[0][4] = "单价";data[0][5] = "出产日期";data[0][6] = "购买日期";data[0][7] = "购买者";data[0][8] = "资产状态";for(int i =1 ; i<=list.size() ; i++){data[i][0] = list.get(i-1).getZcId();data[i][1] = list.get(i-1).getZcName();data[i][2] = list.get(i-1).getZcType();data[i][3] = list.get(i-1).getZcFactory();data[i][4] = list.get(i-1).getZcPrice()+"";data[i][5] = list.get(i-1).getZcProduceTime();data[i][6] = list.get(i-1).getZcBuyTime();data[i][7] = list.get(i-1).getZcBuyer();data[i][8] =list.get(i-1).getZcStatus();}return data;}//得到销售汇总统计数据,实际工程中一般从数据库中获取public String[][] getTotalData(){String[][] data = new String[8][5];data[0][0] = "区域"; data[0][1] = "上半年"; data[0][3] = "下半年";data[1][1] = "第一季度"; data[1][2] = "第二季度"; data[1][3] = "第三季度";data[1][4] = "第四季度";data[2][0] = "华南地区"; data[2][1] = "¥2,000,000"; data[2][2] = "¥2,500,000";data[2][3] = "¥2,200,000";data[2][4] = "¥0";data[3][0] = "华东地区"; data[3][1] = "¥6,000,000"; data[3][2] = "¥4,500,000";data[3][3] = "¥4,800,000";data[3][4] = "¥0";data[4][0] = "华中地区"; data[4][1] = "¥500,000"; data[4][2] = "¥400,000";data[4][3] = "¥700,000";data[4][4] = "¥0";data[5][0] = "华北地区"; data[5][1] = "¥3,000,000"; data[5][2] = "¥3,200,000";data[5][3] = "¥2,500,000";data[5][4] = "¥0";data[6][0] = "东北地区"; data[6][1] = "¥4,000,000"; data[6][2] = "¥5,000,000";data[6][3] = "¥4,400,000";data[6][4] = "¥0";data[7][0] = "总计"; data[7][1] = "¥15,500,000"; data[7][2] = "¥15,600,000";data[7][3] = "¥14,600,000";data[7][4] = "¥0";return data;}//定制Web报表在页面首部显示的工具栏为标准的样式,增加一个【返回】按钮,返回到首页public String getToolbarScript(HttpServletRequest request){return "<a href=\"/hms/storeInShowAll.do\"><img src=\""+request.getRequestURI()+"?op=Resource&name=/resource/back.gif\" border=\"0\" alt=\"返回\"></a>";}%>
图4-13 修改密码
由于浏览器中的参数传递是按字节传送,因此英文和数字不会有任何的问题,而中文汉字则由两个字节组成。为了解决这个问题,使用了下面的两种方法:
本系统中,所有对数据库的操作都由Hibernate来完成,因此用到了大量的HQL语言。HQL是Hibernate设计的一套完整而实用高效的查询语言,它通过面向对象的语句结构实现了和SQL语言类似的功能。HQL拥有面向对象语言的所有特性,这其中包括多态、继承和组合。如果向表里插入一条数据的话,直接调用save()方法即可,但如果要使用查询功能的话,我按照一般的SQL语句的方法:from 表名 where 条件,却总是找不到预期的数据,后来看书中发现,from后跟的是表对应映射的类文件名,而非表名,比如招聘表为invite,它对应的类为Invite.java,所以在from后要根Invite而不是invite。在本文中并不讨论那些非常复杂的查询,只使用连接两个表的查询。
Hibernate配备了非常强大的查询语言,HQL语言被设计为完全面向对象的查询,次语言具有主要特点如下:
本章节为系统设计章节。首先详细设计系统应具备的功能,主要分为:资产管理模块、资产维护模块、员工管理模块、用户管理模块等四大模块。并充分分析项目需求,完善数据库的各个表。然后逐一演示系统功能,由语言叙述到截图显示进行全面讲解,最后到代码的详细分析,全面的介绍了系统的具体实现。其基本功能符合用户需求,能够实现对固定资产的基本信息录入、更新、操作、删除、打印等,从而实现对资产的管理。
最后简单阐述了一下项目进行中所遇到的主要问题及解决方法和为保证系统的安全性所采用的拦截器。
在完成了程序的编写工作后,接下来将进行软件的测试,这里说的软件,并不单单是指程序本身,还包括其他方面。测试和开发一样,也是一项技术性很强的工作,有着很多的技巧。软件测试是软件质量保证的主要活动之一,因此,测试的质量直接影响软件的质量。
界面测试是测试过程中比较简单直观的一种测试方法,只要细心地按界面要求核对就行了。可这点往往是程序开发人员容易忽视和遗漏的地方,也是常常出Bug的地方。下面是界面测试中经常出现的几种Bug:
顾名思义,功能测试主要是测试程序模块是否实现了设计中所有要求的功能,功能测试中需要注意的有:
在完成编码的工作以后,根据以上的方法和步骤进行了如下的测试:
通过这几方面的测试,我及时修正了系统中存在的问题,很好的提高了系统的性能,达到了预期目标。
代码虽然编写完成,却并不意味着项目的结束,还需要最后的一步检测。软件测试是软件质量保证的主要活动之一。因此,测试的质量直接影响软件的质量。所以要从诸多方面考虑测试的方向如:界面测试、功能测试、需求测试、性能测试,然后根据实际需求判断是否有不符,再进行校正修改。
结 论
毕业论文是本科学习阶段一次非常难得的理论与实际相结合的机会,通过这次比较完整的固定资产管理系统的设计,我摆脱了单纯的理论知识学习状态,实际设计的结合锻炼了我的综合运用所学的专业基础知识,解决实际问题的能力,同时我也提高我查阅文献资料、设计手册、设计规范等其他专业能力水平,而且通过对整体的掌控,对布局的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了丰富的提高,并且意志品质力,抗压能力及耐力也都得到了不同程度的提升。这一次设计让我累计了无数实际经验,使我的头脑更好的被知识武装了起来,也必然会让我在未来的工作学习中表现出更高的应变能力,更强的沟通力和理解力。
论文在撰写过程中,力求将理论与实践相结合,在对资产管理进行阐述的同时,配合此系统从实际应用和操作技巧上加以说明,以期达到更深层次的理解与认识。
该系统由于在设计前期,进行了大量的需求分析,在此基础上将理论知识与开发技术运用到系统的实现过程当中,所以该系统具有较强的实用价值,能够实现一个中小型团体的固定资产管理系统所具备的各种功能。当然,由于时间有限,以及软、硬件设施的配置等限制因素,这个系统还不太完善,还有许多地方有待改进与完善;世界上对资产管理的内涵、标准及技术也日新月异,处于不断的变化发展之中,将会不断有观点、技术和实践的创新与突破,需要我们加以学习与改进,因此,我在论文的撰写过程当中,尽量避免使用结论性的语言;加之固定资产管理范围是一个涉及多领域的概念,每个不同的团体具体需要方向不同,且文理渗入,很难从整体上把握,难免存在许多疏漏,恳请各位老师加以批评指点。
致 谢
时光荏苒,转眼间在这里度过了最美好的时光,在这里的学习生涯,不仅是我丰富个人知识的重要阶段,也是我提升自身素质与能力的关键时期。
通过几个月的毕业课程设计,让我在巩固过去所学知识的基础上,也锻炼了我的实际应用能力和处理问题的能力,另外还学到了许多书本上学不到的知识,让我获益匪浅。
首先,感谢学校以及所有老师四年来对我的辛勤培育与关怀,感谢系里的领导和主任给我们安排足够的论文设计时间。
其次,我要向学识渊博、治学严谨、诲人不倦的导师表示最衷心的感谢,感谢###老师对我的教导,谢谢她在我论文写作中对我的鼓励和宽容,让我顺利的完成论文。在论文写作过程中,老师不仅为我指点研究方向,还细致耐心地给我提出许多十分有价值的改进意见,才使我得论文日渐成熟。从选题,构思,到开题,写作,每一过程都凝聚着老师的心血,使我在论文的整体构思和关键问题的把握上深受启发,在此,我要对老师的帮助提出感谢。
最后,再次感谢各位老师对我的指导和帮助,使我能顺利的完成我的毕业设计。感谢所有老师四年来对我的辛勤培育与关怀,同时也非常感谢系里的领导和主任给我们安排足够的论文设计时间。
合上论文的最后一页,也合上我大学的求学生涯,但是我会永远留这一份执着和认真。在求职的征程上,我将带着所有关心我的朋友的祝福和爱,一如既往的期待最精彩的人生。
参考文献
[1] 刘洋.精通Hibernate[M].电子工业出版社,2010.
[2] 史济民.软件工程――原理、方法与应用[J].高等教育出版社,2008.
[3] 张桂元,贾燕枫.Eclipse开发入门与项目实践[M].人民邮电出版,2006.
[4] 张桂元.Struts开发入门与项目实践[M].人民邮电出版社,2005.
[5] 孙卫琴.精通Struts:基于MVC的Java Web设计与开发[M].电子工业出版社,2004.
[6] 鲁晓东.JSP软件工程案例精解[J].电子工业出版社,2005.
[7] 丁鹏.STRUTS技术解密及WEB开发实例[M].清华大学出版社,2009.
[8] 夏昕.深入浅出Hibernate[M].电子工业出版社.2008.
[9] 孙卫琴.精通Hibernate:Java对象持久化技术详解[DB].电子工业出版社,2007.
[10]李小喆,张晓辉,李祥胜.SQLServer 2000管理及应用系统开发[M].人民邮电出版社,2002.
[11] Thomas Kyte. Expert Oracle Database Architecture 9i and 10g Programming Techniques and Solutions [M]. BeiJing: Posts&Telecom Press.2005.
[12] Tsichritzis D C.Lochovsky F H.Data Models[M].Prentice-Hall.2010.
[13] Abraham Silberschatz. Database System Concepts(Fourth Edition) [M].BeiJing:Higher Education Press.2010.
[14] Thomas Connolly. Database System: A Practical Approach to Design, Implementation, and Management(Third Edition)[M].BeiJing: Publishing Houser of Electronics Industry.2009.
[15] Cay S.Horstmann,GaryCornell.Core Java 2.Volume I-Fundamentals (Seventh Edition)[M]. U.S.A.: Sun Microsystems Press.2005.