расположение содержимого с вложением не работает для ответа AJAX - PullRequest
1 голос
/ 07 октября 2011

Проблема для меня довольно проста.После нажатия на метку привязки я выполняю javascript, используя a4j:jsFunction, и действие этой функции должно передавать XML-файл с сервера.Проблема в том, что поток, отправленный в ответе richfaces, не дает диалоговое окно saveAs, а вместо этого отображает XML в браузере.Прочитав много статей, я понял, что ответ Ajax не может дать диалог SaveAs.

Фрагмент xhtml:

<h:form>
        <a4j:jsFunction name="updateCart" reRender="idFavouritePanel">
            <a4j:actionparam name="jsonObject" assignTo="#{archiveOrderBean.jsonObject}"/>
        </a4j:jsFunction>

         <a4j:jsFunction  name="download" reRender="partTableId" action="#{archiveOrderBean.loadSelectedOrder}">
            <a4j:actionparam name="strId" assignTo="#{archiveOrderBean.strId}"  />
        </a4j:jsFunction>
</h:form>

и набор ответов от bean-компонента.

response.setContentType("application/xml");
                    response.setContentLength(byteArr.length);
                    response.addHeader("Content-Disposition", "attachment; filename=" + attr.getUrl());
//                  writer.write(byteArr.toString());
//                  writer.flush();
                    response.getOutputStream().write(byteArr);
                    response.getOutputStream().flush();
                    // post(trueStr,encPath,encUrl,trueStr,response);
                    FacesContext.getCurrentInstance().responseComplete();

любая помощь в этом отношении будет очень полезна.

Ответы [ 2 ]

3 голосов
/ 07 октября 2011

Да, вы не можете вызвать диалоговое окно saveAs с ajax.Что вы можете сделать, это вернуть URL.Затем откройте этот URL (с помощью JavaScript).Затем сервер должен отправить файл (с соответствующими заголовками).Конечно, вы можете пропустить все это и просто дать ссылку на рассматриваемый URL (если он не генерируется динамически)

0 голосов
/ 11 октября 2011

Я мог бы решить эту проблему грубым методом, не очень рекомендуемым, но без альтернативы.

Я добавил скрытый h:commandButton и переместил атрибут action="#{archiveOrderBean.loadSelectedOrder}" из a4j:jsFunction. По завершении выполнения javascript я явно вызываю событие click для h:commandButton, используя javascript. Это будет синхронный запрос для XML. Короче говоря, определение события клика.

Это был один из способов, которым я должен был внести изменения, так как XML был создан во время выполнения. Другой способ, как объяснил @ Божо.

Спасибо @BalusC за помощь: -)

...