2011-04-20 92 views
3

我想使用稱爲Notification bar的primefaces工具在用戶登錄時顯示歡迎消息。問題是我不知道如何才能觸發它,只有當登錄成功時(如果密碼錯誤不應該被顯示)並且即使我被重定向到另一個頁面也被顯示。如何在登錄時顯示歡迎信息通知?

這是我的洛頁面看起來像:

<ui:composition template="WEB-INF/templates/BasicTemplate.xhtml"> 
    <!-- THE REGISTRATION FORM --> 
    <ui:define name="loginForm"> 
     <h2>Login page</h2> 
     <h:form> 
     <p:panel>     
        <h:outputText value="*[email protected]:" /> 
        <h:inputText id="email" value="#{securityController.email}" binding="#{emailComponent}"/>     
        <br/> 
        <h:outputText value="*Lozinka: " /> 
        <h:inputSecret id="password" value="#{securityController.password}" validator="#{securityController.validate}">      
         <f:attribute name="emailComponent" value="#{emailComponent}" /> 
        </h:inputSecret>    

        <br/> 
        <span style="color: red;"><h:message for="password" 
        showDetail="true" /></span> 
        <br/> 
        <h:commandButton value="Login" action="#{securityController.logIn()}" onclick="topBar.show()"/>     

       </p:panel> 
      </h:form> 

    </ui:define> 

</ui:composition> 

這是管理的bean,做重定向的方法:

@ManagedBean 
@RequestScoped 
public class SecurityController { 

    @EJB 
    private IAuthentificationEJB authentificationEJB;  

    public String logIn() {  
     if (authentificationEJB.saveUserState(email, password)) {    
      return "main.xhtml"; 
     } else { 
      return null; 
     } 
    } 

通知欄位於模板所有頁面使用(BasicTemplate.xhtml):

<f:view contentType="text/html"> 
    <h:head> 
     ... 
    </h:head> 

    <h:body> 
     ...  
     <p:notificationBar position="top" widgetVar="topBar" styleClass="top"> 
      <h:outputText value="Welcome, you are now logged in!" 
       style="color:#FFCC00;font-size:36px;" /> 
     </p:notificationBar> 
    </h:body> 
</f:view> 

我希望它只出現一次用戶獲取正確登錄(如果執行else塊,應該不會出現)。

我該如何做到這一點?

更新

改變了login()方法:

public String logIn() { 
     if (authentificationEJB.saveUserState(email, password)) { 
      // Pass a parameter in ussing the URL.(The notification bar will 
      // read this parameter) 
      return "main.xhtml?faces-redirect=true&login=1"; 
     } else { 
      return null; 
     } 
    } 

添加了這個在main.xhtml

<ui:composition template="WEB-INF/templates/BasicTemplate.xhtml"> 
    <ui:define name="mainForm">  
     <h2>The main page</h2> 
     <script type="text/javascript"> 
      jQuery(function() { 
      topBar.show() 
      }); 
     </script>   
     <p:notificationBar id="notbar" position="top" widgetVar="topBar" styleClass="top" rendered="#{param.login == 1}"> 
      <h:outputText value="Welcome, you are now logged in!" 
       style="color:#FFCC00;font-size:36px;" /> 
     </p:notificationBar> 

    </ui:define> 

</ui:composition> 
+2

如果您想在main.xhtml中顯示通知欄,我很困惑@sfrj爲什麼在登錄頁面中顯示? – Bastardo 2011-04-20 12:24:41

+0

是的你是對的。我只是改變了這一點(查看更新後的問題)。通知欄當前位於所有頁面正在使用的模板中。如果登錄按鈕是正確的,我如何從登錄按鈕觸發它? – sfrj 2011-04-20 12:32:09

+2

我認爲問題是在加載main.xhtml時觸發欄。由於OP使用JSF模板沒有'H:body'在頁面上添加一個'的onLoad =「topBar.show()」' – 2011-04-20 12:32:18

回答

3

包括在你main.xhtmlp:notificationBar(刪除它來自模板)並將以下JavaScript添加到您的main .xhtml

<script type="text/javascript"> 
    jQuery(function() { topBar.show() }); 
</script> 

這將顯示欄的頁面加載時。如果我看了你的代碼的權利,main.xhtml只有成功登錄後顯示。

+0

Main.xhtml沒有顯示。我需要確保只有當用戶登錄並且只有一次時,欄纔會顯示。我們是否可以調整該腳本多一點按照需要工作? – sfrj 2011-04-20 13:40:06

+0

你可以使用通知欄的'渲染'屬性,讓渲染取決於用戶是否登錄。只是一個想法。 (這有點骯髒,因爲如果組件未被渲染,會導致出現js錯誤)。 – 2011-04-20 15:27:56

+0

我想我會嘗試一個類似的想法。我想我會保存會話中的一些變量,然後我只會渲染,如果該變量不爲null。之後,我將從會話中刪除變量。我認爲這可以工作,我認爲這將只顯示一次。我不知道這是可能的,但我會嘗試。 – sfrj 2011-04-20 16:58:58