0

我有一个 JSF 2 应用程序,它从数据库中检索数据并将其显示在页面上。我有一个名为“getCurrentPage”的属性获取方法,它将显示数据库数据。在此方法中,如果指定页面不存在数据,我想重定向到 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;
    }
}
4

1 回答 1

1

您不应该在 getter 方法中执行业务逻辑。这只是各种颜色的麻烦。Getter 方法应该只返回已经准备好的属性。只需使用预渲染视图事件侦听器即可。

例如

<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;
}

请注意,我还改进了一些糟糕的逻辑。

于 2013-10-30T13:48:17.897 回答