Отправить объекты из flex в Java сервлет - PullRequest
0 голосов
/ 06 декабря 2010

Это мой метод в Actionscript

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

Как получить массив байтов на сервлете?

Также вышеупомянутый 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();

Вышеуказанный метод не работает.

Ответы [ 3 ]

1 голос
/ 06 декабря 2010

Вы можете использовать BlazeDS для этого.У меня нет примера десериализации на сервере, но вот пример для сериализации.В сервлете сделайте что-то вроде:

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/

0 голосов
/ 06 декабря 2010

Библиотека загрузки файлов Commons приходит на помощь! Просто передайте объект запроса объекту ServletFileUpload. Подробный пример можно найти здесь

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

0 голосов
/ 06 декабря 2010

Если вы настаиваете на отправке параметров таким способом, вам лучше закодировать байтовый массив в строковом представлении. Base64 например.На стороне Java используется commons-codec для его декодирования.

В противном случае см. эту статью .Это немного старо, но все еще применяется.Также см. Здесь

...