简化的
1. 引言
每位Web开发者在工程中都必须实现至少实现一个客户文件的上载功能。永远需要!然而,要求用户仅提供一个指向其数据的URL是不公平的。作为一个开发者,帮助用户顺利地完成这些正是你的工作。HTTP协议的使用将十分有助于解决这个问题,但是许多开发者并没有选择使用HTTP协议。
你需要解决的问题有:存储上载的文件并找到关于问题“Where?”,“Why?”和“How?”等等的有关答案。
本文将解释所有在解决这些问题中遇到的瓶颈,并提供了功能性的、易于理解的代码,这些内容很可能会应用于你将来的工程中。
2. 准备工作
本文将使用当前最流行的开发工具,它们是:
◆应用程序服务器:WebLogic 8.1 SP3服务器
◆基于Java的构建工具:Apache Ant 1.6.2
◆数据库服务器:MySQL 4.0.16
◆用于从Java连接到MySQL的:MySQL Connector/J 3.1.7
Struts 1.2.4用作构建Java Web应用程序的框架,而Hibernate 3.0(RC1)用于对象/关系持续性操作和查询服务。
本文虽然基于Windows平台写成,但在其它操作系统之上,应该稍作修改就能运行。
另外,读者还应熟悉BEA WebLogic服务器以及使用Struts和Hibernate进行J2EE应用程序的开发。篇幅所限,本文并没有讨论关于应用程序和数据库服务器配置的问题。
3. 上载工程分析
现在让我们讨论存储上载文件的机制,并回答上面列出的三个问题。
◆Where?你将会把上载文件存储到一个数据库中。
◆Why?在许多情况下,它确实是合适的解决方案。使用本文的解决方案,你不会因同步上载文件而烦恼,一旦你正在备份着应用程序-你只需要备份数据库就可以了。而且,你不需要与一个用户及其在一文件系统上的文件一直保持十分笨拙的联系。
◆How?可以使用BLOB(二进制大型对象)字段实现。这样的字段用于存储大型的并且经常是原始或二进制的格式。Hibernate可以使你非常容易地操作这些字段。
典型情况下,一个企业应用程序(EAR)由两部分组成:Web层(WAR)和商业层(EJB)。商业层包含一个无状态的会话bean-它借助于Hibernate的帮助实现数据的存储。图1显示了EJB的远程接口。
498)this.style.width=498;\">
图1:HelloSession EJB的接口从Web层角度看,这个EJB为商业代理所存取。
注意,该代码使用了一个类User的对象。User代表什么意思?它是一个保留在数据库中的用户实体的“Plain Old Java Object”(POJO)。你将会活跃地使用这个UserPOJO。设置它的属性并请求EJB来存储它,然后带回一个所有的已存在于数据库中的User实体的列表。或者,由它取回一个专门的User实体并存入POJO中,然后使用一个getter存取器来存取它的属性(见图2)。
498)this.style.width=498;\">图2:所有的Web层的servlet都使用该User POJO非常明显,Web层仅由三个servlet(Struts Action的)组成,一个用于上载文件,一个用于下载文件,一个用于列出所有的User实体及其相关文件。
◆DownloadFileAction:该servlet仅使用一个参数id,这是在数据库中的一个用户的id。然后,它装入该用户的实体并把该文件从BLOB字段传递到ServletOutputStream。
◆UploadFileAction:该servlet负责从一个HTML表单中提取数据并用这些数据进一步生成DynaActionForm。它仅提取用户名和上载的文件。
◆ListAllFilesAction:该servlet没有输入参数或数据,仅负责从数据库中装入所有可用的用户User实体。
4. 环境准备
如果所有相应的软件被正确下载并安装在你的PC上,那么下一步,你就可以准备数据库和存取该数据库的用户而且还要使用名为MySqlDS的JNDI设置好连接池与数据源。同时,请肯定MySQL Connector/J存在于你的类路径中!要检查这一点,只需输入:
echo %CLASSPATH%
文件r(带有完整的路径)应该于此。这是必需的,因为WebLogic需要查找到MySQL Connector/J并用该驱动程序进行工作。
现在,既然一切准备妥当,我们就可以在数据库中创建一个表以用于保存用户实体。以任何MySQL客户身份登录到该数据库,然后输入:
drop table if exists TABLE_USER_FILE;
create table TABLE_USER_FILE
(
USER_ID int auto_increment not null,
USER_USERNAME text,
USER_FILENAME text,
USER_FILETYPE text,
USER_FILESIZE text,
USER_FILEBIN longblob,
primary key (USER_ID)
)
type = MyISAM;
你看,一切都很简单。也许在此你最陌生的是longblob类型。二进制大型对象(BLOB)列是MySQL的秘密武器之一。这些列中存储了二进制的数据,你可以象其它普通的数据类型一样来检索和操纵它。根据MySQL指南有关资料,BLOB是一个二进制大型对象,它能容纳不同大小的数据。事实上,MySQL有四种BLOB类型:
◆tinyblob:仅255个字符
◆blob:最大限制到65K字节
◆mediumblob:限制到16M字节
SMM 1月22日讯: ◆longblob:可达4GB
在每个MySQL的文档(从MySQL4.0开始)的介绍中,一个longblob列的最大允许长度依赖于在客户/服务器协议中可配置的最大包的大小和可用内存数。
杭州治妇科哪家医院好治疗脂溢性脱发用达霏欣多久能治愈
唐山月经不调治疗费用多少钱
-
未按期披露2021年年度报告 宜华集团及时任的公司法定代表人收警示函
来源:广东证监局〔2022〕86号关于对宜华企业(跨国企业)有限母公司、刘绍...
2023-09-23
-
APP也能拍出电影感,vivo S15系列让你自带主角光环
前不久vivo发行的vivo S15三部引起数码圈的关注,除了不俗的外观设计与强劲的...
2023-09-22
-
高于5000万元!四川省制造业企业“制惠贷”等你申报
很低5000万元!宜宾省工业部门跨国公司“制惠贷”等你申报 工业部门是本体...
2023-09-21
-
意甲:博洛尼亚vs泽尼特,抢分关键战泽尼特有惊无险?
皇马无法的卡塞谢尔吉伊夫卡后防和纸糊的差不多,韦根可以说一打就穿要不...
2023-09-15
-
谨防美尼尔高氏综合征患者术后顽固性呕吐
写作者:米勒之声 临床临时工时长总长了,什么样的事情都能巧遇。大大小...
2023-09-14
-
泰山外援最新动态:莫队坚持训练,老贾小德SM多,克雷桑要来了
由于严重影响,山东泰山队放弃了当年往省内拉练的计划,不用在受训补给站...
2023-09-13