JSF页面在属性getter中重定向

时间:2013-10-29 05:26:35

标签: jsf redirect

我有一个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;
    }
}

1 个答案:

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

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