Я использую RichFaces 3.3 и Seam 2 для разработки веб-приложения.Seam + RichFaces fileUpload должен подстрекать reRender
У меня есть страница со следующим:
<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 компонент, который является СТР-Scoped.
- Отмечая разговор как долгое время в
service.fileUpload()
и заканчивая его при выполненииfileUploadComplete()
.
Правильным способом было бы переписать страницу в том же разговоре, что и service.fileUpload()
. Это возможно?
Хм, похоже, что у RichFaces4 есть решение, указав атрибут «render» на fileUpload. Этот атрибут недоступен в RichFaces3. – parasietje
Просто протестирован с использованием продолжительной беседы. Это не работает, потому что Seam выталкивает все StatusMessages в FacesContext до этапа Render. – parasietje