基于JAVA_JSP电子书下载系统

第1章 绪论

课题的研究背景、内容和意义

电子书代表人们所阅读的数字化出版物, 从而区别于以纸张为载体的传统出版物, 电子书是利用计算机技术将一定的文字、图片、声音、影像等信息, 通过数码方式记录在以光、电、磁为介质的设备中, 借助于特定的设备来读取、复制、传输,已经为人们所熟悉。

众所周知,自20世纪80年代以来,电子图书的出现和迅速发展已经引起社会各界的普遍关注。在信息社会化和社会信息化的今天,电子图书极大地刺激了传统图书出版、发行市场,改变了读者阅读习惯,给人类社会文化和社会生活带来了深刻的变革。一般情况下,阅读电子图书主要有两种形式,一种是在线或在PC机上阅读,即通过台式电脑或笔记本电脑直接阅读网站提供的免费或付费的电子图书,也可以下载到本地计算机上阅读;另一种是离线或脱机阅读,即通过使用专用的手持阅读器阅读。手持阅读器具有体积小,分量轻,容易携带的特点,不受时间、地点、环境的限制。而且,随着阅读器材技术、内容、格式的日臻完善,电子图书必将展示其更为广阔的发展空间。

对比传统的图书出租的书店,电子书租借平台有许多的优越性。对租借者来说,方便了大家租借图书的途径,不必走出家门,只需有一台电脑,一根网线,连上网就可以访问因特网上大量的电子书网站。随着因特网发展和上网用户的增加,农村也已开始有越来越多的网络连接,上网早已不是难事,所以,一个网络的电子书租借平台可以适应大众的需求。对于管理者来说,便于管理,运营成本低,没有地域限制。总之,电子书租借平台有着很高的灵活性和方便性,随着社会的发展,会为越来越多的人所接受,有着极高的应用前景。

在国外,电子图书的发展体现在阅读软件和阅读硬件两个方面。阅读软件主要指在线阅读器,阅读硬件一般是手持式阅读器,也包括手机。各软硬件生产厂商为了更好的吸引消费者,在这上面都下了不小的精力来完善自己产品的功能,保证产品质量和提高其可用性,竞争也比较激烈。

在国内,最为普遍的电子书阅读终端是PC,手机阅读电子书的方式也在逐渐增加,而专用的手持阅读器还有待推广。国内已经出现了很多的电子书网站,比较出名的有晋江文学、潇湘书院、小说阅读网等,内容包括一些原创,各类小说和国内外名著。为了自身发展,网站往往和一些网络作家签约,网络作家在签约网站发表自己的原创并获得不低的著作费,这样也丰富了网站的内容,更好地吸引读者,达到双赢的目的。网站盈利的方式主要是向读者收取阅读费,收费方式不尽相同,一般分为按字数收取,按本数收取和按时间收取费用,所以,拥有一个广大的用户群是保证网站持续良好发展的基础。网站也可以靠出租广告位置获得额外的利益,但是过多的广告,会影响网页的美观简洁,一些弹窗广告甚至会影响读者的操作,给用户造成不必要的麻烦,所以广告的投放一般不会过多 

第2章 主要技术概述

2.1 B/S结构            

B/S 是 Brower/Server 就是用浏览器(如IE)为应用程序客户端操作服务器。这样用浏览器来操作简单易用,但是对输入没有很好的验证。逻辑实现不多。本地只是用于获取数据然后大部分验证需要提交服务器来完成。

B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构[4]。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。

以目前的技术看,局域网建立B/S结构的网络应用,并通过Internet/Intranet模式下数据库应用,相对易于把握、成本也是较低的。它是一次性到位的开发,能实现不同的人员,从不同的地点,以不同的接入方式(比如LAN, WAN, Internet/Intranet等)访问和操作共同的数据库;它能有效地保护数据平台和管理访问权限,服务器数据库也很安全 。特别是在JAVA这样的跨平台语言出现之后,B/S架构管理软件更是方便、快捷、高效。

B/S架构软件的优势与劣势:

(1)维护和升级方式简单。

目前,软件系统的改进和升级越来越频繁,B/S架构的产品明显体现着更为方便的特性。对一个稍微大一点单位来说,系统管理人员如果需要在几百甚至上千部电脑之间来回奔跑,效率和工作量是可想而知的,但B/S架构的软件只需要管理服务器就行了,所有的客户端只是浏览器,根本不需要做任何的维护。无论用户的规模有多大,有多少分支机构都不会增加任何维护升级的工作量,所有的操作只需要针对服务器进行;如果是异地,只需要把服务器连接专网即可,实现远程维护、升级和共享。所以客户机越来越“瘦”,而服务器越来越“胖”是将来信息化发展的主流方向。今后,软件升级和维护会越来越容易,而使用起来会越来越简单,这对用户人力、物力、时间、费用的节省是显而易见的,惊人的。因此,维护和升级革命的方式是“瘦”客户机,“胖”服务器。

(2)成本降低,选择更多。

大家都知道windows在桌面电脑上几乎一统天下,浏览器成为了标准配置,但在服务器操作系统上windows并不是处于绝对的统治地位。现在的趋势是凡使用B/S架构的应用管理软件,只需安装在Linux服务器上即可,而且安全性高。所以服务器操作系统的选择是很多的,不管选用那种操作系统都可以让大部分人使用windows作为桌面操作系统电脑不受影响,这就使的最流行免费的Linux操作系统快速发展起来,Linux除了操作系统是免费的以外,连数据库也是免费的,这种选择非常盛行。

(3)应用服务器运行数据负荷较重。

