jsp+sql智能道路交通信息管理系统的设计与实现(论文+系统+开题报告+答辩PPT+外文翻译)

毕业设计(论文)

任务书1

文献综述4

开题报告9

译文14

译文原文

附件A

毕业设计(论文)

设计(论文)题目 智能道路交通信息管理系统

学 院 计算机学院

专 业 计算机科学与技术

学 生 姓 名

指导教师姓名、职称

助理指导教师姓名、职称

下 发 日 期 20 年 月 日

教 务 处

设计(论文)的主要内容与要求:智能道路交通信息管理系统通过对电子警察系统抓拍到的违章车辆的图像信息进行有效管理,达到惩戒违章司机,改善交通路口混乱,减少因交通违章造成的人为塞车和事故,提高交通执法的准确性和效率,节省警力并提高城市道路交通效率的目的。本系统包括四部分功能:(1)违章车辆图像信息的录入;(2)违章车辆信息的查询统计;(3)违章车辆信息的公告与处罚;(4)信息管理系统的维护与设置。设计(论文)的主要技术指标:1、实现违章图像的网络访问并将相应信息录入数据库;2、实现违章图像及信息的网络查询及信息统计;3、实现违章车辆信息的网络公告并对违章司机作出处罚;3、实现本信息管理系统的维护与设置。
进 度 安 排
序号设计(论文)工作进度日期(起止周数)
1查阅资料第1,2周
2完成文献综述和开题报告第3周
3熟悉开发环境第4-5周
4系统设计与实现第6-13周
5程序调试与测试第14-15周
6撰写论文,准备答辩第16周
7
8
主要参考文献:[1] 丁宝康、董健全编著 数据库使用教程 清华大学出版社 2003[2] 丁爱萍编著 数据库技术及应用 西安电子科技大学出版社 2005[3] DATE C J. An Introduction to Database Systems. Vol. I, Addison-Wesley ,Version 6, 1995[4] 谢希人编著 计算机网络(第2版) 电子工业出版社 1999[5] 李劲、谢兆阳,SQL Server 2000数据库设计与系统管理 清华大学出版社 2001 [6] 飞思科技产品研发中心编著 JSP应用开发祥解 电子工业出版社 2005[7] 施安平等译 JAVA程序设计教程(第5版) 清华大学出版社 2005
同组设计(论文)者:
系负责人意见:签字: 年 月 日
学院负责人意见:签字: 年 月 日
学生签字:接受任务时间: 年 月 日

注:任务书由指导教师填写。

附件B

毕业设计(论文)

文献综述

题 目 电子警察系统的发展现状

学生姓名 学号

指导教师评语:

指导教师评定成绩 签字:

交叉评阅教师评语:

交叉评阅教师评定成绩 签字:

教 务 处

文献综述:

电子警察系统的发展现状

1摘要

电子警察是“智能电子警察监测系统”的简称,它是一套高科技电子设备,最初是为维护交通执法提供了一种先进手段。以往许多城市在某些交通场合,由于没有有效的执法手段造成执法困难,例如:无人值守的路口;单行线;禁行、限时道路;限车型车道;主、辅路进出口;紧急停车带;公交专用道;违章超速等场合检查执法困难,特别是在夜间,违章行车现象经常发生,严重破坏了交通秩序。该设备能够对 违章车辆进行自动判断与图像记录。执法部门可以根据该系统所提供的车辆违章过程的图像记录,对违章 司机进行追究和处罚。几年来,各大中城市均在此方面做过有益的尝试,但使用情况总的来并不理想。主要原因是现有的电子警察抓拍设备存在许多缺陷,限制了它发挥更大的作用。从目前市场情况来看,还没有哪一家公司提供的系统和设备能够真正满足用户期望,用户对系统现状也看法各异。电子警察设备具有非常广阔的前景,但现阶段在设备选型方面却难度很大。

本系统是作为电子警察的后台数据处理系统的“车辆违章处罚系统”。要求能实现交通主管部门的网上办公功能,通过对电子监控得到的数据进行录入,处理,查询,公告,处罚等,实现对违章车辆的纪录,处罚。因而,其在现代交通管理中有很大的发展空间。即使它在数据的采集,处理上还要求人工处理,但它还是比以前全人工的方式要优异得多。可以想象随着科学技术的发展,相信在不久就能在数据采集与处理上实现不同系统之间的数据传递,以及数据处理。

2关键字

电子警察,智能交通,违章处罚,电子监控

3正文

3.1电子警察的组成

典型的“电子警察”通常是由图像检测(车辆感应)、拍摄、采集、处理、传输与管理以及辅助光源、辅助支架和相关配套设备等几个部分组成。主要有固定和流动的两种应用型式,自动和人工操作的两种工作方式。下面分别就各组成部分作一一介绍:

1、图像检测部分:在系统中起车辆感应的作用,主要有:(1)环形线圈检测器,(2)视频检测器;(3)超声波或微波(雷达波)检测器;(4)红外线检测器等几种。

2、图像拍摄部分:在系统中起图像抓拍的作用,主要有照相机和摄像机。其中照相机目前基本上多采用数码照相机,极少使用传统的胶片式照相机(繁锁、后期使用成本高、实时性差)。而数码照相机多选用三百万以上像素、可变焦、自动光圈及白平衡调整等的准专业相机。不过,由于其结构、图像存取等原因,其实时性、连拍续传能力和环境适应性较差,一般多用于交叉路口的闯红灯车辆抓拍(需特制机箱,进行温度调控等)和人工流动拍摄等场合;而摄像机基本上都选用高清晰度(≥480TVL)、低照度(≤0.1lux)、高信噪比、动态抗逆光与强光抑制、背景光自动补偿、白平衡自动调整等功能的快速(快门速度不能慢于1/1000秒)工业级摄像机,其配套的镜头则应采用大孔径、可变焦,大光圈、快速自动光圈调整的专业光学镜头。

3、图像采集部分:在系统中起图像采集即将模拟视频图像数字化的作用,通常采用多路视频图像采集卡:将多路模拟视频图像经过多路切换器、A/D变换器以及裁剪、压缩编码后变成数字视频信息。国际上通常采用的视频压缩编码方式有:MJPEG、Wavelet(小波变换),MPEG-1(如VCD),MPEG-2(如DVD)和MPEG-4等几种。国内数字化视频监控工程中常用的是具有压缩率高、系统资源总帧数大、传输速率要求低、单卡可支持多路视频压缩的MJPEG和MPEG-4两种视频压缩编码方式。图像采集的优劣直接关系到系统的工作效能、图像质量和进一步处理、利用的成效大小。

4、图像处理部分:事实上,应包括控制主机和系统应用软件两个部分,在系统中起控制、图像识别、存贮与管理的作用。为了保证系统在恶劣工作环境中连续不间断地自动运行,控制主机必须采用高速、大内存、大容量镜像硬盘等高性能工业级控制机或DSP处理机,以满足多路图像(包括全景和近景特写图像)的捕捉、识别、压缩、存贮、比对、报警、传输和故障自诊断与管理等实时多任务、多进程的操作要求,同时尚需预留有适宜的扩展与升级余地;而系统应用软件通常包括Windows或Linux或Unix操作系统、图像模糊识别与信息管理软件。图像模糊识别主要是车牌识别软件一般包括图像二值转换,图像差分、滤波与平滑,车牌定位与旋转,字符切割,字符识别,车牌颜色提取与识别和车牌分类等功能模块。控制主机的配置和操作系统合适与否直接决定了系统的性能、稳定性与可靠性的好坏。图像识别率的高低则几乎决定了系统技术水平和智能化程度的高低。

5、信息传输部分:包括本地和远程传输两个部分,在系统中起信息传递与交换的作用。本地信息传输部分主要包括检测信号线、视频信号线、网络信号线,网卡以及交换机或集线器等,其是确保系统正常工作的“中枢神经”;而远程信息传输部分则主要要有线和无线介质两种,其是实现系统远程监控,远程维护与远程报警以及信息共享与综合利用的基本保障。

6、信息管理部分:包括中心主机和管理软件两部分,在系统中起信息的汇集、存贮、查询、统计、交换、备份、打印、嫌疑信息(如交通违章或事故逾期未处理、逾期未参加法定检验或审验,被盗抢和肇事逃逸等车辆信息)的自动比对与实时报警、系统故障自诊断与管理和远程监控、远程维护与远程报警等诸多重要作用。信息管理部分是实现系统“实时监视、联网布控、自动报警、快速反应、科学高效、信息共享,监控、威慑、防范和打击并重”综合效能,体现系统战斗力的关键所在。

7、辅助光源:在系统中起辅助照明尤其是夜间或光线不足时补光,提高抓拍图像清晰度的作用。通常有:(1)频闪照明灯,如闪光灯:(2)连续照明灯,如路灯和其他冷、热光源(常见的有白炽灯、萤光灯、卤钨灯、陶瓷金卤灯,高压钠灯等多种)。辅助光源是确保系统在光线不足条件下正常工作的“夜明灯”,不可或缺。

8、辅助支架:在系统中用于安装、固定摄像机或照相机和辅助光源等。常见的有:(1)龙门架;(2)悬臂架,如L或F型;(3)立柱;(4)移动式安装支架,如三角架和固定在汽车上专用支架等。辅助支架是系统正常工作,持续运行的基础,不可忽视。

9、其他相关配套设备:在系统中主要起保证系统相关设备正常、稳定、可靠地通行的作用。常用的有:(1)长延时不间断电源(UPS),(2)净化稳压电源;(3)强、弱电防雷、设备避雷与接地装置;(4)系统故障、违章或嫌疑信息和防盗等报警装置;(5)打印机等等。

3.2主要功能

  1. 环形线圈和视频检测器复合检测、图像融合(拼接)与后期处理(滤波,平滑等优化处理和亮度/对比度/色彩/锐化调整等)和边界触发报警功能,可全天候、不间断地对所有通过拍摄点的车辆(含违章、嫌疑车辆等)进行自动拍摄,且只有当车辆通过时才拍摄;
  2. 准确地记录并存贮车辆(全景和近景即车头或车尾部位特写),车牌、速度、流量、日期、时间、地点和行驶方向等信息,能够自动识别车辆类型(大、小、客,货四类)、车身颜色、车牌(含汉字、字母,数字和车牌颜色),实现车辆超速、超车,逆行、不按道行驶、跨越双实线、闯红灯、禁停、禁行、禁弯等动、静态交通违章车辆抓拍,嫌疑车辆及车牌信息自动比对与实时报警功能;
  3. 各功能模块(包括运行参数等)可根据实际需要进行灵活配置与管理。汉化界面、简单直观、操作维护方便。能够按照车型、车身颜色、车牌、速度、流量、日期、时间、地点、行驶方向和违章类别等相关条件进行单一或组合方式的信息查询、统计、传递与打印等;
  4. 可存贮不少于80万辆汽车图像信息,实现全自动刷新,循环存储。能够进行多任务操作,监控、查询、统计、传递与打印等互不影响;
  5. 完善的系统管理(包括用户权限管理、黑客与病毒防治、各功能模块及其电源的故障自诊断与自动报警——含防盗报警等,各种报警的提示方式应有明显区别)和远程监控、远程维护与远程报警等功能。
  6. 关键指标:(1)最高拍摄车速:≥160km/h;(2)车辆抓拍率:≥98%;(3)车牌抓拍率:≥90%:车牌识别率:≥80%。

4结语

随着科技的不断发展,道路监控手段也在不断地提高,电子警察的性能与图像拍摄、传输也在不断发展。电子警察就可以实现信号灯无线发射采集控制、图像自动下载,无线传输、系统自停自恢复自启动、远程无线监控电子警察工作状态等功能,这必将大大提高交通管理部门对交通的管理。

参考文献

[1] 李巨伟等著.北京交通违章监测非现场处罚数据库管理系统简介.

[2] 黄晓丹著.广州市电子警察拍摄系统及其应用.

[3] 谢希人编著.计算机网络(第2版).电子工业出版社

[4] 飞思科技产品研发.JSP应用开发详解(第二版).电子工业出版社.

[5] 龙马工作室编著.DREAMWEAVER MX2004 & JSP 动态网页编程完全自学手册.人民邮电出版社.

[6] 赛奎春著.JSP工程应用与项目实践.机械工业出版社.

[7] 黄明等著.JSP信息系统设计与开发实例.机械工业出版社.

[8] 刘晓华,陈亚强著.J2EE应用开发详解.电子工业出版社.

[9] 王能斌著.数据库管理系统.中国水利水电出版社.

[10] 李劲,谢兆阳著.SQL Server 2000数据库设计与系统管理.清华大学出版社.

[11] 叶核亚,陈立等著.JAVA2程序设计实用教程.电子工业出版社.

[12] 马云峰等著.IC卡交通违章处罚管理系统.

[13] 张春锐著.IC卡在交通管理中的应用.

附件C:

毕业设计(论文)

设计(论文)题目 智能道路交通信息管理系统

学 院 计算机学院

专 业 计算机科学与技术

学 生 姓 名 学 号

指导教师姓名、职称

助理指导教师姓名、职称

完 成 日 期 20 年 月 日

教 务 处

