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

#jsf #restore #view-scope #http-request-parameters #viewexpiredexception

#jsf #восстановить #область просмотра #http-request-parameters #исключение viewexpiredexception

Вопрос:

У меня есть страница с настройкой, как показано ниже, с 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 из резервного компонента.

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

Я работаю на:

  • Tomcat 7
  • Mojarra 2.2.6
  • Omnifaces 1.8.1
  • Primefaces 5.0

Комментарии:

1. Что означает «больше не иметь доступа к соответствующему идентификатору»?

2. @EJP обновил вопрос с более подробной информацией в отношении вашего вопроса.

3. Это происходит из-за вызовов Ajax. Истечение срока действия сеанса не имеет ничего общего с параметрами запроса. Сохраните его в представлении или компоненте с c:set .

Ответ №1:

Чтобы обойти представление с истекшим сроком действия, просто полностью воссоздав его, добавьте <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>
  

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

 @PostConstruct
public void initialize() {
    id = Faces.getRequestParameter("id");
    // ...
}
  

Комментарии:

1. При выполнении действий, указанных выше, и, скажем, при нажатии commandLink на пейджер, ошибка скрывается и отображается страница, но я теряю все данные. Данные не обновляются и actionListener никогда не вызываются. В итоге я теряю все данные — в основном то, что является update общим.

2. Обновление ставит меня на правильный путь. Несколько дополнительных вещей, которые мне нужно сделать, но это более конкретная функциональность / логика, которую нужно выполнить с моей стороны. Спасибо!

3. Я не получил правильного ответа, я попробовал <f:metadata> … <o:enableRestorableView /> </f:metadata> с <h:form> … <тип ввода =»скрытый» имя =»идентификатор» значение =»#{dataTable.id }» /> </h:form> также я попробовал <o:form>, но проблема в том, что у меня есть несколько форм на странице, но они не вложены, они не решили проблему для меня

Ответ №2:

Я пробовал все это выше и не работал в mojarra 2.2.5

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