由于B/S架构管理软件只安装在服务器端(Server)上,网络管理人员只需要管理服务器就行了,用户界面主要事务逻辑在服务器(Server)端完全通过WWW浏览器实现,极少部分事务逻辑在前端(Browser)实现,所有的客户端只有浏览器,网络管理人员只需要做硬件维护。但是,应用服务器运行数据负荷较重,一旦发生服务器“崩溃”等问题,后果不堪设想。因此,许多单位都备有数据库存储服务器,以防万一。

2.2 JSP技术

JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。

Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户。插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能。

JSP与Java Servlet一样,是在服务器端执行的,通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览[5]。

JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。Java Servlet 是JSP的技术基础,而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。

自JSP推出后,众多大公司都支持JSP技术的服务器,如IBMOracleBea公司等,所以JSP迅速成为商业应用的服务器端语言。

2.2.1 JSP技术的强势

(1)一次编写,到处运行。除了系统之外,代码不用做任何更改。

(2)系统的多平台支持。基本上可以在所有平台上的任意环境中开发,在任意环境中进行系统部署,在任意环境中扩展。相比ASP/PHP的局限性是显而易见的。

(3)强大的可伸缩性。从只有一个小的Jar文件就可以运行Servlet/JSP,到由多台服务器进行集群和负载均衡,到多台Application进行事务处理,消息处理,一台服务器到无数台服务器,Java显示了一个巨大的生命力。

(4)多样化和功能强大的开发工具支持。这一点与ASP很像,Java已经有了许多非常优秀的开发工具,而且许多可以免费得到,并且其中许多已经可以顺利的运行于多种平台之下。

(5)支持服务器端组件。web应用需要强大的服务器端组件来支持,开发人员需要利用其他工具设计实现复杂功能的组件供web页面调用,以增强系统性能。JSP可以使用成熟的JAVA BEANS 组件来实现复杂商务功能。

2.2.2 JSP技术的弱势

(1) 与ASP一样,Java的一些优势正是它致命的问题所在。正是由于为了跨平台的功能,为了极度的伸缩能力,所以极大的增加了产品的复杂性。

(2) Java的运行速度是用class常驻内存来完成的,所以它在一些情况下所使用的内存比起用户数量来说确实是“最低性能价格比”了。从另一方面,它还需要硬盘空间来储存一系列的.java文件和.class文件,以及对应的版本文件。

2.3 SQL Server 2000数据库

SQL Server 2000 是Microsoft 公司推出的SQL Server 数据库管理系统的一个版本。该版本继承了SQL Server 7.0 版本的优点同时又比它增加了许多更先进的功能,具有使用方便,可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2000 的大型多处理器的服务器等多种平台使用。

SQL Server 2000 系统之间之所以成为目前流行的大型商用数据库系统,有着其深刻的内在因素,这与它鲜明的特点是分不开的:

①与Internet 的高度集成。

SQL Server 2000与其它Microsoft Back Office产品紧密集成,在安全、事件浏览、Windows NT服务程序、性能监视器、多处理器支持、索引服务器等方面充分利用了它们的长处,形成了自己独特的优势。

②高伸缩性和适应性。

同一SQL Server 2000数据库引擎运行在Windows 2000 Professional、Windows 2000 Server、Windows 2000 Advanced Server、Windows 98和Windows Millennium Edition上。还运行在Windows NT 4.0版的所有版本上。此数据库引擎是一个功能强健的服务器,可管理供上千用户访问的TB数据库。同时,当以默认设置运行时,SQL Server 2000还具有动态自调整等功能,这使得它可以有效地运行在便携式电脑和台式机中,用户无需承担管理任务。SQL Server 2000 Windows CE版将SQL Server 2000程序设计模型扩展到移动的Windows CE设备上,并且可以很容易地集成到SQL Server 2000环境中。

③企业级数据库功能强。

SQL Server 2000关系数据库引擎支持当今苛刻的数据处理环境所需的功能。数据库引擎充分保护资料完整性,同时将管理上千个并发修改数据库的用户的开销减到最小。SQL Server 2000分布式查询使您得以引用来自不同资料源的资料,就好象这些资料是SQL Server 2000数据库的一部分,同时分布式事务支持充分保护任何分布式资料更新的完整性。复制同样使您得以维护多个资料复本,同时确保单独的资料复本保持同步。可将一组资料复制到多个移动的脱接用户,使这些用户自主地工作,然后将他们所做的修改合并回发布服务器。

④易于安装和使用。

SQL Server 2000中包括一系列管理和开发工具,这些工具可改进在多个站点上安装、部署、管理和使用SQL Server的过程。SQL Server 2000还支持基于标准的、与Windows DNA集成的程序设计模型,使SQL Server 2000数据库和资料仓库的使用成为生成强大的可伸缩系统的无缝部分。

⑤具有决策支持的资料仓库。

SQL Server 2000提供了数据转换服务、联机分析处理(OLAP)、数据挖掘支持、English Query、Meta Data Services等等工具,以便对数进行析取、分析汇总资料并对数据库的设计提供帮助。

2.4 JDBC数据库连接

JDBC(Java DataBase Connectivity)称为Java数据库连接,它是一种用于数据库访问的应用程序API,由一组用Java语言编写的类和接口组成。JDBC为数据库应用开发人员、数据库前台工具开发人员提供了一个标准的API,使他们能够用纯Java API来编写数据库应用程序。

JDBC定义了Java语言同SQL数据之间的程序设计接口。JDBC有一个非常独特的动态连接结构,它使得系统模块化。使用JDBC来完成对数据库的访问包括以下四个主要组件:Java的应用程序、JDBC驱动器管理器、驱动器和数据源。简单地说,JDBC可做三件事:与数据库建立连接、发送SQL语句,处理结果。

2.4.1 JDBC接口

一般来说,JDBC API中有两层接口:应用程序层,开发人员用API通过SQL调用数据库和取得结果;驱动程序层,处理与具体驱动程序版本的所有通讯。

