Обновления формы Ajax в JSF показывают ViewExpiredException

У меня есть приложение jsf 1.2 с некоторыми ссылками на главной странице. Эти ссылки открываются кликами в новых диалогах jquery. Каждая ссылка открывает новую страницу моего приложения в отдельном диалоговом окне, поэтому приложение может открывать множество ссылок во многих диалоговых окнах на одной странице. Все мои управляемые компоненты имеют область сеанса.

Моя проблема в том, что когда я открываю новый диалог и нажимаю любую ссылку внутри, мое приложение по-прежнему работает нормально, но после этого, если я нажимаю другую ссылку на моей индексной странице, чтобы открыть другое диалоговое окно, приложение показывает мне ViewExpiredException. Я попытался обновить свой jsf до версии 2.0, установить для EnableRestoreView11Compatibility в web.xml значение true, использовать keepAlive в своих компонентах, но ничего не работает.

Я думаю, это произошло потому, что у меня есть главная страница с одним состоянием, и когда я нажимаю, чтобы открыть новую страницу в диалоговом окне jquery, она загружает всю страницу и помещает html внутрь. Таким образом, запрос не ссылался на состояние главной страницы. Как я могу это решить?


person Pedro Vítor    schedule 09.06.2014    source источник
comment
Вы используете ‹h:commandLink›? Вы звоните в службу поддержки, нажимая на ссылку, или просто показываете статическую страницу во всплывающем окне?   -  person Dinal    schedule 09.06.2014
comment
Привет @Dinal, спасибо за ответ. Я использую функцию, чтобы открыть диалог. Эта функция создает div, заполняет его другой страницей и открывает диалоговое окно jquery. Я использую a4j: commandButton. И да, страница представляет собой страницу jsp, которая отправляется на сервер.   -  person Pedro Vítor    schedule 09.06.2014
comment
Я думаю, что это чистая функциональность javascript. Если вы не используете вызовы actionListener, зачем использовать richfaces. Обычные теги ‹a› будут служить цели rt?   -  person Dinal    schedule 09.06.2014
comment
Нет, потому что у меня есть метод actionListener в моих управляемых компонентах для выполнения некоторых действий, когда пользователь нажимает на ссылку. Мой a4j: commandLink имеет actionListener для обработки запроса и oncomplete для вызова функции javascript.   -  person Pedro Vítor    schedule 09.06.2014
comment
Взгляните на этот ответ от @BalusC stackoverflow .com/questions/11408130/   -  person Avinash Singh    schedule 09.06.2014
comment
@AvinashSingh Кажется, работает с jsf 2.x ... Я использую jsf 1.2. Но я попробую это, спасибо!   -  person Pedro Vítor    schedule 10.06.2014


Ответы (1)


Вроде ошибка в JSF которая еще не исправлена, планируется исправить в JSF 2.3

Вы можете использовать приведенный ниже обходной путь, опубликованный в java.net для jquery.

http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-790

var patchJSF = function () {
  jsf.ajax.addOnEvent(function (e) {
    if (e.status === 'success') {
      $("partial-response:first changes:first update[id='javax.faces.ViewState']", 
       e.responseXML).each(function (i, u) {
        // update all forms
        $(document.forms).each(function (i, f) {
          var field = $("input[name='javax.faces.ViewState']", f);
          if (field.length == 0) {
           field = $("<input type=\"hidden\" name=\"javax.faces.ViewState\" />").
                    appendTo(f);
          }
          field.val(u.firstChild.data);
        });
      });
    }
  });
}
person Avinash Singh    schedule 09.06.2014
comment
Спасибо за ответ, но это не проблема... Я пробовал это. Проблема в том, что когда отображается мой диалог, создается новое состояние просмотра. Когда я работаю с этим новым диалогом, jsf изменяет и обновляет это состояние просмотра, но не другие (если у меня много диалогов, у каждого диалога есть ваше состояние просмотра). Итак, когда я закрываю свое диалоговое окно и щелкаю на главной странице (с необновленным состоянием просмотра), отображается трассировка стека. Я нашел эту ссылку об этой проблеме: irian. at/en/blog/-/blogs/jsf-ajax-and-multiple-forms - person Pedro Vítor; 09.06.2014
comment
@PedroVítor Я пропустил, что вы использовали Ajax для обновления нескольких форм на странице. Я отредактировал свой ответ со ссылкой на java.net - person Avinash Singh; 09.06.2014
comment
Ну, я прочитал это, и кажется, это именно то, что мне нужно! Я не могу внести изменения прямо сейчас, но сделаю это завтра. Надеюсь, это работает с JSF 1.2... - person Pedro Vítor; 10.06.2014