1、课题的目的及意义(含国内外的研究现状分析)电子警察是“智能电子警察监测系统”的简称,它是一套高科技电子设备,最初是为维护交通执法提供了一种先进手段。以往许多城市在某些交通场合,由于没有有效的执法手段造成执法困难,例如:无人值守的路口;单行线;禁行、限时道路;限车型车道;主、辅路进出口;紧急停车带;公交专用道;违章 超速等场合检查执法困难,特别是在夜间,违章行车现象经常发生,严重破坏了交通秩序。该设备能够对违章车辆进行自动判断与图像记录。执法部门可以根据该系统所提供的车辆违章过程的图像记录,对违章司机进行追究和处罚。几年来,各大中城市均在此方面做过有益的尝试,但使用情况总的来并不理想。主要原因是现有的电子警察抓拍设备存在许多缺陷,限制了它发挥更大的作用。从目前市场情况来看,还没有哪一家公司提供的系统和设备能够真正满足用户期望,用户对系统现状也看法各异。电子警察设备具有非常广阔的前景,但现阶段在设备选型方面却难度很大。总结近年的实践经验,提出以下看法,只有在这几方面得到突破,才可能真正实现完善的电子警察系统。1)抓拍单元是具备200万以上像素的工业标准数码相机。具备良好的软件控制能力,并开放协议。2)采用工业级器件,具有良好的全天候工作能力,长期运行稳定可靠。3)系统采用嵌入式软硬件平台,以保证良好的稳定性。4)配置以太网通讯接口,支持远程文件传送协议。5)采用硬盘或存储卡在本地保存图片。6)信息管理部分:包括中心主机和管理软件两部分,在系统中起信息的汇集、存贮、查询、统计、交换、备份、打印、嫌疑信息(如交通违章或事故逾期未处理、逾期未参加法定检验或审验,被盗抢和肇事逃逸等车辆信息)的自动比对与实时报警、系统故障自诊断与管理和远程监控、远程维护与远程报警等诸多重要作用。其作为服务器的主机通常要选用高性能(最好是双CPU)工业级控制机或PC服务器;而管理软件部分则多是建立在Oracle或MS SQL Server或Sybase等大型数据库基础之上的系统综合管理与应用软件。信息管理部分是实现系统“实时监视、联网布控、自动报警、快速反应、科学高效、信息共享,监控、威慑、防范和打击并重”综合效能,体现系统战斗力的关键所在。因此,开发出一套优化的电子警察系统,以及针对不同用户的需要,对违章图像进行管理和查询软件,能够提高交通部门工作效率,在一定程度上保障交通安全,减少交通隐患。将要开发的系统是作为电子警察的后台数据处理系统的“车辆违章处罚系统”。要求能实现交通主管部门的网上办公功能,通过对电子监控得到的数据进行录入,处理,查询,公告,处罚等,实现对违章车辆的纪录,处罚。因而,其在现代交通管理中有很大的发展空间。即使它在数据的采集,处理上还要求人工处理,但它还是比以前全人工的方式要优异得多。可以想象随着科学技术的发展,相信在不久就能在数据采集与处理上实现不同系统之间的数据传递,以及数据处理。
2、课题任务、重点研究内容、实现途径智能道路交通信息管理系统通过对电子警察系统抓拍到的违章车辆的图像信息进行有效管理,达到惩戒违章司机,改善交通路口混乱,减少因交通违章造成的人为塞车和事故,提高交通执法的准确性和效率,节省警力并提高城市道路交通效率的目的。本系统包括四部分功能:1)违章车辆图像信息的录入;2)违章车辆信息的查询统计;3)违章车辆信息的公告与处罚;4)信息管理系统的维护与设置。充分理解课题内容及意义,掌握违规图像采集原理及方法,熟练应用JSP、SQL Server 2000等知识建立一套基于WEB的违章处罚管理系统,具备对违章图像的录入、存储、公告、处理,以及多种查询方式,公告,处罚和员工管理,权限设置等功能。重点研究内容:数据库的管理,WEB技术,图像存储,图片的传输,违章信息的录入、违章处罚、公告、信息统计、权限设置;这其中还包括了处罚决定书的打印、信息统计结果表的打印以及用户权限的实现方式,数据库的同步的细节性的问题值得仔细考虑。实现途径:按照软件工程的分析、设计方法和过程,应用数据库相关理论,运用JSP和JDBC和JavaBean技术,以SQLserver2000数据库管理系统为后台数据库支持来实现智能道路交通信息管理系统:本系统的设计采用模块化的设计方法,将系统分为违章信息的录入、违章信息公告、违章信息处罚、信息统计、用户及权限管理和包含很多系统初始化小模块的系统初始化模块,然后再整合这些模块使整个系统的功能统一在一个完整的框架下。在用户界面方面,采用页面框架导航的方式在一个页面中实现整个系统的功能,按这样的思想,用户界面的设计就采用框架的结构实现,页面分为三个框架页,顶部的为一个LOGO图标,左边的框架页设计成本系统的一个功能导航页面,相当于系统的功能菜单。用户的权限用查询数据库权限表的方式来控制导航页的内容来实现。在实现的过程中可能遇到的难题:页面设计阶段的界面设计和美工问题,由于自身缺乏美术感,因此只能在用户界面设计是多参考他人的设计,并借鉴他人成功之处,尽可能在设计中利用开放的素材资源,以及一些好的设计模板;系统用户权限的设计方式,用数据库表和应用程序相结合来实现,还是用数据库的角色来实现;系统的数据库连接问题,计划在本系统中采用JDBC—ODBC桥接器来实现连接,这就要求有相应数据库驱动程序(本系统用SQL Server2000的驱动程序),并建立起ODBC数据源,最后再用JAVA程序进行连接;至于打印的问题,我现在没想到好的解决方法,只好把它留到系统开发过程中再作处理。总之,现在系统还没有开始进行相关的具体设计和实现,因此,系统将要涉及到的各种问题,现在是不可能完全预知的,所以,只有留待到系统设计和实现阶段再进行分析,处理。报告人签名: 年 月 日
3、进度计划
序号日期进度安排
1第1,2周查阅资料
2第3周完成文献综述和开题报告
3第4-5周熟悉开发环境
4第6-13周系统设计与实现
5第14-15周程序调试与测试
6第16周撰写论文,准备答辩
7
8
4、指导教师意见指导教师签名: 年 月 日

附件D:

毕业设计

外文译文

指导教师评语:

指导教师评定成绩 签字:

交叉评阅教师评语:

交叉评阅教师评定成绩 签字:

学生姓名: 完成日期 20 年 月 日

教 务 处

译文:

JDBC与JSP研究

1JDBC入门

本文阐述了JDBC(数据库连接)API(应用程序接口)的基本内容。在这里,你将学到用基本的JDBC API去创建表单,插入数值,查询表单,检索结果,修改表单,创建动态语句,完成事务,捕捉异常和错误。

本文来自SUN公司关于JDBC基础内容的官方指南。

--概述

--建立连接

--第一个JDBC语句

--精制JDBC语句

--执行DDL语句

--执行查询语句

--结果集访问说明

--事务处理

--异常和错误处理

--简单的代码和编辑规则

1.1 概述

JDBC的访问级接口是提供了SQL数据库操作和更新操作的编程接口。他们通过带数据库接口的库程序允许在普通的程序中调用SQL。特别的,Java提供了很多非常简单的基于JDBC的接口。

这里有一条简单的方法可也看到在访问级发生了什么:你正在写一个简单的Java程序。在程序的某处,你需要和数据库交换数据。用标准的库程序,你就可也打开一个数据库的连接。接下来,用JDBC来发送SQL代码给数据库,并且加工要返回的结果。等到你结束工作,就关闭数据连接。

这样的方法需要和内嵌SQL的预编辑方法相比较。后者含有一个预编辑过程,在这个过程中内嵌的SQL语句被转化为主机语言代码(C/C++)。访问级的接口不要求预编辑过程就避免了内嵌SQL语句转化的过程。这样在增加轻便性的同时使客户—服务的关系更清晰。

1.2 建立连接

当然,最先要做的是在你的计算机上安装Java,JDBC和DBMS。由于我们想要连接Oracle数据库,我们也就需要一个支持它的驱动程序。幸运地是,我们有一个负责的主管他已经在Leland的机子上为我们做好了。

和前面说的一样,在一个数据库能被访问前,一个在程序(client)和数据库(server)之间的连接必须被打开。这包括两步:

  1. 装载特定厂商的驱动程序
    为什么需要这一步呢? 为了确保轻便和代码重用,API被尽可能地设计来不依赖于一个数据库的版本或厂家。由于不同DBMS拥有不同的行为,我们就需要告诉驱动管理器我们想用那种DBMS,以便它能调用正确的驱动程序。装载Oracle驱动程序可以用下面的代码:
    Class.forName(“oracle.jdbc.driver.OracleDriver”)
  2. 建立连接

当驱动装载完成就可以建立连接,你建立一个实际的连接可以用:

Connection con=DriverManger.getConnection(“jdbc:oracle: thin:

@dbaprodl:1544:SHRI_PRD”,username,password );

现在,让我们看看这个语句是干什么的。第一个字符串是关于数据库的URL,它包含了协议(JDBC),厂商(oracle),驱动(thin),服务器(dbaprodl),端口号(1521),和一个服务实例(SHRI_PRD)。用户名和密码就是你过去输入SQLPLUS以进入你的帐户的用户名和密码。

这就是建立连接的步骤。最后一步返回来的是一个打开的连接,我们将用它来向数据库传递SQL语句。在上面的代码中,con是一个打开的连接,并且我们在后面还将用到它。注意:上面提到的价值在我们的环境中是用根据的。他们在别的环境中有不同的价值。

1.3 创建JDBC 语句

JDBC语句对象是用来发送你的SQL语句到DBMS的,不是与SQL语句相混淆的。JDBC语句是绑定在一个打开的连接上的,不只是一个简单的SQL语句。你能把JDBC语句对象想象成嵌在连接上的一个信息通道,它能传递一个或多个你的SQL语句(那些你要执行的)到DBMS。

一个活动的连接要求创建一个Statement对象。下面的小代码,就是用刚才的连接con,来为你实现Statement对象的:

Statement stmt = con.createStatement();

这样,一个Statement对象存在了,但是它没有向DBMS传递一个SQL语句。我们将在下一节学习它。

1.4 精制JDBC语句

有时,用精制的语句对象来向DBMS发送SQL语句能更方便或更有效。它区别于其超类Statement的主要特征是,它不像Statement,在它被创建时就被给与了一个正确的SQL语句。这个SQL语句接下来就以正确的方式发向DBMS,并且在那里得到编译。因此,精制的语句实际上是连接的一个信道,并汇编有关SQL声明.

和用普通的语句在每次用的时候都要编译一次相比,它提供的优势是,当你需要用相同的或相似的带不同参数的查询多次,语句就可以被DBMS编译和优化,而在不同参数时,不再要求编译。

PreparedStatements 也是用连接方法来创建的。下面的小代码展示了怎么创建一个有三个输入参数的带参数SQL语句:

PreparedStatements prepareUpdateprice =con. preparedStatements(

“UPDATE Sells SET price = ? where bar = ? AND beer = ?”);

在执行一个PreparedStatement前,我们需要提供参数的值。这可以调用定义在PreparedStatement类中的SET XXX方法来完成。最常用的方法是setInt,setFloat,setDouble,setString 等。你可以设置参数的值在执行准备的语句前。

继续上面的例子,我们将写:

prepareUpdatePrice.setInt(1, 3);

prepareUpdatePrice.setString(2, "Bar Of Foo");

prepareUpdatePrice.setString(3, "BudLite");

1.5 执行DDL语句

在JDBC中执行SQL语句用很多样式,他们依赖于SQL语句的目的。DDL(数据定义语言)语句,象表的创建和删除语句,还有更新表的内容的语句都是通过executeupdate方法执行的。注意到这些命令都改变数据库的状态,因此方法的名字包含”Update”。

下面的代码是executeupdate语句的例子:

Statement stmt con.createStatement();

stmt. Executeupdate(“CREATE TABLE Sells” + “(bar VARCHAR2(40),beer

VARCHAR2(40),price REAL)”);

stmt. Executeupdate(“INSERT INTO Sells ” + “VALUES (‘Bar Of

Foo’,’BudLite’,2.00)” );

String sqlString= “CREATE TABLE Bars ” + “name

VARCHAR2(40),address VARCHAR2(80),license INT”);

Stmt. Executeupdate(sqlString);

由于SQL语句不太适合在一行上显示,我们就把它打断成两个字符串,并且用加号连接起来以便它被编译。特别注意“INSERT INTO Sells”和“VALUES”之间的间隔。也注意我们更愿意重用相同的Statement而不是重新创建一个。

在执行executeUpdate时常常是调用DDL语句,返回的结果一般是0,在数据修改语句执行时将返回一个大于或等于0的值,这个数据表明了其间的关系。

当使用PreparedStatement时,我们将执行这样的一个语句,它首先要设定参数的值(象上面所见的那样),接着调用executeUpdate.

int n = prepareUpdatePrice.executeUpdate();

1.6 执行SQL语句

作为和前一节的语句相对的语句,一个查询希望得到一组记录来作为结果,并且不改变数据库的状态。自然地,这里就有相应的方法叫做executeQuery,它返回一个ResultSet对象作为其结果。

String bar,beer;

float price ;

ResultSet rs = stmt.executeQuery(“SELECT * FROM Sells”);

While( rs.next() ){

Bar = rs.getString(“bar”);

Beer = rs.getString(“beer”);

Price = rs.getFloat(“price”);

System.out.println(bar + “sells” + beer + “for” + price + “Dollars.”);

}

查询得到的结果集包含在一个变量rs中,rs是ResultSet的一个实例。这样的组对我们没有太大的作用,除非我们能访问每一行和每行中的各个属性。ResultSeta给我们提供了一个能让我们依次访问每行的游标。游标仅仅是第一行的集。每次调用next方法使它移动到下一行,如果下一行存在就返回真,如果没有剩余行就返回错。

我们可以用适当类型的getXXX方法去检索行的各个属性。 在前面的例子中,我们用了getDtring和getFloat两个方法来访问各列的值。注意到我们用想得到的值得列的列名作为方法的参数。同时也注意,VARCHAR2类型的bar,beer被转换为Java String,REAL转换为Java float.

同样地,我们可以指定列号来代替列名,也能得到相同的结果。这样,有关的语句就应该是:

Bar = rs.getString(1);

Beer = rs.getString(2);

Price = rs.getFloat(3);

当使用PreparedStatement工作时,我们应该执行一个设置好参数的查询,并且用它调用executeQuery方法。

ResultSet rs = prepareUpdatePrice.executeQuery();

1.7 结果集访问说明

JDBC提供了一系列的方法来找出你在处理结果集的那个地方,方法包括:getRow,isFirst,isBeforeFirst,isLast,isAfterLast.

他们提供可以任意访问结果集中各行的游标。默认的,游标仅仅只能向前并且是只读的。在为Connection创建Statement时,你可以改变ResultSet的类型,使它成为更方便查找和更新的模型:

Statement stmt = con.createStartment(

ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);

ResultSet rs = stmt.executeQuery(“SELECT * FROM Sells”);

不同的类型选项有: TYPE_FORWARD_ONLY、TYPE_SCROLL_INSENSITIVE、和TYPE_SCROLL_SENSITIVE。你可以利用CONCUR_READ_ONLY和CONCUR_UPDATABLE选项来选择是用只读的还是可更新的游标。用默认的游标,你可以利用rs.next()来卷动游标。用可卷动的游标你可设置更多的选项:

rs.absolute(3); // 移动到第三tuple

rs.previous(); //向后移动一个tuple(tuple 2)

