我是JSF和Primefaces的新手,刚刚开始登录和基本导航的工作,我已经遇到了一个问题。我已经在SO上回答了大约10个类似的问题,但没有一个解决方案对我有效,所以我想我应该把我的具体问题贴出来,这样真正知道的人就可以给我指出正确的方向。
-
登录:似乎工作就像注销一样好,但我担心,因为浏览器中的url仍然说我在登录后的登录屏幕,我使用了直接从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";
}
-
登录后,我被带到正确目录下的正确页面,一切都被正确显示,但当你将鼠标悬停在链接上时,浏览器底部的状态栏显示了所有三个链接的相同url。下面提供的页面代码
<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>
-
NavigationBean
@Named(value = "navigationBean")@RequestScoped公共类NavigationBean实现Serializable {
public NavigationBean() {}
public String getPageToDisplay() {返回pageToDisplay;}
public void setPageToDisplay(String pageToDisplay) {这一点。pageToDisplay = pageToDisplay;}
private String pageToDisplay = "welcome.xhtml";}
当页面在登录后加载时,显示导航bean中的默认页面集,但单击除注销链接以外的任何链接会导致默认页面从中心布局单元中消失,并显示空白页面/单击注销链接确实会像预期的那样注销您。
1。登录:似乎工作得很好,因为注销,但我担心,因为在浏览器中的url仍然说,我在登录后登录屏幕
发送一个重定向(这指示浏览器在给定的URL上发送一个新的GET请求,该请求将反映在浏览器的地址栏中)。
return "/faces/system/index?faces-redirect=true";
2。登录后,我被带到正确的目录中正确的页面,一切都被正确显示,但当你将鼠标悬停在链接上时,浏览器底部的状态栏显示了所有三个链接的相同url。
<h:form>
确实提交到同一个页面。使用<h:outputLink>
或<h:link>
代替<h:commandLink>
进行页到页导航。请参见我何时应该使用h:outputLink而不是h:commandLink?
3。当页面在登录后加载时,将显示导航bean中的默认页面集,但单击除注销链接以外的任何链接都会导致默认页面从中心布局单元中消失,并显示空白页面
这个问题可以通过使用GET而不是ajax回发来进行页面到页面导航来解决。因此,当解决第2个问题时,它本身就解决了。您可能只希望将NavigationBean
重新设计为过滤器或阶段侦听器,它也拦截GET请求。您根本不应该使用POST进行导航。它挫败了书签功能、用户体验和搜索引擎优化,就像你现在遇到的那样。