JDBC API是一系列抽象的接口,应用程序开发人员通过它可以编写访问数据库的Java应用程序。JDBC API中,抽象类的实现是由驱动程序开发商提供的。驱动程序实现了应用程序和某个数据库产品之间的接口,它的管理器则对应用程序和驱动程序之间的交互进行控制。JDBC API主要用来连接数据库和直接调用SQL命令,执行各种SQL语句。利用JDBC API可以执行一般的SQL语句、动态SQL语句,以及带IN和OUT参数的存储过程。

JDBC API是一个标准统一的SQL数据存取接口,它为Java程序提供了一个统一无缝地操作各种数据库的接口,程序员编程时,可以不关心它所要操作的数据库是哪个厂家的产品,从而提高了软件的通用性。而且在Internet上确实无法预料你的用户想访问什么类型的数据库,只要系统上安装了正确的驱动器组,JDBC应用程序就可以访问其相关的数据库。您只需用JDBC API写一个程序就够了,它可向相应数据库发送SQL语句。而且,使用Java编程语言编写的应用程序,就无须去忧虑要为不同的平台编写不同的应用程序。将Java和JDBC结合起来将使程序员只需写一遍程序就可让它在任何平台上运行。

2.4.2 JDBC的驱动程序

JDBC的数据库访问要通过JDBC驱动程序来完成,JDBC驱动程序是Java应用程序与物理数据库之间桥梁。JDBC驱动程序可以分为下面四种类型,分别适用于不同的场合[6]。

(1)JDBC-ODBC桥驱动程序

这类驱动程序负责将JDBC转换为ODBC,然后通过JDBC-ODBC的方法调用ODBC驱动程序来存取数据库。

(2)本机应用编程接口的JDBC驱动程序

这类驱动程序部分采用Java语言编写,部分采用本地代码编写。这种JDBC驱动会将客户机的JDBC调用转换为对特定数据库驱动程序的调用,进而存取数据库,因此必须先在客户机上安装好特定的数据库的数据访问驱动库才能使用。

(3)数据库中间件的纯JDBC驱动程序

这种类型的驱动程序把客户端的JDBC调用转换为一种独立于特定数据库的协议,然后将数据库访问请求传输给服务器组件,最后该服务器组件将访问请求转换为特定数据库的协议。

(4)直接连接数据库的纯JDBC驱动程序

这种类型的驱动程序可以将客户端的JDBC请求直接转换成特定数据库的协议,所有存取数据库的操作,都直接由驱动程序来完成。     

2.5 TOMCAT应用服务器

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5 支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Tomcat 很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。

Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML 页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapps目录下,Tomcat会自动检测到这个文件,并将其解压。你在浏览器中访问这个应用的Jsp时,通常第一次会很慢,因为Tomcat要将Jsp转化为Servlet文件,然后编译。编译以后,访问将会很快。另外Tomcat也提供了一个应用:manager,访问这个应用需要用户名和密码,用户名和密码存储在一个xml文件中。通过这个应用,辅助于Ftp,你可以在远程通过Web部署和撤销应用,当然本地也可以。Tomcat不仅仅是一个Servlet容器,它也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,它的处理静态Html的能力就不如Apache。我们可以将Tomcat和Apache集成到一块,让Apache处理静态Html,而Tomcat处理Jsp和Servlet。这种集成只需要修改一下Apache和Tomcat的配置文件即可。

3章 需求分析

3.1 系统功能描

该系统是用于用户对电子书的租借和相互交流,运营者可以管理此平台盈利,是一个基于在线阅读的平台,怎样可以方便管理者的管理并实现盈利,方便用户的使用,提供搜索和租借功能并且提供一个给用户的交流平台是研究的主要内容。重点在于对访问该系统的身份进行基于角色的识别,使系统可以允许三种不同的角色进行访问,即游客、会员、管理员,并赋予他们不同的访问权限。

3.1.1 用户及主要操作功能

游客可以浏览网站的主页,但是需要注册为会员后才能对电子书进免费行阅读或租借。会员登录需要输入帐号和密码信息,每个会员的帐号下都会对应有相关的个人信息,如个人邮箱,地址等,不同的会员等级在租借图书时会有不同的待遇。以管理员身份登录也需要输入账号和密码,可以管理会员信息,添加公告,管理留言板等,管理员的角色在该系统中拥有最高的权限。

3.1.2 系统角色管理模块

包括系统管理员模块和会员模块

(1)在会员模块,作为会员,可以查看个人的信息,修改自己的密码;作为管理员可以查看,管理,删除会员信息。

(2)在管理员模块,可以添加、删除管理员,管理员可以修改自己的密码。

3.1.3 电子书管理模块

电子书管理模块包括不同电子书类别的添加,删除以及电子书的上传,删除管理。

(1)电子书类别的添加是由管理员进行的,可以包括武侠小书,都市言情,穿越小书等各个类别。按照付费与否可以添加免费和付费两种类别,当然这和前一种分类方式并不冲突。

(2)各类电子书由管理员上传,上传时如果是付费电子书,可以设置下载此电子书是所需费用。

(3)对于一些过时,或人气不高的电子书,系统管理员可以进行删除操作。

3.1.4 公告模块

公告模块主要包括了公告的发布、编辑、删除和浏览;公告的发布、编辑和删除只能由管理员来进行。

3.2 系统性能需求分析

电子书租赁下载系统是对广大读书爱好者设计的一个系统,提供给读者一个寻找读物的平台,因此必须方便用户的注册,搜索和下载等功能,并提供一个交流平台。系统应该具有开放性和可靠性,同时又要方便进行操作和维护。

3.3 开发环境及开发工具

操作系统:Windows XP SP3;

语言选择:JSP 、JavaScript;

数据库选择:SQL Server 2000;