rs.relative(2); //向后移动两个tuples(tuple 4)

rs. relative(-3); //往回移动两个tuples(tuple 1)

这里还有很多可卷动游标特征的细节。可卷动游标,虽然在某些应用中很有用,但是它非常复杂,因此在使用时要小心和克制。更多关于游标细节的操作技术可以在New Features in the JDBC 2.0 API上找到。

1.8 事务处理

JDBC允许多个SQL语句嵌入到一个单一的事务中。因而,我们用JDBC事务可以确保ACID(原子性、一致性、独立性、完整性)属性。

事务控制是通过连接对象完成的。当连接建立时,它就默认是自动提交型。这意味着每个SQL语句都被认为是一个单独得事务,并且只要它自身执行完成就马上提交。(这样并不完全精确,并且在大多数情况下,我们可能被它蒙蔽而不知道这些细节。)

我们能为连接关闭自动提交,用:

con.setAutoCommit(false);

也可以再打开,用:

con. setAutoCommit(ture);

一旦自动提交关闭,没有SQL语句能被提交(那不是说,数据库将永远得不到更新),直到你明确地调用commit()方法来告诉它提交。

Con.commit();

在提交之前的任何地方,我们都可也调用rollback()来卷回事务,并恢复数据到上一次提交的地方(在尝试更新之前)。下面是个融合了上面观点的例子。

con.setAutoCommit(false);

Statement stmt = con.createStatement();

Stmt.executeUpdate(“INSERT INTO Sells VALUES(‘bar of

foo’,’budlite’,’1.00’)”);

con.rollback();

Stmt.executeUpdate(“INSERT INTO Sells VALUES(‘bar of

joe’,’Miller’,’2.00’)”);

con.commit();

con.setAutoCommit(true);

让我们浏览这个例子理解几个方法的用法和作用。我们首先看看自动提交关闭时,接下来的几条语句需要看成一个整体。我们尝试在Sells表中插入记录(‘bar of foo’,’budlite’,’1.00’))。然而,这个操作最终并没完成(committed).当我们调用rollback,我们取消了插入。注意,Sells表现在仍和我们尝试插入之前一样。接着我们尝试插入其他记录,并且这次,我们提交了事务。现在Sells表就受到了永久的影响,并且多了一条新的记录。最后,我们重新开启了自动提交。

我们同样可以按需要地设定事务的独立性。例如,我们可以设定事务独立性为TRANSACTION_READ_COMMITTED,它不允许访问数据直到数据提交完毕,同时也不允许读脏数据。在连接的接口中提供了5个独立性级别。默认下,独立性级别是串行化 。JDBC允许查看数据库设定的独立性级别(用连接的getTransactionIsolation方法),也可以设定适当的级别(用连接的setTransactionIsolation方法)。

rollback常常和Java异常处理结合在一起来恢复不可预知的错误。这样的结合提供了简单而优秀的处理数据完整性的机制。我们将在下一节学习JDBC的异常处理。

1.9 错误与异常处理

事实上,在软件项目中错误是常常发生的。经常,数据库程序是一个危险的应用,并且温和地捕捉和处理错误是势在必行的。程序应该能恢复并使数据库保持一致性的状态。Rollback与Java异常处理机制协同工作是达到这一要求的一条清晰的道路。

客户端(程序)访问服务器(数据库)需要是否有错误从服务器返回。JDBC通过两个不同级别的错误情况(SQLException和SQLWarning)来获取以上信息。SQLExceptions是Java异常,假如不处理,会终止应用程序。SQLWarnings是SQLException的子类,但它们描述不致命的错误或不预期的情况等,可以忽略。

在Java中,预计要抛出异常或警告的语句被包含在try语句块中。如果在try语句块中的语句抛出了异常或警告,那么,在相应的catch语句中将被捕获。每个catch语句都被指明准备捕获那个异常。

下面是一个捕捉异常,使用错误情况来卷回事务的例子:

try{

con.setAutoCommit(false);

stmt.executeUpdate(“CREATE TABLE Sells (bar VARCHAR2(40),”+”beer VARHAR2(40),price REAL)”);

stmt.executeUpdate("INSERT INTO Sells VALUES " +

"('Bar Of Foo', 'BudLite', 2.00)") ;

con.commit() ;

con.setAutoCommit(true) ;

}catch(SQLException ex) {

System.err.println("SQLException: " + ex.getMessage()) ;

con.rollback() ;

con.setAutoCommit(true) ;

}

既然这样,一个异常肯定被抛出,因为错误的书写导致了beer被定义为VARHAR2。由于在DBMS中没有这样的类型,一个SQLException将被抛出。这样输出就将是:

Message: ORA-00902:invalid datatype

还有就是,如果你的数据类型正确,但万一你的你的数据库超过了空间限制并不能再创建一个新的表。SQLWarning可以从Connection对象、Statement对象和ResultSet对象中找回来。每一个仅仅存放着最近的SQLWarning。因此,只要你用你的Statement对象执行其他的语句,那么以前的警告就将被丢弃。下面的小代码举例说明了怎么使用SQLWarning:

ResultSet rs = stmt.executeQuery("SELECT bar FROM Sells") ;

SQLWarning warn = stmt.getWarnings() ;

if (warn != null)

System.out.println("Message: " + warn.getMessage()) ;

SQLWarning warning = rs.getWarnings() ;

if (warning != null)

warning = warning.getNextWarning() ;

if (warning != null)

System.out.println("Message: " + warn.getMessage()) ;

SQLWarnings(相对于SQLExceptions)其实是相当难得,最多的就是数据连接切断的警告。后面将要指出的是在读或写数据库是这里存在的一个问题。

1.11简单的代码和编辑规则

有望地,到现在你已经可以熟悉地用JDBC写复杂的代码了。这里有一个简单的例子融合了上面多有的观点。

我们还有一些简单的为教育的目的由Craig Jurney编写的代码。你可以免费地使用这些代码来作为一个准则,或者在将来写代码是用作筐架,但是你要在你引用了代码的应用上做一个说明。

SQLBuilder.java - Creation of a Relation 关系的创建

SQLLoader.java - Insertion of Tuples 插入记录

SQLRunner.java - Processes Queries 查询过程

SQLUpdater.java - Updating Tuples 更新记录

SQLBatchUpdater.java - Batch Updating 批更新

SQLUtil.java - JDBC Utility Functions JDBC的有用函数

不要忘记用source /usr/class/cs145/all.env,它将正确的设置你的classpath。增加你的全局的classpath的简单命令:

elaine19:~$ javac SQLBuilder.java

elaine19:~$ java SQLBuilder

替换成:

elaine19:~$ javac SQLBuilder.java

elaine19:~$ java –classpath

/usr/pubsw/apps/oracle/8.1.5/jdbc/lib/classes111.zip: SQLBuilder

在java的用户名和密码文件中有固定的用户名和密码。他们必须被改成你自己的用户名和密码,这样你才能访问数据库。

这篇文章最初由Nathan Folkert在2000年春写给Jennifer Widom教授的CS145班,在2000年秋,它又被Mayank Bawa出租给Jeff Ullman教授的CS145班。Jim Zhuang在2005年夏作了一点小改动。同时感谢Matt Laue的排版改正。

2利用JSP和JDBC技术访问动态的WEB数据

这篇文章讨论用JSP和JDBC技术来整合WEB站点上的静态的、动态的和数据库的内容。为了简单和举例的需要,这里的JSP页面用简短的脚本来揭示JSP开发者根本的JDBC观点而不是把它们隐藏在传统的标签下。作者介绍了一种关键的设计途径就是整合JavaBeans组件和JDBC,就好像JSP技术已经运用了bean和HTTP一样。他也提供代码来执行这种整合。

建立在Java Servlet技术上, JSP技术是生成动态内容的Java 服务器端的核心。一种动态内容的来源是关系数据库。为了管理来自在线社团的电子商务事务,WEB站点用关系数据库来存储各种信息:目录条款,图像,文本,注册用户的数据等等。这篇文章讨论利用JDBC的JSP与关系数据库的应用。JDBC的意思就是通过它,Java程序可以操作关系数据库。

为了能更好的学习这篇文章,你应该熟悉JDBC和SQL。

2.1 JDBC基础

JDBC是连接Java和SQL数据库的桥梁。首要的JDBC对象描述数据库的连接且语句的执行要依赖这个连接。和关系数据库一起使用的两种基本的语句是查询和更新。作为先决条件,你首先需要用java.sql.DriverManger类建立一个数据库连接。连接的建立要花费很长的时间,因此,在强事务环境中,比如一个WEB服务器,只要可能你就想要重用连接。这样的重用称为connection pooling。

如果你的JDBC技术已经生疏了,在例子Listing 1中代码片段说明了怎样建立数据库连接,用连接创建statement对象,发送SQL查询,处理结果,以及释放JDBC资源。

Listing 1.Simple JDBC code

Connection connection = DriverManager.getConnection(URL, user, password);Statement statement = connection.createStatement();ResultSet results = statement.executeQuery(sqlQuery);while (results.next()){ ... process query results ... logSQLWarnings(results.getWarnings());}results.close();statement.close();connection.close();

在现实生活中,JDBC代码没有这么简单;异常和警告情况需要处理。例子Listing 2 是相同的JDBC例子但是增加了JDBC异常和警告的处理。在这个例子中,异常和警告是简单和笨拙的,在异常情况下,我们终止操作。可是,dinally{}子句确保了资源的释放。

在这里仅仅暗示实际的处理结果。我们将在本文的后面找到更详细的内容。如果我们正在执行一个数据库更新而不是查询,我们就应该用下面的代码来替换while循环的内容:

int count = statement.executeUpdate(sqlUpdate);

executeUpdate方法返回更新语句所影响的行数。如果这些代码看起来不熟悉,你也许想花更多的时间来回顾一些关于JDBC的指南信息,在资源章节可以找到。

除了executeQuery()和executeUpdate()之外,类Statement支持一般的execute()方法。这就允许编辑一般的SQL代码,尽管处理的结果复杂很多。

2.2 在JSP页面中使用JDBC

为了来自数据库的动态内容,我们应该怎样结合JDBC和JSP技术。

一般的规则是,好的JSP实践经验建议我们把表示模式和行为模式分离开来。这类似于在OO编程中的模型-视图-控制器(MVC)范例。这样分离的一个原因是在程序员创建的基于JSP技术的应用可能包含了模型和控制器组件,然而,视图组件是在页面设计器里编辑的。在JSP应用体系结构下,视图的角色决定了它的职责是描述,并只在JSP页面中被处理。控制器的角色是响应请求,往往扮演着servlet的角色,并且多数的JSP开发者渐渐地对在控制器角色里使用JSP页面的优越性达成了共识。模型的角色是对应用实体的行为进行建模,它典型的表现在JavaBeans组件上。

除了决定数据库在MVC范例中对应的位置之外,你有好几种在JSP页面中整合JDBC技术的选择。例如,你可以用脚本插入JDBC,用库标签插入,或把它隐藏在定制的标签或其它类中。

我们下面将看到几个不同途径的例子并讨论它们的使用方法。

2.3 一个JSP scriptlet的例子

一个新的JSP程序员很可能做的第一件事就是写一个scriptlet来访问JDBC。或许它在一些地方象在Listing 3中的那个在页面中用JDBC实现"hit counter"的例子。(这页的一个生动的版本是在JSP开发者指南的WEB站点上。)

Listing 3 JSP page using JDBC in a scriptlet

<jsp:directive.page import="java.sql.*" />
<jsp:scriptlet>
Class.forName("org.gjt.mm.mysql.Driver");
Connection connection =
DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "", "");
Statement statement = connection.createStatement();
int changed =
statement.executeUpdate("update counters set hitCount = hitCount + 1 " +
"where page like '" + request.getRequestURI() + "'");
if (changed == 0) statement.executeUpdate("insert counters(page) values('" +
request.getRequestURI() + "')");
ResultSet rs =
statement.executeQuery("select hitCount from counters where page like '" +
request.getRequestURI() + "'");
rs.next();
int hitCount = rs.getInt(1);
statement.close();
connection.close();
</jsp:scriptlet>
<HTML>
<HEAD>
<TITLE>JDBC scriptlet example</TITLE>
</HEAD>
<BODY>
<P>This page has been hit
<jsp:expression>hitCount</jsp:expression>
times. The page counter is implemented by a JSP scriptlet calling
the JDBC package directly.</P>
</BODY>
</HTML>

这页包含了一个scriptlet(前面突出的部分),它连接数据库,创建statement,以及尝试更新由页面URI键入的纪录。如果更新不影响任何行,这个例子中假定没有这样的行并新增一行。最后,这个scriptlet查询数据库当前命中的数并赋值给一个本地变量。更进一步,在这个JSP页面的描述部分,突出的JSP表达式被用来传递上面的值。

尽管功能正确,但这个JSP页面仍有几个问题。首先这个scriptlet并不是一个无程序页面设计师会先看到的。坦白地,甚至使程序员也不想在页面中看到这样的东西。第二,页面缺少了异常处理,那可是真实的JDBC代码必不可少的部分。第三,hit counter的执行是逐字逐句地植入的,因此任何改动都需要传播到包含hit counter 的每个JSP页面。

注意:你不可能像这样来执行一个hit counter .为每次请求改变数据库的代价是必不可少的。无论如何,这个hit counter都提供了一个查询和更新数据库的简单的例子,这说明我们可以用各种手段把你的JSP与JDBC页整合起来.
注意:你不可能像这样来执行一个hit counter .为每次请求改变数据库的代价是必不可少的。无论如何,这个hit counter都提供了一个查询和更新数据库的简单的例子,这说明我们可以用各种手段把你的JSP与JDBC页整合起来.

因此,我们该如何装配这个JSP页面。一个再三提到的方法是用库标签来除去scriptlet。在我们的下一个例子中,将看到这种可选择的解决方案。

2.4 一个用DBTags的库标签例子

一个初学JSP的程序员最先听到的事,经常是来自朋友和专家的关于不要使用scriptlet的建议。相反,他们建议你用定制的标签。定制的标签是一种手段,通过它可扩张JSP平台:定制XML风格的标签,依靠代码库,实现渴望的功能。我们将在下一个例子中,它们工作得多么良好。

Jakarta 库标签工程是Jakarta工程的一个子工程,正式实施的范围是Java Servlet和JSP 技术。

