我有一个JSF 2应用程序,它从数据库中检索数据并将其显示在页面上。 我有一个名为“getCurrentPage”的属性get方法,它将显示数据库数据。在此方法内部,如果指定页面不存在数据,我想重定向到404页面。 我试过了
FacesContext.getCurrentInstance().getExternalContext().redirect("404.xhtml");
但是我得到了一个java.lang.IllegalStateException。 如何重定向?
这是我的XHTML代码段
<h:panelGroup layout="block">
<h:outputText escape="false" value="#{common.currentPage.cmsPageBody}"/>
</h:panelGroup>
这是我的bean片段
public CmsPage getCurrentPage() {
HttpServletRequest request = (HttpServletRequest) (FacesContext.getCurrentInstance().getExternalContext().getRequest());
try {
String requestUrl = (String) request.getAttribute("javax.servlet.forward.request_uri");
if (this.currentCmsPage == null) {
// Page not found. Default to the home page.
this.currentCmsPage = cmsPageBL.getCmsPage("/en/index.html", websiteId);
} else {
this.currentCmsPage = cmsPageBL.getCmsPage(requestUrl, websiteId);
}
if (this.currentCmsPage == null) {
FacesContext.getCurrentInstance().getExternalContext().redirect("404.xhtml");
}
}
} catch (Exception ex) {
log.error("getCurrentPage Exception: ", ex);
}
return currentCmsPage;
}
}
答案 0 :(得分:1)
您不应该在getter方法中执行业务逻辑。它只是所有颜色的麻烦的配方。 Getter方法应该只返回已经准备好的属性。只需使用预渲染视图事件侦听器。
E.g。
<f:event type="preRenderView" listener="#{common.initCurrentPage}" />
<h:panelGroup layout="block">
<h:outputText escape="false" value="#{common.currentPage.cmsPageBody}"/>
</h:panelGroup>
与
public void initCurrentPage() throws IOException {
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
String requestUrl = (String) ec.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI);
if (currentCmsPage == null) {
// Page not found. Default to the home page.
currentCmsPage = cmsPageBL.getCmsPage("/en/index.html", websiteId);
} else {
currentCmsPage = cmsPageBL.getCmsPage(requestUrl, websiteId);
}
if (currentCmsPage == null) {
ec.redirect(ec.getRequestContextPath() + "/404.xhtml");
}
}
public CmsPage getCurrentPage() {
return currentCmsPage;
}
请注意,我也改进了一些糟糕的逻辑。