主要开发工具:Dreamweaver CS3、Eclipse 3.4;

Web应用服务器:Tomcat 5.5。

第4章 概要设计

本章详细的介绍了本系统的设计实现,包括系统功能模块的设计和数据库的设计,系统功能模块设计主要介绍了系统的功能和各功能实现的流程,数据库设计主要介绍了数据库表的设计和各字段的意义。

4.1 系统的体系结构


结构设计是系统设计的关键,结构是整个系统的骨架,将对系统的性能起决定性的作用,采用如图4-1所示的结构模式。图中客户端可分别为:管理员、游客、和会员三种角色。

图4-1  系统结构模块示意图

4.2 系统功能结构设计

系统功能框图如图4-2所示。

电子书租赁下载系统包括了用户登录模块和匿名模块,在用户登录模块中角色分为管理员和会员三种角色。管理员可以对用户进行管理,可以建立数目类别,上传电子书,公告的编辑和发布;会员可以浏览系统公告、电子书信息,可以同其他会员进行交流。

4.2.1 管理员模块

本模块包括会员管理、公告管理和书籍管理三部分。具体功能结构分析如图4-3所示。

图4-3  管理员模块结构图

4.2.2 会员模块

本模块包括信息管理,点券充值,书籍搜索三部分,具体的功能结构如图4-4所示。

4-4 会员模块结构图

4.3 系统流程图

4.3.1 会员管理

会员管理包括对公司新近员的信息进行查看和删除等操作。还有对点券充值的确认。

 (1)删除会员

首先查看会员的信息,查看的会员的信息必须在库里存在,如果有即可找到,如果没有就不能看到。当找到相应的记录后就会显示出来,然后对会员信息进行删除,删除完成该会员的信息就不存在数据库中。

具体的操作流程如图4-5所示。

4-5 删除会员流程图

4.3.2 公告管理

系统公告的管理由管理员来进行管理,系统公告发布后所有人都可以看见,系统公告的数据表(newsinfo),所有公司公告的相关操作均在本表了进行操作。

4.4 数据库设计

数据库设计是系统设计中非常重要的环节。数据库设计是整个系统的根基,如果设计不好,在后来的系统维护、变更和功能扩充时,甚至在系统开发过程中,将会引起比较大的问题,有时将会重新进行大量的工作。

创建数据库:

数据库名:manage(软件项目团队管理系统)

本系统中一共用到了以下几个数据表:

(1)电子书类别表(t_catelog):存储电子书类别信息,具体为表4-1所示。

表4-1  电子书类别表(t_catelog)

名称

别名

类型

长度(字符)

1

id

编号

Int

4

2

name

类别名称

Varchar

50

3

jieshao

类别介绍

Varchar

5000

(2)电子书表(t_book):用于存放电子书信息,具体如表4-2所示。

表4-2  电子书信息表(t_book)

名称

别名

类型

长度(字符)

1

id

编号

Int

4

2

catalog_id

类别编号

Int

50

3

name

名称

Varchar

50

4

zuozhe

作者

Varchar

50

5

shifoumianfei

是否免费

Varchar

50

6

dianquan

下载所需点券

Varchar

50

7

daxiao

大小

Varchar

50

8

jieshao

介绍

Varchar

50

9

mianfeizhangjie

免费试读

Varchar

50

10

fujian

附件

Varchar

50

(3)会员信息表 (t_user):记录会员信息,具体如表4-3所示。

表4-3  会员信息表(t_user)

名称

别名

类型

长度(字符)

1

id

编号

Int

4

2

loginname

登录帐号

Varchar

50

3

loginpw

登录密码

Varchar

50

4

name

姓名

Varchar

50

5

sex

性别

Varchar

50

6

age

年龄

Varchar

50

7

address

住址

Varchar

50

8

tel

联系方式

Varchar

50

9

email

邮箱

Varchar

50

10

dianquan

拥有点券值

Int

4

 (4)充值表(t_chongzhi):用来存放会员充值信息,具体设计如表4-4所示。

表4-4  充值表(t_chongzhi)

名称

别名

类型

长度(字符)

1

id

编号

Int

4

2

user_id

会员编号

Int

4

3

jine

充值金额

Int

4

4

fukuanfangshi

付款方式

Varchar

50

5

shijian

充值时间

Varchar

50

6

zhuangtai

审核状态

Varchar

50

 (5)留言表(t_liuyan):用来存放所有的留言信息,具体设计如表4-5所示。

表4-5  留言表(t_liuyan)

名称

别名

类型

长度(字符)

1

id

编号

Int

4

2

title

标题

Varchar

50

3

content

内容

Varchar

50

4

shijian

留言时间

Varchar

50

5

user_id

会员编号

Int

4

 (6)公告表(t-gonggao):用来存放公告信息,具体设计如表4-6所示。

表4-6  公告表(t_gonggao)

名称

别名

类型

长度(字符)

1

id

编号

Int

4

2

title

标题

Varchar

50

3

content

内容

Varchar

50

4

shijian

留言时间

Varchar

50

 (7)系统管理员表(t_admin):用来存放管理员信息,具体设计如表4-7所示。

表4-7  管理员表(t_admin)

名称

别名

类型

长度(字符)

1

userId

编号

Int

4

2

userName

帐号

Varchar

50

3

userPw

密码

Varchar

50

第5章 详细设计

本章介绍的是软件项目团队管理系统的详细功能,包括了页面的设计以及程序的设计。

5.1 公告管理模块

公告管理包括了公告的发布、管理和浏览,下面介绍这些功能。

5.1.1 浏览公告

浏览公告是前台页面的功能,只要登录网站主页即可进行公告的浏览,在主页上显示最新的几条公告。

图5-1为主页显示的部分公告页面:

下面为公告模板的核心代码。