一个由Jakarta 库标签工程赞助发展的包就是DBTags定制标签库。(从前叫做JDBC标签库)。在Listing 4中的例子实现了和Listing 3中相同的hit counter,仅仅用定制标签代替了scriptlet

Listing 4. JSP page using DBTags

<HTML>
<HEAD>
<TITLE>Jakarta DBTags example</TITLE>
</HEAD>
<BODY>
<%@ taglib uri="http://jakarta.apache.org/taglibs/dbtags" prefix="sql" %>
<%-- open a database connection --%>
<sql:connection id="conn1">
<sql:url>jdbc:mysql://localhost/test</sql:url>
<sql:driver>org.gjt.mm.mysql.Driver</sql:driver>
</sql:connection>
<%-- insert a row into the database --%>
<sql:statement id="stmt1" conn="conn1">
<%-- set the SQL query --%>
<sql:query>
insert counters(page,hitCount) values('<%=request.getRequestURI()%>', 0)
</sql:query>
<%-- the insert may fail, but the page will continue --%>
<sql:execute ignoreErrors="true"/>
</sql:statement>
<%-- update the hit counter --%>
<sql:statement id="stmt1" conn="conn1">
<%-- set the SQL query --%>
<sql:query>
update counters set hitCount = hitCount + 1 where page like '<%=request.getRequestURI()%>'
</sql:query>
<%-- execute the query --%>
<sql:execute/>
</sql:statement>
<P>This page has been hit
<%-- query the hit counter --%>
<sql:statement id="stmt1" conn="conn1">
<sql:query>
select hitCount from counters where page like '<%=request.getRequestURI()%>'
</sql:query>
<%-- process only the first row of the query --%>
<sql:resultSet id="rset2" loop="false">
<sql:getColumn position="1"/>
</sql:resultSet>
</sql:statement>
times. The page counter is implemented using the Jakarta Project's
DBTags tag library, calling JDBC indirectly.</P>
<%-- close a database connection --%>
<sql:closeConnection conn="conn1"/>
</BODY>
</HTML>

我不了解你,但我有一点失望。那看起来比上面那个scriplet例子好要不清晰,并且我不知道是否有HTML设计者会因它而高兴,等等。那里出错了呢?毕竟,我们遵守了人们的建议:我们除去了scriplet,代替为定制标签。

他们没有告诉你关于标签库的是:标签设计是语言设

发展定制标签库是相当直接的,但是它确实要耗费一些时间和精力。我经常推介标签作者首先用scriptlets建立标签行为的圆型,接下来才把这些scriptlets转换为标签。一个可选的方法是用Allaire的JRun Server Tags(JST),它能使每个你的原始标签库作为一个JSP页面。JST可以在运行时可以转换这些页面为标签,因此,JST技术很明显地服务于客户端页面。尽管Allaire警告说“建立JST的目的是可移植技术,以便所有J2EE社团的成员都能平衡他们的利益”,但JST现在仅仅在JRun中可用。时间将会证明JST是否会成为开发标记更通用的工具。与此同时,我们发现scriptlet为开发标记的业务逻辑奠定了良好的基础;逻辑经调试后,我们把它迁移成为标记处理程序类。
发展定制标签库是相当直接的,但是它确实要耗费一些时间和精力。我经常推介标签作者首先用scriptlets建立标签行为的圆型,接下来才把这些scriptlets转换为标签。一个可选的方法是用Allaire的JRun Server Tags(JST),它能使每个你的原始标签库作为一个JSP页面。JST可以在运行时可以转换这些页面为标签,因此,JST技术很明显地服务于客户端页面。尽管Allaire警告说“建立JST的目的是可移植技术,以便所有J2EE社团的成员都能平衡他们的利益”,但JST现在仅仅在JRun中可用。时间将会证明JST是否会成为开发标记更通用的工具。与此同时,我们发现scriptlet为开发标记的业务逻辑奠定了良好的基础;逻辑经调试后,我们把它迁移成为标记处理程序类。

计。大多数标签库都是在约定的时间内,由程序员写给程序员的;这些标签的语义连接给其它的程序员。此外,还记得模型和描述的分离吗?DBTags并不是很好的支持这种分离。Sql:getColumn标签和jsp:getProperty事件很相似。它将DBTags结果直接发到输出流中。这使得很难在描述想要的表的输出流时不用DBTags。最后,注意在Listing 3和Listing 4的例子中的逻辑的不同。DBTags执行来自JDBC的更新语句的标签表示形式。只有查询才可以被找回。这意味着我们知道有多少行被更新语句所更新。因此,我们转换Update和insert语句;我们常常尝试插入一个新的记录,强迫它忽略任何错误,并在接下来执行更新。

公平地看待DBTags标签库,他并不是一个对程序员有害的标签库。除开对更新量的不足,这代码提供了一个相当优秀的JDBC计划。潜藏的问题人仍然存在;标签提供的功能少于直接转换JDBC包。不同于隐藏某些异常处理,标签库不真的提供任何从scriptlets的提取。他确实不帮助从功能中分离描述。

因此,真正的问题不在于是使用scriptlet还是使用标记;这种问题不是分离功能和表示的问题的原因,而是结果。解决方案是要以适当的说明级别上为表示页面的作者提供更高级别的功能。认为标记优于scriptlet的原因在于:根据定义,scriptlet 是编程,而标记可以表示高级概念。

2.5 对表示页面隐藏JDBC

将JDBC同JSP技术集成时,我们希望对表示作者尽可能多的隐藏该集成。在我们显现数据库概念的地方,我们希望在恰当的抽象级别上显现这些概念。这一方法引出了我们的下一个示例。

在清单5中的示例中,我们对表示页面隐藏了JDBC集成。(这个页面的 实际版本位于JavaServer Pages Developers Guide Web站点)

清单5 隐藏了JDBC的JSP页面

<jsp:directive.include file="/pagelets/hitCounter.jsp" />
<HTML>
<HEAD>
<TITLE>JDBC hidden example</TITLE>
</HEAD>
<BODY>
<P>This page has been hit
<jsp:getProperty name="hitCounter" property="int" />
times. The page counter is implemented indirectly: a JavaBeans component containing the
hit count is inserted into the environment and referenced within the page using
the JSP getProperty action. The JSP page doesn't have any exposure to JDBC.</P>
</BODY>
</HTML>

被包含的hitCounter.jsp文件负责设置环境。内容可以是scriptlet、标记或只是一个taglib伪指令;只要是为表示页面建立预期环境的都可以作为内容。如果您愿意,您可以把getProperty操作替换成定制标记;例如:

This page has been hit
<page:hitcounter />
times.

如前所述,这些点击计数器示例纯粹用作说明;每个页面都执行这样的数据库操作将会是不必要的开销。上面这个示例说明事实上您希望以何种方式显现点击计数器。通过把它隐藏在定制标记里,我们就把该实现彻底隐藏了起来。现在我们可以聚集点击计数运行时信息,并周期性的更新数据库(比如,在每次会话结束时)。甚至连存储方式(数据库或是别的)也对表示页面作者隐藏了。这正是我们在DevTech实现点击计数器的方式:我们利用bean类实现点击计数器模式行为。标记把该行为结合到了我们的页面里。

2.6 集成JavaBean组件

到目前为止,示例一直都相当简单,但大多数数据库操作都比这些简单的查询和更新要复杂。因此,既然我们已经讨论了把JDBC用于JSP页面的一些基本原则,就让我们用一个略微复杂些但肯定更加通用的一类应用来结束这篇文章。

这一部分的示例(下面清单9)将指出一种方法以支持Web站点上访问者提供的内容。换句话说,我们希望允许访问者读取与某一URI关联的数据库内容并撰写额外的内容。这样的内容在现在的Web站点上相当常见。同样的基本部分可用于构造:

  • 评论页面,例如在http://Amazon.com找到的那些页面
  • 链接页面
  • 公告牌
  • Wikiweb

通过由不同技术背景的设计人员编写,本例中JSP组件稍微再精细些的版本就可以实现看上去截然不同的Web页面。这些页面看上去的唯一的相同之处就是用于访问者撰写内容。

我们的annotation(注释)示例使用HTML表单。HTML表单用于JSP时,使用属性映射到表单域的bean变得方便了。这使setProperty标记可以变戏法:

清单6 映射到表单的Bean实例

<%-- setup a bean instance that matches our form --%>
<jsp:useBean id="instance-name" class="bean-class" ... />
<%-- set all bean properties that match a form field --%>
<jsp:setProperty name="instance-name" property="*" />

集成JavaBean组件是JSP技术设计方面的一个过人之处。不幸的是bean和JDBC之间的集成根本不是无缝的,因此我们针对DevTech的JDBC工作开发了一个包,它不仅提供了bean和JDBC的集成,而且还有必要的异常处理,从而使程序员不必应付这些细节。

映射bean和ResultSet
示例使用com.devtech.sql以使说明简洁。示例使用Java Reflection和Introspection,依靠列名及属性名提供JDBC数据和bean属性间的映射。您可以把DevTech包替换成自己的代码。

映射bean和ResultSet
示例使用com.devtech.sql以使说明简洁。示例使用Java Reflection和Introspection,依靠列名及属性名提供JDBC数据和bean属性间的映射。您可以把DevTech包替换成自己的代码。
映射bean和ResultSet
示例使用com.devtech.sql以使说明简洁。示例使用Java Reflection和Introspection,依靠列名及属性名提供JDBC数据和bean属性间的映射。您可以把DevTech包替换成自己的代码。

annotation(注释)示例使用com.devtech.sql包中的两种查询和更新方法。这里用到的查询方法传递一个bean类、一个SQL查询和一个Object数组填充查询中的占位符。在这种情况下,仅有的占位符是给页面的URL的。结果是一个数据库游标对象,它必须是一种迭代器。

清单7 数据库游标对象

dataBase.queryCursor(AnnotationDBBean.class, new String[] { URL },
"select page, author, annotation, DATE_FORMAT(whenPosted, '%W %d%b%y %T')" +
" as whenPosted from annotations where page like ?");

这个查询方法的有趣之处在于指定类型的bean将会为您实例化,只要bean属性名同ResultSet中的列名相对应,属性值就会被自动设置。每次您用游标选择下一行时,bean的属性就会根据ResultSet被自动设置。

用到的这种特殊更新方法有一个bean实例、一个String数组及一条update语句作为参数。String数组值规定了用来填充更新中的占位符的预期bean属性。在这种情况下,page、author和annotation属性是根据bean选择的。

清单8 更新方法

int count = dataBase.update(annotationBean,
new String[] { "page", "author", "annotation" },
"insert into annotations(page, author, annotation) values(?, ?, ?)");

我们的JSP页面示例annotations.jsp清单9中所示。高亮的部分指出两个可以用定制标记替换的scriptlet,如清单 10 中所示。一些为页面设计者提供帮助的JSP组件、把动态内容放到页面上去的getProperty操作以及标准HTML组成了页面的剩余部分。使用JSP注释的原因是因为JSP注释是私有的,不会出现在输出流中。

清单9 annotation(注释)的JSP页面

<jsp:directive.include file="/pagelets/annotate.jsp" />
<%--
By the time we arrive here, the annotation bean has been established, and if the
form is submitted, the contents will be posted to the database. The page
property is initialized. If the author is known during this session, that property
is also initialized.
Bean:"annotation"
Properties:String page;
String author;
String annotation;
String whenPosted;
Access to any bean property follows the format:
<jsp:getProperty name="annotation" property="property-name" />
-%>
<HTML>
<HEAD>
<TITLE>Comments for <jsp:getProperty name="annotation" property="page" /></TITLE>
</HEAD>
<BODY>
<p align="left"><font size="+1">
Comments for <i><jsp:getProperty name="annotation" property="page" /></i>
</font>.</p>
<CENTER><HR WIDTH="100%"></CENTER>
<!-- Annotation Submission Form -->
<FORM method="POST">
<TABLE>
<TR>
<TH align="left">Name:</TH>
<TD><INPUT type=text name=author size=50 maxlength=60
value="<jsp:getProperty name="annotation" property="author" />"> </TD>
</TR>
<TR>
<TH valign="top" align="left">Note:</TH>
<TD><TEXTAREA name=annotation cols=40 rows=5 wrap=virtual>
<jsp:getProperty name="annotation" property="annotation" /></TEXTAREA></TD>
</TR>
<TR>
<TD align="center" colspan="2"><INPUT type=submit value="Add Comment"></TD>
</TR>
</TABLE>
</FORM>
<!-- End of Annotation Submission Form -->
<!-- beginning of annotations -->
<%--
The following section iterates through all annotations in the database for the
requested page. To change the look of the page, just change anything in the
demarcated area.
--%>
<jsp:scriptlet>
Database.Cursor annotations = annotation.getCursor();
while (annotations.next(annotation) != null)
{
</jsp:scriptlet>
<%-- beginning of annotation change area --%>
<CENTER><HR WIDTH="100%"></CENTER>
From: <jsp:getProperty name="annotation" property="author" /></A>
at <jsp:getProperty name="annotation" property="whenPosted" /><BR>
<jsp:getProperty name="annotation" property="annotation" /><BR>
<%-- end of annotation change area --%>
<jsp:scriptlet>
}
annotations.close();
</jsp:scriptlet>
<!-- end of annotations -->
</BODY>
</HTML>

定制标记等价程序清楚,但不提供信息:

清单10 定制标记等价程序

<sql:results queryName="annotations" bean="annotation">
<CENTER><HR WIDTH="100%"></CENTER>
From: <jsp:getProperty name="annotation" property="author" /></A>
at <jsp:getProperty name="annotation" property="whenPosted" /><BR>
<jsp:getProperty name="annotation" property="annotation" /><BR>
</sql:results>

我们在这个示例中使用scriptlet只是要让您(一位程序员)知道正在发生的事情。如果用陈述性的标记替换scriptlet,那么页面设计者会很清楚,但您却一头雾水。

逻辑并不复杂。annotation.getCursor()调用能得到同服务器的连接、发出查询并在结果集建立一个数据库游标对象annotations。每次调用annotations.next()时,从结果集中取出一个新行,其中的值移到bean里,方法返回的正是这个bean的引用。所用的这个特殊的next()方法使用一个要植入的bean参数。虽然我们本可以使游标为每一行实例化一个新的bean,但反复使用一个bean更加高效。

