Я пытаюсь кэшировать и обрабатывать viewExpiredexception
, где, если «viewExpiredexceptionviewExpiredexception» является броском, я написал собственный обработчик обработчика viewExpiredexception, который, как предполагается, перенаправляет обратно на страницу, где выбрано Exception, i также вставьте логическое значение в сеанс, который используется на странице с кратким изображением, чтобы показать сообщение «страница была обновлена».Обработка viewExpiredexception путем перенаправления
Ниже соответствующая часть моего ViewExpiredException Handler:
public void handle() throws FacesException {
for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) {
ExceptionQueuedEvent event = i.next();
ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();
Throwable t = context.getException();
if (t instanceof ViewExpiredException) {
ViewExpiredException vee = (ViewExpiredException) t;
FacesContext fc = FacesContext.getCurrentInstance();
Map<String, Object> requestMap = fc.getExternalContext().getRequestMap();
NavigationHandler nav = fc.getApplication().getNavigationHandler();
try {
requestMap.put("currentViewId", vee.getViewId());
HttpServletRequest orgRequest = (HttpServletRequest) fc.getExternalContext().getRequest();
fc.getExternalContext().redirect(orgRequest.getRequestURI());
Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
sessionMap.put("refreshedMaxSesion",true);
fc.renderResponse();
}
catch(IOException e){ }
finally { i.remove(); }
}
}
// here queue will not contain any ViewExpiredEvents, let the parent handle them.
getWrapped().handle();
}
и случай навигации
<navigation-rule>
<navigation-case>
<from-outcome>/app/ord1</from-outcome>
<to-view-id>/jsp/orderHist.jsp</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
Я имел ограниченный успех с вышеизложенным, он будет работать в некоторых случаях, но и в других случаях страница не будет перенаправляться вообще. Он работает в основном в хроме, но в IE он вообще не работает.
Я попытался сделать несколько изменений, таких как использование
HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse();
response.sendRedirect(vee.getViewId());
но я получаю страницы ошибок 500 с исключением говоря View must Exists...
так я перестал экспериментировать, чтобы выяснить, что я делаю неправильно первым. Как может быть заархивирована эта цель кэширования ViewExpiredException и Redirectign обратно на страницу, где была заброшена ошибка?
Я нахожусь на myFaces (2.1.7) и richFaces (3.3.3). Спасибо