JSF Как перенаправить из резервной копии bean в URL, динамически построенный в резервной копии bean?

Примером может служить демонстрация проблемы. У меня есть 10 документов, которые отображаются на странице, 3 из них содержат дополнительную информацию, содержащуюся в пакетах zip. Во время начальной загрузки страницы я знаю только, какие документы имеют эту дополнительную информацию, я не знаю URL-адрес этих zip файлов. Итак, я показываю ссылку ( "Получить пакет Zip" ) на 3 документа, которые содержат дополнительные файлы zip. Когда пользователь нажимает "Получить пакет Zip", он вызывает метод в базе bean, который отправляется в базу данных для определения URL-адреса почтового пакета. Как только это будет сделано, я хотел бы обслуживать почтовый пакет в браузере, который затем открывается как диалог "Сохранить как...", и пользователь может сохранить пакет zip.

Я пробовал два подхода, но ни один из них не работает.

Подход 1

<p:commandLink actionListener="#{myBackingBean.zipPackage(aDocument)}"
               value="Get Zip Package"
               ajax="false"
               rendered="#{aDocument.packageAvailable}"/>
public String zipPackage(DocItem item){
  //logic here to figure out the URL for this item zip package
  return packageLink;
}

Подход 2

<h:outputLink onclick="getPackageLink([{name:'product', value: '#{aResult.product}'}, {name:'version',value:'#{aResult.version}'}])"
   <h:outputText value="Get Documentation Package"/>
</h:outputLink>
<p:remoteCommand name="getPackageLink" actionListener="#{kbBackingBean.zipPackage()}"/>
public String zipPackage() {
  Map map = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
  String product = (String) map.get("product");
  String version = (String) map.get("version");
  //logic here to figure out the URL for this item zip package
  return packageLink;
}

Когда страница загружается и отображаются 10 документов, ссылка "Получить почтовый пакет" (для 3-х документов) ничего не указывает, по существу, имеет тот же URL-адрес, что и страница. Когда я нажимаю на него, он отправляет запрос GET на сервер и вызывает функцию поддержки bean. С приближением 1 браузер, похоже, ждет завершения метода поддержки bean до того, как он начнет рендеринг ответа. При подходе 2 нет ожидания, и браузер немедленно перезагружает страницу. Я подозреваю, что, так как ссылка "Получить почтовый пакет" указывает на страницу, запрос браузера GET обрабатывается первым, а ответ метода поддержки bean просто теряется.

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

Любое предложение или подход (ы), которые позволили бы мне использовать URL-адрес без вызова сервлета, приветствуются. Конечно, если Servlet - это единственный "правильный" способ сделать это, я обязательно это сделаю.

Спасибо.

Ответ 1

Вы можете попробовать с такой логикой:

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
context.redirect(context.getRequestContextPath() + "download-page.jsf?product=" + product + "&version=" + version);