请注意真正的查询及更新都没有在表示页面中出现。被包括的页面设置表示页面环境,也包括setProperty和update操作。这些操作独立于表示页面;只有注释bean的属性所包含的contract是重要的。这遵守了将表示与模式行为相分离的策略。页面设计者完全有能力更改表示是如何呈现的,但无从得知数据库是如何集成的。如果更改在数据库更新或查询时生效,就应当由JSP程序员负责。

2.7 总结

本文对结合使用Java Server Page、JavaBean和JDBC技术并通过关系数据库生成动态内容的进行了总结性介绍。我们从对于JSP程序员新手来说最显而易见的方法(scriptlet)开始。我们看到不加控制的使用scriptlet是如何使逻辑和表示纠缠在一起的,使两者都难以维护。我们还看到标记库并不一定会改善 MVC 分离,如果用编程术语来表示标记,则页面设计人员可能无法理解使用这样的标记的页面。最后,我们看了更为复杂的示例,这些示例说明了几种使数据库访问与内容表示分离的途径。

现在您应该对在对页面设计人员隐藏真实的数据库访问的同时如何把数据库内容集成到一个Web站点中有一些基本概念。还请注意,对您(一个程序员)而言,几乎不含信息的那些示例是最适合于页面设计人员的示例。当您为JSP解决方案制定计划时,千万要为页面设计人员设身处地地想一想。

重庆大学本科学生毕业设计

智能道路交通信息管理系统的设计与实现

学 生:李小江

学 号:20024417

指导教师:石 锐 副教授

专 业:计算机科学与技术

重庆大学计算机学院

二OO六年六月

Graduation Design of Chongqing University

The Design and realization of The Online Intelligent Traffic MIS System

Undergraduate: Li Xiaojiang

Supervisor: Associate Prof. Shi Rui

Major: Computer Science and Technology

College of Camputer

Chongqing University

June 2006

摘 要

伴随着社会经济的发展,交通在人们经济和社会活动中扮演着越来越重要的角色。因而,交通管理的水平和质量就和我们的日产生活紧密相连,并且直接影响着投资的环境和城市的面貌。因此,每个城市都做了很多关于改善交通和发展智能交通系统(ITS)的思考。电子警察系统成为了一个非常重要的部分,它在提高安全系数,警觉驾驶员的意识,结束车辆闯红灯和栏杆的显现。

本次设计的这个信息管理系统是智能交通系统(ITS)的一个后台子系统。它根据电子警察系统传来的违章图片信息,来处理违章信息。本系统可以帮助警察记录和管理车辆的违章信息,并且可以将违章信息进行公告、处罚,以便使道路交通更加畅通。本智能道路交通信息管理系统主要包括:违章信息录入,违章信息公告,违章出发,信息统计以及系统初始化和用户管理等功能。

软件的设计采用B/S模式进行,用DreamWeaver MX开发用户界面,用JSP+JavaBean技术实现业务逻辑,同时以SQL Server2000作为后台数据库。

关键词:管理信息系统,违章处罚,智能交通,JSP,JavaBean

ABSTRACT

With the economic development of society, traffic is becoming more and more important in human economic and social activities. The level and quality of traffic management is associated tight with our daily life, and take direct effect with the investing environment and city appearance. So, each city has thought much on improvement of traffic and the development in Intelligent Traffic System ITS. Electronic Police System become a most important part, it is taking more and more important effect in improving security coefficient and regulating drivers' driving consciousness and putting an end to rush away while the traffic indicator light is red and beating robbing of cars etc.

This information management system is only a background subsystem of the Intelligent traffic System.It deal with the peccancy information according to the picture from the Electronic Police Sysetem.This system can note the cars’ peccancy informatin,help police to manager the peccancy informatin and punish the drivers make the traffic become well. The Intelligent traffic information management system include:the peccancy information input subsystem,the system initiation subsystem,the peccancy punish subsystem, the peccancy affiche subsystem and the information Statistic subsystem and user manager subsystem,and so on.

Software design used B/S architecture, using DreamWeaver MX develop user interface, using JSP+JavaBean achieve system operational logic, and use Microsoft SQL Server 2000 database management system as a backgroud support.

Keywords: Management Information System (MIS),Peccancy and punish,Intelligent Traffic System (ITS),JSP,JavaBean

目 录

中文摘要I

英文摘要II

1 引言1

2 智能交通系统介绍2

2.1 智能交通系统(ITS)概述2

2.2智能交通管理系统的应用现状及发展趋势3

3 开发方法、技术、工具4

3.1 系统的开发方法4

3.2 开发技术4

3.2.1动态网页技术简介4

3.2.2 JSP技术简介4

3.3开发工具5

3.3.1网页制作工具Deamweaver MX20046

3.3.2 SQL6

3.3.3 Eclipse7

4 需求分析10

4.1 设计目标10

4.2 智能道路交通信息系统描述10

4.2.1 功能模块简单描述10

4.3 系统的数据流程分析12

4.3.1 数据流程分析概述12

4.4.2 数据流程图12

5 数据库系统及设计17

5.1 数据库的引入17

5.2 数据库E-R模型18

5.3 数据库表结构设计19

5.4 数据库的完整性和安全性25

5.4.1 数据库的完整性25

5.4.2 数据库的安全性25

6 系统主要功能模块的设计与实现26

6.1 系统设计概述26

6.1.1 系统设计的原则与内容26

6.1.2 系统设计的基本方法26

6.2 系统主要功能模块结构设计27

6.2.1 系统主要功能模块结构27

6.2.2 用户管理子系统27

6.2.3 用户组管理子系统28

6.2.4 违章信息录入子系统29

6.2.5 违章信息公告子系统32

6.2.6 违章处罚子系统32

6.2.7 信息统计子系统33

6.3系统重要的程序实现简介36

6.3.1 数据库的连接实现36

6.3.2 违章图片存储方式37

7 系统测试38

7.1 软件测试的目的和原则38

7.2 系统测试39

7.2.1 JSP的中文乱码问题39

7.2.2 表单和表格打印问题39

7.2.3 数据库时间字段以及页面中的时间显示问题39

7.3 软件运行与安装40

7.3.1 J2EE应用程序的构建与部署40

7.3.2 具体运行过程40

8 结论41

9 致谢43

参考文献44

1 引言

当前,我国正处于经济高速发展时期,城市交通速度发展较快,但从总体上看,形势不容乐观,交通道路及设施需求长期持续增长,交通供给一直短缺,供需矛盾突出;受财力制约,交通基础设施的建设速度难以适应交通需求增长的要求;汽车进入家庭,使得本来就紧张的城市交通面临着更大的困难;交通运输在能源消耗中所占的比重不断增加,特别是对石油资源的依赖和消耗将进一步加剧我国能源供给的结构性矛盾;由于城市人口,特别是流动人口急剧膨胀,使交通出行量大幅度增长;城市交通基础设施的增长速度落后于交通流量的增长;城市居民出行方式结构不合理,公共交通呈萎缩状态;机动车大幅度增长,与非机动车混行,加剧了城市交通的紧张;城市交通的综合治理有待于进一步加强;交通环境问题日趋严重。主要表现以下两个方面:

①交通基础设施供应严重不足,不能满足交通发展的需求

随着车辆保有量的高速增长,道路负荷增加,尤其在发展较快的城市交通基础设施,包括汽车及自行车行驶的道路、人行道、人行横道等都严重不足。以广州为例,改革开放以来,广州市城市道路面积与总长度都有了大幅度增长,自1990年以来,两者的增长率分别是13.87%和12.82%,但仍然低于机动车的年均增长率25.4%。又以北京市为例,机动车已于2003年8月初突破了200万辆,预测到2010年,这个数字将有可能达到380万,其中家用轿车为280万,平均每个家庭拥有汽车0.53辆,而2015年机动车保有量将达到500万-600万辆之间,虽然与发达国家同等规模的城市相比机动车总量少得多,但高峰时其机动车的平均时速只有十几公里,交通拥堵现象十分严重,给居民出行带来了极大不便。

②交通管理水平低,交通需求管理不善

随着经济的发展,我国交通拥堵的频率和时间明显增加,导致车辆运动速度降低,加速、减速、怠速频繁,运行工况恶化。研究调查表明,北京与广州市区的平均车速仅在23km/h左右,机动车低速运行时间加长;而在早晚的高峰期,北京市区道路平均车速不足20km/h。

2 智能交通系统介绍

2.1 智能交通系统(ITS)概述

我国城市交通面临巨大的挑战,而其对策主要是规划及政策手段、工程设施

建设手段、运行管理手段,以及采用高新技术改造传统交通运输系统的手段,智能交通系统(ITS -Intelligent Transportation System)是解决上述矛盾的有效途径。智能交通系统处于当今世界上交通运输科技的前沿,它是在较完善的道路设施基础上,将先进的电子技术、信息技术(IT)、人工智能(AI)、地理信息(GIS)、影像、计算机技术、有线/无线通信(如ATM,GPS,GPRS,GSM,TETRA)、传感器技术和系统工程技术集成运用于地面运输的实际需求,建立起全方位、实时准确、高效的地面交通系统,能对各种交通方式进行现代化、科学化的智能管理。智能交通系统的出现是为了能够改善混乱的交通状况,减少拥堵,提高运输效率并提高交通的安全性,对于交通环境的改善则是随着在实践中的应用而被提出的.在人类生存环境受到严重威胁的今天,积极开发ITS对于改善环境有着独特的意义。

首先,ITS给出行者提供可靠的交通信息,在家中或在其它任何地方的人均可使用个人出行帮助系统来获取自己所需的相关信息,以帮助他选择出符合其出行预算和时间要求的交通工具与出行路线。导航系统将引导司机到达目的地,司机将不断地接收到前方有关交通状况的信息。司机与外界完全相通,出行变得容易、安全和舒适。交通信息数字化很容易与其他服务系统一体化,在进入一个城市前,司机被预先告之停车场位置以及如何与公交相接,他可以预定停车位;其移动通讯可以直接进入Internet网,自动访问所选择服务(如餐、旅馆等)的站点另外,通过与相邻交通区域信息的交换,交通管理水平将会有很大提高,减少了由于缺乏信息而造成的不必要的延误与等待。

其次,提供引导信息,大幅度减少交通阻塞,提高交通安全。与ITS控制中心相连的路况监控设备对路网交通状况进行实时监控,借助人工智能的帮助,控制中心将所连续监控的路网信息进行整合处理,从而提出整个路网的优化运行方案。与此同时,司机接收到与路网优化运行方案相应的引导信息,他可以根据引导信息选择的行车路线,避开行车拥挤的路段,选择快捷的行车路线,从而大幅度提高现有路网基础设施的使用效率和安全性。

2.2智能交通管理系统的应用现状及发展趋势

随着改革开放的不断深入、经济的高速发展,人民生活水平的日益提高,各大城市的机动车辆和驾驶人员数量急剧增加。由于道路建设的速度远远赶不上机动车辆和驾驶人员的增长速度,从而导致交通拥挤、违章严重、道路交通事故时有发生,严重影响了市民出行和企事业单位的生产及公务活动。

除了加强道路建设外,利用先进的科学技术、树立先进的管理观念,在现有的道路交通设施基础上,进行城市交通的科学化、规范化管理,建设现代化的交通指挥中心和管理系统是投资少、见效快的好办法。

智能道路交通信息管理系统的主要成分就是电子警察系统电子警察是“智能电子警察监测系统”的简称,它是一套高科技电子设备,最初是为维护交通执法提供了一种先进手段。以往许多城市在某些交通场合,由于没有有效的执法手段造成执法困难,例如:无人值守的路口;单行线;禁行、限时道路;限车型车道;主、辅路进出口;紧急停车带;公交专用道;违章 超速等场合检查执法困难,特别是在夜间,违章行车现象经常发生,严重破坏了交通秩序。该设备能够对违章车辆进行自动判断与图像记录。执法部门可以根据该系统所提供的车辆违章过程的图像记录,对违章司机进行追究和处罚。

几年来,各大中城市均在此方面做过有益的尝试,但使用情况总的来并不理想。主要原因是现有的电子警察抓拍设备存在许多缺陷,限制了它发挥更大的作用。从目前市场情况来看,还没有哪一家公司提供的系统和设备能够真正满足用户期望,用户对系统现状也看法各异。电子警察设备具有非常广阔的前景,但现阶段在设备选型方面却难度很大。

本次毕业设计的主要任务完成智能道路交通信息管理系统的设计与实现。本系统,通过对电子警察系统抓拍到的违章车辆的图像信息进行有效管理,达到惩戒违章司机,改善交通路口混乱,减少因交通违章造成的人为塞车和事故,提高交通执法的准确性和效率,节省警力并提高城市道路交通效率的目的。

本系统包括四部分功能:①违章车辆图像信息的录入;②违章车辆信息的查询统计;③违章车辆信息的公告与处罚;④信息管理系统的维护与设置。

3 开发方法、技术、工具

3.1 系统的开发方法

智能道路交通信息管理系统,根据其需求的要求和特点,采用在B/S模式下开发,在开发过程中采用面向对象的系统开发方法进行系统开发,根据系统的特性按照结构化程序设计思想与面向对象的设计思想和方法相结合的方式来进行系统设计。

依据系统的总体功能,将系统划分成多个模块进行独立的实现,根据各个模块的不同情况进行具体的分析和设计,最后对各个模块进行整合,建立一个统一模块来实现各个模块之间消息的传递、相互的协助,以及整体功能的完全展现。

3.2 开发技术

3.2.1动态网页技术简介

在B/S模式下操作Web数据库是通过数据库的网络技术ASP、JSP等实现的,这就要用到动态网页的技术。动态网页即使在网页文件中加入脚本语言动态的执行用户的请求。

传统的静态网页既是用HTML语言编写的网页文件格式,文件扩展名为.htm或.html,当用户请求该页的时候服务器便将此页下载到客户端的浏览器显示出来。而动态的网页中嵌入了部分程序代码,当用户请求该页的时候Web服务器会将此页传递给Web应用程序服务器,应用程序服务器根据用户提供的参数处理程序代码,转化为相应的HTML代码,返回给Web服务器,再下载到客户端浏览器显示。

3.2.2 JSP技术简介

JSP(Java Server Pages)是一种运行于Web服务器端的脚本语言,是开发Web动态网页快速而有效的工具,是基于java语言的Web开发技术中最具有代表性的解决方案。JSP是基于Java的脚本技术,可用于创建跨平台、跨Web服务器的动态网页。使用JSP不仅能够制作像HTML一样的静态网页,还能制作包括动态数据的网页。

