第第第第5555章章章章开发案例开发案例开发案例开发案例-Web-Web-Web-Web文件管理系统文件管理系统文件管理系统文件管理系统本章设计一个使用Servlet和JSP的综合案例-Web文件管理系统。他的主要功能是用户在系统中注册成功后,可以上传文件到系统中,并可以对文件进行管理。在这个系统的构建中重点学习:向Web服务器提交表单数据,如何上传文件,如何下载文件,如何对程序的执行过程进行日志记录,如何把设计完成的程序发布到Web服务器。本章首先对案例进行功能与需求分析,然后提出设计方案,并用程序实现。最后把开发好的案例发布到Web服务器上。5.15.15.15.1EclipseEclipseEclipseEclipse与与与与TomcatTomcatTomcatTomcat集成集成集成集成在第二章中讲过,EclipseSDK和WTP项目集成后,就可以开发Servlet,JSP等JavaWeb程序,开发好的Servlet和JSP需要发布到一个Web服务器上进行测试。本节讲解一些Eclipse和Tomcat5.5的集成,主要完成Eclipse中的设置。1)启动Eclipse,打开菜单【window】|【Preferences】,显示Eclipse配置对话框,单击左边目录树中的【Server】|【InstalledRuntimes】选项,如图5-1所示。图5-1Eclipse中的服务器配置2)单击右边的【Add..】按钮,显示“新建服务器运行时环境”对话框,按图5-2所示,选择“ApacheTomcatv5.5”。图5-2选择Tomcatv5.53)单击【Next】按钮,显示Tomcat服务器配置对话框,在这里设置Tomcat服务器的名字,选择Tomcat的安装路径(前提是已经安装了Tomcat5.5),选择使用的JRE,如图5-3所示,配置完成后,点击【Finish】按钮,关闭对话框后,如图5-4,说明Tomcat服务器已经配置好了,可以用来测试Servlet和JSP。图5-3配置Tomcat服务器图5-4Eclipse中已经配置好的服务器运行时环境如果我们在JavaWeb程序开发中还需要其他服务器,也可以按照这个方法进行配置。5.25.25.25.2系统功能与需求分析系统功能与需求分析系统功能与需求分析系统功能与需求分析5.2.15.2.15.2.15.2.1系统概述系统概述系统概述系统概述不论什么类型和用途的JavaWeb应用程序,在功能上都有一些共同的部分,最基本的功能如1)用户填写表单,向服务器提交数据,最常见的是新用户注册,2)向服务器上传文件和从服务器下载文件,最常见的是在Web上发电子邮件时,添加附件。本章所讲解的例子“Web文件管理系统”就是向读者展现这两个主要功能的实现。一个良好的Web应用程序除了具备满足用户需求的功能外,还应该具备一个良好的结构。本案例在综合前面学习的Servlet和JSP的基本知识上,使用MVC模式构建程序的框架,由Servlet负责控制用户的请求,JSP负责用户界面的显示,模型部分有服务类和JavaBeans组成。用户提交的数据一般需要保存到数据库中,本案例还使用到JDBC,在构建访问数据库的代码时,使用DAO模式。5.2.25.2.25.2.25.2.2需求分析需求分析需求分析需求分析本案例是构建一个Web文件管理系统,就是注册用户个人信息,然后可以上传和下载文件。任何合法的注册用户都可以上传和下载文件,但是只能删除自己上传的文件,不能删除其他用户上传的文件。系统需求总结如下:1)注册新用户,删除用户。2)显示所有用户的列表3)用户登录。4)已登录用户上传文件5)显示所有文件的列表6)下载文件7)用户删除自己的文件。5.2.35.2.35.2.35.2.3系统功能预览系统功能预览系统功能预览系统功能预览1)新用户注册,输入用户名,姓名,电子邮件和口令就可以了,如图5-5所示。图5-5注册新用户2)用户登录,如图5-6所示图5-6用户登录3)上传文件,如图5-7图5-7上传文件4)浏览自己上传的文件,如图5-8,在这里还可以删除和下载文件。图5-8用户浏览已上传文件5)浏览全部文件,如图5-9图5-95-95-95-9浏览全部文件6)浏览所用用户,如图5-10图5-105-105-105-10浏览所有用户5.35.35.35.3系统分析设计系统分析设计系统分析设计系统分析设计需求确定之后需要对系统进行整体分析和设计,包括系统功能的描述和模块划分、数据库设计、数据库访问设计、整体框架设计、目录与包结构设计和日志记录。5.3.15.3.15.3.15.3.1功能模块划分功能模块划分功能模块划分功能模块划分模块分析是描述系统需求的一个过程,需要将需求分析中的感性描述进行抽象,提取出需要实现的功能,是整个系统开发的一个关键过程。分析的根本目的是在开发的人和提出需求的人之间建立一种理解和沟通的机制。在整个软件的构建中使用MVC模式,在模块划分中同时指出用什么技术规范实现。根据前面提出的系统需求,对其模块的划分与功能描述如下:1)用户的管理�用户登录表单的显示,用JSP实现�用户登录和注销操作,用Servlet实现�用户的删除,用Servlet实现�查询所有的用户,用Servlet实现�所有用户的显示,用JSP实现2)文件的管理�文件上传表单的显示,用JSP实现�处理用户上传的文件,用Servlet实现�下载或者删除文件,用Servlet实现�查询所有的文件,用Servlet实现�显示所有的文件列表,用JSP实现5.3.25.3.25.3.25.3.2数据库设计数据库设计数据库设计数据库设计数据库设计是这个系统设计中非常重要的一环,数据是一切系统设计的基础,如果设计不合理、不完善,将在系统开发过程中,设置后期的系统维护、功能变更和功能扩充时引起较多问题,严重时,设置要重新设计项目,重做已经完成的工作。从功能模块的划分可知,本系统主要涉及两类实体:用户和文件。�用户实体:需要记录用户的ID,姓名,电子邮件,口令和创建时间。�文件实体:需要记录文件的ID,文件的名称,在服务器磁盘上存储的路径,文件的上传时间,文件的所有者。为了更好的描述文件,还需记录文件的标题和类型。这两个实体之间有一种关系,就是每个上传文件的用户是这个文件的所有者。在设计数据库表时要注意两个实体之间关系的确立。在设计数据库表时,一般要遵循下面几条原则:�数据库的一个表,最好只存储一个实体或者对象的相关信息,最好能够遵循数据库设计中的第三范式。�数据表的信息结构一定要合适,字段的数量一般不要过多。�扩充信息和动态变化的信息一定要分别放在不同的表里。�数据库表中最好有一个表示时间的字段。�表的名字最好能够反映实体的含义,名字前最好有一个前缀或者后缀,这样当同时使用表和视图时,容易区分。�字段的命名规则尽量一致,统一使用英文单词或者汉语拼音。1.1.1.1.创建数据库和表首先要创建一个数据库,在这里我们暂且使用MSSQLServer2000。在SQLServer2000的企业管理器中创建一个数据库,名称为“filedb”。然后再创建两张表:tblUser和tblFile。在命名表的名称时使用了前缀“tbl”,这样就可以在名称上和今后使用的视图区分开来。表5-1tblUser用户表表5-2tblFile文件表序号字段类型含义1UserIDVarchar(50),notnull主键,用户唯一标识2UserNameVarchar(10),notnull姓名3UserMailVarchar(50),notnull电子邮件4UserPasswordVarchar(50),notnull口令5UserTypeInt,default0用户类型,0普通用户,1管理员6UserCreatedDatetimedefaultgetdate()创建时间序号字段类型含义1FileIDInt自增主键,文件唯一标识2FileNameVarchar(255),notnull文件原始名称3FilePathVarchar(255),notnull文件的存放路径4FileTypeVarchar(10),文件类型,保留在创建表的时候,注意两个表之间的关系,用户表的UserID是文件表的外键。在SQLServer2000中创建表的脚本文件如下:1)tblUser表CREATETABLEtblUser(UserIDVARCHAR(50)NOTNULL,UserNameVARCHAR(10)NOTNULL,UserPasswordVARCHAR(50)NOTNULL,UserMailVARCHAR(50)NOTNULL,UserTypeINTEGERDEFAULT(0),UserCreatedDATETIMEDEFAULT(getdate())NOTNULL)GOCREATEINDEXPK_tblUserONtblUser(UserIDASC)GOALTERTABLEtblUserADDCONSTRAINTPK_tblUserPRIMARYKEY(UserID)GO2)tblFile表CREATETABLEtblFile(FileIDBIGINTNOTNULL,FileNameVARCHAR(255)NOTNULL,FilePathVARCHAR(255)NOTNULL,FileTypeVARCHAR(10),FileOwnerVARCHAR(50)NOTNULL,FileCreatedDATETIMEDEFAULT(getdate())NOTNULL,FileSubjectVARCHAR(100)NOTNULL)GOCREATEINDEXPK_tblFileONtblFile(FileIDASC)GOCREATEUNIQUEINDEXIX_tblFileONtblFile(FileOwnerASC)GOALTERTABLEtblFileADDCONSTRAINTPK_tblFilePRIMARYKEY(FileID)GOALTERTABLEtblFileADDCONSTRAINTFK_tblFile_tblUserFOREIGNKEY(FileOwner)REFERENCEStblUser(UserID)ONDELETERESTRICTONUPDATERESTRICT5FileOwnerVarchar(50),外键,文件的所有者,用户表的主键6FileSubjectVarchar(100),notnull文件的标题7FileCreatedDatetimedefaultgetdate()创建时间GO2.2.2.2.对象关系映射在数据库设计中,另外一个重要的问题就是对象关系映射,把数据库表中的记录映射为简单的Java对象。一般情况一个实体映射为一个Java类。本系统产生两个类:User和File。通过DAO模式实现简单Java对象和数据表中的数据交互。在User和File类的基础上进一步抽象出一个超类Enity,定义User和File类共同的组成部分,也便于统一引用所有的实体类,如图5-11所示图5-11实体类的设计在Entity类中定义了3个方法:getKey(),返回实体主键的名称;getKeyValue(),返回实体主键的值;getTable()返回实体的表名称。这写方法都是所有的实体类需要的方法。在具体的实体类File和User中定义各自的属性,并重写Entity类和Object类中的部分方法。5.3.35.3.35.3.35.3.3数据库访问设计数据库访问设计数据库访问设计数据库访问设计为了更好的实现对数据库的相关操作,本系统采用了两个方法:1)创建了一个DBPool类,负责数据库的链接;2)在访问数据库的基本操作上使用DAO模式。1.1.1.1.DBPoolDBPoolDBPoolDBPool数据库连接池本系统使用DBPool类封装数据库连接池进行数据库连接的统一管理,优化了程序结构,提高了访问效率。在读写数据库时,首先要连接数据库,如果每一次在需要操作