强制欢迎页面

时间:2013-10-24 16:09:20

标签: jsf jsf-2

我有一个JSF 2.0应用程序,它有一个叫做协议的bean。这个应用程序总共有4页:main.xhtml,details.xhtml,generation.xhtml和generationFailed.xhtml。正确的导航顺序应该是main.xhtml - > details.xhtml并给定某些条件,generation.xhtml或generationFailed.xhtml。

顺序必须是这样的,因为为了正确显示details.xhtml和生成页面,必须根据用户在main.xhtml中的输入构建bean。

问题是客户可以通过在浏览器中输入URL地址直接转到任何页面。因此,当加载例如details.xhtml时,它会抛出一个错误,因为协议bean有几个null属性。我必须以某种方式知道协议bean的属性是否为null(该属性称为id),如果它为null,则强制重定向到main.xhtml。

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

您必须为页面使用过滤器,并为每个客户端构建虚拟状态机。状态机保留您描述的导航规则:main.xhtml - > details.xhtml - > generation.xhtml或generationFailed.xhtml。通过将状态保存在cookie或任何你喜欢的状态(在会话中或服务器端以某种方式),您可以通过检查实际状态来管理,如果实际请求是合法的还是不合适的。

答案 1 :(得分:1)

当用户从main.xhtml导航到任何页面时,只需将main.xhtml bean的属性放入flash范围

       public String gotoDetails() {  
       getFlash().put("id", Id);  
       return "/pages/details?faces-redirect=true";  
  }

然后在Details bean中检查此属性以确保它不为null,否则将用户重定向到主页面以选择第一个订单或其他任何东西。使用此方法进行检查

      public void loadPage(ComponentSystemEvent cse) {  
       if (null == getID()) {  
            FacesContext  
                      .getCurrentInstance()  
                      .getApplication()  
                      .getNavigationHandler()  
                      .handleNavigation(FacesContext.getCurrentInstance(), null,  
                                "/pages/main?faces-redirect=true");  
       }  
  }  

然后您可以使用

在details.xhtml中调用preRenderView event中的上一个方法
    <f:event listener="#{yourdetailsbean.loadPage}" type="preRenderView" />   

答案 2 :(得分:0)

好吧,如果用户输入URL,浏览器将发送GET请求,但如果他们提交表单,则会提交POST请求。您可以简单地编写一个servlet Filter,将FacesServlet的所有GET请求重定向到欢迎页面。

答案 3 :(得分:0)

创建一个sessionscoped bean并添加3个布尔值:

firstPageVisited,secondPageVisited,thirdPageVisited。

在第4页上检查thirdPageVisited是否为false,重定向到3,如果secondPageVisited为false则重定向为2 ...