要开发JSP文件,必须要有Web服务器和浏览器、应用程序服务器、数据库连接驱动和Java编程环境。

①Web服务器

在Internet上,Web服务器为客户提供信息服务,服务器的基本信息单位称为网页(Web页),由HTML写成。客户端使用称为浏览器的软件显示HTML文档的内容。客户端和服务器之间使用超文本传输协议(HTTP,HyperText Transfer Protocol)传送信息。HTTP协议是实现Web服务器和浏览器之间的通信、交流信息的协议。当用户激活一个链接后,服务器使用HTTP协议送回约定好的格式文件,文件信息在客户端上通过浏览器显示相应的信息。如果服务器和浏览器都遵守HTTP协议,则任何一个浏览器和服务之间都能够进行通信。

目前广泛使用的Web服务器有IIS、Apache,浏览器有Interent Explorer、Netscape等,我在设计和调试中使用的Web服务器是Apathe,浏览器是Interent Explorer 6.0。

②应用程序服务器

应用程序服务器既是用来处理程序代码的服务器,它将网页文件中的Java语言代码根据用户提供的参数进行处理并返回给Web服务器。

目前广泛使用的Java脚本应用程序服务器有Tomcat、Jboss等,我使用的是Apthe Tomcat 4.1。

③数据库驱动

数据库驱动既是连接数据源的驱动,像系统的ODBC、JDBC等,我在设计的时候是使用JDBC-ODBC桥接器来连接数据源。

④Java编程环境

因为JSP是Java脚本语言技术,当然在开发的时候需要有Java的编程环境,目前用得最多的就是J2sdk,我在设计中使用的是SUN公司的j2sdk-1_5_0_5-windows-i586-p。

JSP是用Java语言写成的,Java语言具有跨平台的特性,所以JSP最适合于编写服务器端执行的程序。加上JSP可以结合静态的HTML语法,使得JSP的设计方式简洁而直观。

3.3 开发工具

随着计算机在信息系统中的广泛应用,对各种软件工具的研究十分迅速,各种各样的软件及程序的自动设计、生成工具日新月异,为各种信息系统的开发提供了强有力的技术支持和方便的实用手段。利用这些软件生成工具,可以大量减少手工编程环节的工作,避免各种编程错误,极大地提高系统的开发效率。一般来说,比较流行的工具有:一般编程语言工具、数据库系统工具、程序生成工具、专用系统生成工具、及面向对象编程等。

本系统采用HTML+JSP++JavaBean+SQLServer2000进行B/S模式下的B端的界面的开发,以及的S端的业务处理逻辑程序的实现和后台数据库的开发。在开发的过程中使用了Deamweaver MX 2004、Eclipse3.1、Tomcat 4.1、SQLServer2000等开发工具。

3.3.1网页制作工具Deamweaver MX2004

当前流行的网页制作工具有很多,它们也都有各自的特点。出于没有网页制作经验和方便站点管理方面的考虑,我载设计中选择了Deamweaver MX 2004中文版这款开发工具。它很容易上手,并且对站点的管理非常的方便。

①建立一个Deamweaver站点:安装完成后启动Deamweaver MX 2004中文版,选择“站点”>“管理站点”,出现“管理站点”对话框;单击“新建”按钮,出现“站点定义”对话框;单击“基本”选项卡以使用“站点定义向导”,它将引导您逐步完成设置过程;单击“高级”选项卡以使用“高级”设置,它使您可以根据需要分别设置本地、远程和测试文件夹。

②代码设计和视图设计的分离。Deamweaver将代码的设计和视图的设计分开,可以在视图设计时很快捷的设计出很美观大方的界面,并在这个界面下能很好的进行代码的设计。

3.3.2 SQL

SQL是一种综合的、通用的、功能极强的关系数据库语言(关系数据库是所有用户可见的数据都严格按表的形式组织起来的表,且所有库操作都针对这些表的数据库),它包括数据定义(Definition)、数据操纵(Manipulate)、数据管理(Management)、存取保护(Access Protection)、处理控制(Control)等多种功能。利用表(table)、索引(index)、码(keys)、行(rows)、列(columns)等来确定存储位置。

SQL语言本身并不是一个很完整的编程语言,例如它不支持流控制等。一般它都与其他编程语言(如DELPHI、PowerBuilder、VB、PB、JAVA等)结合来使用。

SQL的主要特点在于:

①一体化的特点

SQL语言能完成定义关系模式,录入数据以建立数据库、查询、更新、维护、数据库重构、数据库安全控制等一系列操作要求,用SQL可以实现数据库生命期当中的全部活动。由于关系模型中实体与实体间的联系都是用关系来表示,这种数据结构的单一性保证了操作符的单一性。

②统一的语法结构,多种使用方式

SQL有两种使用方式,一种是联机使用方式,另一种是嵌入程序方式。大多数的程序接口都采用嵌入的SQL语言。虽然使用方式不同,SQL语言的语法结构是一致的。这使得用户与程序员之间的通信得以改善。

③高度非过程化

在SQL中,只需用户提出“干什么”,而无须指出“怎么干”,存取路径的选择和SQL语句操作的过程由系统自动完成。

④语言简洁

SQL语言十分简洁,语法简单。标准SQL中,完成核心功能只用了6个动词(CREATE、INSERT、UPDATE、DELETE、SELECT、GRANT)因此简单易学。

⑤浏览器/服务器(B/S)结构

SQL能使应用程序采取浏览器/服务器结构。交互式查询、报表打印和应用程序称为数据库的“前端”,在个人机上运行,存储和数据管理的后端数据库引擎在服务器上运行,在此情况下,SQL作为用于用户交互的前端工具和用于数据库管理的后端引擎之间通信的桥梁。

⑥支持异类复制

它可以将SQL Server数据复制到其他的数据库中,包括Access、Oracle、Sybase和DB2,并采用ODBC作为其连接机制。

⑦Internet数据库功能集成

支持数据库信息自动发布到HTML文档,同时结合Microsoft Internet Information Server和SQL Server Internet Connector这两个产品/技术,使用户得到完整的Internet数据发布的能力。

3.3.3 Eclipse

Eclipse这样功能完整且成熟的开发环境,是由蓝色巨人IBM所释出。IBM花了4千万美金来开发这个IDE(Integrated Development Environment)。第一版1.0在2001年11月释出,随后逐渐受到欢迎。

Eclipse的主要特点在于:

①开放的可扩展的IDE

Eclipse平台是一个开放的可扩展的IDE。Eclipse平台是建造模块和构造并运行集成软件开发工具的基础。Eclipse平台允许工具建造者独立开发与其他工具无缝集成的工具,用户甚至无须去分辨一个工具功能在哪里结束、而另一个工具功能在哪里开始。

②成功的底层图形界面API

从Java诞生至今,已经在太多的领域取得成功,然而它却很少在图形界面程序上崭露头角。究其原因,Java语言缺省的图形界面开发包AWT和SWING实在是难辞其咎,无论速度和外观,它们都难以让人接受。如今,Eclipse组织编写的SWT开发包,为Java程序员提供了AWT和SWING之外的一个更佳的选择。

SWT本身仅仅是Eclipse组织为了开发Eclipse集成开发环境所编写的一组底层图形界面API。或许是无心插柳,又或是有意为之,至今为止,SWT无论是在性能和外观上,都超越了Sun公司提供的AWT和SWING。目前Eclipse IDE已经开发到了2.1版本,SWT已经十分稳定。

③强大的插件加载功能

可以通过不断地加载插件来实现同其他制品的合作。整个Eclipse体系结构就像一个大拼图,可以不断地向上加插件,同时,现有插件上还可以再加插件,进而实现功能的扩展。目前,Eclipse已经开始提供C语言开发的功能插件。更难能可贵的,Eclipse是一个开放源代码的项目,任何人都可以下载Eclipse的源代码,并且在此基础上开发自己的功能插件。也就是说未来只要有人需要,就会有建立在Eclipse之上的COBOL,Perl,Python等语言的开发插件出现。同时可以通过开发新的插件扩展现有插件的功能,比如在现有的Java开发环境中加入Tomcat服务器插件。可以无限扩展,而且有着统一的外观、操作和系统资源管理,这也正是Eclipse的潜力所在。

④可以通过导入一些CVS相关的插件来实现版本管理的便易性

Eclipse平台提供了对于直接从工作区进行团队开发操作的支持。这种支持允许开发人员并发地与几个独立的资源库以及不同版本的代码或项目进行交互。工作区中的资源允许团队支持组件处理版本和配置管理问题。当然,单个工作区也可以同时访问不同类型的资源库。Eclipse平台并没有提供它自己的代码管理解决方案,它总是依靠外部系统。Eclipse平台只对一个(但也是最流行的一个)源代码管理系统提供内置支持——并发版本控制系统CVS。

Eclipse提供了强大的个人版本管理机制,每一次被保存的更改都可以得到恢复,而且可以精确到每一个方法的版本恢复。操作也十分方便,在任何一个能看到所要操作文件的观察窗口中,例如资源浏览窗口,选中该文件,单击右鼠标键,选择Compare with或Replace with即可。如果是恢复已经被删除的方法,则可以选择Add from local history,之后相应的本地历史记录就会显示出来,按照用户本人的需求找到相应的版本就可以了。强大的个人版本管理功能为程序员提供了更多的信心——只管编下去,任何不小心的错误都可以恢复到从前的状况,在Eclipse下开发,是有“后悔药”的!

⑤充分的帮助文件

值得提出的是,在下载了Eclipse的多国语言翻译包之后,所有的菜单和联机帮助都已经翻译成了中文,使用起来非常方便。

4 需求分析

4.1 设计目标

该软件必须尽量达到人力与设备费用的节省,能够最大限度的利用现有资源,降低系统开发费用,并且使软件的数据处理速度和效率有明显提高,降低人员工作负担。完成软件的设计,实现本系统满足用户的需求。基本功能的略缩用例描述如下所示:

图4.1系统简要用例图

4.2 智能道路交通信息系统描述

4.2.1 功能模块简单描述

智能道路交通信息管理系统,在权限方面主要是分为两部分,普通用户和系统管理员。系统管理员通过增加,修改,删除,用户或用户组,来创建和管理不同权限组,以及不同的用户;同时系统管理员也可以具有一般用户能具有的一切权限。普通用户通过用户帐号和密码登陆该系统后,可以进行系统工作所要求的一些标准设置的增加,修改,查询,删除(如支队管理,大队管理,违章行为管理等);也可以根据他的权限进行相应的处理(如信息录入、公告、处罚、统计,打印等)。该系统可大致分为下表所示的模块:

系统简要功能模块表

表4.1

序号模块名称模块标识简要功能描述
1用户验证Login用于用户登陆验证
2用户管理UsermManager用于管理员管理用户
3功能列表Left_nav导航树
4系统设置Mid_tools进行开始工作的预先设置
5违章信息录入xinxi用于查看违章图片,录入违章信息
6违章公告Gonggao用于对违章车辆进行信息公告
7违章处罚ChuFa用于对违章车辆进行处罚处罚信息保存,打印
8信息统计XinXi_TJ对一些信息进行分类统计,报表打印
9用户组管理Group用于管理用户组以及权限

其中系统设置分为:支队管理、大队管理、违章行为设置、违章地点设置、处罚地点设置、行政区划等10多个模块。

4.3 系统的数据流程分析

4.3.1 数据流程分析概述

数据流程的分析是对业务流程分析的深化,主要工作是隐去实物流,抽象出信息流,绘制出数据流程。并对各种数据的属性和各项处理功能,进行详尽的数据分析,为下一步的程序设计做准备。

数据流程分析要求弄清这些流动数据的属性、存储情况和对数据的查询要求,并给与定量的描述和分析。其中包括:

①绘制数据流程图:它是分析阶段所提供的重要的技术文件之一,反映了系统内部的数据传递关系。是对系统的一种抽象和概念化,它只表示数据、功能之间的关系,不涉及如何实现。

②数据分析:其目的是弄清数据流程图中、出现的各种数据的属性,存储情况和查询的要求,对数据予以定量的描述和分析。数据分类是指对数据项予以定义,并根据总的属性将数据项归纳到其应有的类目中去。

③数据属性分析:根据其属性可以正确的确定数据与文件的关系,通常是具有固定属性的数据存放在主文件中,把具有变动属性的数据存放在周转文件或处理文件中。

4.3.2 数据流程图

管理业务调查过程中的管理业务流程图形象地表达了人事管理过程中信息流动和存储的过程,但仍旧包含了一些物理内容,要实现计算机网络进行信息管理,还必须进一步舍去物质因素,收集相关资料,绘制系统的数据流程图。数据流程图能精确地在逻辑上描述系统的输入、输出和数据存储等功能,是描述管理信息系统逻辑模型的最主要的工具。

经过对智能道路交通信息管理系统的分析以及用户的需求分析,得到本系统的数据流程图,如下:

图4.2 顶层DFD

图4.3—第二层DFD

图4.4 第二层管理员管理子系统DFD

图4.5 第三层管理员管理子系统DFD

图4.6 第三层支队管理子系统DFD

图4.7 第三层公告管理子系统DFD

图4.8 第三层违章信息录入子系统DFD

图4.9 第三层违章处罚子系统DFD

图4.10第三层违章处罚子系统DFD

图4.11第三层信息统计子系统DFD

5 数据库系统及设计

数据库设计是管理信息系统设计的核心。数据库设计是在一个给定的应用环境下,构造最优的数据模式、建立起数据库,使之能有效地存储数据,同时构造出应用系统以支持各种应用的信息处理需求。

5.1 数据库的引入

数据库技术从60年代中期至今只有不到40年的历史,但其发展速度之快是其它技术所不及的。它已由第一代的层次型、网状型数据库,第二代的关系型数据库发展到今天以面向对象为主要模型的数据库,即第三代数据库。数据库技术和网络通信技术、面向对象编程技术、并行计算机技术、人工智能技术相互融合、相互渗透,促进了数据库技术的广泛应用。

数据库(Database),是按照数据结构来组织、存储和管理数据的仓库,是用于查询的大量数据的存储区域。使用数据库可以带来许多好处:如减少了数据的冗余度,从而大大地节省了数据的存储空间,实现数据资源的充分共享等等。此外,数据库技术还为用户提供了非常简便的使用手段,使用户易于编写有关数据库应用程序。特别是近年来推出的计算机关系数据库管理系统,操作直观,使用灵活,编程方便,功能强大,环境适应广泛,数据处理能力极强。

