2012-05-01 49 views
2

私のprevious questionでは、ログインフォームからの検証メッセージを表示するという問題がありました。その問題は解決されましたが、今度はFacesContex#addMessageというカスタムメッセージを表示できません。JSF FacesContext#addMessageが表示されない

JSF + PrimeFacesの使用。 LoginBeanSessionScopedManagedBean)で

<p:dialog header="Login" widgetVar="loginDlg"> 
    <h:form id="loginForm"> 
     <h:panelGrid columns="3" cellpadding="5"> 
      <h:outputLabel for="username" value="Username:" /> 
      <p:inputText value="#{loginBean.username}" id="username" required="true" label="username" /> 
      <p:message for="username" /> 
      <h:outputLabel for="password" value="Password:" /> 
      <h:inputSecret value="#{loginBean.password}" id="password" required="true" label="password" /> 
      <p:message for="password" /> 
      <f:facet name="footer"> 
       <p:commandButton value="Login" id="loginDlgButton" update=":loginForm,:welcomeMsg" actionListener="#{loginBean.login}" 
            oncomplete="handleLoginRequest(xhr, status, args)"/> 
       <p:message for="loginDlgButton" /> 
      </f:facet> 
     </h:panelGrid> 
    </h:form> 
</p:dialog> 

public void login() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    RequestContext rContext = RequestContext.getCurrentInstance(); 
    HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest(); 
    try { 
     request.login(this.username, this.password); 
     rContext.addCallbackParam("loggedIn", true); 
    } catch (ServletException e) { 
     rContext.addCallbackParam("loggedIn", false); 
     context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Login Error", "Invalid credentials")); 
    } 
} 

このコード検証が成功し、ログインに失敗したとき、 "無効な資格" というメッセージを表示するが、ないはずです。さらに、私のウェブページの本文のどこかに次の行を追加しました:

<p:messages autoUpdate="true" /> 

私のメッセージはそこにも表示されません。

Javadocs

はのclientIdがnullの場合

は、このFacesMessageのは、任意の特定のコンポーネントのインスタンス

に関連付けられていないと想定される。しかし、私はこれが何を意味するのか理解できないと言います。

答えて

3

場所<p:messages autoUpdate="true" />を、または

+0

ダニエルありがとう。他の答えに私のコメントを参照してください。 – perissf

+0

@perissfこのアプローチはどうですか? http://stackoverflow.com/a/321722/617373 – Daniel

+1

偉大なヒント、ありがとう – perissf

2

コードにp:messagesタグが表示されません。これはp:messageタグと同じではありません。 p:メッセージが別のコンポーネントに添付され、検証の一部として表示されます。 p:messages(またはp:growl)コンポーネントは、あなたのbeanで更新しているものです。あなたのform内部またはあなたのcommandButtonのupdateによって更新されているいくつかのラッパー内

<h:form id="loginForm"> 
<p:growl id="messageGrowl" showDetail="true" sticky="false" /> 
<h:panelGrid columns="3" cellpadding="5"> 
+1

私の悪いcontext.addMessage(...loginDlgButton代わりのnullを配置します。このようなメッセージやうなり声のコンポーネントを追加してみてください。それはすでに働いていましたが、答えはちょっと遅かったり、私はそれを見ていませんでした!したがって、メッセージはp:messagesタグで捕捉されます。しかし、beanにcomponentIdを置かずに、非グローバルなp:messageタグでメッセージをキャッチする方法はありますか? – perissf

+1

メッセージをキャッチしてダイアログに表示する方法を尋ねていると思いますか? p:のメッセージをp:ダイアログに入れてください。コマンドボタンの更新リストに追加することができます。コンテキストで返されたメッセージがあれば、そのメッセージを更新します。他のメッセージコンポーネントでautoUpdate = "true"をオフにする必要があります。そうしないと、両方が更新されます。 – SteveS

関連する問題