List gonggaoList=new ArrayList();

       String sql="select * from t_gonggao order by id desc";

       Object[] params={};

       DB mydb=new DB();

       try

       {

           mydb.doPstm(sql, params);

           ResultSet rs=mydb.getRs();

           while(rs.next())

           {

              Tgonggao gonggao=new Tgonggao();

             

              gonggao.setId(rs.getString("id"));

              gonggao.setTitle(rs.getString("title"));

              gonggao.setContent(rs.getString("content"));

              gonggao.setShijian(rs.getString("shijian"));

             

              gonggaoList.add(gonggao);

           }

           rs.close();

       }

       catch(Exception e)

       {

           e.printStackTrace();

       }

       mydb.closed();

图5-3为某条公告的显示页面:

5.1.2 发布公告

发布公告是由管理员来进行的操作,只有管理员有权限进行公告的发布及修改、删除,其他人只能够进行浏览,而管理员进行公告发布之前需要进行登录,登录界面如图5-5所示:

在登陆进入管理页面之后,就可以进行公告的发布,管理员进入管理页面之后可以进行很多操作,而公告的发布与管理只是管理员众多工作之一,图5-6为管理员登陆后的界面:

5.1.3 管理公告

公告发布后要及时对公告进行管理,管理界面如图5-7所示:

以下公告管理的核心代码:

public void gonggaoAdd(HttpServletRequest req,HttpServletResponse res)

    {

       String id=String.valueOf(new Date().getTime());

       String title=req.getParameter("title");

       String content=req.getParameter("content");

       String shijian=new Date().toLocaleString();

      

      

       String sql="insert into t_gonggao values(?,?,?,?)";

       Object[] params={id,title,content,shijian};

       DB mydb=new DB();

       mydb.doPstm(sql, params);

       mydb.closed();

      

       req.setAttribute("message", "操作成功");

       req.setAttribute("path", "gonggao?type=gonggaoMana");

      

        String targetURL = "/common/success.jsp";

       dispatch(targetURL, req, res);

       

    }

   

   

    public void gonggaoDel(HttpServletRequest req,HttpServletResponse res)

    {

       String id=req.getParameter("id");

      

       String sql="delete from t_gonggao where id=?";

       Object[] params={id};

       DB mydb=new DB();

       mydb.doPstm(sql, params);

       mydb.closed();

      

       req.setAttribute("message", "操作成功");

       req.setAttribute("path", "gonggao?type=gonggaoMana");

      

        String targetURL = "/common/success.jsp";

       dispatch(targetURL, req, res);

    }

    public void gonggaoMana(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException

    {

       List gonggaoList=new ArrayList();

       String sql="select * from t_gonggao";

       Object[] params={};

       DB mydb=new DB();

       try

       {

           mydb.doPstm(sql, params);

           ResultSet rs=mydb.getRs();

           while(rs.next())

           {

              Tgonggao gonggao=new Tgonggao();

             

              gonggao.setId(rs.getString("id"));

              gonggao.setTitle(rs.getString("title"));

              gonggao.setContent(rs.getString("content"));

              gonggao.setShijian(rs.getString("shijian"));

             

              gonggaoList.add(gonggao);

           }

           rs.close();

       }

       catch(Exception e)

       {

           e.printStackTrace();

       }

       mydb.closed();

      

       req.setAttribute("gonggaoList", gonggaoList);

        req.getRequestDispatcher("admin/gonggao/gonggaoMana.jsp").forward(req, res);

}

5.2 会员模块

会员模块包括会员注册,搜索租借和点券的充值。

5.2.1 会员注册

首先介绍会员信息的注册,具体界面如图5-9所示:

会员信息的注册有一定的限制条件,用户名必填项,年龄必须为数字,密码输入两次必须一致,否则会提示出错。

会员注册的核心代码如下:

public void userReg(HttpServletRequest req,HttpServletResponse res)

    {

       String id=String.valueOf(new Date().getTime());

       String loginname=req.getParameter("loginname");

       String loginpw=req.getParameter("loginpw");

       String name=req.getParameter("name");

       String sex=req.getParameter("sex");

       String age=req.getParameter("age");

       String address=req.getParameter("address");

       String tel=req.getParameter("tel");

       String email=req.getParameter("email");

       String qq=req.getParameter("qq");

       int dianquan=0;

       String del="no";

      

       String sql="insert into t_user values(?,?,?,?,?,?,?,?,?,?,?,?)";

       Object[] params={id,loginname,loginpw,name,sex,age,address,tel,email,qq,dianquan,del};

       DB mydb=new DB();

       mydb.doPstm(sql, params);

       mydb.closed();

      

        String targetURL = "/common/add_success.jsp";

       dispatch(targetURL, req, res);

}

 

5.2.2 点券充值

点券充值应为条件限制,不能做到与付费接口的连接,再此只做模拟,点券充值后需由管理员来确认。具体界面如图5-10所示:

点券充值的核心代码如下

public void chongzhiAdd(HttpServletRequest req,HttpServletResponse res)

    {

      

       String user_id=req.getParameter("user_id");

       int jine=Integer.parseInt(req.getParameter("jine"));

       String fukuanfangshi=req.getParameter("fukuanfangshi");

       String shijian=new Date().toLocaleString();

       String zhuangtai="a";

      

       String sql="insert into t_chongzhi values(?,?,?,?,?)";

       Object[] params={user_id,jine,fukuanfangshi,shijian,zhuangtai};

       DB mydb=new DB();

       mydb.doPstm(sql, params);

       mydb.closed();

      

       req.setAttribute("msg", "申请成功。等待管理员审核");

       String targetURL = "/common/msg.jsp";

       dispatch(targetURL, req, res);

       

    }

   

   

    public void chongzhiMana(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException

    {

       List chongzhiList=new ArrayList();

       String sql="select * from t_chongzhi order by zhuangtai";

       Object[] params={};

       DB mydb=new DB();

       try

       {

           mydb.doPstm(sql, params);

           ResultSet rs=mydb.getRs();

           while(rs.next())

           {

              Tchongzhi chongzhi=new Tchongzhi();

             

              chongzhi.setId(rs.getInt("id"));

              chongzhi.setUser_id(rs.getString("user_id"));

              chongzhi.setJine(rs.getInt("jine"));

              chongzhi.setFukuanfangshi(rs.getString("fukuanfangshi"));

              chongzhi.setShijian(rs.getString("shijian"));

              chongzhi.setZhuangtai(rs.getString("zhuangtai"));

             

              chongzhiList.add(chongzhi);

           }

           rs.close();

       }

       catch(Exception e)

       {

           e.printStackTrace();

       }

       mydb.closed();

      

       req.setAttribute("chongzhiList", chongzhiList);

        req.getRequestDispatcher("admin/chongzhi/chongzhiMana.jsp").forward(req, res);

    }

5.2.3 搜索和下载书籍

       登录到系统的会员,可以搜索自己喜爱的书籍, 可以按照书名搜索,也可以按照作者搜索, 如果有符合搜索条件的书籍,则会显示在主页面。

以下为搜索书籍的界面:

核心代码如下:

public void bookSearch(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException

    {

       List bookList=new ArrayList();

       String sql="select * from t_book where del='no' and name like '%"+req.getParameter("name").trim()+"%'"+" and zuozhe like '%"+req.getParameter("zuozhe").trim()+"%'";

       System.out.println(sql+"^^^^^");

       Object[] params={};

       DB mydb=new DB();

       try

       {

           mydb.doPstm(sql, params);

           ResultSet rs=mydb.getRs();

           while(rs.next())

           {

              Tbook book=new Tbook();

             

              book.setId(rs.getInt("id"));

              book.setCatelog_id(rs.getInt("catelog_id"));

              book.setName(rs.getString("name"));

              book.setShifoumianfei(rs.getString("shifoumianfei"));

              book.setDianquan(rs.getInt("dianquan"));

              book.setDaxiao(rs.getString("daxiao"));

             

              book.setJieshao(rs.getString("jieshao"));

              book.setMianfeizhangjie(rs.getString("mianfeizhangjie"));

              book.setFujian(rs.getString("fujian"));

               book.setFujianYuanshiming(rs.getString("fujianYuanshiming"));

              book.setFabushijian(rs.getString("fabushijian"));

              book.setDel(rs.getString("del"));

             

               book.setCatelog(liuService.getCatelog(rs.getInt("catelog_id")));

             

              bookList.add(book);

           }

           rs.close();

       }

       catch(Exception e)

       {

           e.printStackTrace();

       }

       mydb.closed();

      

       req.setAttribute("bookList", bookList);

        req.getRequestDispatcher("qiantai/book/bookSearch.jsp").forward(req, res);

}

下载书籍界面:

下载核心代码:

try

          {

              String fujianPath=request.getParameter("fujianPath");

              String fujianYuashiMing=request.getParameter("fujianYuashiMing");

              fujianYuashiMing=java.net.URLDecoder.decode(fujianYuashiMing,"UTF-8");

              System.out.println(fujianYuashiMing+fujianPath);

             

              SmartUpload su = new SmartUpload(); // 新建一个SmartUpload对象

   

              su.initialize(pageContext); // 初始化

   

              su.setContentDisposition(null);

              // 设定contentDispositionnull以禁止浏览器自动打开文件,

              //保证点击链接后是下载文件。若不设定,则下载的文件扩展名为

              //doc时,浏览器将自动用word打开它。扩展名为pdf时,将用acrobat打开

              //response.sendRedirect(path+"/updown/updown_err.jsp");

              //su.downloadFile("/uploadPath/file/liu.doc"); // 下载英文文件

            

              su.downloadFile(fujianPath, null, new String(fujianYuashiMing.getBytes(), "ISO8859-1")); // 下载中文文件

              //downloadFile(String sourceFilePathName, String contentType, String destFileName)

              out.clear();

              out=pageContext.pushBody();

          }

          catch(Exception e)

          {%>

              <script type="text/javascript">

                    alert("文件不存在。请联系管理人员");

                    window.history.back();

              </script>

        <%}

5.3 书籍管理模块

,书籍管理模块包括电子书类别管理模块和电子书的管理,由管理员来管理操作,可以添加和删除相应的电子书类别,电子书,下面详细介绍各个功能。

5.3.1 电子书类别的管理

电子书类别的管理包括添加和删除电子书,界面如下图所示。类别建立时,需要要确定好类别的名称:

设计界面如下:

核心代码如下:

public void catelogAdd(HttpServletRequest req,HttpServletResponse res)

    {

       String name=req.getParameter("name");

       String jieshao=req.getParameter("jieshao");

       String del="no";

       String sql="insert into t_catelog values(?,?,?)";

       Object[] params={name,jieshao,del};

       DB mydb=new DB();

       mydb.doPstm(sql, params);

       mydb.closed();

      

       req.setAttribute("message", "操作成功");

       req.setAttribute("path", "catelog?type=catelogMana");

      

        String targetURL = "/common/success.jsp";

       dispatch(targetURL, req, res);

    }

   

    public void catelogDel(HttpServletRequest req,HttpServletResponse res)

    {

       String sql="update t_catelog set del='yes' where id="+Integer.parseInt(req.getParameter("id"));

       Object[] params={};

       DB mydb=new DB();

       mydb.doPstm(sql, params);

       mydb.closed();

      

       req.setAttribute("message", "操作成功");

       req.setAttribute("path", "catelog?type=catelogMana");

      

        String targetURL = "/common/success.jsp";

       dispatch(targetURL, req, res);

    }

    public void catelogMana(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException

    {

       List catelogList=new ArrayList();

       String sql="select * from t_catelog where del='no'";

       Object[] params={};

       DB mydb=new DB();

       try

       {

           mydb.doPstm(sql, params);

           ResultSet rs=mydb.getRs();

           while(rs.next())

           {

              Tcatelog catelog=new Tcatelog();

              catelog.setId(rs.getInt("id"));

              catelog.setName(rs.getString("name"));

              catelog.setJieshao(rs.getString("jieshao"));

              catelogList.add(catelog);

           }

           rs.close();

       }

       catch(Exception e)

       {

           e.printStackTrace();

       }

       mydb.closed();

      

       req.setAttribute("catelogList", catelogList);

        req.getRequestDispatcher("admin/catelog/catelogMana.jsp").forward(req, res);

}

5.3.2 电子书管理

电子书的管理包括各个类别中,电子书的上传和已有电子书的删除,上传时,有上传类别,付费和免费的选择。

电子书管理的界面如图所示:

5.3 留言版模块

下面介绍的是会员之间的交流,每个会员可以在系统的留言版上进行留言,而其他会员看到留言后可以与之进行交流。留言版界面如下图所示:

留言版代码如下所示:

public void liuyanAdd(HttpServletRequest req,HttpServletResponse res)

    {

       String id=String.valueOf(new Date().getTime());

       String title=req.getParameter("title");

       String content=req.getParameter("content");

       String shijian=new Date().toLocaleString();

       String user_id="0";

       if(req.getSession().getAttribute("user")!=null)

       {

           Tuser user=(Tuser)req.getSession().getAttribute("user");

           user_id=user.getId();

       }

      

       String sql="insert into t_liuyan values(?,?,?,?,?)";

       Object[] params={id,title,content,shijian,user_id};

       DB mydb=new DB();

       mydb.doPstm(sql, params);

       mydb.closed();

      

       req.setAttribute("message", "操作成功");

       req.setAttribute("path", "liuyan?type=liuyanAll");

      

        String targetURL = "/common/success.jsp";

       dispatch(targetURL, req, res);

       

    }

   

    public void liuyanAll(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException

    {

       List liuyanList=new ArrayList();

       String sql="select * from t_liuyan";

       Object[] params={};

       DB mydb=new DB();

       try

       {

           mydb.doPstm(sql, params);

           ResultSet rs=mydb.getRs();

           while(rs.next())

           {

              Tliuyan liuyan=new Tliuyan();

             

              liuyan.setId(rs.getString("id"));

              liuyan.setTitle(rs.getString("title"));

              liuyan.setContent(rs.getString("content"));

              liuyan.setShijian(rs.getString("shijian"));

              liuyan.setUser_id(rs.getString("user_id"));

               liuyan.setUser_name(liuService.getUserName(rs.getString("user_id")));

              liuyanList.add(liuyan);

           }

           rs.close();

       }

       catch(Exception e)

       {

           e.printStackTrace();

       }

       mydb.closed();

      

       req.setAttribute("liuyanList", liuyanList);

        req.getRequestDispatcher("qiantai/liuyan/liuyanAll.jsp").forward(req, res);

}

5.4 通用模块

5.4.1 登录、修改个人信息及注销退出

登录是系统的每个角色都会进行的,但是由于权限的不同所以登录后的功能不同,但是每个人都有修改个人信息、修改密码和注销退出的功能。

由于此处的修改个人信息与管理员进行修改没有太大的区别,在此就不做详细介绍,而修改密码和注销退出也是比较简单的功能,在此也就不再详细介绍。

5.4.2 数据库的连接接

本系统采用数据库的连接是用了一个java包来进行连接的,这样方便了数据库的管理。

在实现某一个功能时,首先要连接数据库。那么,如果我们在每一次进行数据库操作前都需要加载驱动、创建连接,则这些操作可以封装在一个数据库操作类中。这样做有很大的优点,一旦系统移植、数据库参数改变,则不需要重新修改所有的连接代码并重新编译,只要在这个封装类中改变其中的参数即可。我采用了如下代码的一个类来统一管理数据库的连接:

//数据库连接封装

public class DB

{

    private Connection con;

    private PreparedStatement pstm;

    private String user = "sa";

    private String password = "sa";

    private String className = "net.sourceforge.jtds.jdbc.Driver";

    private String url = "jdbc:jtds:sqlserver://localhost:1433;DatabaseName=db_ebook";

    public DB()

    {

       try

       {

           Class.forName(className);

       } catch (ClassNotFoundException e)

       {

           System.out.println("加载数据库驱动失败!");

           e.printStackTrace();

       }

    }

    /** 创建数据库连接 */

    public Connection getCon()

    {

       try

       {

           con = DriverManager.getConnection(url, user, password);

       } catch (SQLException e)

       {

           System.out.println("创建数据库连接失败!");

           con = null;

           e.printStackTrace();

       }

       return con;

    }

    public void doPstm(String sql, Object[] params)

    {

       if (sql != null && !sql.equals(""))

       {

           if (params == null)

              params = new Object[0];

           getCon();

           if (con != null)

           {

              try

              {

                  System.out.println(sql);

                  pstm = con.prepareStatement(sql,

                         ResultSet.TYPE_SCROLL_INSENSITIVE,

                         ResultSet.CONCUR_READ_ONLY);

                  for (int i = 0; i < params.length; i++)

                  {

                     pstm.setObject(i + 1, params[i]);

                  }

                  pstm.execute();

              } catch (SQLException e)

              {

                  System.out.println("doPstm()方法出错!");

                  e.printStackTrace();

              }

           }

       }

    }

    public ResultSet getRs() throws SQLException

    {

       return pstm.getResultSet();

    }

    public int getCount() throws SQLException

    {

       return pstm.getUpdateCount();

    }

    public void closed()

    {

       try

       {

           if (pstm != null)

              pstm.close();

       } catch (SQLException e)

       {

           System.out.println("关闭pstm对象失败!");

           e.printStackTrace();

       }

       try

       {

           if (con != null)

           {

              con.close();

           }

       } catch (SQLException e)

       {

           System.out.println("关闭con对象失败!");

           e.printStackTrace();

       }

    }

}

以上就是数据库的连接函数,在jsp页面中只需要引入这个包就可以,就不需要在每个页面写数据库的链接,大大的提高了工作的效率以及方便了编程。

5.5 小结

以上是对本系统做的详细介绍,里面对各个模块的功能和界面都做了比较详细的介绍。虽然基本功能可以实现,但是系统还是不够完善,在以后的学习和生活中需要继续对此系统进行完善。

第6章 系统测试

所谓系统测试就是为了发现程序中的错误而执行程序的过程。具体地说,系统测试时根据系统开发各阶段的规格说明和程序的内部结构而精心设计出一批测试用例,并利用测试来运行程序,以发现程序错误的过程。

系统测试是系统开发周期中一个十分重要的活动。尽管在系统开发的各个阶段均采用了严格的技术审查,但依然难免遗留下差错,如果在投入运行前的测试阶段没有被发现并纠正,问题迟早会暴露出来,到时再纠正错误将要付出更大的代价[7]。

在经过几个月的开发与设计,软件项目团队管理系统已经实现了基本功能,具体的测试结果如下。

6.1 公告管理模块

6.1.1 公告的浏览

经过系统测试公告的浏览已能够成功进行,只要登录网站的主页就可以进行公告的浏览,用户可以看到公告的题目和发布时间。

6.1.2 公告的添加

公告的添加只能由管理员来进行,经过系统测试可以顺利的进行公告的添加,通过id号来确定公告不会重复出现。

6.1.3 公告的编辑、删除

经过系统测试,会员可以进行对公告的浏览,管理员可以进行公告的添加与删除,管理员登录后可以点击公告管理来进行公告的操作,在添加公告时点击添加按钮就可以进行对公告的添加才操作了,每条公告后都有删除按钮,可以进行删除操作。

6.2 会员管理模块

6.2.1 成员注册

经过测试,会员可以进行注册操作,用注册的帐号可以成功登录系统。

6.2.2 点券充值

会员登录后,需要用点券来下载书籍,经过测试,点券充值可以把点券充值在自己的帐号之下,成功的用来下载付费书籍。

6.2.3 搜索书籍

会员登录后,可以顺利地搜索出系统拥有的电子书信息,能够按照书名或作者搜索,并且可以进行下载。

6.3 书籍管理模块

6.3.1 电子书类别的管理

经测试,电子书类别只可以由系统管理员进行操作,管理员根据需要添加和删除电子书类别,可以成功进行电子书类别的添加和删除操作。

6.3.2 电子书管理

经测试,电子书的管理只可以。由系统管理员进行操作,管理员根据需要添加和删除电子书,可以成功地进行电子书的添加和删除操作。

6.3.3 留言版

经过系统测试可以进行会员间的交流,每个人都可以在系统查看别人的留言,留下自己的留言,管理员可以对留言进行删除。

第7章 结论与展望

经过三个月的学习和设计,毕业设计基本完成。刚开始做毕业设计的时候感觉非常困难,感觉自己什么都不会,整天觉得毕业设计很难,后来经过老师的指导和自己的努力,慢慢的使毕业设计步入正轨。这几个月学到了很多知识,感觉比较满足,特别是经过自己的研究之后做出的成果感觉到很欣慰。

通过对课题的研究、分析以及设计,课题的要求基本实现。虽然实现了课题要就的基本功能,但是还有许多问题存在,系统不是非常完善,没能实现论坛的功能。但是经过几个月的学习与设计,自己感觉学到了很多知识,感觉自己这几个月通过自己的努力取得了不错的成绩。最重要的是让我认识到了学习的重要性,只要自己肯学,就一定能学会。同时不可以眼高手低,不管什么都要动手实践才行,不可以自己觉得会了就是会了,只有自己做出来才能叫真正的学会。

由于自己的能力和时间有限,在一学期的时间里只做到了现有的地步,不过我希望在以后的生活和学习中可以继续完善自己的系统,系统还需要论坛等功能。希望在以后的工作和学习中可以继续完善自己的毕业设计,做出属于自己的完善的系统。

参考文献

[1] 杨崑,王二平. 软件开发管理中的沟通与协调问题研究[J]. 中国管理科学,2004,12(3):141-148.

[2] 张珞玲,李师贤. 软件项目风险管理方法比较和研究[J]. 计算机工程,2003,29(3):91-94.

[3] 李丽. 项目管理与项目经理的技能及策略选择[J]. 公路,2001,11:39-42.

[4] 孙鑫编著. Java Web开发详解[M].北京: 电子工业出版社,2006

[5] 贾更新,赵立超编著. JSP完全实力教程[M].电子工业出版社,2001.

[6] 龙马工作室.典型网站建设[M].北京:人民邮电出版社,2004(8):20-54.

[7] 薛华成主编.管理信息系统[M].北京:清华大学出版社,1999.

[8] 成典勤. 基于JSP技术的Web应用[J]. 安康师专学报,2005年6期.

[9] 邓松良.软件工程[M] .西安:西安电子科技大学出版社,2004.

[10] David B. L. Client Needs and The Design Process in Web Projects[J]. Sydney: University of Technology,2002,1.

[11] Thomas R. Peltier.Information Security Risk Analysis[J].Rothstein Associates Inc,2001

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值