Мы используем JSF 2 + Primefaces + Glassfish + CDI / WELD для разработки.
На нашей странице search.xhtml есть таблица данных / dataTable списков книг, каждый из которых отображается как outputLink. При нажатии на любую запись отображается view.xhtml со всеми подробностями книги. Это код в нашем search.xhtml, который вызывается:
<h:outputLink value="${request.contextPath}/viewBook.xhtml?id=${book.id}">${book.title}
</h:outputLink>
В файле viewBook.xhtml, основанном на идентификаторе книги, переданном в URL, детали заполняются перед отображением страницы следующим образом:
<f:metadata>
<f:viewParam name="id" value="#{bookBean.id}"/>
</f:viewParam>
<f:event type="preRenderView" listener="#{bookBean.populate}" />
</f:metadata>
Наше требование состоит в том, чтобы проверить Id перед рендерингом страницы, и если его нет в нашей БД, нам нужно перенаправить его на страницу ошибки или показать сообщение об ошибке на той же странице, то есть на странице поиска
Мы пытались проверить Идентификатор книги двумя различными способами:
1. Использование проверки в методе заполнения следующим образом
if (bookFound)
{
//Display details
}
else
{
FacesContext fc = FacesContext.getCurrentInstance();
fc.addMessage("id", new FacesMessage("No such book found in the system. Please try again."));
fc.renderResponse();
}
Подключив пользовательский валидатор в view.xhtml и выбрав исключение валидатора (сообщение Faces) на экране. Мы используем CDI-WELD, поэтому мы можем использовать инъекцию.
<f:metadata>
<f:viewParam name="id" value="#{bookBean.id}"/>
<f:validator validatorId="bookIdValidator"/>
</f:viewParam>
<f:event type="preRenderView" listener="#{bookBean.populate}" />
</f:metadata>
Оба эти подхода работают, но они показывают ошибку на экране просмотра, а не на экране поиска. Можно перенаправить его на страницу ошибки, используя код:
FacesContext.getCurrentInstance().getExternalContext().redirect("/error.xhtml");
- Есть ли способ обработать проверку таким образом, чтобы сообщения об ошибках отображались на странице поиска, где нажимается outputLink. Мы понимаем, что нам нужно обрабатывать проверку на странице поиска, но как можно связать валидатор с h: outputLink. Можем ли мы использовать h: link в качестве альтернативы (нам нужно использовать GET-запросы, а не POST .. поэтому использование commmandLink или Button невозможно)
Есть ли лучший способ перенаправить на страницу с ошибкой, чем то, как мы это делаем.
(FacesContext.getCurrentInstance () getExternalContext () перенаправления ( "/ error.xhtml");..) * 1 031 *
Любые указатели будут с благодарностью.
Спасибо и всего наилучшего