1. 引言
从Web层角度看,这个EJB为商业代理所存取。 注意,该代码使用了一个类User的对象。User代表什么意思?它是一个保留在数据库中的用户实体的"Plain Old Java Object"(POJO)。你将会活跃地使用这个UserPOJO。设置它的属性并请求EJB来存储它,然后带回一个所有的已存在于数据库中的User实体的列表。或者,由它取回一个专门的User实体并存入POJO中,然后使用一个getter存取器来存取它的属性(见图2)。
非常明显,Web层仅由三个servlet(Struts Action的)组成,一个用于上载文件,一个用于下载文件,一个用于列出所有的User实体及其相关文件。 ·DownloadFileAction:该servlet仅使用一个参数id,这是在数据库中的一个用户的id。然后,它装入该用户的实体并把该文件从BLOB字段传递到ServletOutputStream。 ·UploadFileAction:该servlet负责从一个HTML表单中提取数据并用这些数据进一步生成DynaActionForm。它仅提取用户名和上载的文件。 ·ListAllFilesAction:该servlet没有输入参数或数据,仅负责从数据库中装入所有可用的用户User实体。 4. 环境准备
你看,一切都很简单。也许在此你最陌生的是longblob类型。二进制大型对象(BLOB)列是MySQL的秘密武器之一。这些列中存储了二进制的数据,你可以象其它普通的数据类型一样来检索和操纵它。根据MySQL指南有关资料,BLOB是一个二进制大型对象,它能容纳不同大小的数据。事实上,MySQL有四种BLOB类型: ·tinyblob:仅255个字符 ·blob:最大限制到65K字节 ·mediumblob:限制到16M字节 ·longblob:可达4GB 在每个MySQL的文档(从MySQL4.0开始)的介绍中,一个longblob列的最大允许长度依赖于在客户/服务器协议中可配置的最大包的大小和可用内存数。 你可能对在BLOB中存储大型文件非常谨慎,但是请放心使用,MYSQL提供了这样的灵活性!最大包的大小可容易地通过文件my.ini中的适当行进行设置。例如: set-variable = max_allowed_packet=10M 你能指定几乎任何你需要的大小。默认是1M。 现在,在Hibernate和WebLogic之间还存在一个问题。根据Hibernate的文档,Hibernate3.0使用ANTLR作为它的新的查询分析器。这真是个遗憾!但是BEA Weblogic在系统类路径中包括了ANTLR的一个版本,它在任何应用程序库装入前就已经被加载了。因为Weblog似乎不支持属性类装载器隔离,在应用程序的上下文中它是不会看到该Hibernate类的。BEA好象在包名前加上前缀来解决这个问题,但是现已发布的ANTLR并没有这个前缀。 这个问题的解决办法是,把所有的Hibernate和依赖库放到你的CLASSPATH中。就象如下这样: C:\green\te3>echo %CLASSPATH% .;C:\mysql-connector-java-3.1.7\mysql-connector-java-3.1.7-bin.jar;C:\hibernate-3.0\hibernate3.jar; C:\hibernate-3.0\lib\ehcache-1.1.jar;C:\hibernate-3.0\lib\jta.jar;C:\hibernate-3.0\lib\xml-apis.jar; C:\hibernate-3.0\lib\commons-logging-1.0.4.jar;C:\hibernate-3.0\lib\dom4j-1.5.2.jar; C:\hibernate-3.0\lib\antlr-2.7.4.jar;C:\hibernate-3.0\lib\cglib-full-2.0.2.jar; C:\hibernate-3.0\lib\jdbc2_0-stdext.jar;C:\hibernate-3.0\lib\xerces-2.6.2.jar; C:\hibernate-3.0\lib\jaxen-1.1-beta-4.jar;C:\hibernate-3.0\lib\commons-collections-2.1.1.jar; C:\hibernate-3.0\lib\log4j-1.2.9.jar; 现在,unzip源代码到任何你想要的目录下。用你喜欢的文件编辑器打开build.xml文件,并检查(如果必要的话,加以改变)前面涉及你的HOME目录的几行和你的域的标题。保存你的变化并输入: ant 当工程建构完成时,你就会得到一个文件TE3.EAR,这是一个准备好等待发布的包(名字TE3仅是个普通名字)。然后,你就可以用WebLogic的管理控制台发布它,当发布后,用你的浏览器http://localhost:7001/te3/打开它。之后,你将看到两个选项:"upload file"和"list all files"。 5. 代码分析
现在,你已经看到了一切是如何工作的,下面解释一下几个更为重要的代码片断。如前述,UploadFileAction.java使用DynaActionForm来保持HTML表单的属性。下面是它在/WEB-INF/struts-config.xml文件中的定义:
下面的代码教你怎样通过属性存取来"存储"一个上传的文件:
Hibernate.createBlob(...)返回初始的不变的java.sql.Blob对象并使用它,因为为了设置User实体的filebin属性,该属性被定义并被映射为java.sql.Blob。 接下去一段有趣的代码来自于DownloadFileAction.java,它用’id’加载该User实体:
下一步,你就需要设置响应的头部,并开始把Blob型字段filebin的内容写到ServletOutputStream中:
6. 最容易的解决方案 在所有官方档案中,Hibernate 3.0都包装了Blob和Clob的实例,这样以来就允许具有类型Blob或Clob的属性的类可以被分离、串行化、反串行化以及被传递而实现合并的目的。因此,你会看到,Struts和Hibernate几乎为你做了一切事情-而需要你做的仅仅是极少的几个步骤。 现在看来,上载文件并把它们存储到数据库中已不再是象以前那样是一项繁重的任务。你只需选择正确的工具并知道如何灵活地使用它们即可! |
|