Ну, я решил пойти с ответом / рекомендацией BalusC выше и решил поделиться своим кодом здесь для людей, которые могут зайти сюда, «позже».К вашему сведению, моя окружающая среда представлена ниже:
TomEE 1.6.0 SNAPSHOT (Tomcat 7.0.39), PrimeFaces 3.5 (PrimeFaces Push), снимок Atmosphere 1.0.13 (1.0.12 - последняя стабильная версия)
Прежде всего, я использую p: fileDownload с p: commandLink.
<p:commandLink value="Download" ajax="false"
actionListener="#{pf_ordersController.refreshDriverWorksheetsToDownload()}">
<p:fileDownload value="#{driverWorksheet.file}"/>
</p:commandLink>
Так как у меня есть xhtml выше, и так как p: fileDownload не позволяет oncomplete = "someJavaScript ()" длячтобы выполнить, я решил использовать PrimeFaces Push для отправки сообщения клиенту, чтобы активировать JavaScript, необходимый для разблокировки интерфейса, потому что интерфейс блокировался всякий раз, когда я нажимал на команду commandLink для загрузки файла, и в течение многих месяцев я не знал, какЧтобы решить эту проблему.
Поскольку я уже использую PrimeFaces Push, мне пришлось настроить на стороне клиента следующее:
.js file;содержит метод, который обрабатывает сообщения, отправленные с сервера на клиент
function handlePushedMessage(msg) {
/* refer to primefaces.js, growl widget,
* search for: show, renderMessage, e.detail
*
* sample msg below:
*
* {"data":{"summary":"","detail":"displayLoadingImage(false)","severity":"Info","rendered":false}}
*/
if (msg.detail.indexOf("displayLoadingImage(false)") != -1) {
displayLoadingImage(false);
}
else {
msg.severity = 'info';
growl.show([msg]);
}
}
index.xhtml;содержит компонент p: socket (PrimeFaces Push);Я рекомендую все следующее, если вы реализуете FacesMessage пример PrimeFaces Push
<h:outputScript library="primefaces" name="push/push.js" target="head" />
<p:growl id="pushedNotifications" for="socketForNotifications"
widgetVar="growl" globalOnly="false"
life="30000" showDetail="true" showSummary="true" escape="false"/>
<p:socket id="socketForNotifications" onMessage="handlePushedMessage"
widgetVar="socket"
channel="/#{pf_usersController.userPushChannelId}" />
Месяцев (или, может быть, год или около того) назад, я счел необходимым добавить следующее кcommandLink, который оборачивает p: fileDownload, который обновит файл / поток на сервере, так что вы можете щелкнуть файл столько раз, сколько вам нужно, и загрузить файл снова и снова без обновления страницы с помощью клавиши F5 / refresh на клавиатуре (или аналогичнойна мобильном устройстве)
actionListener="#{pf_ordersController.refreshDriverWorksheetsToDownload()}"
На этот метод bean ссылаются всякий раз, когда конечный пользователь нажимает на commandLink для загрузки файла, так что это было идеальное место для «передачи» сообщения с сервера на клиент, для запуска JavaScript на клиенте,чтобы разблокировать пользовательский интерфейс.
Ниже приведены методы bean-компонентов в моем приложении, которые выполняют свою работу.:)
pf_ordersController.refreshDriverWorksheetsToDownload ()
public String refreshDriverWorksheetsToDownload() {
String returnValue = prepareDriverWorksheetPrompt("download", false);
usersController.pushNotificationToUser("displayLoadingImage(false)");
return returnValue;
}
usersController.pushNotificationToUser ();я должен был добавить это сегодня вечером.
public void pushNotificationToUser(String notification) {
applicationScopeBean.pushNotificationToUser(notification, user);
}
applicationScopeBean.pushNotificationToUser ();это уже существовало, без изменений в этом методе.
public void pushNotificationToUser(String msg, Users userPushingMessage) {
for (SessionInfo session : sessions) {
if (userPushingMessage != null &&
session.getUser().getUserName().equals(userPushingMessage.getUserName()) &&
session.getUser().getLastLoginDt().equals(userPushingMessage.getLastLoginDt())) {
PushContext pushContext = PushContextFactory.getDefault().getPushContext();
pushContext.push("/" + session.getPushChannelId(),
new FacesMessage(FacesMessage.SEVERITY_INFO, "", msg));
break;
}
}
}