【问题标题】:Send objects from flex to java servlet将对象从 flex 发送到 java servlet
【发布时间】:2010-12-06 09:26:39
【问题描述】:

这是我在 actionscript 中的方法

var urlVars : URLVariables = new URLVariables();
                urlVars.myname = byteArr;
                var urlReq : URLRequest = new URLRequest('MyServlet');
                urlReq.data = urlVars;
                urlReq.method = 'post';
                navigateToURL(urlReq, '_blank');

如何在 servlet 上接收字节数组?

还有上面的byteArr来自java端,

byte[] byteArr = aMethodWhichReturnsaPDFByteArray();
        HttpServletResponse response = FlexContext.getHttpResponse();
        ServletOutputStream os = null;
        try {
            response.reset();
            response.setContentType("application/pdf");
            response.setContentLength(byteArr.length);
            response.setHeader("Content-disposition",
                    "inline; filename=\"Report.pdf\"");
            os = response.getOutputStream();
            os.write(byteArr);
            os.flush();
os.close();

上述方法无效。

【问题讨论】:

  • 我运行debug的时候,运行流畅; os.close() 下方有一条 catch 语句;但是,没有发现异常,没有打开新页面。

标签: java apache-flex actionscript-3 servlets flex3


【解决方案1】:

您可以为此使用 BlazeDS。我没有在服务器上反序列化的示例,但这里有一个用于序列化的示例。在 servlet 中执行以下操作:

response.setHeader("Content-Type", "application/x-amf");
ServletOutputStream out = response.getOutputStream();

ActionMessage requestMessage = new ActionMessage(MessageIOConstants.AMF3);

MessageBody amfMessage = new MessageBody();
amfMessage.setData(list);
requestMessage.addBody(amfMessage);

AmfMessageSerializer amfMessageSerializer = new AmfMessageSerializer();
amfMessageSerializer.initialize(SerializationContext.getSerializationContext(), out, new AmfTrace());
amfMessageSerializer.writeMessage(requestMessage);

out.close();

在客户端执行如下操作:

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, function(event:Event):void {
  var ba:ByteArray = (event.currentTarget.data as ByteArray);          
  var packet:AMFPacket = AMFDecoder.decodeResponse(ba) as AMFPacket;
});
loader.load(urlReq);

你的用例与此类似,只是在客户端序列化并在服务器上反序列化。

您可以在以下位置找到此示例的所有源代码:
http://flexapps.svn.sourceforge.net/viewvc/flexapps/census2-tests/

【讨论】:

    【解决方案2】:

    如果您坚持以这种方式发送参数,您最好将字节数组编码为字符串表示形式。 Base64 例如。在java端使用commons-codec解码。

    否则,请参阅this article。它有点旧,但仍然适用。还有see here

    【讨论】:

    • 字节数组很大。在另一端编码然后解码会导致性能问题。还有其他方法吗?实际上字节数组是在java端生成并发送回flex。由于从 java 端创建新响应不起作用。
    • 大约 1MB。可能会在不久的将来扩展。
    • 这不是太大。但如果你可以使用频道(就像我链接的那样),那就更喜欢了。
    • 另外,你能告诉我为什么代码的第二部分(参考上面的问题)不起作用。
    【解决方案3】:

    Commons File Upload 库来救援了!只需将请求对象传递给 ServletFileUpload 对象。可以在这里找到一个详细的例子

    http://commons.apache.org/fileupload/using.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 2012-02-13
      • 2017-07-27
      相关资源
      最近更新 更多