Я использую RichFaces 3.3 и Seam 2 для разработки веб-приложения.
У меня есть страница со следующим:
<h:form>
<s:div id="myPanel">
<h:messages/>
<rich:fileUpload fileUploadListener="#{service.uploadEvent}" maxFilesQuantity="1">
<a:support event="onuploadcomplete" reRender="myPanel"/>
</rich:fileUpload>
</s:div>
</h:form>
В методе service.uploadEvent
я получаю файл и добавляю FacesMessage, чтобы пользователь знал, что файл успешно загружен.
Что на самом деле происходит так:
- Браузер запрашивает страницу
- Сервер начинает временный разговор # 1
- Сервер отображает страницу
- Сервер отправляет завершенную страницу и убивает разговор # 1
- Клиент запускает вызов AJAX fileUpload
- Сервер начинает временный разговор # 2
- Сервер вызывает
service.fileUpload()
. Этот метод добавляет FacesMessage
к компоненту FacesMessages
шва в области беседы.
- Сервер возвращает ответ на запрос AJAX и завершает разговор № 2, включая все
FacesMessage
s в очереди.
- Событие 'onuploadcomplete' получено, клиент запрашивает повторное отображение myPanel.
- Сервер начинает временную беседу # 3
- Сервер отображает страницу, создает новый пустой
FacesMessages
для разговора # 3
- Сервер возвращает ответ на запрос AJAX (который содержит пустой
<h:messages/>
) и завершает разговор # 3
Я могу решить эту проблему несколькими способами:
- Путем создания нового компонента FacesMessages с областью PAGE.
- Отметив разговор как длительный в
service.fileUpload()
и завершив его после выполнения fileUploadComplete()
.
Надлежащим способом будет повторное отображение страницы в том же разговоре, что и service.fileUpload()
Это возможно?