Как я могу вернуть и страницу и поток в Tapestry5? - PullRequest
0 голосов
/ 07 декабря 2010

Я работаю над проектом веб-приложения, используя Tapestry 5 framework / javascript.Это приложение принимает несколько входных данных и возвращает файлы PDF.

Я получил новое требование отключить кнопку отправки формы, когда пользователь щелкает ее.Кнопка должна оставаться отключенной до генерации отчетов.Я планирую написать JavaScript для отключения кнопки отправки.Но как я могу включить кнопки при возврате PDF-файла?

Я просмотрел документацию по Гобелену.Согласно документу, допустимыми типами возвращаемых значений являются «Nothing, String, Class, Page, Link, Stream».Если я вернусь на страницу, я смогу снова включить кнопку отправки.Если я верну поток, пользователь сможет скачать PDF.Но я хочу сделать оба.Есть ли способ, которым я могу вернуть несколько объектов (может быть один объект внутри другого объекта).(или) Может кто-нибудь предложить какое-либо решение этой проблемы?

Спасибо

1 Ответ

2 голосов
/ 07 декабря 2010

Я предполагаю, что ваш рабочий процесс заключается в том, что обработчик отправки формы направляет страницу, которая возвращает поток (pdf) в методе onActivate. Я также предполагаю, что вы установили заголовки ответа так, чтобы файл загружался, а не открывался браузером.

если вы сделаете это, браузер обычно создает диалог «сохранить файл как», и текущая страница никогда не удаляется (не обновляется). вы никогда не получите ответный звонок, сообщающий, что файл также был загружен.

, следовательно, с помощью описанного выше рабочего процесса вы не сможете повторно включить свою кнопку в ответ на начало или завершение загрузки. это потому, что ответ потока - это не что иное, как произвольные двоичные данные, а не html / javascript, который может быть выполнен браузером. вы не можете вернуть смешанный ответ html / javascript + данные двоичного файла.

лучшее, чего вы можете добиться, - это отключить кнопку на некоторое время, а затем снова включить, чтобы предотвратить двойной щелчок. если вы не хотите добавлять слишком много сложности в ваше приложение, я рекомендую этот подход.

однако вы можете изменить рабочий процесс, вставив дополнительный запрос-ответ между отправкой формы и загрузкой.

т.е.. вместо прямого перехода на страницу, которая возвращает поток, вы можете перезагрузить текущую страницу, которая в свою очередь запрашивает загрузку:

  1. отправка вашей формы сохраняет ваши параметры генерации PDF в сеансе и возвращает ответ (перезагрузка страницы)
  2. новая страница загружается вместе с мета-обновлением или директивой скрипта для перенаправления на URL-адрес загрузки
  3. URL загрузки вызывается, возвращает ответ потока вместе с правильными заголовками, установленными для того, чтобы пользователь увидел диалоговое окно «Сохранить файл как»

Возможно, есть и другие подходы, которые также позволят достичь желаемой функциональности, однако шаблон будет таким же, так как вам потребуется дополнительный запрос-ответ между отправкой формы и загрузкой файла.

пс. на самом деле это не проблема гобеленов, вы столкнетесь с одной и той же проблемой независимо от фреймворка (если только фреймворк не сделает что-то особенное для обработки этого случая). именно так работает технология http / browser.

...