基于java+SSH+JSP的固定资产管理系统设计与实现(全套源码+配套论文)
大家好,今天给大家介绍基于java+SSH+JSP的固定资产管理系统设计与实现,更多精选毕业设计项目实例见文末哦。
文章目录:
1、项目简介
- 本文所阐述的固定资产管理系统,以浏览器/服务器模式高效地实现了固定资产管理的各项功能,可进行资产的添加,删除、修改、查询、打印报表等功能;还可以对每位职工的添加、删除、修改、查询基本操作;本系统还对权限进行限制,操作员只可对资产和用户进行基本操作,管理员可以为每位员工赋权限。
- 固定资产管理系统是对高校固定资产的一个信息化管理系统,基本功能包括:对固定资产的购进、接触、销毁,对物品的使用状态、借出状态、库存状态等进行标识,对各类物品进行编号,根据编号进行查询,根据名称进行查询等。本系统结构如下:
(1)系统登录:
用户登录模块:登录功能 重置
(2)系统用户管理:
对系统用户的增加
系统用户的权限修改
系统用户的删除
分配系统用户的权限
修改本身登录密码
资产的相关维护
(3)员工信息管理:
教工的增加、修改、删除、查询
(4)资产入库管理:
资产的录入
资产的属性修改
资产的报废删除
资产的属性查询
(5)资产维护管理:
物资的维修、维护物资的信息修改
(7)资产借还管理:
增加借出资产
查询借出资产
归还已借出资产
(8)打印报表
2、资源详情
项目难度:中等难度
适用场景:相关题目的毕业设计
配套论文字数:29548个字
包含内容:整套源码+完整毕业论文+答辩PPT+辅导视频+运行截图
很多同学询问怎么下载开题报告、论文答辩、课题报告等ppt模板,给大家找了个好用的下载工具,可以试试:
3、关键词
资产管理 JSP Struts Hibernate Spring4、资源下载
本项目全套源码及配套论文如下,有需要的朋友可以点击进行下载。如果链接失效可点击文章最下方的卡片扫码自助下载。
序号 | 毕业设计全套资源(点击下载) |
---|---|
本项目源码 | 基于java+SSH+JSP的固定资产管理系统设计与实现(源码+文档)_JAVA_SSH_JSP_固定资产管理系统.zip |
5、毕设简介
提示:以下为毕业设计的简略介绍,项目源码及完整毕业论文下载地址见文末。
前 言
固定资产已成为公司管理中不可或缺的一部分,在许多国家得到了广泛的研究与应用。总的说来,固定资产管理系统就是通过集中固定资产信息,对公司的资产进行调控。实现固定资产管理系统现代化的根本途径是信息化、系统化。
省略
第1章 绪 论
1.1 项目背景
本系统就是基于此种社会背景进行独立开发,解决了以往资产管理中存在的普遍问题,如资产的录入、删除等模糊不清,数据来去不透明,致使资产无据可查。本系统不仅实现了通过简单操作完成繁琐的资产管理功能,而且将每笔资产的动态信息进行数据记录,里面有资产、相关操作人员和时间的记录,使得所有资产都有据可查、透明可见,提高资产管理效率,解决以往资产管理弊端。
省略
1.2 项目设计原则
1.2.1 实用性原则
固定资产管理是企业管理中的一个重要组成部分,其管理具有数量大、种类多、价值高、使用周期长、使用地点分散等特点,管理难度比较大。很多单位目前仍采用人工记账的管理方式,因为以上原因使得管理工作异常艰难,导致资产流失和重复购置等问题,所以迫切的需要一款实用的管理软件的出现。充分考虑到在固定资产管理中可能遇到的种种问题,系统主要应该包括资产管理中的日常管理,从而实现对资产的全方位监控管理。
1.2.2 经济性原则
本系统建立适合高校自身需求的网络平台,提供广泛的涵盖资产管理多种需求的功能,数据处理方式灵活,满足需求,节省网站建设成本,并确保其较好的拓展性和开放性;同时网站具有基于WEB界面的管理后台,能够自主的对网站中的内容作更新、修改操作,节省了高校网站的运营成本,提高了信息更新、传播效率。
省略
1.2.3 扩充性原则
网站的整体规划及框架设计是具可扩充性的。首先前台页面的设计能保证网站在增加栏目后不会破坏网站的整体结构。以此方便后期维护升级,不仅减少经济开支,并且大大提高了解决实际问题的效率,所以本系统具有很高的实际应用价值。其次后台数据库的设计具有高度的扩充性,能够根据需要对资产、员工的增、减、改、查,从而完成对资产设备的大批量录入或者删除及修改等相关操作,对员工表亦可如此操作,达到了根据实际需求实现操作并完成提高升级性能和高度扩充的目的。
1.2.4 社会可行性原则
因为本平台是个人自主开发的,所以不存在侵权、管理制度、组织管理等问题,这个平台的社会可行性是可行的。
省略
1.3 本章小结
本章主要介绍固定资产的管理在过去有很大的弊端,急需一个系统高效的管理系统。并且以实际角度出发,根据固定资产具有的相关特点对项目进行实用性、经济性、扩充性和社会可行性等多方面做到深层次的分析,达到管理容易、更新信息方便、操作简便、信息透明化等目的,从而解决以往存在的问题。
第2章 系统分析
2.1 需求分析
设备不仅是高校固定资产的重要组成部分,也是一个高校技术装备水平的重要标志,赖以正常经营和参与市场竞争的物质技术基础。根据高校的实际需求本系统具有以下的功能需求:
- 统一、友好的操作界面,能保证系统的易用性。
- 完善的资产及设备档案管理,支持资产及设备信息的增加、删除、修改、查询等基本管理模块。
- 软件同时提供了资产及设备的借出、归还管理,资产及设备的维修管理。
- 软件提供了多功能查询,有多种查询条件可以任意选择,方便信息的汇总。
- 连续录入式的应用增添及维护管理,用户的权限、密码修改设置。
2.2 技术可行性
2.2.1 动态网站技术介绍
随着网络技术的不断发展,单纯的静态页面已经不能满足发展的需要,因为静态页面是用单纯的HTML语言组成的,它没有交互性.因此,为了满足实际的需要,许多网页文件扩展名不再只是“htm”、“html”,出现了以“php”、“asp”、“jsp”、“shtml”等为后缀的网页文件,这些都是采用动态网页技术制作出来的。
省略
2.2.2 程序语言的选择
1 CGI
CGI(Common Gateway Interface,通用网关接口)。首先,客户端(即Web浏览器)根据某资源的URL(Uniform Resource Locator,统一资源定位器)向Web服务器提出请求,Web服务器的HTTP Daemon(守护进程)将此请求的参数通过标准输入stdin和环境变量传递给指定的CGI程序,并启动此应用程序进行处理,如要存取数据库服务器上数据库的数据,则向数据库服务器发出处理请求,数据库服务器将执行结果返回给CGI程序,CGI程序处理结果通过标准输出stdout返回给HTTP Daemon进程,再由HTTP Daemon进程返回给客户端,由浏览器解释执行,将最终结果在用户面前显示。
省略
2 JSP
JSP(Java Server Pages)是由Sun公司倡导,许多别的公司参与一起创建的一种新动态网页技术标准,类似其他技术标准。在传统的网页HTML文件(.htm,.html)中加入Java程序片断(Script let)和JSP标签,构成了JSP网页(*.jsp)Servlet/JSP Container收到客户端发出的请求时,首先执行其中的程序片断,然后将执行结果以HTML格式响应给客户端,其中程序片断可以是:操作数据库,重新定向网页以及发送E-Mail等等,这些都是建立动态网站所需要的功能。所有程序操作都在服务器端运行,网络上传送给客户端的仅是得到的结果,与客户端的浏览器无关,因此,JSP被称为Server-side Language,所以被许多人认为是未来最有发展前途的动态网站技术之一。
省略
2.3 软件可行性分析
2.3.1 软件环境
省略
本文开发的固定资产管理系统所需要的环境如下:
开发工具:Myeclipse8.0,PowerDesigner12.5,Rational Rose
数据库:MySQL5.1
Web服务器:Tomcat 6.0
操作系统:Windows 7
外部包:Struts.jar,Hibernate.jar,JavaReport-V3-Enterprise-Released.jar
1 服务器端
(1) 开发工具
MyEclipse企业级工作平台(MyEclipse Enterprise Workbench,简称MyEclipse)是对Eclipse IDE的扩展,利用它我们可以在数据库和JavaEE的开发、发布,以及应用程序服务器的整合方面极大地提高了工作效率。它是功能丰富的JavaEE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML、Struts、JSF、CSS。JavaScript、SQL、Hibernate。本系统利用现在JAVAEE开发的主流工具MyEclipse进行开发,它不仅是一个开源软件,而且是一个基于Java的可扩展开发平台。MyEclipse的功能十分强大,支持也十分广泛,尤其是对各种开元产品的支持十分不错。
(2) 数据库
MySQL是最受欢迎的开源SQL数据库管理系统,它由MySQL AB开发、发布和支持。
省略
(3) Web服务器
Tomcat不仅仅是一个Servlet容器,它也具有传统的Web服务器的功能:处理Html页面。基于Tomcat的开发其实主要是Jsp和Servlet的开发,开发Jsp和Servlet非常简单,可以用普通的文本编辑器或者IDE,然后将其打包成WAR即可,和传统的桌面应用程式不同,Tomcat中的应用程式是个WAR(Web Archive)文件,WAR是Sun提出的一种Web应用程式格式,和JAR类似,也是许多文件的一个压缩包。这个包中的文件按一定目录结构来组织:通常其根目录下包含有Html和Jsp文件或包含这两种文件的目录,另外还会有一个WEB-INF目录,这个目录非常重要。通常在WEB-INF目录下有一个web.xml文件和一个classes目录,web.xml是这个应用的设置文件,而classes目录下则包含编译好的Servlet类和Jsp或Servlet所依赖的其他类(如JavaBean)。通常这些所依赖的类也能打包成JAR放到WEB-INF下的lib目录下进行统一管理。在Tomcat4以后的高级版本中可以利用Servlet2.3提供的事件监听器功能,来对系统的应用或者Session实行监听。Tomcat也提供其它的一些特征,如与SSL集成到一块,实现安全传输。还有Tomcat也提供JNDI支持,这与那些J2EE应用服务器提供的是一致的。
(4) 开发语言
Java是一种跨平台,适合于分布式计算环境的面向对象编程语言。具体来说,它具有如下特性:面向对象、多态性、分布式、可靠、安全、多线程等
省略
2 客户端
客户端由于不涉及到系统的开发和维护等问题,因此可以不用安装过多的软件,只要能够实现对服务器端的访问就可以,一般来说普通PC机即可。
2.3.2 硬件环境
1 服务器端
服务器端的配置是有建立站点所需的硬件来决定的。在最低配置下,服务器虽然能正常工作,但其性能往往不尽如人意,如果我们想使服务器工作的更好的话,我们需要更好的配置,特别是服务器的内存应该大于2G,下面为服务器的最低配置:
处理器:双核2.1GHz
内存:2GB
显卡:SVGA显示适配器
光驱:安装系统及相关软件
网卡:PCI和ISA接口均可
2 客户端
客户端主要用于浏览系统界面、同web数据库进行数据交互等基本操作,因此客户端对硬件要求不高,主要由所安装的Windows的要求来决定。但若期望性能更好,需要的配置应该高于以下配置:
处理器:双核2.1GHz
内存:2GB
硬盘:320G
显卡:SVGA显示适配器
网卡:PCI和ISA接口均可
2.4 系统结构可行性分析
2.4.1 B/S模式简介
本系统采用B/S模式
B/S(Browser/Server)结构即浏览器和服务器结构。特别是在JAVA这样的跨平台语言出现之后,B/S架构管理软件更是方便、快捷、高效。
省略
2.4.2 B/S模式的优点
1 维护和升级方式简单
省略
2 成本降低,选择更多
省略
2.5 本章小结
本章节首先对项目所要实现的功能进行分析,应主要包含对资产的录入、销毁、维修、借入借出和多功能查询,和对相关工作人员的管理和权限的分配。然后介绍一下本系统所涉及到的技术知识,及对系统所需要的软硬件环境进行说明。最后阐述为何会选择B/S结构和诸多好处。
第3章 关键技术
3.1 开发架构
3.1.1 软件开发架构的意义
省略
3.1.2 Struts架构简介
随着Web开发技术的日益成熟,在Web开发领域中出现了许多设计好的软件开发框架,Struts就是一种基于MVC经典设计模式的框架,也是当前Web开发中比较成熟的一种框架。
1 经典的MVC模式
MVC(Model-View-Controller)模式,即模型-视图-控制器模式,其核心思想是将整个程序代码分成相对独立而又能协同工作的3个组成部分。
(1)模型(Model):业务逻辑层。实现具体的业务逻辑,状态管理的功能。
(2)视图(View):表示层。即与用户实现交互的界面,通常实现数据输入和输出功能。
(3)控制器(Controller):控制层。起到控制整个业务流程(Flow Control)的作用,实现View和Model部分的协同工作。
省略
这在开发大型复杂的Web项目时体现得尤为突出。如图3-1所示。
图3-1 MVC设计模式的结构
2 Struts 1.2开发框架
作为基于MVC设计模式的Web应用的一种典型体现,Struts架构实际上是建立在Model2基础上的,对Model,View和Controller都提供了现成的实现组建。
3.2 数据持久层
数据是软件系统中不可缺少的环节,数据持久化的解决之道也一直是企业计算标准中最有影响力的部分。如今关系型数据库已经稳定地占据着主要的数据库市场,XML技术和XML数据库技术也日渐成熟。
J2EE的三层结构是指表示层(Presentation),业务逻辑层(Business Logic)以及基础架构层(Infrastructure),这样的划分非常经典,但是在实际的项目开发法中,开发者通常对三层结构进行扩展来满足一些项目的具体要求,一个最常用的扩展就是将三层体系扩展为五层体系,即表示层(Presentation),控制/中介层(Controller/Mediator)、领域层(Domain),数据持久层(Data Persistence)和数据源层(Data Source)。它其实是在三层架构中增加了两个中间层。控制/中介层位于表示层和领域层之间,数据持久层位于领域层和基础架构层之间。由于对象范例和关系范例这两大领域之间存在“阻抗不匹配”,所以把数据持久层单独作为J2EE体系的一个层提出来的原因就是能够在对象-关系数据库之间提供一个成功的企业级映射解决方案尽最大可能弥补这两种范例之间的差异。
3.2.1 持久层主流方案
数据是我们软件开发人员必须考虑的对象。无论你使用哪种技术,借助哪种工具,以及购买哪种软件平台产品,当接受一个实际的问题时,你都需要面对实际的数据,考虑实际数据的各种问题。在这些问题中往往都包含数据持久化的问题,这不仅是因为我们的计算机内存有限,更主要的原是业务逻辑的需要,作为一个接触软件技术,尝试写程序的人,我们要接触各种类型的数据。
省略
3.2.2 持久层主流方案
1 JDBC
许多开发者用JDBC进行数据库程序的开发。此中方式很多情况下都使用DAO模式,采用SQL进行查询。虽然用此方式可以使应用程序代码与具体的数据库厂商和数据库位置无关,不过JDBC是低级别的数据库访问方式,JDBC并不支持面向对象的数据库表示。JDBC数据库表示完全围绕关系数据库模型。在大型应用程序的DAO中书写这样的代码,维护量是非常大的。
2 EJB
在J2EE的规范中,为EJB定义了两种持久化的解决方案:一种是BMP,另一种是CMP。其中CMP不需要将SQL语句加入到代码中。目前,在采用J2EE的应用中,EJB CMP方式得到了广泛应用。更加引人注意的是,随着EJB规范的发展,CMP也包含了一些高级关系的内容。但是,CMP的使用比较复杂,对很多开发人员来说比较难以掌握。而且,不是在所有的情况下都适合在系统中采用EJB,而且想要非常清楚的了解EJB规范也是非常费时的。在用EJB编码前,先要让专家理解API,然后需要了解每一个容器部署时所要关注的技术。此外,许多情况下商用容器的性能和支持也不是很好。
3 JDO
JDO是一个存储java对象的规范,JDO规范1.0的提出可以使你将精力集中在设计Java对象模型,然后在企业应用软件架构的不同层面中存储传统的Java对象(Plain Old Java Objects,简称POJOs),采用JDOQL语言进行SQL操作。一些公司(包括sun)企图根据JDO规范进行设计并实现JDO产品,然而他们都不能很好的进行实现,并且性能优化上比较差。
3.2.3 持久化技术
省略
Hibernate的出现,提供了一个符合Java面向对象编程思想,易于使用的数据库持久化解决方案。因此,在目前行业的Java数据库应用项目中,有越来越多的开发人员开始尝试使用Hibernate在数据库外面包裹上一层面向对象的外衣,从而将开发人员从繁琐、重复、技术含量不高的数据库编程中结果出来。
Hibernate概述:
省略
Hibernate本质上是一个面向Java开发环境的对象/关系数据库映射工具。在Hibernate之前,开发人员要将面向对象的软件和关系数据库结合在一起,往往会费长麻烦。而借助Hibernate对象/关系数据库映射技术,可以非常轻松地将以面向对象思想封装的对像的各个状态数据映射到基于SQL的关系模型数据结构中去。如图3-2所示。
图3-2 Hibernate工作示意图
3.3 本章小结
本章节阐述了Struts框架有何优点,并将MVC模式以图形加文字的双重方式进行介绍,充分展现其好处,引出固定资产管理系统选取Struts1.2为开发框架,采用经典的MVC模式对项目进行整体的分层,让项目层次分明、代码规范。再由框架引出数据库同样是系统中不可分割的一部分,然后提出通过Hibernate的映射文件简化对数据库的操作,从而达到更好的面向对象进行开发。
第4章 总体设计
系统设计是在系统分析的基础上由抽象到具体的过程。概要设计解决软件系统的模块划分和模块的层次机构以及数据库设计;详细设计解决每个模块的控制流程,内部算法和数据结构的设计。根据种种分析设计在逐步实现各个功能,完成一个完整的固定资产管理系统。
省略
4.1 总体设计
本系统对固定资产进行标识,实现了固定资产生命周期和使用状态的全程跟踪。标识后的资产在进行清查和巡检时依靠设备编号从而达到:方便、快捷、准确的定位资产,保证了信息流和资产实物流的对应。利用计算机支持不同的团体机构完成固定资产管理的事物,由计算机来代替人工执行一系列的诸如增加新的资产信息、变更资产信息、删除资产信息、查询、修改等操作。这样使办公室人员可以轻松快捷地完成固定资产管理的任务,使企业的员工管理资产能够系统化、规范化、半自动化,从而有效地解决了企业固定资产的管理难题,使企业更轻松、更有效地管理固定资产。总体设计如图4-1所示。
图4-1 系统功能模块图
本系统主要分为四大模块:
资产管理模块:根据不同资产的唯一编号对资产进行购入、销毁、修改属性和多种组合条件的查询操作等,里面包括相应的逻辑验证及提示。对资产维护的增加维修设备、删除已经维修好的信息、查询操作;支持对固定资产库存报表的多种格式打印。
用户管理模块:可直接添加员工成为用户并为其分配不同的权限,管理员权限是本系统最大的权限,可以对所有的设备和人员进行维护、查询等操作。操作员不拥有分配权限的功能,可以完成除了此模块之外的所有功能,如:首先,可对资产进行录入、所有资产不同方式的查询、销毁某些设备、修改设备属性信息及对设备进行借出归还状态的跟踪和更改,及时更新设备的所处状态和库存设备的全部信息等。其次可对员工进行的增加、删除、修改信息和查询等相应的维护,可以将库存设备信息根据不同需求打印出来。
员工管理:支持对学校的教工信息的维护,包括新增员工、删除员工、修改员工所处状态和对员工进行明细查询等。
系统管理:修改登陆用户的登录密码及安全退出系统,保证系统的正常运行。
4.2 数据库设计
4.2.1 数据库的需求分析
依据项目的处理需求,对应数据表的设计及功能如下:
1 资产信息表:主要用于保存入库的资产信息。
2 资产设备的借出归还表:主要用于保存借出设备的信息。
3 资产设备维修信息表:主要用于保存维修资产的信息。
4 管理资产信息的用户表:主要用于保存系统管理员的信息。
5 公司员工其本信息表:主要用于保存公司员工的基本信息。
6 部门表:主要用于保存部门信息。
4.2.2 数据库表的具体设计
省略
各个数据表如下:
设备借出归还表是由资产表和员工表根据实际需求衍生出来的一张业务表,此表用于保存某位员工于某个时间借出了某个编号的资产借,并打算在什么时间归还及实际的归还时间的全部信息,使得用户对资产的管理更加方便简单。表结构如表4-1资产设备借出归还表。
用户表是依附于员工表而存在的一张管理员表,此表中根据competence字段区分管理员及操作员两种权限,管理员具有最高权限,操作员可对资产进行全方位的管理和信息查询。表结构如表4-2用户表。
员工信息表是跟资产基本表密切相关的一张相关操作表,员工编号为唯一主键,能够标识员工身份。每一次对资产的操作都应该落实到具体的员工头上,让所有的操作都可查,使业务更加清晰,方便应用。表结构如表4-3员工信息表。
设备借出归还表是由资产表和员工表根据实际需求衍生出来的一张业务表,此表用于保存某位员工于某个时间借出了某个编号的资产借,并打算在什么时间归还及实际的归还时间的全部信息,使得用户对资产的管理更加方便简单。表结构如表4-4资产设备借出归还表。
部门表的存在是专门为了方便使用单而存在的表,其主要用于区分不同部门而方便操作,每个员工都有一个字段叫做dept,使得不同部门的人员,进行不同的归拢,方便管理。具体表结构如表4-5部门表。
资产设备维修信息表也是由资产基本表衍生出来的一张业务表,它用于管理哪些设备因为何种原因而需要维修,其中有由谁送去维修并经过谁手而修,维修流水号应该为唯一主键,包含所有的维修相关信息。表结构如表4-6资产设备维修信息表。
4.3 详细设计
4.3.1 功能设计
本系统主要用于高校中的“资产”进行管理。具体地讲,固定资产管理系统就是通过资产的增加、删除、查看、借出、归还、维修等一系列手段来提高效率,最终达到发展目标的一种管理行为。总体来说就是解决固定资产管理中经常出现的实物与财务账目不符的情况,以实物管理为特点,以简化为目的,实现信息流和实物流的统一,并且提高工作效率减轻工作负担。本系统中各种功能操作都非常简单方便,操作员无须专门的培训就可以使用,大大的减少了误操作的几率。具体实现目标如下:
1 系统用户管理功能
当前登陆的用户可根据个人需要对自己的登陆密码进行修改。系统用户即管理员可对系统中的资产进行管理,可以对资产进行录入、资产查询、资产销毁、资产信息修改、资产借用等相关操作。用户是本系统中最大权限所有者,可以给任意员工分配权限使其成为新的用户,用户可以根据实际需求增加新的员工、修改员工的状态、修改员工的相关信息,亦可根据员工唯一ID对员工进行查询和删除。
2 员工信息管理功能
员工是本系统中的一个模块,主要和资产的归还、借出、维修等实物资产的流向状态进行绑定,使每一次对资产的操作都能落实到具体的人头上,让资产管理透明可查。
3 资产入库管理功能
资产入库功能由用户进行管理,用户有权限进行增、减、改、查操作。
4 资产维护管理功能
对于资产的管理必定涉及到资产的状态如:维修、报废、借出、正常,这些功能都是根据实际需要进行实现,保证了资产的不明流向和总体管理。
5 打印报表
针对资产清单进行打印,可根据实际不同需求打印不同格式如:word、excel、pdf等
6 系统最大限度地实现了易安装性、易维护性和易操作性
本系统以tomcat为服务器,搭建服务器小而轻便,安装简单。用户可根据不同的需求自行对资产进行维护,并且不必经过专门的培训即可掌握本系统的使用,实现了简单易懂方便维护等特性。
7 系统运行稳定、安全可靠
系统经过严格的测试并实际运行无误,可以安全稳定上线运行;根据权限拦截器防止越过登陆对本系统进行操作,所以安全可靠,能保证正常的工作运转。
4.3.2 系统登陆
用户登录模块是用户进入主页面的入口,用户可根据自己的用户名和密码进行登录,若不符则给予相应提示,重置按钮可将当前所填的信息清空,登陆页面如图4-2所示。
图4-2 用户登录
系统登陆是固定资产管理系统中最先使用的功能,因为用户登陆在数据库中使用的是用户表,人员表中有一个competence字段,是来标识用户权限的。在登陆时要根据数据库的这个字段来判断此用户是否具有管理员的权限。在网页里添写用户名和密码和验证码后点击【确定】按钮,网页通过action="login"进Struts配置文件中,代码如下:
<html:form method="post" action="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 session=(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");
}
}
接下来看一下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.3 系统用户管理
系统用户管理:主要包括对系统用户的增加、系统用户的权限修改、系统用户的删除、分配系统用户的权限功能及对本身的登录密码做修改和对资产的相关维护,其中权限的分配分为操作员和管理员,操作员只能对除了用户管理之外的其他功能进行操作,而管理员是本系统中权限最大的,可以进行所有操作。当点击【用户管理】时出现用户管理界面如图4-3所示。
图4-3 用户管理界面
当点击【用户管理】时,系统会通过Stuts框架,找到userManaAction.do 从后台取出数据库中所有的员工信息,并将信息返回到界面显示出来,具体的表现代码实现如下:
<input name="addUser" type="button" class="button" id="addUser" value="添加用户" onclick="window.location='/gdzc/user_info/user_add.jsp'">
<input name="edit" type="button" class="button" id="edit" value="修改权限"
onmouseover="this.style.color='red'"
onMouseOut="this.style.color='#1e7977'" onclick="window.location='findUserbyname.do?username=${item.userName}'">
<input name="delete" type="button" class="button" id="delete" value="删除"
onmouseover="this.style.color='red'"
onMouseOut="this.style.color='#1e7977'"
onclick="if(confirm('您确定要删除编号为${item.comployee.comployeeNo}的用户吗?'))
window.location='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.3.4 员工信息管理
员工信息管理:
主要包括对学校教工的增加、修改、删除、查询功能。
添加员工功能:
不同部门根据各自需求,可添加任意数量的员工,添加员工时首先给其建立一个唯一的标识员工编号,以后对资产的相关操作都与员工编号进行绑定,另外员工还有一个状态分为:在职、休假、离职三类。
修改员工信息功能:
当进入员工信息管理主页面后,系统默认查处员工的信息,并且每个员工后面都有【修改】和【删除】两个按钮,当点击【修改】按钮时,系统首先将本条信息带到修改页面,除了员工的唯一标识符员工编号之外都可更改,用户可根据需求对员工信息进行修改,然后点击【保存】保存。
删除员工信息功能:
点击【删除】按钮会弹出提示框“您确定要删除员工编号为****的员工吗?”,点击【确定】即删除成功,点击【取消】则返回操作。
员工信息管理主页面如图4-5所示。
图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<=totalPage
if (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.3.5 资产入库管理
资产入库管理:作为本系统两大主要模块之一的它主要包括对资产的录入、资产的属性修改、资产的报废删除、资产的属性查询功能。本功能根据实际资产管理需要完成,首先满足实时录入新的不同设备功能了,可由用户随意添加,然后可以根据不同的信息改变完成对设备信息的修改更新,若此设备已经不具备继续使用功能,则可由用户点击【删除】完成销毁操作,彻底删除设备信息。如图4-6所示。
图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<=totalPage
if (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.3.6 资产维护管理
资产维护管理:是本系统的另一主要模块,主要包括对维护物资的送去维修、维护物资的信息修改即此物资是否维修完成及各种相关维护信息、维护物资的删除即是此物资以无须维护可通过删除维护信息后正常使用、当前用户可根据自身实际需求进行多种组合查询维护物资的信息。如图4-10所示。
图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<=totalPage
if (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.3.7 资产借还管理
资产借出归还管理:此模块是根据固定资产管理的实际需求出发,以达到简化资产管理为目的的具体应用实现,是本系统的中心模块,也是资产管理的核心表现,作为本系统的另一主要模块,功能主要包括增加借出资产、查询借出资产、归还以借出的资产,用以实现对资产的初步管理,满足用户基本需求。
首先,用户可通过员工编号和设备编号查询是否有相关的借出信息,若有则查询出相应结果并显示,如若相关信息,则给予相关提示。
其次,用户可根据实际需求将某个编号的设备借给某个编号的员工,并自动将此借出信息保存到一张叫做借出归还的中间表中,用以储存借出与归还的信息,完成资产信息化,方便查询管理并且易于保存及信息交互。
最后,就是用户可以查询借出信息中的员工和设备的详细信息,也可将设备进行归还,删除掉借出信息,将设备中的状态字段通过实际需求变动改成符合实际的标示,这样就使得设备的实际所处状态一目了然,只要注意设备的状态字段,变可知道其是否处于正常应用状态或者是借出状态还是维修状态,极大地减轻了工作量,方便日后维护操作等相关的实际应用。如图4-11所示。
图4-11 资产借还管理
具体的代码如下:
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String message="";
HttpSession session=(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.3.8 打印报表
报表管理功能:本功能用于明细统计资产,用户可根据自己的不同需求将资产进行打印输出,如word、excel、pdf等,打印内容包括资产的详细信息,及使用状态和购买人,使得资产管理不仅仅局限于电脑上,考虑用户需求以便资产管理。如图4-12所示。
图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.3.9 密码修改
修改密码:主要对当前用户的密码修改功能,首先用户需要重新输入登录密码,然后第一次输入新密码,再次输入新密码,当点击【提交】时,需验证两次输入的新密码是否一致,若不一致则不予以更改,确保正确操作完成修改功能。如图4-13所示。
图4-13 修改密码
4.4 技术难点
4.4.1 中文乱码
由于浏览器中的参数传递是按字节传送,因此英文和数字不会有任何的问题,而中文汉字则由两个字节组成。为了解决这个问题,使用了下面的两种方法:
- <%request.setCharacterEncoding(“gb2312”);%>
- request.getParameter(“Password”).getBytes(“ISO-8849-1”),“GB2312”)。
4.4.2 图片处理
在MySQL的数据库中可以存放任何格式的图片,但是要将其转换为二进制的数据存入数据库,在调用时再将二进制数据转换为图片,这样虽然便于管理,但是在当前国内的网速来看,这样的方法实在是不可取。因此本系统的图片均是存放的相对路径,将图片放在系统根目录下的upload文件夹中,按类分好,然后将其相对路径存入数据库的对应列中。这样可以大大提高网页浏览的速度。
4.4.3 HQL语言
本系统中,所有对数据库的操作都由Hibernate来完成,因此用到了大量的HQL语言。HQL是Hibernate设计的一套完整而实用高效的查询语言,它通过面向对象的语句结构实现了和SQL语言类似的功能。HQL拥有面向对象语言的所有特性,这其中包括多态、继承和组合。
省略
4.4.4 安全性
将项目发布到互联网上后,有些用户不是点击超链接打开网站的某个页面,而是在地址栏中直接写,而后进入,试图避开身份验证,处于对安全性的考虑,本项目在用户登陆后才能进入的页面中,特意添加了拦截器,用于防止恶意跳过登陆而操作系统,以确保系统安全正确的运行。拦截器配置如下。
权限检查拦截器继承
<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>/zcgl</value>
<value>/add</value>
<value>/updateAssets</value>
<value>/save</value>
<value>/deleteAssets</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>authorityInterceptor</value>
</list>
</property>
</bean>
在拦截器中设置了对用户名的判断,因为在登陆中以经将用户名放入到Session中了,所以只用判断是否有用户就行了,代码如下。
import javax.servlet.http.HttpServletRequest;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.struts.action.ActionMapping;
public class AuthorityInterceptor implements MethodInterceptor{
public Object invoke(MethodInvocation invocation) throws Throwable {
HttpServletRequest request = null;
ActionMapping mapping = null;
Object[] args = invocation.getArguments();
for (int i = 0; i < args.length; i++) {
if (args[i] instanceof HttpServletRequest)
request = (HttpServletRequest) args[i];
if (args[i] instanceof ActionMapping)
mapping = (ActionMapping) args[i];
}
if(request.getSession().getAttribute("username")!=null)
{
return invocation.proceed();
}else{
return mapping.findForward("faillogin");
}
}
}
4.5 本章小结
本章节为系统设计章节。首先详细设计系统应具备的功能,主要分为:资产管理模块、资产维护模块、员工管理模块、用户管理模块等四大模块。并充分分析项目需求,完善数据库的各个表。然后逐一演示系统功能,由语言叙述到截图显示进行全面讲解,最后到代码的详细分析,全面的介绍了系统的具体实现。其基本功能符合用户需求,能够实现对固定资产的基本信息录入、更新、操作、删除、打印等,从而实现对资产的管理。
最后简单阐述了一下项目进行中所遇到的主要问题及解决方法和为保证系统的安全性所采用的拦截器。
第5章 系统测试
在完成了程序的编写工作后,接下来将进行软件的测试,这里说的软件,并不单单是指程序本身,还包括其他方面。测试和开发一样,也是一项技术性很强的工作,有着很多的技巧。软件测试是软件质量保证的主要活动之一,因此,测试的质量直接影响软件的质量。
5.1 测试的定义及目的
测试的目标是以最少的时间和人力找出软件中潜在的各种错误和缺陷。
省略
5.2 测试的原则
对于相对复杂的产品或系统来说,Zero-Bug是一种理想,Good-Enough是我们的原则。Good-Enough原则就是一种权衡投入/产出比的原则;不充分的测试是不负责任的;过分的测试是一种资源的浪费,同样也是一种不负责任的表现。我们操作的困难在于,如何界定什么样的测试是不充分的,什么样的测试是过分的。目前状况唯一可用的答案是:制定最低通过标准和测试内容,然后具体问题具体分析。
5.3 系统的方法
依据前面所说的测试对象,我们把测试划分为几个方面来进行测试。
5.3.1 界面测试
界面测试是测试过程中比较简单直观的一种测试方法,只要细心地按界面要求核对就行了。可这点往往是程序开发人员容易忽视和遗漏的地方,也是常常出Bug的地方。下面是界面测试中经常出现的几种Bug:
- 错别字,即界面中的标题或者文本内容中出现了错别字。这种Bug如果测试人员不细心,很难找出来,可能会出现在提示信息或界面中。
- 出现了一些根本读不懂的内容,一般多出现在程序的提示信息和一些较长的文本中。这种情况基本上出现在拼起来显示的提示中,页面的简单陈述是通过变量拼组起来的,通过程序将字一个一个地输出来。通常是因为程序中的控制错误或是程序开发人员对程序没有进行认真的自测,导致出现这种Bug。
- 程序员自创的词语,虽然意思对,但不符合界面的标准及需求。这种情况基本上是由于开发人员使用一些专业术语,并且混杂着自己的理解出现Bug,主要是由于开发过程中团队合作没有明确的分工,没有统一的规范用语。
- 页面类似的内容中,明显有字体,字号不同的情况,使界面整体风格看上去不一致,这种情况只出现在没有CSS定义的情况下,或是已经定义的CSS,开发人员在开发过程中没有调用。
- 标题相近的程序及模块,把标题弄混。这种情况多是因为业务方面的定义名称很相似或很类似,并且业务实体方面也很类似,开发人员在开发过程中忽略了开发名称和模块,只单独地实现其功能。
5.3.2 功能测试
顾名思义,功能测试主要是测试程序模块是否实现了设计中所有要求的功能,功能测试中需要注意的有:
- 查询功能中,有按单一查询条件进行查询的,也有按多个查询条件组合查询的,这里要注意多个查询条件之间的关系,还有一些常识性的问题。
- 录入功能中,需要注意的是前台设置的数值长度是否大于后台数值长度,以及前台与后台的数据结构是否相符,很多时候录入功能无法实现是由于这些原因。还有就是必须录入的字段的设置是否有误。
- 测试删除功能中需要注意的是单击【删除】按钮后,一般会出现提示信息,询问是否确定删除。通常情况下,我们单击【确认】按钮查看信息是否被删除掉了,而忽略了单击【取消】按钮后程序的反应,这时有可能的是没有删除,还有一种可能是即便单击了【取消】按钮,也一样删除了数据。另外,在删除多条记录的时候,要注意连续选中的几条记录是否真正都被删除了,即如果再按照这种查询方式查询,是否还能查询出来。有的时候需要在数据库中设一个标志位,而不是真正的物理删除。所以在下一次查询中,可能还会被查询出来,这主要是因为在查询条件中没有将标志位考虑在内。此外,最重要的一种删除方式既级联删除,当删除一个有子数据的信息时就会有异常抛出,这时我们需要用一个提示语“此信息有子数据,如果删除该信息则会连带的删除子数据,是否确定删除?”如果点击【是】那么就顺带的把与这条数据有关的信息都删除。如果点击【否】则什么信息都不会删除。
- 关于修改功能的测试,主要是看修改确认后是否数据真正已被修改了。这是最基本的功能,需要注意的是看是否能把不应该修改的数据也修改成功了。
5.3.3 需求测试
针对需求测试,是测试中很重要的一个环节。因为需求是在软件设计,开发乃至软件测试中重要的依据。要针对需求测试,首先就要对项目的需求和业务有一定的了解。这些需求很多时候是在实现增、减、查、改这些基本功能之上,针对项目和相关业务所作的一些逻辑上的控制。这就要求程序员在设计和编码的时候要充分理解考虑需求。
5.3.4 性能测试
性能测试在软件的质量保证中起着重要的作用。通常我们把性能指标全部归结到硬件,操作系统和开发环境上,而忽略了代码本身性能上的考虑。性能需求指标中,稳定性,并访支撑能力以及安全性都很重要,作为程序员需要评估该模块在系统运营中所处的环境、将要受到的负荷压力以及各种潜在的危险和恶意攻击的可能性。
5.4 系统中其它要注意的地方
- 时常有这样的情况发生,每个模块都能单独工作,但这些模块集成在一起之后却不能正常工作。其主要原因是,模块相互调用时接口会引入许多新问题。这就要求在进行程序设计和编码的时候要尽可能地从整体考虑。
- 实引用某些控件,实现了程序中未实现的功能的同时,也容易引发新的Bug。
- 错误本身出现在程序设计阶段,并非由于程序员编码造成的问题。这就要求我们无论是在开发还是测试阶段,对需求或程序设计存在疑问,应及时提出,及时解决。
- 由于一些模块被修改了,对其他模块造成了影响而出现了新的Bug。发现这些Bug要求我们对程序整体的结构有基本的了解,清楚模块之间的一些联系。
5.5 固定资产管理系统的测试
在完成编码的工作以后,根据以上的方法和步骤进行了如下的测试:
- 界面测试:在不开启Web服务器的情况下,反复点击网页上的超链接,测试其连接情况,直到所有的链接都达到预期的效果。
- 功能测试:对网站的几大功能模块逐一测试,尽最大可能发现其潜在的错误。
- 性能测试:将程序以局域网的形式发布,查看其是否满足多用户的要求。
- 需求测试:根据需求分析的内容,测试网站是否和当初的设计一样。
通过这几方面的测试,我及时修正了系统中存在的问题,很好的提高了系统的性能,达到了预期目标。
5.6 本章小结
代码虽然编写完成,却并不意味着项目的结束,还需要最后的一步检测。软件测试是软件质量保证的主要活动之一。因此,测试的质量直接影响软件的质量。所以要从诸多方面考虑测试的方向如:界面测试、功能测试、需求测试、性能测试,然后根据实际需求判断是否有不符,再进行校正修改。
结 论
省略
致 谢
省略
参考文献
[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.