#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, и проблема будет решена без добавления какого-либо кода