【免费】javaEE土地档案管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89296786
土地档案管理关系
摘 要
研究土地档案管理关系即为实现一个土地档案管理系统。土地档案管理系统是将现有的历史纸质档案资料进行数字化加工处理,建成标准化的网络基础资料数据库,同时建成一套基于计算机网络应用的档案管理软件系统。不仅要在技术上符合国家关于档案信息化建设的有关要求,在标准化程度上符合国土行业档案管理规范的专业性要求,而且还要能够与当前现有其他业务信息管理系统进行整合,在档案和业务数据间建立互换和抽取机制,达到信息的顺利交换,便于信息的一致性获取,减少重复劳动工作量。
本文对系统进行了可行性研究、需求分析、前台界面的设计、后台数据库建设以及系统测试等相关工作。基于三层架构的思想,前台使用jsp技术,后台使用了Oracle 11g平台,主要使用Hibernate的设计模式访问数据库,采用B/S架构,实现此土地档案管理系统。
关键词:纸质档案;数字化;三层架构
Land records management system
Abstract
Land records management system is the existing historical archives data digital processing, built the network database standardization, also built a set based on the archival management software system using computer network. Not only to meet the relevant requirements of the state on the construction of archival information in technology, meet the professional requirements management to standardize land industry archives in the degree of standardization, but also can be integrated with the existing other business information management system, in the archives and business data to establish exchange and extraction mechanism, to smooth exchange of information, consistency is the acquisition of information, reduce duplication workload.
This paper has carried on the system feasibility study, demand analysis, interface design, database construction and system testing and other related work. Three layer architecture based on the idea, the use of JSP technology, the background using the Oracle 11g platform, design mode to access the database using Hibernate, using B/S architecture, the land records management system.
Key words:The paper archives; digital; three layer architecture.
1 绪论
1.1 可行性研究编写目的
可行性研究的目的是为了对问题进行研究,以最小的代价在最短的时间内确定问题是否可解。
经过对此项目进行详细调查研究,初拟系统实验报告,对软件开发中将要面临的问题及解决方案进行初涉设计及合理安排。明确开发风险极其所带来的经济效益以及为工作带来的便利性。本报告合身后,交软件经理审查。
1.2 项目背景
随着国土大面积调查工作的全面展开和城镇地籍管理工作得以日趋细化,各种野外调查数据,不同比例尺图件资料急剧增加。特别是城市建设的空前发展以及土地有偿使用法规的实施,使得地籍变更日益频繁、地籍信息量也越来越大,对城镇地籍管理提出了更高的要求。面对如此数量巨大、来源多样、变更频繁的信息,传统的管理方法已经愈来愈不能满足现代化土地管理的需要。此外,国民经济的迅猛发展,迫切要求各级国土部门为国家提供准确的数量、质量和土地利用现状等信息。因此,应用现代先进的科学技术和手段,建立科学的土地管理体系,为合理利用土地资源,进行土地规划、整治、开发利用、税收等提供有关基础资料和科学依据,土地管理信息系统的建立势在必行。
现有土地档案大部分还是传统的纸质档案,电子档案极少,随着 城市大规模旧城区改造以及城中村改造的面积扩大,一些不适应城市发展的建筑物已经消失 ,土地档案部门作为城市建设的见证人,社会发展的记录者,有责任、有义务将城市建设发 展的历史真实的记录下来。[2]
从本质上来讲,建立土地管理信息就是用现代化的技术来获取、分析、处理、管理和利用土地信息,就是要依靠计算机技术和现代化科学理论及数学模型的应用,如地理信息系统、遥感学、计算机科学(包括互联网技术……)等对土地信息进行管理。其中,土地管理的许多业务工作,如,动态监测、建设用地管理、土地监察、地价评估都必须建立在地籍、土地详查系统的基础之上,或者说与其有着千丝万缕的联系。因此,土地信息系统的核心问题是建立地籍管理信息系统和土地详查系统,这是土地管理各项业务工作的基础,必须先行。
1.3 土地管理现状
当前社会逐步向信息化社会演变,及时、全面、系统、准确地获取信息是做好各项工作的前提。档案利用者对档案信息的要求也是如此。档案管理工作者如果继续沿用低效率的传统手工管理模式,必将在社会发展的大趋势面前没有立足的空间。随着计算机的应用,电子档案大量地出现,但与之相适应的管理缺乏经验。电子档案本身具有信息与载体的可分离性、信息传递的网络化、信息存储的高容量及信息的易修改等特点。国土资源档案的管理工作者更应跟上形势,努力适应对电子档案的管理。
随着档案法规的逐步完善,依法治档的社会环境不断好转,档案管理工作正面临难得的发展机遇。土地档案对依法管地、合理开发用地、解决土地纠纷、农村土地承包、制定土地利用总体规划及缴纳土地租金、征缴国有土地使用税等很多方面都起到了很重要的作用。随着新的土地管理法的正式实施以来,土地资源管理制度和方式均发生了重大的变化,耕地保护、土地用途管制、国土资源执法、矿产管理等管理职能都得到了增强,基本农田保护、土地开发整理、用地报批、征地实施等各项具体工作都有了新的政策、法规、程序,由此形成的土地资源档案数量不断增多。如何开发和利用这部分内容丰富的土地资源档案成为档案管理工作的一大难题。
土地资源档案管理工作的发展,对土地资源档案管理工作者的素质提出了更高的要求。新技术的应用使土地资源档案管理工作者有了施展才能的广阔空间,但同时也对土地资源档案管理工作者的素质提出了更高的要求。新时期的土地资源档案管理工作者,除了要求具有档案管理本专业的知识外,还要求具有计算机、外语、管理学等基础知识,尤其是要求具有土地资源管理基础业务知识。
1.4 土地档案管理研究方向
一、加强基础业务建设。按照各地土地档案管理目标认定的各项业务建设要求,扎扎实实地抓好基础业务建设。在国土资源管理工作中,档案的形成要规范化、档案的整理要系统化、档案的保护要科学化、档案的管理要现代化。另一方面要积极探索对电子档案管理的新办法,把电子档案的形成、积累、归档、保管和提供利用等各环节纳入到档案管理的范围,并纳入档案管理部门的监督管理之中。
二、加强信息系统建设。随着办公自动化的普及,要加快档案信息电子化建设进程,充分利用计算机存储、网络、计算的功能,加快档案信息系统建设。建议建立电子影像档案数据库,实现对电子影像档案的管理和维护,同时使其具备和地籍管理系统之间的数据借口,通过土地登记申请材料的扫描,在完成土地登记后,可以直接生成地籍电子影像档案,同时形成纸质和电子两套档案数据。
三、积极采用现代化科学技术,全面提高档案管理的现代化水平。在抓好档案基础工作的前提下,要着重提高档案管理的科技含量。国土资源档案管理工作者要主动开发或引进先进的管理软件,努力学习国内外先进的技术和经验,及时配置不断更新档案现代化管理所必须的计算机、扫描仪、光盘刻录机等现代化办公设备,充分利用现代化技术,探索对国土资源档案进行扫描、光盘存储管理等新的办法。在建设新的办公楼时要科学设计、规划国土资源档案管理库房,有条件的要采用库房安全的自动化监控、库房温湿度的自动控制等先进技术。
四、加强档案法制的学习和宣传,推进依法治档工作。要利用多种形式,加大对《档案法》等档案法规的学习和宣传。对领导和干部职工的宣传要有针对性、注重实效;在档案管理工作中要强调依法治档,把依法治档工作真正落实到档案工作的各个环节。
1.5 项目目标
建立地、市、县级的土地信息系统,开发以土地登记为核心的地籍信息系统,以土地利用现状调查为核心的土地资源信息系统,为以服务社会为目标的地、市、县级数字国土信息系统奠定基础,从而实现土地管理工作的计算机化,实现土地管理信息的共享;提高土地管理的质量、效率和水平,更好地为上级领导和有关部门提供准确快速的土地信息查询服务、为土地使用者提供快捷的、全面的服务,为各级政府部门和有关机构的土地管理和决策提供技术支持。
1.6 项目设计原则
1.6.1 实用性原则
当前土地档案管理还是主要停留在流传千年的传统纸质档案管理,这样的落后的管理方式对档案的存储、查阅等相关工作带来了极大的不便。尤其是是这样信息化全面发展的时期,旧的落后的系统已经逐步显现其缺陷。在一线二线城市,信息化相关工作还好,但是再往下级就回归纸质时代。这样就呈现出了工作效率的分化。全面的信息化会让土地档案管理方面的工作带来极大便利。
1.6.2 经济性原则
建立合适的土地档案管理系统,提供了全面的功能,,数据处理方式灵活且满足需求,减少了人力物力的过度投入。同时基于web开发的系统,能够自主对系统进行修改,也节省了运营成本。
1.6.3 合法性原则
由于在中国对于版权的保护相关法律并不完善,所以某些软件使用盗版软件并不会带来太大影响,且能减少支出。但是政府机关的软件都是受到国家监管的,所以软件正版化这部分的投入不可少,否则后期版权纠纷带来的影响可能会很大。此外,所有资料都由提出放保管,合同制定确定违约责任。
2 相关技术介绍
2.1 三层架构的选择
MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
模型-视图-控制器(MVC)是Xerox PARC在二十世纪八十年代为编程语言Smalltalk-80发明的一种软件设计模式,已被广泛使用。后来被推荐为Oracle旗下Sun公司Java EE平台的设计模式,并且受到越来越多的使用ColdFusion和PHP的开发者的欢迎。模型-视图-控制器模式是一个有用的工具箱,它有很多好处,但也有一些缺点。
MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制。
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
Controller(控制器)是应用程序中处理用户交互的部分。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。
MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。MVC的层次结构如图2-1所示。
图2-1 MVC层次图
2.2 编程语言的选择
与传统程序不同,Sun 公司在推出 Java 之际就将其作为一种开放的技术。全球数以万计的 Java 开发公司被要求所设计的 Java软件必须相互兼容。“Java 语言靠群体的力量而非公司的力量”是Sun公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同。
Sun 公司对 Java 编程语言的解释是:Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。
Java 平台是基于 Java 语言的平台。这样的平台非常流行。因此微软公司推出了与之竞争的.NET平台以及模仿Java的C#语言。
Java是功能完善的通用程序设计语言,可以用来开发可靠的、要求严格的应用程序。
选择JAVA主要是因为其8大优势:
1. Java是目前使用最为广泛的网络编程语言之一。它具有简单,面向对象,稳定,与平台无关,解释型,多线程,动态等特点。
2.简单 Java 语言简单是指这门语言既易学有好用。不要将简单误解为这门语言很干瘪。你可能很赞同这样的观点 英语要比阿了伯语言容易学。但这并不意味着英语就不能表达丰富的内容和深刻的思想,许多文学若贝尔奖的作品都是英文写的。如果你学习过 C++语言,你会感觉 Java很眼熟,因为 Java中许多基本语句的语法和 C++一样,像常用的循环语句,控制语句等和 C++几乎一样,但不要误解为 Java 是 C++的增强版,Java 和 C++是两种完全不同的语言,他们各有各的优势,将会长期并存下去,Java 语言和 C++语言已成为软件开发者应当掌握的语言。如果从语言的简单性方面看,Java要比 C++简单,C++中许多容易混淆的概念,或者被Java弃之不用了,或者以一种更清楚更容易理解的方式实现,例如,Java不再有指针的概念。
3.面向对象 基于对象的编程更符合人的思维模式,使人们更容易编写程序。在实际生活中,我们每时每刻都与对象在打交道。我们用的钢笔,骑的自行车,乘的公共汽车等。而我们经常见到的卡车,公共汽车,轿车等都会涉及以下几个重要的物理量 可乘载的人数,运行速度,发动机的功率,耗油量,自重,轮子数目等。另外,还有几个重要的功能 加速功能,减速功能,刹车,转弯功能等。我们也可以把这些功能称作是他们具有的方法,而物理量是它们的状态描述。仅仅用物理量或功能不能很好的描述它们。在现实生活中,我们用这些共有的属性和功能给出一个概念 机动车类。一个具体的轿车就是机动车类的一个实例 对象 .Java 语言与其它面向对象语言一样,引入了类的概念,类是用来创建对象的模板,它包含被创建的对象的状态描述和方法的定义。
4.与平台无关 与平台无关是 Java 语言最大的优势。其它语言编写的程序面临的一个主要问题是 操作系统的变化,处理器升级以及核心系统资源的变化,都可能导致程序出现错误或无法运行。Java的虚拟机成功地解决了这个问题,Java编写的程序可以在任何安装了 Java虚拟机 JVM 的计算机上正确的运行,Sun公司实现了自己的目标 “一次写成,处处运行”。
5.解释型 我们知道C,C++等语言,都是只能对特定的CPU芯片进行编译,生成机器代码,该代码的运行就和特定的CUP有关。例如,在C语言中,我们都碰到过类似下面的问题 int 型变量的值是10 ,那么下面代码的输出结果是什么呢 printf(“%d,%d”,x,x=x+1) 如果上述语句的计算顺序是从左到右,结果是 10,11 但是,有些机器会从右到左计算,那么结果就是11,11.Java不像C++,它不针对特定的CPU芯片进行编译,而是把程序编译为称做字节码的一个“中间代码”。字节码是很接近机器码的文件,可以在提供了 Java 虚拟机 JVM 的任何系统上被解释执行。Java 被设计成为解释执行的程序,即翻译一句,执行一句,不产生整个的机器代码程序。翻译过程如果不出现错误,就一直进行到完毕,否则将在错误处停止执行。同一个程序,如果是解释执行的,那么它的运行速度通常比编译为可执行的机器代码的运行速度慢一些。但是,对Java来说,二者的差别不太大,Java的字节码经过仔细设计,很容易便能使用JIT 即时编译方式 编译技术将字节码直接转化成高性能的本地机器码,Sun 公司在 Java 2发行版中提供了这样一个字节码编译器——JIT(Just In Time),它是Java虚拟机的一部分。Java运行系统在提供JIT的同时仍具有平台独立性,因而“高效且跨平台”对Java来说不再矛盾。如果把 Java 的程序比做“汉语”的话,字节码就相当于“世界语”,世界语不和具体的“国家”关,只要这个“国家”提供了“翻译”,就可以再快速地把世界语翻译成本地语言。
6.多线程 Java 的特点之一就是内置对多线程的支持。多线程允许同时完成多个任务。实际上多线程使人产生多个任务在同时执行的错觉,因为,目前的计算机的处理器在同一时刻只能执行一个线程,但处理器可以在不同的线程之间快速地切换,由于处理器速度非常快,远远超过了人接收信息的速度,所以给人的感觉好象多个任务在同时执行。C++没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序的设计。
7.安全 当你准备从网络上下载一个程序时,你最大的担心是程序中含有恶意的代码,比如试图读取或删除本地机上的一些重要文件,甚至该程序是一个病毒程序等。当你使用支持Java的浏览器时,你可以放心地运行Java的小应用程序 Java Applet ,不必担心病毒的感染和恶意的企图,Java小应用程序将限制在 Java运行环境中,不允许它访问计算机的其它部分。
8.动态 Java 程序的基本组成单元就是类,有些类是自己编写的,有一些是从类库中引入的,而类又是运行时动态装载的,这就使得 Java 可以在分布环境中动态地维护程序及类库,而不像 C++那样,每当其类库升级之后,相应的程序都必须重新修改,编译。
2.3 主要技术、框架的选择
首先,Hibernate是数据持久层的一个轻量级框架。主要有以下优点:
1.使用简介的hql语句(Hibernate query language)。可以不使用传统的insert,update等sql语句。比如insert一个对象,原来的做法是:insert into 表名称 alue(值1,值2,值3,……),而现在的做法是:save(对象)。
2.使用or映射。对象到关系数据库之间的映射。是从对象的角度操作数据库,再次体现了面向对象思想。原来的实体抽取方法:首先有了表,然后表映射实体对象。而现在Hibernate做法是:直接由对象映射到表。
3.没有侵入性,移植性比较好。什么是没有侵入性?就是Hibernate采用了pojo对象。所谓的pojo对象就是没有继承Hibernate类或实现Hibernate接口。这样的话,此类就是一个普通的java类,所以移植性比较好。
4.支持透明持久化。透明是针对上层而言的。三层架构的理念是上层对下层的依赖,只是依赖接口不依赖具体实现。而Hibernate中的透明是指对业务逻辑层提供了一个接口session,而其他的都封装隐藏。持久化是指把内存中的数据存放到磁盘上的文件中。
2.4 数据库的选择
ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比如SilverStream就是基于数据库的一种中间件。ORACLE数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库,它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。但它的所有知识,只要在一种机型上学习了ORACLE知识,便能在各种类型的机器上使用它。
Oracle数据库最新版本为Oracle Database 12c。Oracle数据库12c 引入了一个新的多承租方架构,使用该架构可轻松部署和管理数据库云。此外,一些创新特性可最大限度地提高资源使用率和灵活性,如Oracle Multitenant可快速整合多个数据库,而Automatic Data Optimization和Heat Map能以更高的密度压缩数据和对数据分层。这些独一无二的技术进步再加上在可用性、安全性和大数据支持方面的主要增强,使得Oracle数据库12c 成为私有云和公有云部署的理想平台。
选择ORACLE,是因为其具备一下优势:
- 处理速度快,非常快。
2、安全级别高。支持快闪以及完美的恢复,即使硬件坏了 也可以恢复到故障发前的1s。
3、几台数据库做负载数据库,可以做到30s以内故障转移。
4、网格控制,以及数据仓库方面也非常强大。
2.5 技术选择方向
在日常的实际数据库操作中,因为数据库架设在服务器上,而服务器的处理能力远优于客户端的处理能力,所以更多地把逻辑放在服务端将成为趋势,而存储过程就是其中一个常用的项目。
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
在大型数据库系统中,存储过程和触发器具有很重要的作用。无论是存储过程还是触发器,都是SQL 语句和流程控制语句的集合。就本质而言,触发器也是一种存储过程。存储过程在运算时生成执行方式,所以,以后对其再运行时其执行速度很快。SQL Server 2005 不仅提供了用户自定义存储过程的功能,而且也提供了许多可作为工具使用的系统存储过程。
同样,触发器也是很重要的对象。
触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如Update、 Insert、 Delete 这些操作时,SQL Server 就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:
(1) 强化约束(Enforce restriction)
触发器能够实现比CHECK 语句更为复杂的约束。
(2) 跟踪变化Auditing changes
触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。
(3) 级联运行(Cascaded operation)。
触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。
(4) 存储过程的调用(Stored procedure invocation)。
为了响应数据库更新,触发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS(数据库管理系统)本身之外进行操作。
由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(Insert、 Update、 Delete)的多个触发器能够对同一种数据操作采取多种不同的处理。
总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。
3 需求分析
3.1 编写目的
本土地项目管理系统在可行性研究的基础上,是为了进一步明确土地项目管理系统的软件需求,以便安排项目规划和进度,组织软件开发和测试,撰写本文档。
本文档供项目经理、设计人员、开发人员参考。
3.2 系统需求分析简述
土地档案管理系统是一个复杂庞大的系统,整体需求是要通过信息化的手段完成传统档案管理工作向新技术手段的迁移。考虑到土地档案管理工作的保密性,对此系统应当按照用户级别进行授权,以及对系统的安全性进行一系列的设计。在具体功能上,要实现的有用户的管理、档案的管理、系统的维护等功能。
但是,这样的一个庞大系统,并不是以一人之力可为之的。所以现在从庞大的需求中抽离出出最基础最核心的对档案的增删改查,以及其它部分以实现。
3.3 系统需求分析详细描述
3.3.1 用户管理模块
若要使用该系统,需注册用户登录系统才可以使用。
用户管理模块主要包括登录和注册两个部分,只是简单的实现其功能,对权限分配等暂无需求。
注册模块实现用户注册功能。
登陆模块实现用户登录功能。
3.3.2 文件查找模块
文件查找模块,是要根据文件号进行文件的查找。
3.3.3 文件添加模块
在需要向系统中添加文件的时候,通过该模块手工录入文件各项详细信息,完成对文件的录入。
3.3.4 文件修改模块
根据文件号查找到文件,在能看到该文件信息的情况下,进行文件信息的修改操作,修改完成后进行储存。
3.3.5 文件删除模块
通过文件号查找到文件,然后进行文件的删除操作。
4 总体设计
本系统是采用B/S体系的三层结构,使用java编程语言,应用Hibernate开发模式。三层结构即Model层、View层和Service层的分离,层次分明的设计结构让整个系统显得层次分明,在实现和后期维护等方面将带来极大的方便。
总体来说,对于土地档案管理系统主要是实现用户管理方面即用户的登录和注册功能,以及对于文件档案的管理工作,即对文件档案的增删改查工作。在实现这些基本功能的基础上,在实现一些其他的功能,诸如页面的导航显示。
4.1 系统功能模块结构设计
本系统主要分为两大功能模块,即用户管理模块和档案管理模块,这两个模块下又细分为多个子模块,本系统的功能模块结构如图4-1所示。
图4-1系统总体功能框架图
4.2 数据库设计
表结构设计:
all_categories表是所有档案文件表父表信息,本表结构如图4-2所示。
图4-2档案父表设计图
user表是用户表信息,本表结构如图4-3所示。
图4-3用户表设计图
files表是土地登记表信息,本表结构如图4-4所示。
图4-4档案表设计图
all_categories表是土地类别相关的表,可用于后期的档案归属方面工作的管理,本表的结构如图4-5所示。
图4-5土地类别表设计图
土地档案管理系统的数据库存放应与传统的存档方式相似,有两种方案的选择:第一种是只有一个父表,也只有一个子表,父表中存放各层父结点,以本表自联结的方式可查询,而子表中存放所有最底层目录的文件,通过主外键的方式关联;第二种是每级目录都建一张表,多张表将文档的层次关系明确表示出来。
鉴于本设计是将该系统的部分功能实现出来,在数据量不够大的情况下选择第二种设计方式,以更直观的展现数据。而实际中将所有数据放在一个Model中的方式更加高效。
5 详细设计
5.1 登陆模块设计
Login.java
接受登录页面传送来的用户登录信息,对输入信息访问数据库判定是否允许登陆,允许则调到主页面,否则跳转回之前的登录页面。
UserServerImpl.java
继承IUserServer接口,实现login()方法,开启数据库事务,调用dao层方法,实现登录功能。
UserDaoImpl.java
继承IUserDao接口,通过对数据库的直接操作,将数据传输给上层,完成登录功能。
5.2 注册模块设计
Register.java
接受注册页面所传送来的用户注册信息,对输入的信息传给server层进行逻辑处理。
UserServerImpl.java
继承IUserServer接口,实现register()方法,开启数据库事务,调用dao层方法,实现注册功能。
UserDaoImpl.java
继承IUserDao接口,通过对数据库的直接操作,将数据传输给上层,完成注册功能。
5.3 文件查询模块设计
FindFiles.java
接受查询页面传来的土地号数据,以土地号信息为依据,调用server层的方法进行处理。
FileServerImpl.java
继承IFileServer接口,实现getAllFiles()方法,开启数据库事务,调用dao层方法,实现按土地号查询功能。在接收到dao层传回的数据后将数据传给页面显示。
UserDaoImpl.java
继承IFileDao接口,通过对数据库的直接操作,将数据传输给上层,完成查询功能。
5.4 文件添加模块设计
AddFiles.java
接受添加页面传来的土地文件信息,调用server层的方法进行处理。
FileServerImpl.java
继承IFileServer接口,实现addFile()方法,开启数据库事务,调用dao层方法,先验证数据库是否有相同信息,在没有的情况下向数据库中添加数据。并返回显示添加成功后的数据库中存储的信息。
UserDaoImpl.java
继承IFileDao接口,通过对数据库的直接操作,执行对数据库的增加操作,完成添加新文件功能。
5.5 文件修改模块设计
UpdateFiles.java
接受修改页面传来的土地文件信息,调用server层的方法进行处理。
FileServerImpl.java
继承IFileServer接口,实现addFiles1()方法,开启数据库事务,先验证对象是否为空,在非空的条件下,调用dao层的方法。并返回显示修改成功后的数据库中存储的信息。
UserDaoImpl.java
继承IFileDao接口,通过对数据库的直接操作,把新数据覆盖原始数据,完成修改文件的功能。
5.6 文件删除模块设计
DelFiles.java
接受删除文件的请求,调用server层的方法进行处理。
FileServerImpl.java
继承IFileServer接口,实现delFiles()方法,开启数据库事务,先验证对象是否为空,在非空的条件下,调用dao层的方法。并返回显示删除的结果。
UserDaoImpl.java
继承IFileDao接口,通过对数据库的直接操作,把数据删除。
6 系统实现
6.1 用户相关
6.1.1 登陆界面
登录功能介绍:
上面的截图为登录页面的一部分,通过该页面实现登录过程。当使用者有一个用户的时候,可以通过其已拥有的用户名和密码来进行登录,只有在用户名和密码都正确的时候才可以成功登陆。如果没有本系统的账户时,可以通过注册功能注册一个用户,然后通过注册完成的用户登录本系统。
系统登陆界面如图6-1所示。
图6-1登陆界面
登录功能核心代码:
Login.java
package com.ex.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.ex.bean.Users;
import com.ex.common.BeanFactory;
import com.ex.common.exception.UserServiceException;
import com.ex.service.imp.UserServiceImpl;
public class Login extends HttpServlet {
private static final long serialVersionUID = 1L;
private UserServiceImpl service = (UserServiceImpl)BeanFactory.getBean("userService");
public Login() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("username");
String password = request.getParameter("password");
try {
Users users = service.login(name, password);
HttpSession session = request.getSession();
session.setAttribute("users", users);
request.getRequestDispatcher("/host.jsp").forward(request, response);
} catch (UserServiceException e) {
e.printStackTrace();
request.setAttribute("message", "<script laguage='JavaScript'> alert('用户名或密码错误,请重新输入!') </script>");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
6.1.2 注册页面
注册功能介绍:
当某人要使用本系统的时候,需要有一个账户来进行登录,登陆之后才可以进行系统的操作。当没有账户时,可以快捷的通过登录页面的注册链接进入系统的注册页面,输入一个任意的符合规则的用户名和密码,以及一些其他的个人信息。当填写完信息之后想要对已填写的信息进行重新编辑,可以点重置按钮清空已填写的信息,然后可以重新录入你个人的注册信息。注册成功后则会成功跳转到登录页面使用新注册的账户进行登录。
用户注册页面如图6-2所示。
图6-2注册页面
注册功能核心代码:
Register.java
package com.ex.web;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.hibernate.Session;
import com.ex.bean.Files;
import com.ex.bean.Users;
import com.ex.common.HibernateSessionFactory;
import com.ex.common.exception.UserServiceException;
import com.ex.dao.imp.UserDaoImpl;
import com.ex.service.imp.UserServiceImpl;
public class Register extends HttpServlet {
private static final long serialVersionUID = 1L;
private UserServiceImpl service = new UserServiceImpl();
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String password = request.getParameter("password");
String email = request.getParameter("email");
String zip = request.getParameter("zip");
String address = request.getParameter("address");
String phonenumber = request.getParameter("phonenumber");
// System.out.println(name + address + telephone);
Session session = HibernateSessionFactory.getSession();
List list = session.createQuery("from Users").list();
Users users = new Users();
users.setId(list.size()+1);
users.setAddress(address);
users.setEmail(email);
users.setPassword(password);
users.setName(name);
users.setZip(zip);
users.setPhoneNumber(phonenumber);
try {
service.register(users);
request.getRequestDispatcher("/login.jsp").forward(request,
response);
} catch (UserServiceException e) {
request.getRequestDispatcher("/register.jsp").forward(request,
response);
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
6.2 档案相关
6.2.1 档案列举
代码列举功能的介绍:
在左侧的导航树中点击想要查询的文件档案分类的模块,进入其功能的详细显示页面。在这个页面上将直接显示本分类下所有文件的基本信息,通过对于本页面显示的文件档案的简要信息,了解其基本信息之后可以进行后续操作。比如要进行档案的查询时需要先知道其土地号,通过土地号来进行土地档案的查询。
档案列表页面如图6-3所示。
图6-3档案列表
档案列举功能核心代码:
java.sql.Connection sqlCon;
java.sql.Statement sqlStmt;
java.sql.ResultSet sqlRst;
java.lang.String strCon;
java.lang.String strSQL;
int intPageSize;
int intRowCount;
int intPageCount;
int intPage;
java.lang.String strPage;
int i;
intPageSize = 5;
strPage = request.getParameter("page");
if(strPage==null){
intPage = 1;
}
else{
intPage = java.lang.Integer.parseInt(strPage);
if(intPage<1) intPage = 1;
}
java.sql.DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
strCon = "jdbc:oracle:thin:@localhost:1521:orcl";
sqlCon = java.sql.DriverManager.getConnection(strCon,"dsg","dsg");
sqlStmt=sqlCon.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);
strSQL = "select gnum,squre,type,usedfor,people,location from files";
sqlRst = sqlStmt.executeQuery(strSQL);
sqlRst.last();
intRowCount = sqlRst.getRow();
intPageCount = (intRowCount+intPageSize-1) / intPageSize;
if(intPage>intPageCount) intPage = intPageCount;
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>档案分页显示</title>
</head>
<body>
<table border="1" cellspacing="0" cellpadding="0">
<tr>
<th>土地号</th>
<th>面积(单位:平方米)</th>
<th>土地类型</th>
<th>土地用途</th>
<th>拥有者</th>
<th>地址</th>
</tr>
<% if(intPageCount>0){
sqlRst.absolute((intPage-1) * intPageSize + 1);
i = 0;
while(i<intPageSize && !sqlRst.isAfterLast()){ %>
<tr>
<td width="150" align="center"><%=sqlRst.getString(1)%></td>
<td width="150" align="center"><%=sqlRst.getString(2)%></td>
<td width="150" align="center"><%=sqlRst.getString(3)%></td>
<td width="150" align="center"><%=sqlRst.getString(4)%></td>
<td width="150" align="center"><%=sqlRst.getString(5)%></td>
<td width="150" align="center"><%=sqlRst.getString(6)%></td>
</tr>
<%
sqlRst.next();
i++;}}
%>
</table>
第<%=intPage%>页 共<%=intPageCount%>页 <%if(intPage<intPageCount){%><a href="sele.jsp?page=<%=intPage+1%>">下一页</a><%}%> <%if(intPage>1){%><a href="sele.jsp?page=<%=intPage-1%>">上一页</a><%}%>
</body>
</html>
<% sqlRst.close();
sqlStmt.close();
sqlCon.close(); %>
6.2.2 档案查询
土地档案查询功能的介绍:
一般情况下要进行土地档案查询的时候,都要先知道土地号的。在已经知道土地号的情况下,输入要查询的土地档案的土地号,如果该土地档案在系统中存在,则会显示其具体的土地档案信息。若是不存在的话,则不会显示任何信息。在查询的结果的页面有修改和删除的相关功能的按钮,对于已经查询到的文件档案信息要进行修改或者删除的操作是可以通过其按钮进行操作。
先对土地档案进行查询操作,通过查询页面输入要查询的档案的土地号,进行查询,档案查询页面如图6-4所示。
图6-4档案查询
在输入要查询的土地号之后,进入档案的查询结果页面查看其具体信息,查询结果如图6-5所示。
图6-5档案查询结果
档案查询功能核心代码:
Findfiles.java
package com.ex.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.catalina.startup.SetAllPropertiesRule;
import com.ex.bean.Files;
import com.ex.common.exception.UserServiceException;
import com.ex.service.imp.FileServiceImpl;
public class FindFiles extends HttpServlet {
private static final long serialVersionUID = 1L;
private FileServiceImpl service = new FileServiceImpl();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String gNum = request.getParameter("tudi");
Files files = new Files();
files.setGnum(gNum);
try{
Files files2= service.getAllFiles(files);
request.setAttribute("files", files2);
request.getRequestDispatcher("/queryrs.jsp").forward(request, response);
}catch(Exception e){
e.printStackTrace();
request.setAttribute("message1", "<script laguage='JavaScript'> alert('文件不存在') </script>");
request.getRequestDispatcher("/query.jsp").forward(request, response);
}
}
public FindFiles() {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
6.2.3 档案修改
档案修改功能的介绍:
在文件档案查询的页面完成档案的查询之后,点击修改,会将查到的档案的所有信息传到页面的修改页面,然后在其本来的信息的基础上进行修改,只需要在原有的基础上进行自己想进行的修改,修改完成之后提交,通过档案土地号在查询页面中进行查询,则可看到其修改后的信息。
档案修改页面如图6-6所示。
图6-6档案修改
档案修改功能核心代码:
UpdateFiles.java
package com.ex.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ex.bean.Files;
import com.ex.common.exception.UserServiceException;
import com.ex.service.imp.FileServiceImpl;
public class UpdateFiles extends HttpServlet {
private static final long serialVersionUID = 1L;
private FileServiceImpl service = new FileServiceImpl();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String pid = request.getParameter("flh");
String gnum = request.getParameter("tdh");
String squre = request.getParameter("mj");
String type = request.getParameter("lx");
String usedfor = request.getParameter("tdyt");
String people = request.getParameter("yyz");
String location = request.getParameter("wz");
String whenuse = request.getParameter("kssysj");
String remark = request.getParameter("bz");
String content = request.getParameter("nr");
Files files = new Files();
files.setPid(pid);
files.setGnum(gnum);
files.setSqure(squre);
files.setType(type);
files.setUsedfor(usedfor);
files.setPeople(people);
files.setLocation(location);
files.setWhenuse(whenuse);
files.setRemark(remark);
files.setContent(content);
try{
service.addFiles(files);
request.getRequestDispatcher("/query.jsp").forward(request, response);
}catch(UserServiceException e){
// request.getRequestDispatcher("/register.jsp").forward(request, response);
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
6.2.4 档案删除
档案删除功能介绍:
在查询到要查询的档案信息之后,通过其页面下方的删除按钮,完成是否删除的提示框确认之后,可完成对文件档案的删除。在查询页面对刚才删除的档案进行查询,删除成功后将不会显示刚才的文件信息。
档案删除页面如图6-7所示。
图6-7档案删除
档案删除功能核心代码:
DelFiles.java
package com.ex.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.catalina.startup.SetAllPropertiesRule;
import com.ex.bean.Files;
import com.ex.common.exception.UserServiceException;
import com.ex.service.imp.FileServiceImpl;
public class DelFiles extends HttpServlet {
private static final long serialVersionUID = 1L;
private FileServiceImpl service = new FileServiceImpl();
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String gNum = request.getParameter("tdh");
Files files = new Files();
files.setGnum(gNum);
Files files2 = service.getAllFiles(files);
if (!files2.equals(null)) {
try {
service.delFiles(files2);
request.getRequestDispatcher("/query.jsp").forward(request,
response);
} catch (Exception e) {
e.printStackTrace();
}
} else
request.getRequestDispatcher("/queryrs.jsp").forward(request,
response);;
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
6.2.5 档案添加
档案添加功能的介绍:
如果要进行档案的添加,点击档案的添加按钮,进入档案添加页面,通过输入要添加的档案信息,可以完成对档案的添加。其中的分类号是档案所属类的序号,每一类的档案拥有同一个序号。其中分类号、土地号和面积是非空的,因为每个土地信息这三个方面的信息是必不可少的。
档案添加页面如图6-8所示。
图6-8档案添加
档案添加功能核心代码:
AddFiles.java
package com.ex.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ex.bean.Files;
import com.ex.common.exception.UserServiceException;
import com.ex.service.imp.FileServiceImpl;
public class AddFiles extends HttpServlet {
private static final long serialVersionUID = 1L;
private FileServiceImpl service = new FileServiceImpl();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String pid = request.getParameter("flh");
String gnum = request.getParameter("tdh");
String squre = request.getParameter("mj");
String type = request.getParameter("lx");
String usedfor = request.getParameter("tdyt");
String people = request.getParameter("yyz");
String location = request.getParameter("wz");
String whenuse = request.getParameter("kssysj");
String remark = request.getParameter("bz");
String content = request.getParameter("nr");
Files files = new Files();
files.setGnum(gnum);
Files files2= service.getAllFiles(files);
if(files2.equals(null)){
files.setPid(pid);
files.setSqure(squre);
files.setType(type);
files.setUsedfor(usedfor);
files.setPeople(people);
files.setLocation(location);
files.setWhenuse(whenuse);
files.setRemark(remark);
files.setContent(content);
try{
service.addFiles1(files);
request.getRequestDispatcher("/queryrs.jsp").forward(request, response);
}catch(UserServiceException e){
// request.getRequestDispatcher("/register.jsp").forward(request, response);
e.printStackTrace();
}
}
else{
files2.setPid(pid);
files2.setSqure(squre);
files2.setType(type);
files2.setUsedfor(usedfor);
files2.setPeople(people);
files2.setLocation(location);
files2.setWhenuse(whenuse);
files2.setRemark(remark);
files2.setContent(content);
try{
service.addFiles1(files2);
request.setAttribute("files", files2);
request.getRequestDispatcher("/queryrs.jsp").forward(request, response);
}catch(UserServiceException e){
// request.getRequestDispatcher("/register.jsp").forward(request, response);
e.printStackTrace();
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
6.2.6 报表功能
在数据库中的数据存放表只占到很小的一部分,而大多数的业务处理应用到的是视图,以下是其中统计同一个人在不同地区土地面积的报表,只有不少于2块土地的人才会出现在记录中。
报表结果如图6-9所示。
图6-9 报表图
以下是该视图的设计代码:
create or replace view baobiao as
select people,sum(decode(location,'山西省太原市小店区',squre,null)) as xd,
sum(decode(location,'山西省太原市迎泽区',squre,null)) as yz,
sum(decode(location,'山西省太原市晋源区',squre,null)) as jy
from files
group by people
having count(people)>1;
6.3 Service层的实现
6.3.1 Service层实现介绍
下面介绍的文件处理相关的Service层。这一层的方法是由Servlet调用的。就拿文件处理相关的FileServiceImpl.java来说,通过判断Servlet中调用的方法,然后执行调用持久层的方法,来实现与数据库的交互。而与数据库的交互的的持久层方法并不是在这里实现的。
6.3.2 Service层实现的相关代码
FileServiceImpl.java
package com.ex.service.imp;
import java.util.Map;
import javax.servlet.http.HttpSession;
import com.ex.bean.Files;
import com.ex.bean.Users;
import com.ex.common.exception.UserServiceException;
import com.ex.common.transaction.HibernateTransaction;
import com.ex.dao.imp.UserDaoImpl;
import com.ex.dao.imp.FileDaoImpl;
import com.ex.service.iFileServer;
public class FileServiceImpl implements iFileServer{
private FileDaoImpl dao = new FileDaoImpl();
public Files getAllFiles(Files files){
HibernateTransaction ht = new HibernateTransaction();
ht.beginTransaction();
Files files2 =new Files();
try {
files2 = dao.findFilesByGnum(files.getGnum());
} catch (Exception e) {
e.printStackTrace();
}
return files2;
}
public void addFiles(Files files) throws UserServiceException {
HibernateTransaction ht = new HibernateTransaction();
ht.beginTransaction();
try {
Files files2 = dao.findFilesByGnum(files.getGnum());
if (files2 != null) {
throw new UserServiceException("已经存在");
}
dao.saveOrupdateFiles(files);
ht.commit();
} catch (Exception e) {
ht.rollback();
e.printStackTrace();
throw new UserServiceException("失败");
}
}
public void addFiles1(Files files) throws UserServiceException {
HibernateTransaction ht = new HibernateTransaction();
ht.beginTransaction();
try {
Files files2 = dao.findFilesByGnum(files.getGnum());
dao.saveOrupdateFiles1(files);
ht.commit();
} catch (Exception e) {
ht.rollback();
e.printStackTrace();
throw new UserServiceException("失败");
}
}
public void delFiles(Files files) throws UserServiceException {
HibernateTransaction ht = new HibernateTransaction();
ht.beginTransaction();
try {
Files files2 = dao.findFilesByGnum(files.getGnum());
dao.deleteFiles(files2);
ht.commit();
} catch (Exception e) {
ht.rollback();
e.printStackTrace();
throw new UserServiceException("失败");
}
}
}
6.4 持久层的实现
6.4.1 持久层功能实现的介绍
持久层则是实现数据的持久化,完成数据在数据库中的增删改查还是要靠这一层的方法。这里是直接调用底层的方法,并没有自己专门去实现这些方法,这些方法就可以由service来调用最终实现数据的持久化。下面的的代码是文件档案相关的数据持久代码。
6.4.2 持久层实现的代码
package com.ex.dao.imp;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.hibernate.Session;
import com.ex.bean.Files;
import com.ex.bean.Users;
import com.ex.common.HibernateSessionFactory;
import com.ex.dao.IFileDao;
public class FileDaoImpl implements IFileDao{
public void saveOrupdateFiles(Files files) throws Exception {
Session session = HibernateSessionFactory.getSession();
session.save(files);
}
public void saveOrupdateFiles1(Files files) throws Exception {
Session session = HibernateSessionFactory.getSession();
session.update(files);
}
public void deleteFiles(Files files) throws Exception {
Session session = HibernateSessionFactory.getSession();
session.delete(files);
}
public Files findFilesByGnum(String gNum) throws Exception {
Session session = HibernateSessionFactory.getSession();
List list = session.createQuery("from Files where gNum= ?")
.setString(0, gNum).list();
if (list.size() != 0) {
return (Files) list.get(0);
} else {
return null;
}
}
}
7 测试
7.1 测试目的
在开发大型软件的漫长过程中,面对极其错综复杂的问题,人的主观认识不可能完全符合客观事实,与工程密切相关的各类人员之间的通信和配合也不可能完美无缺。因此,在软件生命周期的每个阶段都不可避免的会产生差错。尤其对于土地档案系统这类政府职能机关所用的工程软件,必须尽量减少错误,以免造成严重的损失。测试时为了发现程序中的错误而执行程序的过程。测试的目的就是在软件投入生产性运行之前,尽可能多的发现软件中的错误。目前软件测试仍然是保证廉质量的关键步骤,他是对软件说明设计和编码的最后复审,也是必不可少的关键步骤。
7.2 测试原则
一,测试应该尽早进行,最好在需求阶段就开始介入,因为最严重的错误不外乎是系统不能满足用户的需求。
二,程序员应该避免检查自己的程序,软件测试应该由第三方来负责。
三,设计测试用例时应考虑到合法的输入和不合法的输入以及各种边界条件,特殊情况下要制造极端状态和意外状态,如网络异常中断、电源断电等。
四,应该充分注意测试中的群集现象。
五,对错误结果要进行一个确认过程。一般由A测试出来的错误,一定要由B来确认。严重的错误可以召开评审会议进行讨论和分析,对测试结果要进行严格地确认,是否真的存在这个问题以及严重程度等。
六,制定严格的测试计划。一定要制定测试计划,并且要有指导性。测试时间安排尽量宽松,不要希望在极短的时间内完成也有一个高水平的测试。
7.3 测试内容
软件测试主要工作内容是验证(verification)和确认(validation),下面分别给出其概念:
验证(verification)是保证软件正确地实现了一些特定功能的一系列活动, 即保证软件以正确的方式来做了这个事件(Do it right)
1.确定软件生存周期中的一个给定阶段的产品是否达到前阶段确立的需求的过程。
2.程序正确性的形式证明,即采用形式理论证明程序符合设计规约规定的过程。
3.评审、审查、测试、检查、审计等各类活动,或对某些项处理、服务或文件等是否和规定的需求相一致进行判断和提出报告。
确认(validation)是一系列的活动和过程,目的是想证实在一个给定的外部环境中软件的逻辑正确性。即保证软件做了你所期望的事情。(Do the right thing)
1.静态确认,不在计算机上实际执行程序,通过人工或程序分析来证明软件的正确性。
2.动态确认,通过执行程序做分析,测试程序的动态行为,以证实软件是否存在问题。
软件测试的对象不仅仅是程序测试,软件测试应该包括整个软件开发期间各个阶段所产生的文档,如需求规格说明、概要设计文档、详细设计文档,当然软件测试的主要对象还是源程序。
7.4 测试过程
7.4.1 登录模块
登陆模块的等价类划分如表7-1所示。
表7-1 登录等价类划分
输入 | 有效等价类 | 无效等价类 |
用户名 | (1)长度在0~10之间的varchar2型 | (2)长度小于0或大于10 |
密码 | (3)长度在0~16之间的varchar2型 | (4)长度小于0或大于16 |
登陆模块为等价类设计测试用例如表7-2所示。
表7-2 登录测试用例
测试数据 | 期望结果 | 覆盖用例 |
用户名:dhc 密码:dhc | 输入正确 | (1)(3) |
用户名:1236547896541236547896541236547896 密码:1234 | 长度大于50 | (2) |
用户名:qy 密码:12365478965412365478965412365478 | 长度大于50 | (4) |
7.4.2 查询模块
查询模块的等价类划分如表7-3所示。
表7-3 查询等价类
输入 | 有效等价类 | 无效等价类 |
查询的内容 | (1)长度在0~15之间的varchar型 | (2)长度小于0或大于15 |
查询模块为等价类设计测试用例如表7-4所示。
表7-4 查询测试用例
测试数据 | 期望结果 | 覆盖用例 |
土地号:10000001 | 输入正确 | (1) |
土地号:124124124124124124124 | 输入错误 | (2) |
7.5 测试结果
7.5.1 功能性
现在的系统基本实现了登陆、注册和文件档案的管理,但是对于权限先关的设计使得功能上有所缺陷
7.5.2 易用性
增删改查的操作比较方便。
登陆界面还算可以,但是其他的页面还比较简单。
输入的内容缺乏解释性注释。
结 论
土地档案系统作为将传统的纸质化档案管理方式进行数字化电子化的一项工程,将人类历史上的传承千年的档案管理工作进行数字化的封装,将土地档案管理工作进行了优化,在档案的查询、修改、删除等方面带来了极大的便利。
作为典型的档案管理系统,本土地档案管理系统实现了基本的登录、注册、档案查询、档案修改、档案增添、档案删除的经典功能,而正式使用的土地档案管理系统无外乎就是这些核心的功能在做多种优化以及个性化的功能而实现的。当然,从目前所实现的功能来说,当然不得以支撑正式的土地档案管理工作的日常实现,在日常的土地档案管理工作中,结合其实际当然少不了对于权限的设置,比如在各级地方的土地档案查阅权限是不尽相同的;再如现在的GPS定位系统的结合,使得在土地勘查工作的结果能够直接进入土地档案管理系统之中,为土地将两份工作有机地结合起来,简化了工作流程,节省了人力物力;又如土地档案的存储并不是简单地通过前台的页面直接录入系统,而是要经过层层的审核,在审核无误之后才能成功存入系统。但是,复杂的工作带来极大的工作量,以及现在的技能水平还无法达到这一层次的水平,所以现在实现其核心功能,以为以后的设计打下夯实的基础。
对于整个系统来说,页面的设计并不是难点,但是想要做成让人赏心悦目的效果还是简单的,鉴于时间有限,在登录页面做出较多效果,其他页面进行略微调整。而对于系统的逻辑结构,基于MVC模式的开发并且使用Hibernate将系统的层次性以及代码的层次性清晰地呈现了出来,在开发过程中只是略微体现其好处,只是感觉代码的结构很漂亮。待到系统基本实现的时候,对系统进行细节性的调整的,很快地就找到了相应的代码方位,而且在修改的过程当中,应为逻辑的层层分离,不会因为一点点的东西带来大的问题,这就是提高可读性带来的好处。
当然,作为一个档案管理系统,当然上不了对数据的处理,简单地来说就是包括增删改查。之前完成过的设计使用的是SQL SERVER或者MYSQL这样商业化程度低或者小型的数据库,而这次有机会接触并实际操作商业化程度高的大型数据库Oracle,对数据库也有了更加深刻的认识。
通过对于Oracle的实际操作以及实际应用,已经把初始认为的只是用来存放数据的一个东西得到了改变。它并不仅仅是一个存放数据的东西,当然存放数据是其核心功能。数据库编程,能为程序带来意想不到的效果。
就拿当前完成的土地档案系统来说,也只是简单的实现了利用Oracle来存放档案信息,仅仅是放进去而已。虽然数据库中已经建好了部分权限的相关的表,但是目前还没有启用。现在的主流的系统都是将数据持久层架设在Linux上的,鉴于Linux的特性,如果把数据处理的过程放在数据库中进行(比如一个Procedure),这样可以极大地减轻本地资源的消耗,而这看似简单的实现不仅仅减少了服务端的资源浪费,还使得客户端的资源得到极大的施放,毕竟现在使用相关软件的终端并不是配置很高的终端,所以需要这样的优化来为系统的使用带来更大的便利。
而作为这样的一个系统,土地档案管理系统在使用的过程中避免不了升级优化或者开发新系统。这样就无可避免的要进行数据迁移相关的工作。对于数据迁移工作来说,其复杂程度是和之前系统的设计的好坏成正比的。合理的、意义明确的系统,将为后期工作带来极大的便利,而随意而为之的系统将为后来的工作带来极大的隐患。比如,表名是随便起的,这样在实施迁移的时候就会使得很难去对应数据,使得更多的时间是去跟业务人员做不必的交流,会是整个项目的跨度加长,并不利于其开发。
还有在开发出的系统中,由于逻辑或者未知的原因,往往造成数据出错或者丢失之类的情况。而数据实施相关的工作又能解决很多开发遗留的的问题或者突发性问题。所以,对于这个土地档案管理系统,可以将部分的精力置于数据库的设计上,可以把部分的逻辑处理放在数据库中,只要在代码中调用这样的存储过程,这样既减少了代码开发人员的工作,又使得系统得以优化。
对于传统的土地档案管理工作有一定的了解,知道其在实际操作中在很大的仓库进行调阅是一个很繁杂的工作,而且经常因为工作人员的原因而无法及时查阅,造成的很大的不便。而当前电子化的土地档案管理系统虽说在也在用,但是目前只限于一线城市、二线城市,而对于更低行政等级的,却是更需要这样的系统,但是却没有得到普及,因为低行政等级的才是最直接接触的到基本土地档案的单位。而且现在的很多类似系统功能设计的非常的完善,但是80%的功能在实际应用中并不能狗被使用到。所以,一个功能更简单更适合实际应用的、操作起来更简单的系统才是真正需要的。所以朝着这个方向进行开发才是正确的方向,只有实用的的才是需要的,并不是说它的功能有多么全面有多么好就真真正正的时候好的。