Восстановление параметров запроса в bean-компоненте @ViewScoped после истечения срока действия сеанса

У меня есть страница с настройкой, как показано ниже, с URL-адресом типа my.page.com/table.xhtml?id=123:

+----------------------------------------------+
|Meta information                              |
|----------------------------------------------|
|           Search Fields           Submit btn |
|----------------------------------------------|
|                                              |
|                                              |
|            Big p:dataTable                   |
|                with rowExpansion             |
|                                              |
|----------------------------------------------|
|                   Pager                      |
+----------------------------------------------+

id=123 — это параметр запроса, который управляет содержимым таблицы результатов. Все действия только перезагружают таблицу данных с помощью AJAX.

id загружается через это:

<f:metadata>
    <o:viewParam name="id" value="#{dataTable.id}" />
    <f:viewAction action="#{dataTable.initialize}" />
</f:metadata>

Все это работает нормально, пока сеанс не истечет. В этот момент ничего не работает. Я не могу получить данные, так как у меня больше нет доступа к рассматриваемому id, а вызов классов DAO, извлекающих данные, не имеет этого.

Под "больше нет доступа к id" я имею в виду следующее:

FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id")

возвращает null. Кроме того, int id из моего поддерживающего компонента (который загружается через o:viewParam в f:metadata) постигнет та же участь.

Я знаю, что есть способы поймать ViewExpiredException, но это не то, что мне нужно. Мне нужно, чтобы страница просто перезагрузила все значения, используя параметр запроса (в данном случае id) без ведома пользователя.

Мне (думаю, мне) нужен управляющий компонент @ViewScoped для управления этой сложной таблицей, всеми параметрами и т. д.

Я в растерянности по этому поводу. Я попытался создать свой собственный ViewHandler, чтобы попытаться просто перестроить (имитировать обновление) страницы, и попытался использовать PrimeFaces ajaxExceptionHandler среди других решений. Но все они получают ошибку и отображают ее. Я просто хочу иметь доступ к моему параметру запроса my.page.com/table.xhtml?id=123 из вспомогательного компонента.

Любая помощь будет оценена по достоинству.

Я работаю:

  • Томкэт 7
  • Мохарра 2.2.6
  • Омнифейс 1.8.1
  • Праймфейс 5.0

person blo0p3r    schedule 24.06.2014    source источник
comment
Что больше не имеет доступа к рассматриваемому идентификатору?   -  person user207421    schedule 24.06.2014
comment
@EJP обновил вопрос, добавив более подробную информацию о вашем вопросе.   -  person blo0p3r    schedule 24.06.2014
comment
Это происходит из-за вызовов Ajax. Срок действия сеанса не имеет ничего общего с параметрами запроса. Сохраните его в представлении или bean-компоненте с помощью c:set.   -  person user207421    schedule 24.06.2014


Ответы (2)


Чтобы обойти представление с истекшим сроком действия, просто полностью воссоздав его, добавьте <o:enableRestorableView> в метаданные:

<f:metadata>
    ...
    <o:enableRestorableView />
</f:metadata>

Что касается сохранения параметра запроса, либо добавьте в форму простое скрытое поле ввода HTML:

<h:form>
    ...
    <input type="hidden" name="id" value="#{dataTable.id}" />
</h:form>

или используйте <o:form> с includeViewParams="true",includeRequestParams="true" или useRequestURI="true", в зависимости от того, хочет отправить идентификатор представления JSF со всеми параметрами представления или идентификатор представления JSF со всей строкой запроса запроса или весь URI запроса (включая строку запроса):

<o:form includeViewParams="true">
    ...
</o:form>

Что касается повторной инициализации состояния bean-компонента при обратной передаче до того, как он пройдет все этапы жизненного цикла JSF, вам нужно будет заменить <o:viewParam>, захватив его вручную, а <f:viewAction> на @PostConstruct:

@PostConstruct
public void initialize() {
    id = Faces.getRequestParameter("id");
    // ...
}
person BalusC    schedule 24.06.2014
comment
Когда вы делаете, как указано выше, и, скажем, нажимаете commandLink на пейджере, ошибка скрывается и страница отображается, но я теряю все данные. Данные не обновляются, и actionListener никогда не вызывается. В итоге я теряю все данные - в основном то, что updated. - person blo0p3r; 25.06.2014
comment
Обновление ставит меня на правильный путь. Несколько дополнительных вещей, которые мне нужно сделать, но это более конкретная функциональность/логика, которую нужно выполнить с моей стороны. Благодарю вас! - person blo0p3r; 26.06.2014
comment
Я не получил правильного ответа, я попробовал ‹f:metadata› ... ‹o:enableRestorableView /› ‹/f:metadata› с ‹h:form› … ‹input type=hidden name=id value= #{dataTable.id} /› ‹/h:form› также я пробовал ‹o:form›, но проблема в том, что у меня есть несколько форм на странице, но не вложенные, они не решили проблему для меня. - person bob-cac; 21.11.2014

Я пробовал все вышеперечисленное и не работал в моджарре 2.2.5.

Просто измените mojara на mojarra 2.2.8, и проблема будет решена без добавления кода.

person bob-cac    schedule 24.11.2014