使用JSF2.0和Primefaces 3.4进行导航

时间:2013-01-16 16:41:48

标签: java jsf primefaces

我是JSF和Primefaces的新手,刚刚开始登录和基本导航,我已经遇到了问题。我在这里已经完成了大约10个类似的问题,并且没有一个解决方案对我有用,所以我想我会发布我的具体问题,以便真正知道的人可以指出我正确的方向。

  1. 登录:似乎工作得很好,就像退出一样但是我很担心,因为浏览器中的网址仍然说我登录后就在登录界面,我直接使用了登录示例Oracle EE6文档。登录方法如下。

    public String login(){
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();
    try{
        logger.log(Level.FINE, "User credentials: name: {0}, password: {1}", new Object[] {this.username, this.password});
        request.login(this.username, encrypt(this.password));
        logger.log(Level.FINE, "User: {0} logged in", this.username);
    }catch(ServletException e){
        logger.log(Level.SEVERE, "User: {0} login failed, password: {1}", new Object[]{this.username, encrypt(this.password)});
        context.addMessage(null, new FacesMessage("Login Failed!"));
        return "error";
    }
    return "/faces/system/index";
    

    }

  2. 登录后,我被带到正确目录中的正确页面,所有内容都被正确显示,但当您将鼠标悬停在链接上时,浏览器底部的状态栏会显示所有三个相同的网址链接。下面提供的页面代码。

        <h:body>
        <p:layout fullPage="true">
            <f:facet name="last">
                <h:outputStylesheet library="css" name="discovery.css"></h:outputStylesheet>
            </f:facet>
            <p:layoutUnit styleClass="headerDiv" position="north" size="100">
                <h:graphicImage library="images" name="header.jpg"></h:graphicImage>
            </p:layoutUnit>
            <p:layoutUnit styleClass="navDiv" position="west" size="200" id="navPanel">
                <h:form>
                    <h:outputText value="Navigation Menu"></h:outputText>
                    <br/>
                    <p:commandLink value="First Time Users" update=":main">
                        <f:setPropertyActionListener target="#{navigationBean.pageToDisplay}" value="tutorial.xhtml"></f:setPropertyActionListener>
                    </p:commandLink>
                    <br/>
                    <p:commandLink value="Help" update=":main">
                        <f:setPropertyActionListener target="#{navigationBean.pageToDisplay}" value="help.xhtml"></f:setPropertyActionListener>
                    </p:commandLink>
                    <br/>
                    <h:commandLink action="#{loginBean.logout()}" value="Log Out"></h:commandLink>
                </h:form>
            </p:layoutUnit>
            <p:layoutUnit position="center" id="main">
                <ui:include src="#{navigationBean.pageToDisplay}"></ui:include>
            </p:layoutUnit>
        </p:layout>
    </h:body>
    
  3. NavigationBean

    @Named(value =“navigationBean”) @RequestScoped 公共类NavigationBean实现Serializable {

    public NavigationBean(){   }

    public String getPageToDisplay(){     return pageToDisplay;   }

    public void setPageToDisplay(String pageToDisplay){     this.pageToDisplay = pageToDisplay;   }

    private String pageToDisplay =“welcome.xhtml”; }

  4. 当登录导航bean中设置的默认页面后加载页面时,但单击除退出链接以外的任何链接会导致默认页面从中心布局单元中消失,并显示空白页面/单击在注销链接上会按照预期的方式将您注销。非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

  

1。登录:似乎工作得很好,但是我很担心因为浏览器中的网址仍然说我登录后就在登录屏幕上。

发送重定向(这指示浏览器在给定的URL上发送新的GET请求,该请求会反映在浏览器的地址栏中)。

return "/faces/system/index?faces-redirect=true";

  

2。登录后,我将被带到正确目录中的正确页面,所有内容都被正确显示,但当您将鼠标悬停在链接上时,浏览器底部的状态栏会显示所有三个链接的相同网址。

<h:form>确实提交到同一页面。使用<h:outputLink><h:link>代替<h:commandLink>进行页面到页面导航。另请参阅When should I use h:outputLink instead of h:commandLink?


  

3。在登录后加载页面时,显示导航bean中的默认页面集,但单击除注销链接以外的任何链接会导致默认页面从中心布局单元中消失,并显示空白页面 < / p>

这可以通过使用GET而不是ajax回发进行页面到页面导航来解决。因此,在解决#2时它本身已经解决了。您可能只想重新设计NavigationBean作为过滤器或阶段侦听器,它也会拦截GET请求。你根本不应该通过POST导航。它完全像你现在遇到的那样打败了书签,用户体验和搜索引擎优化。