2011-12-28 2 views
0

Я использую 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
    • Сервер отображает страницу
    • Сервер отправляет заполненную страницу и убивает разговор # 1
  2. Клиент запускает файл AJAX fileUpload звонок
    • Сервер начинает временный разговор # 2
    • Сервер вызывает service.fileUpload(). Этот метод добавляет FacesMessage к компоненту шва FacesMessages.
    • Сервер возвращает ответ на запрос AJAX и убивает разговор №2, включая все очереди FacesMessage s.
  3. «onuploadcomplete» событие принимается, клиент запрашивает засавить из «MyPanel»
    • Сервера начинает ВРЕМЕННЫЙ разговор # 3
    • Сервер обрабатывает страницу, создает новую пустую FacesMessages для разговора # 3
    • сервер возвращает ответ на запрос AJAX (который содержит пустой <h:messages/>) и убивает разговор # 3

я могу решить эту проблему в ряде способов:

  1. Создавая новый FacesMessages компонент, который является СТР-Scoped.
  2. Отмечая разговор как долгое время в service.fileUpload() и заканчивая его при выполнении fileUploadComplete().

Правильным способом было бы переписать страницу в том же разговоре, что и service.fileUpload(). Это возможно?

+0

Хм, похоже, что у RichFaces4 есть решение, указав атрибут «render» на fileUpload. Этот атрибут недоступен в RichFaces3. – parasietje

+0

Просто протестирован с использованием продолжительной беседы. Это не работает, потому что Seam выталкивает все StatusMessages в FacesContext до этапа Render. – parasietje

ответ

0

Это может быть разрешено только с помощью специального компонента StatusMessages и определения его контекста, который по-прежнему будет доступен в Rerender (например, PAGE или longrunning CONVERSATION).

Смежные вопросы