我是Flex和BlazeDS的新手,我正在尝试实现一个简单的应用程序,它在前端使用Flex,在后端使用Spring / Hibernate应用程序,两者之间的通信通过BlazeDS通道。
我正在寻求最佳和/或最简单的方法来指导这一点。我以这样的方式设置UI,即向用户呈现文件选择器,在该文件选择器中他们选择他们想要上载的图像文件。当选择并提交(作为表单提交)时,服务器端应该接收图像文件数据以及一些相关的元数据,例如描述和日期,然后用图像文件数据和相关元数据填充Hibernate实体/ POJO。 ,然后将实体/ POJO持久化到数据库中。
我找到了一些如何使用servlet here和FileReference类(here和here)进行文件上传和下载的示例,但这些似乎没有解决问题在于利用BlazeDS和/或Spring / Hibernate的方式。我想将图像文件数据和相关元数据(描述,捕获日期等)放入Flex应用程序中的值对象中,然后通过BlazeDS将其发送到我在Tomcat上运行的Spring / Hibernate应用程序提供的服务。在此服务中,我想从Flex应用程序发送到实体/ POJO中的值对象中提取图像数据(实际的JPG / PNG / GIF数据和相关元数据,如描述等),然后通过实体/ POJO保留Hibernate在我的数据库中。
这可以做到,如果是这样,最好的办法是什么?我错误地假设如果我使用BlazeDS,那么我在某种程度上绕过了在服务器端提供基于HTTP的服务(如servlet)的需要,而我可以将我的Java服务用作“RemoteObjects”?在进行这种传输时,Java POJO /实体类和Flex值对象类之间是否必然存在一对一映射?如果有的话,有一个工具可以从Java POJO创建相应的Flex值对象,反之亦然。
提前感谢您的帮助,意见,建议等。
- 詹姆斯
更新:有些代码可以让您更清楚:
我将此作为Flex中的值对象:
package valueobjects
{
import flash.utils.ByteArray;
[Bindable]
[RemoteClass(alias="com.abc.example.persistence.entity.Image")]
public class Image
{
public var id:Number;
public var captureDate:Date;
public var description:String;
public var imageData:ByteArray;
public function Image() {}
}
我假设这可以用作我的服务和服务器端DAO类使用的POJO类的一对一映射,如下所示:
package com.abc.example.persistence.entity;
import java.sql.Blob;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
@Entity(name = "IMAGE")
public class Image
extends AbstractBaseEntity<Long>
{
private String description;
private Date captureDate;
private Blob imageData;
@Column(name = "CAPTURE_DATE", nullable = true)
public Date getCaptureDate()
{
return captureDate;
}
@Column(name = "DESCRIPTION", nullable = true)
public String getDescription()
{
return description;
}
@Column(name = "IMAGE_DATA", nullable = true)
public Blob getImageData()
{
return imageData;
}
public void setCaptureDate(final Date captureDate)
{
this.captureDate = captureDate;
}
public void setDescription(final String description)
{
this.description = description;
}
public void setImageData(final Blob imageData)
{
this.imageData = imageData;
}
}
在我的Flex应用程序中,我使用描述字符串,日期和图像文件数据(基于用户的文件选择和描述的文本输入)填充Image对象的字段,然后在RemoteObject上调用方法,即映射到Tomcat上运行的服务。我使用Image值对象作为参数在我的Flex代码中进行RemoteObject服务调用,但是在服务器端运行的服务方法实际上需要POJO /实体类型的参数,并且我在这里我认为某种类型的Flex值对象和Java POJO之间的转换/转换将发生(通过值对象的类声明上的RemoteClass别名设置),但它似乎不会发生这种情况,因为当我调试应用程序时Java服务只有在进行服务调用时才会获得空值。
在我的Flex应用程序中,我将FileReference和Image值对象作为公共可绑定变量:
[Bindable]
public var imageToBeArchivedFileReference:FileReference = new FileReference();
[Bindable]
public var imageToBeArchivedValueObject:valueobjects.Image = new valueobjects.Image();
当用户点击文件选择按钮时,还有一个事件处理程序可以浏览文件:
protected function imageFileSelectButton_clickHandler(event:MouseEvent):void
{
var imageFileFilter:FileFilter = new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg;*.jpeg;*.gif;*.png");
var fileTypes:Array = new Array();
fileTypes.push(imageFileFilter);
imageToBeArchivedFileReference.addEventListener(Event.SELECT, imageToBeArchived_fileSelectHandler);
imageToBeArchivedFileReference.browse(fileTypes);
}
有一个事件处理程序在选择图像文件时构建值对象:
private function imageToBeArchived_fileSelectHandler(event:Event):void
{
imageToBeArchivedFileReference.load();
imageToBeArchivedValueObject = new valueobjects.Image()
imageToBeArchivedValueObject.imageData = imageToBeArchivedFileReference.data;
imageToBeArchivedValueObject.description = imageToBeArchivedDescription.text;
imageToBeArchivedValueObject.captureDate = imageToBeArchivedFileReference.creationDate;
}
并且有一个事件处理程序,当用户单击提交按钮执行图像保存/上传时调用该事件处理程序:
protected function archiveImageButton_clickHandler(event:MouseEvent):void
{
imageArchivalService.archiveImage(imageToBeArchived);
}
在服务器端,我的Java类正在简单地保存POJO:
public void archiveImage(final Image image)
{
imageDao.saveOrUpdate(image);
}
当我在上面的方法中设置断点并查看图像变量时,它看起来是空的,所以我假设从Flex值对象到Java POJO的转换没有按预期进行,而且还有更多而不仅仅是在Flex值对象类中添加RemoteClass别名。
答案 0 :(得分:3)
看看这个例子,它就在那里。
http://biemond.blogspot.com/2008/08/flex-upload-and-download-with-blazeds.html
不要使用loader类,请使用readBytes调用。
请务必查看评论,并提供有价值的信息。
干杯