数据库的设计是指对一个给定的应用环境,构造数据库模式,建立数据库及其应用系统,满足各种用户需求。作为信息资源开发、管理和服务的一种有效的手段,数据库技术的应用已越来越广泛,从小型的单项事务处理系统到大型的信息系统大都用先进的数据库技术来保持系统数据的安全性、完整性和共享性。对一个实际的系统来说,数据库表的设计在遵循数据库理论的同时,必须能用开发工具来实现用户在各方面提出的功能要求。

一个真正的、完整的站点是离不开数据库的,因为少量的数据,如网页访问人数等完全可以存储在文本文件中,但实际应用中,需要保存的数据远不止这一点点,而且这些数据之间往往还有关联,利用数据库来管理这些数据,可以很方便的查询和更新。可以说一个动态网站的建设是离不开一个设计最优的数据库的。我们现在可以使用的数据库有很多种,如:Fox数据库(.dbf)、Access数据库(.mdb)、DB2、Informix、Oracle和SQL Server等等,在本次设计中,选择了作为SQL Server后台数据库工具,并提供了许多标准的关系数据库管理功能的支持。

5.2 数据库E-R模型

智能道路交通信息管理系统有如下一些主要E—R模型,下面具体介绍三个主要的关系-模型。

①用户以及用户组权限E—R模型:

图5.1 用户权限E—R图

②支队和大队的E—R模型:

图5.2 支队大队权限E—R图

③违章图片记录、违章信息、处罚信息的E—R模型:

图5.3 违章处理E—R图

5.3 数据库表结构设计

数据库的逻辑结构设计的质量将直接影响到系统的实现效果。根据道路交通信息管理系统数据库结构特点,在设计本系统的数据表时,充分考虑了以下几个方面的问题:

①数据冗余引起的数据不一致将给用户带来很大的麻烦,以至造成用户难以觉察的错误。因而表格的设计要尽量满足数据库设计的3NF要求,尽可能避免数据冗余。

②SQL Server2000数据库管理系统要求每个表的主键值必须唯一,在设计每个表的主键时,必须充分注意这一点,有些表的主键,可以设计成多个字段。

③应用系统的容量体现在某些表的某些字段上,在系统设计时应注重系统容量的设计。

④根据系统的数据流图进行系统数据分析,导出系统的数据库结构,借助PowerDesigner9.0建立数据库模型分析各表之间的对应关系,合理地设计数据表和定义表中的数据类型。

⑤根据各模块的实际要求,事先设计好表的主键、外键、索引、约束、规则、触发器、存储过程等,便于模块对公用数据表的 统一引用,并保证数据的完整性。

智能道路交通信息管理系统所需的表主要包括了:

用户登录信息表(UserBar)、学生详细信息表(UserDatailBar)、支队信息表(DatachmentBar)、大队信息表(LargeTeamBar)、违章地点信息表(PAddressBar)、处罚结果信息表(PshResultBar)、车辆类型信息表(CarCardBar)、特殊车辆类型信息表(TCarBar)、行政区划信息表(WardBar)、银行名称表(BankBar)、行政复议处信息表(WSpaceBar)、条例信息表(MByelawBar)、号牌种类表(SCarBar)、处罚地点信息表(PshAddrBar)、本地车辆标识信息表(LocalSignBar),外地车辆标识信息表(WaiDiBar)、违章信息表(WZXinXiBar)、移动电子警察违章图片信息表(QueryRSBar)、卡口违章图片信息表(PortPicBar)、处罚信息表(chufaBar)、用户组权限信息表(quanxianbar)、用户组信息表(UserGroup)共22个表。

各表的详尽描述如下:

用户登录信息表(UserBar)

表5.1

列名数据类型长度可否为空说明
UserIDvarchar20NOT NULL用户名(主键)
UserPassWDvarchar20NOT NULL用户密码
UserGroupvarchar50NOT NULL用户组(外键)

用户详细信息表(UserDatailBar)

表5.2

列名数据类型长度可否为空说明
UserIDvarchar20NOT NULL用户名(主键,外键)
PoliceIDvarchar20NOT NULL警号
UserNamevarchar10NOT NULL姓名
UserSexvarchar4NOT NULL性别

大队信息表(LargeTeamBar)

表5.3

列名数据类型长度可否为空说明
LTIDvarchar20NOT NULL大队编号(主键)
LTNamevarchar50NOT NULL大队名称
IDvarchar20NOT NULL支队编号(外键)

支队信息表(DatachmentBar)

表5.4

列名数据类型长度可否为空说明
IDvarchar20NOT NULL系别代码(主键)
Namevarchar20NOT NULL系别名称
PassWDvarchar20NULL转递密码
Addressvarchar50NULL转递地址

违章地点信息表(PAddressBar)

表5.5

列名数据类型长度可否为空说明
PAddressIDvarchar10NOT NULL编号(主键)
PaddressNamevarchar40NOT NULL违章地点

处罚结果信息表(PshResultBar)

表5.6

列名数据类型长度可否为空说明
IDvarchar10NOT NULL编号(主键)
Namevarchar20NOT NULL处罚结果名称
Explainvarchar50NULL说明

车辆类型信息表(CarCardBar)

表5.7

列名数据类型长度可否为空说明
CarCardIDvarchar10NOT NULL编号(主键)
CarCardNamevarchar20NOT NULL名称
CarCardExplainvarchar250NULL说明

特殊车辆类型信息表(TCarBar)

表5.8

列名数据类型长度可否为空说明
TCarIDvarchar10NOT NULL编号(主键)
TcarNamevarchar40NOT NULL名称
TCarExplainvarchar250NULL说明

行政区划信息表(WardBar)

表5.9

列名数据类型长度可否为空说明
IDvarchar10NOT NULL编号(主键)
Namevarchar50NOT NULL名称

银行名称信息表(BankBar)

表5.10

列名数据类型长度可否为空说明
BankNamevarchar30NOT NULL银行名称(主键)

行政复议处信息表(WSpaceBar)

表5.11

列名数据类型长度可否为空说明
WSpaceNamevarchar50NOT NULL名称(主键)

条例信息表(MByelawBar)

表5.12

列名数据类型长度可否为空说明
MbyelawNamevarchar50NOT NULL条例名称(主键)

号牌种类信息表(SCarBar)

表5.13

列名数据类型长度可否为空说明
SCarSignvarchar10NOT NULL编号(主键)
SCarNamevarchar20NOT NULL名称
SCarExplainvarchar250NULL说明

处罚地点信息表(PshAddrBar)

表5.14

列名数据类型长度可否为空说明
PshAddrIDvarchar10NOT NULL编号(主键)
PshAddrNamevarchar50NOT NULL处罚地点
PshAddrPartvarchar50NOT NULL落款机关
Departmentvarchar50NOT NULL所属单位

本地车辆标识信息表(LocalSignBar)

表5.15

列名数据类型长度可否为空说明
Frontvarchar20NOT NULL前缀(主键)
Explainvarchar100NULL说明

外地车辆标识信息表(WaiDiBar)

表5.16

列名数据类型长度可否为空说明
BeforePartvarchar10NOT NULL前缀(主键)
Explainvarchar100NULL说明

违章信息表(WZXinXiBar)

表5.17

列名数据类型长度可否为空说明
CarIDvarchar20NOT NULL车牌号(主键)
CarTimeDatetime8NOT NULL违章时间(主键)
CarTypevarchar20NOT NULL车辆类型
CarActionvarchar50NOT NULL违章行为
Addrvarchar50NOT NULL违章地点
fangxinagvarchar50NULL方向
shuduDecimal9NULL速度
LshuduDecimal9NULL限制速度
Localtypevarchar10NOT NULL本地车
TeshuCarvarchar50NULL特殊车名称
statesmallint2NOT NULL信息状态

移动电子警察违章图片信息表(QueryRSBar)

表5.18

列名数据类型长度可否为空说明
ActiontimeDatetime8NOT NULL违章时间(主键)
CarTypevarchar20NULL车辆类型
Addrvarchar50NULL违章地点
Dir1varchar50NULL图片目录1
Dir2varchar50NULL图片目录2
Dir3varchar50NULL图片目录3
Dir4varchar50NULL图片目录4
stateChar2NOT NULL信息状态

卡口违章图片信息表(PortPicBar)

表5.19

列名数据类型长度可否为空说明
ActionTimeDatetime8NOT NULL违章时间(主键)
CarIDvarchar20NULL车牌号码
CarTypevarchar20NULL车辆类型
Addrvarchar50NULL违章地点
CarshuduDecimal9NULL速度
Dir1varchar50NULL图片目录1
Dir2varchar50NULL图片目录2
Dir3varchar50NULL图片目录3
Dir4varchar50NULL图片目录4
statechar2NOT NULL信息状态

处罚信息表(chufaBar)

表5.20

列名数据类型长度可否为空说明
IDvarchar20NOT NULL处罚编号(主键)
WSpacevarchar50NOT NULL行政区划
namevarchar8NULL被处罚人姓名
Partvarchar50NULL发证机关
Addrvarchar100NULL单位或地址
SIDvarchar18NULL驾驶证或身份证号码
CarIDvarchar20NOT NULL车牌号码(主键)
CarTpyevarchar50NULL车辆类型(主键)
Shijianvarchar50NOT NULL违章时间
ActionIDvarchar10NULL违章行为编号
FajingFloat8NULL罚款金额
Chfaaddrvarchar50NULL处罚地点
Personvarchar8NULL执勤民警
ChudateDatetime8NULL处罚日期

用户组信息表(UserGroup)

表5.21

列名数据类型长度可否为空说明
UserGroupvarchar50NOT NULL组名(主键,外键)

用户组权限信息表(quanxianbar)

表5.22

列名数据类型长度可否为空说明
UserGroupvarchar50NOT NULL组名(主键,外键)
quanxianvarchar2NOT NULL小权限(主键)

5.4 数据库的完整性和安全性

5.4.1 数据库的完整性

数据库的完整性是指数据的正确性和相容性。数据库管理系统(DBMS)用一定的机制来检查数据库中的数据是否满足规定的条件——完整性约束条件,数据的约束条件是语义的体现,将作为模式的一部分存入数据库中。

本系统中定义了表与表之间的联系有助于实现完整性规则,一般在程序中实现具体的完整性控制。

5.4.2 数据库的安全性

数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄漏、更改或破坏。在数据库系统中,大量的数据集中存放,而且为许多用户直接共享,是宝贵的信息资源,系统的安全保护措施就显得更为重要,它保护数据库防止恶意的破坏和非法的存取。

本系统包括数据库的安全和服务器的安全。采用用户权限表示和鉴定的方法实现数据库的安全,此安全管理措施并不在前台开发工具中实现,而是在后台数据库中实现。在登录数据库时,系统让用户表示自己的身份,不同的用户组的用户权限不同,系统进行核实,鉴别此用户是否为合法用户,若是,系统进一步核实用户的相应权限,通常要求用户输入口令,系统和对用户口令以鉴别用户身份及用户权限组。服务器的安全也是通过用户在登录服务器时输入合法的用户名和密码来实现的。这是一种简单可行的方法,实现起来比较方便。没有采用更加复杂的系统安全管理措施是因为本管理系统一般是应用在内部网络中,采用安全管理措施主要是为了防止没有修改权限的用户无意间修改了数据,因此采用用户标识、用户组权限和鉴定的安全管理措施就能够保障数据库的安全性。

6 系统主要功能模块的设计与实现

6.1 系统设计概述

6.1.1 系统设计的原则与内容

系统设计阶段的主要目的是,在系统分析提出的反映用户需求的逻辑方案的基础上,科学合理地将逻辑方案转换成可以实施的物理(技术)方案。即根据系统分析说明书中的系统逻辑模型,综合考虑各种约束,利用一切可用的技术手段和方法,进行各种具体设计,确定新系统的实施方案,解决“系统怎么做”的问题。系统设计阶段的主要任务是:在科学合理的设计系统总体模型的基础上,尽可能提高系统的运行效率、可变性、可靠性、可控性和工作质量。充分利用并合理投入各类可以利用的人、财、物资源,使之获得较高的综合效率。[3]

系统设计包括总体结构设计和具体物理模型设计。总体结构设计主要指在系统分析的基础上,对整个系统的划分、机器设备配置=数据的存储规律以及整个系统实现设计等方面的合理安排。

系统设计的优劣会直接影响到整个系统设计的质量和所获得的经济效益。因此,为了使设计的系统能最大限度地满足用户的需求,在系统设计中应遵循这样一些基本原则:简单性、系统性、灵活性、可靠性和经济性。[7]

6.1.2 系统设计的基本方法

目前常见的系统设计方法主要有Jackson法、Parnas法和结构化设计方法(SD)等。其中,Jackson法是面向数据结构的设计方法,其核心是按输入输出以及内部存储信息的数据进行设计,把数据结构的描述变换为对程序结构的描述;Parnas方法与主张程序结构要充分反映数据结构的Jackson方法完全相反,Parnas方法主张将可能会发生变化的数据结构隐藏在一个模块的内部,使其它模块与这个因素无关,也就是说,在设计模块时,将某个因素屏蔽在某个模块内部,这个因素的不断变化不至于传播到所在模块的边界之外,即以信息屏蔽为原则建立模块结构:SD方法是通过将结构化编程技术(SP)的思想移植到整个程序系统的模块结构设计领域而形成的。SD方法自诞生以来,一直显示其强大的生命力,被计算机界认为是60年代末期软件领域研究的最大成果之一,是目前模块结构设计中历史最久、使用最广的一种方法。

SD方法的主题思想是将一个程序系统设计成由有层次关系的、相对独立的、单一 功能的诸模块组成的结构,即一方面满足模块间联系弱,模块内联系强的要求,另一方面诸模块之间具有简单的层次结构关系。在这种层次型的模块结构中,模块之间的调用关系非常明确与简单,每个模块可以单独地被理解、编写、调试、查错与修改,一个模块的错误不易向其它模块扩散。理论分析与实践经验都证明,这种层次型的模块结构具有较高的正确性、可靠性、可理解性和可维护性,它适用于任何软件系统的模块结构设计。因此,本系统开发设计中选用SD方法进行系统设计。

6.2 系统主要功能模块结构设计

6.2.1 系统主要功能模块结构

智能道路交通信息管理系统的设计方法主要采用结构化系统的设计方法,其主要特点是:模块结构相对独立、功能单一;模块内部联系大;模块之间联系小;采用模块结构图的描述方式。

