我正在開發一個帶有JSF 2.0,hibernate和primefaces的網站。 其實我正在實施管理面板,網站管理員可以將整個應用程序置於「維護模式」。這是通過更改應用程序作用域bean上的標誌(稱爲「AppConfigurationBean」)來完成的。 如果標誌處於活動狀態,則用戶必須通過faces-config.xml中聲明的條件導航規則返回到名爲「maintenance.xhtml」的頁面。 用戶可以通過插入管理員很少發出的特殊旁路鍵來繞過維護頁面。如果他這樣做,會在特殊會話範圍的bean上激活一個標誌,該標誌保存有關用戶的信息,並被稱爲「CurrentClientSessionBean」。 如果從CurrentClientSessionBean上的一個特殊方法返回的值(其中包含應用程序bean的維護模式標誌和自身的「繞過密鑰」標誌),導航規則將起作用。有條件的導航無法在JSF中正常工作
這裏是faces-config.xml中的導航規則:
<navigation-rule>
<description>System</description>
<from-view-id>*</from-view-id>
<navigation-case>
<display-name>Maintenance Mode</display-name>
<from-outcome>*</from-outcome>
<if>#{currentClientSessionBean.toReturnToMaintenance}</if>
<to-view-id>/maintenance.xhtml</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
這裏是maintenance.xhtml頁
<ui:composition id="maintenance" xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:plm="http://java.sun.com/jsf/composite/plmCustomComponents">
<f:verbatim><!DOCTYPE html></f:verbatim>
<html>
<h:head>
<title>#{msg.applicationTitle}</title>
<meta charset="UTF-8"></meta>
<meta http-equiv="content-type" content="text/html; charset=utf-8"></meta>
<h:outputStylesheet library="default" name="css/normalize.css" />
<h:outputStylesheet library="default" name="css/icons.css" />
<h:outputStylesheet library="default" name="css/main.css" />
</h:head>
<f:metadata>
<ui:include src="metadata/browserViewParams.xhtml" />
</f:metadata>
<h:body>
<div id="legalPart">
<ui:insert name="legalPart">
<ui:include src="/structure/legalPart.xhtml" />
</ui:insert>
</div>
<p:panel>
<h1>
<h:outputText value="#{msg.maintenancePageTitle}" />
</h1>
<p>
<h:outputText value="#{msg.maintenancePageBodyMsg}" />
</p>
<h:form>
<p:outputLabel for="bypassKeyInput"
value="#{msg.maintenancePageInsertBypassKeyLabel}" />
<br />
<p:inputText id="bypassKeyInput"
value="#{maintenanceBacking.keyBuffer}" required="true" />
<br />
<p:message for="bypassKeyInput" />
<p:commandButton value="#{msg.checkPassword}"
action="#{maintenanceBacking.checkBypassKey}" ajax="false" />
</h:form>
</p:panel>
<ui:debug />
</h:body>
</html>
</ui:composition>
維護後盾是非常簡單的,它只是檢查,如果bypasskey匹配真實的,並且如果真實的話,則對主頁進行簡單的導航。
現在的條件導航CurrentClientSessionBean方法是這樣的一種:
/**
* Special getter that determines if user should return to maintenance
*
* @return
*/
public boolean isToReturnToMaintenance(){
try{
AppConfigurationBean appConfigurationBean = JSFAppUtils.findApplicationBean("appConfigurationBean");
boolean result = ((!this.hasBypassKey) && appConfigurationBean.isMaintenanceModeOn());
return result;
}catch(NotFoundException e){
logger.error("NotFoundException thrown in isToReturnToMaintenance method", e);
throw new RuntimeException("NotFoundException thrown in isToReturnToMaintenance method", e);
}
}
這裏的主要問題是:一些奇怪的原因,當維護模式是活動的,用戶被強制返回到保養即使他將右旁路鍵放入輸入中也是如此。
此外:一定有什麼地方我的應用程序中真的錯了,因爲我想評論的條件導航規則,這意味着維護頁面應該是不可達,並轉移到維護模式應該對應用程序沒有任何影響,但維護模式系統仍以我描述的相同態度繼續工作。
請幫助我,對不起,如果我不夠清楚。向我詢問任何你不懂的代碼。
還是沒人回答?至少請告訴我如何在JSF生命週期中調試導航階段 – Katuiros