Примером может служить демонстрация проблемы. У меня есть 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 - это единственный "правильный" способ сделать это, я обязательно это сделаю.
Спасибо.