本系统根据功能结构来划分为多个子系统模块,主要的功能模块有用户管理、权限管理、违章信息录入、违章信息公告、违章处罚、违章信息统计以及系统的设置部分——包括了:支队管理、大队管理、违章行为、违章地点、车辆类型、处罚地点等子模块。接下来分别介绍几个重要的模块的设计。

6.2.2 用户管理子系统

用户管理子系统仅供管理员级的用户使用,它包括增加用户和查询用户信息两个模块:

①增加用户:填写用户信息,设定用户所属的组,添加用户设定密码。

图6.1 用户添加界面

②查询用户信息:此模块主要完成:查询用户信息;删除用户,把选定用从用户列表中删除;修改用户信息,修改选定用户的用户名、密码、权限等。

图6.2 用户查询界面

6.2.3 用户组管理子系统

用户组管理子系统仅供管理员级的用户使用,它包括增加用户组和查询用户信息两个模块:

①增加用户组:填写用户组名称,设定用户组的权限,进行添加。

图6.3 添加用户组界面

②查询用户组信息:此模块主要完成:查询用户组信息;修改用户组的权限信息,但是不提供修改组名以及删除用户组。

图6.4 修改用户组权限界面

6.2.4 违章信息录入子系统

通过查看违章图片,录入车辆违章信息,该子系统主要包括移动电子警察违章信息录入和卡口违章信息录入两个模块:

①移动电子警察违章信息录入:检索未填写违章信息的移动电子警察数据记录,通过仔细查看车辆的违章图片,核实车辆的违章信息,详细填写车辆的违章信息——包括车牌号码、违章行为、地点时间等,然后保存填写的数据,同时它更新移动电子警察数据记录中的状态字段,使其从未处理变为已处理。当然,如果根据图片判定车辆没有违章就可以删除移动电子警察数据记录中的相应的行。但是他并不删除系统中的图片。

图6.5

移动电子警察违章信息录入界面

②卡口违章信息录入:检索未填写违章信息的移动电子警察数据记录,通过仔细查看车辆的违章图片,核实车辆的违章信息,详细填写车辆的违章信息——包括车牌号码、违章行为、地点时间等,然后保存填写的数据,同时它更新移动电子警察数据记录中的状态字段,使其从未处理变为已处理。当然,如果根据图片判定车辆没有违章就可以删除移动电子警察数据记录中的相应的行。但是他并不删除系统中的图片。

图6.6 卡口违章信息录入界面

6.2.5 违章信息公告子系统

对违章信息进行公告,选定要公告的违章信息的时间段,可以查看到将要公告的数据有那些,进行公告后,数据库中违章信息的状态从未公告变为已公告,这样就可以在公告信息的页面中显示出处于已公告状态的所有数据了。

图6.7 章信息公告界面

6.2.6 违章处罚子系统

此子系统主要功能模块为:通过查看未处罚的违章数据,人工的录入处罚决定书的各个输入项,保证输入正确后,完成输入、这样就可以打印出处罚决定书了,同时也保存处罚信息的数据。

图6.8 章处罚界面

6.2.7 信息统计子系统

此子系统是本系统的信息统计部分,它完成几个简单的统计。具体包括四个小模块:

①违章行为统计:统计不同的违章行为,在不同的时间段内的违章车辆数,并且可以打印报表。

图6.9 章行为统计界面

②违章地点统计:统计不同的违章地点,在不同的时间段内的违章车辆数,并且可以打印报表。

图6.10 章地点统计界面

已处罚车辆一览表:统计在不同的时间段内的所有已经处罚的违章车辆的违章处罚信息,并且可以打印报表。其用户界面如下:

图6.11 处罚车辆统计界面

④未处罚车辆一览表:统计在不同的时间段内的所有未经处罚的违章车辆的信息,并且可以打印报表。

图6.12 处罚车辆统计界面

6.3系统重要的程序实现简介

6.3.1 数据库的连接实现

本系统的数据库连接是通过JDBC-ODBC桥接器来连接的,其步骤如下:

①建立ODBC数据源,在管理工具下选择ODBC数据源,按向导一步一步地建立与确定数据库的连接。

②编写建立数据库连接的类,在编写时,考虑了系统的设计状况,用一个静态的方法来建立连接。

③在要用到数据库连接时,调用数据库连接类的连接方法来建立连接,用以实现数据库的操作。

以下是数据库连接类的具体实现:

package com.db;

import java.sql.*;

public class DBConection {

public static Connection getConnect()

{

Connection con = null;

String classforname = "sun.jdbc.odbc.JdbcOdbcDriver";

String constr = "jdbc:odbc:lixjiang";

try

{

Class.forName(classforname);

con = DriverManager.getConnection(constr);

}

catch(Exception e)

{

e.printStackTrace();

}

return con;

}

}

6.3.2 违章图片存储方式

在本系统中,由于牵涉到大量的图片的存储、传输、查看等问题。因为,图片的自身占用空间比较大(一般大于1MB每张),同时图片的数量很大,且会不断增长,而且又经常要查看和维护,就决定了图片不能直接保存在数据库中。因此图片保存在应用服务器的目录下面,而在数据库中保存图片的路径,应此在要查看图片是通过应用服务器和WEB应用中的图片资源地址来查看图片,这样图片的传输等都是由应用服务器来管理和完成。

7 系统测试

7.1 软件测试的目的和原则

在开发大型软件系统的过程中,需要面对错综复杂的问题,因此,在软件生存周期的每个阶段都不可避免地会产生错误。我们力求在每个阶段结束之前通过严格的技术审查,尽可能早的发现并纠正错误。测试的目的就是在软件投入生产性运行之前,尽可能多地发现软件中的错误。目前软件测试仍然是保证软件质量的关键步骤,它是对软件规格说明、设计和编码的最后复审。

尽管面向对象技术的基本思想保证了软件应该有更高的质量,但无论采用什么样的编程技术,编程人员的错误都是不可避免的,而且由于面向对象技术开发的软件代码重用率高,更需要严格测试,避免错误的繁衍。因此,软件测试在面向对象编程里更具有它的重要性。

与开发过程类似,测试过程也必须分步骤进行,每个步骤在逻辑上是前一个步骤地继续。大型软件系统通常由若干个子系统组成,每个子系统又由许多模块组成。因此,大型软件系统的测试的基本层次如图6-1所示。

图7.1 试的基本层次

①单元测试:单元测试的用例从单元详细设计中导出。在单元测试中可以采用功能性测试和结构性测试两种。

②集成测试:在这个测试步骤中所发现的往往是概要设计的错误。

③系统测试:在这个测试步骤中所发现的往往是需求规格说明的错误。一般来说,系统测试是功能性测试,不是结构性测试。

7.2 系统测试

在智能道路交通信息管理系统的开发过程中,每开发完一个模块都会进行模块功能测试,并且在系统最后完成和整合后,还进行了集成和系统测试。

在测试的过程中,主要问题有以下几个:

7.2.1 JSP的中文乱码问题

问题描述及解决办法:显示信息时出现了中文文字显示的问题。Java语言默认的编码方式是Unicode,而我们通常使用的文件和数据库都是基于GB2312或者BIG5等方式编码的,在程序中经常会碰到汉字的处理及显示的问题。

中文作为参数传递出现了乱码的问题。原因是客户提交的中文信息经浏览器编码到达服务器后,或从数据库中读出数据时都会出现中文乱码,JSP无法将其正确解码。而事实上浏览器缺省的编码方式为ISO-8859-1,所以我们在处理中文参数时,把客户提交的中文参数先转换后再应用。通过在每个单独的页面都加上以下的代码:

<%

Request.setCharacterEncoding(“gb2312”);

%>

就实现了中文乱码的解决。

7.2.2 表单和表格打印问题

问题描述:系统中要求打印处罚决定书,以及一些统计结果的表格打印功能。

解决办法:①用Word新建一个文档,保存为WEB页面,再在要求打印变量的地方用变量替换原有的文本,保存为JSP页面,利用浏览器的打印就可以打印出处罚决定书的Word版本。

②利用网上下载的webprint试用版,实现了表格的打印功能。在此,对发行webprint的公司以及网站表示感谢。

7.2.3 数据库时间字段以及页面中的时间显示问题

问题描述:本系统中对时间的要求比较严格,违章的时间要求精确到秒,这就决定了我在设计数据库是用datetime作为字段类型的想法和实现。然而,由于页面的时间是以字符串的形式传递的,就要求类型转换。

解决办法:在JavaBean中使用SimpleDateFormat对象来进行时间和字符串之间的转换,实现前后两端不同类型数据的类型转换,具体代码如下:

public void setShijian(String Shijian)

{

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

try {

this.shijian = sdf.parse(Shijian);

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public String getShijian()

{

String result;

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

result = sdf.format(this.shijian);

return result;

}

这样就能实现从字符串到时间时间到字符串的转换了。

7.3 软件运行与安装

7.3.1 J2EE应用程序的构建与部署

在J2EE框架下,EJB主要实现的是企业的业务逻辑。这些业务逻辑可以分布式地物理存在于不同的应用服务器上。在实现商务逻辑时,我们要在客户端通过应用服务器来调用这些业务逻辑。要调用业务逻辑,我们必须先将实现业务逻辑的EJB部署到应用服务器中以便调用。在不同的应用服务器上部署同一EJB组件时,其部署过程有一些细微差别。这些应用服务器包括BEA 的WebLogic、IBM的WebSphere、Tomcat和源代码开放组织的JBoss应用服务器。本次开发用的服务器是Tomcat 4.1。

7.3.2 具体运行过程

把EPOLICE目录以及目录下的所有文件拷贝到Tomcat的webapps目录下面,启动Tomcat应用服务器后,打开Internet Explorer,在URL地址中输入http://localhost:8080/login1.jsp,即可运行所写的JSP登录页,就可以运行智能道路交通信息管理系统了。

8 结论

此次毕业设计,从系统的需求分析,到总体功能模块的设计、程序具体实现,及最终的整个完整的系统实现和实施,每一个开发环节,都倾注了很多的心血和汗水。在这次的设计里,以前学到的知识都派得上用场,并在实际操作中得到了更多的启发,这正是一个温故而知新的过程。在这次毕业设计的过程中我从一个JSP的门外汉开始,慢慢地学习JSP的知识并不断的进行运用,并且随着系统模块一个一个地渐渐完成我对JSP的学习也就更加深入,并且伴随着系统的开发,我不停地学习JSP更加深入的知识,本来更好的知识和技术应该拿来改良系统的设计和实现,然而,当我想更改设计模式时却发现,在系统大半完工的那时,重新进行设计几乎已经是不可能的了,因此,我只好放弃了用新的设计思想来重建的想法。这样我毕业设计的智能道路交通信息管理系统就只是一个用JSP+JavaBean模式设计的WEB应用,该系统具有如下特点:

①采用Browser/Server三层体系结构,使系统具有很好的可维护性和可重用性。

②在本系统的开发过程中采用的是JSP+JavaBean模式,此模式将明显的把显示和逻辑分离,使代码容易管理,适合于中小型项目的开发。

③中间层使用数据库连接池技术加快与数据库服务器之间的数据处理速度,也加快对客户机层的响应速度。

④Web服务器采用的是开源的Tomcat应用服务器,它是一个比较完善的、开放的Web应用服务器。它严格地遵循普遍流行的开放标准,在开发过程中较为适用。

⑤后台数据库采用的SQL Server2000,它功能比较强大,包括了数据复制、数据库系统管理、Internet网关支持、在线分析处理、多媒体支持和各种并行处理能力。

但是,因为本系统比较大,并且在本项目设计阶段,我在Java和Web应用程序设计方面不太熟悉,同时由于毕业设计的时间有限,许多方面在下一步的工作中还需要进一步改进和完善。主要针对以下几方面:

①在设计模式上,应尽量采用满足MVC模式的要求来开发,分离表示层和事物层,使系统具有高的可重用性和适应性以及良好的可维护性。

②系统的某些设计的可扩展性并不十分理想,在以后的系统维护过程中,使用重构方法对系统进行重构,使系统的设计日益趋于更强的可扩展性。

③多开发和使用JSP标签,它可以非常紧密地和JSP的表示逻辑联系在一起,同时又具有和普通JavaBean相同的业务逻辑处理,采用标签库将会提高系统的开发速度。

④在开发中应该用Hibernate、Spring等来实现持久层,同时实现连接池技术,因为这样就能使数据库的连接等到尽可能的减少,有利于数据库效率的提高,以及整个系统效率的提高。

9 致谢

本次毕业设计是在石锐老师的精心指导下完成的,导师她严谨的治学态度以及渊博的知识,时时刻刻的深深地影响着我。无论在理论上,还是在技术上,她都给予我很大的帮助与信心,使我的设计逐步地趋于完善,最终形成一个功能基本齐全的系统。在论文的写作和修改过程中,石锐老师也给予了我莫大的帮助和支持。在此,向石老师表示我最诚挚的谢意。

参考文献

[1]王潜平,郭玉钗,林宗楷.一种逻辑层次连接的工程数据库设计方法及应用. 1999

[2]Kenneth C.Laudon .管理信息系统--网络化企业的组织与技术.北京高等教育出版社.2001

[3]陈禹.软件开发工具.经济科学出版社.2000

[4]张基温.信息系统开发案例(第一辑).清华大学出版社.1999

[5]王珊,陈红.数据库系统原理教程.清华大学出版社.1998

[6]杨一平.现代软件工程技术与CMM的融合.人民邮电出版社.2002

[7] 王青,李怀璋.软件质量管理:标准、技术与实践.中国计划出版出版社.2002

[8]孟广均,沈英,郭志明,霍国庆.信息资源管理导论.清华大学出版社.1998

[9]C.J.Date著.孟小峰,王珊等译.数据库系统导论.机械工业出版社.2000

[10]杜云贵.Dreamweaver UltrDev 4.清华大学出版社.2001

[11]Mary Pyefinch著.希望图书创作室译.SQL数据库开发从入门到精通.北京希望电子出版社.2000

[12]Cbuck Musciano,Bill Kennedy著.技桥译.HTML与XTHTML权威指南.清华大学出版社.2004

[13]Bruce Eckel著.陈昊鹏,饶若楠等译.Java编程思想.机械工业出版社.2005

[14]邓子云、张赐编著.JSP网络编程.电子工业出版社.2005

[15]耿祥义著.JSP基础教程.清华大学出版社,2004

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值