【发布时间】:2011-09-07 07:16:23
【问题描述】:
我们正在使用 JSF 2 + Primefaces + Glassfish + CDI/WELD 进行开发。 我们的 search.xhtml 页面上有一个图书列表的 datalist/dataTable,每个都呈现为一个 outputLink。单击任何条目时,view.xhtml 将显示所有书籍详细信息。这是我们调用的 search.xhtml 中的代码:
<h:outputLink value="${request.contextPath}/viewBook.xhtml?id=${book.id}">${book.title}
</h:outputLink>
在 viewBook.xhtml 中,根据 URL 中传入的 book Id,在渲染页面之前填充详细信息,如下所示:
<f:metadata>
<f:viewParam name="id" value="#{bookBean.id}"/>
</f:viewParam>
<f:event type="preRenderView" listener="#{bookBean.populate}" />
</f:metadata>
我们的要求是在渲染页面之前验证 Id,如果我们的数据库中不存在,我们需要将其重定向到错误页面或在同一页面(即搜索页面)上显示错误消息
我们尝试以两种不同的方式验证图书 ID: 1.在populate方法中使用validation如下
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().redirect("/error.xhtml");)
任何指针将不胜感激。
感谢和问候
【问题讨论】:
标签: validation jsf-2 redirect