7

JSF キューにグローバル メッセージがある場合にのみ、ブロックを表示しようとしています。

を使用しようとしましrendered="#{not empty facesContext.getMessageList(null)}"たが、常に false と評価されます。

私が見つけた唯一の方法は、カスタム EL 関数を作成して Java でテストすることです。

例えば。: 私の el 関数 :

public static boolean isFacesGlobalMessages() {
  return ! FacesContext.getCurrentInstance().getMessageList(null).isEmpty();
}

JSFページ:

<h:panelGroup class="block1" layout="block" rendered="#{el:isFacesGlobalMessages()}">
  <div class="block-warn-body">
    <rich:messages id="msg" globalOnly="true"/>
  </div>
</h:panelGroup>

Mojarra 2.1.5 を使用しています。

何か不足していますか?ありがとう !

編集:次の提案を試みましたが、これまでのところ運がありません:

  • #{not empty facesContext.getMessageList(null)}-> 常に false
  • #{! facesContext.getMessageList(null)}-> エラー
  • #{! empty facesContext.getMessageList(null)}-> 常に false
  • #{fn:length(facesContext.getMessageList(null)) > 0}-> 常に false
  • #{not empty facesContext.messageList(null)}-> エラー: メソッド messageList が見つかりません
  • #{not empty facesContext.messageList}- >検証エラーの場合はtrueを返します(グローバルエラーでのみtrueが必要です)
  • #{! facesContext.getMessageList(null).isEmpty()}-> IllegalAccessException をスローします: クラス javax.el.BeanELResolver は、修飾子 "public" を持つクラス java.util.Collections$UnmodifiableCollection のメンバーにアクセスできません
4

3 に答える 3

18

カスタムEL関数は不要

これを試して

rendered="#{not empty facesContext.messageList}"

編集

自分では試していませんが、試してみてください

rendered="#{not empty facesContext.messageList(null)}"

アイデア...

 rendered="#{not facesContext.validationFailed and not empty facesContext.messageList}"
于 2012-07-31T09:30:22.933 に答える
2

これが古いスレッドであることは知っていますが、とらえどころのない解決策を探すのに苦労した後、この動作の説明を見つけました。この説明がどこにも見つからないため (理由はわかりません)、これが役立つと思います。

私はel関数をわずかに変えました:

public static boolean hasMessages(String clientId) {
    return !FacesContext.getCurrentInstance().getMessageList(clientId).isEmpty();
}

違いはパラメータclientIdです。この関数の動作は、 を使用した場合とまったく同じ#{not empty facesContext.getMessageList(clientId)}です。clientId = nullコードをデバッグしていると、 で関数を呼び出したときに、関数内のの値がclientId実際には""(空の文字列)であることに気付きました。

その後、EL 3.0 仕様を調べたところ、次のことがわかりました。

セクション 1.23 - 型変換

すべての式は、期待される型のコンテキストで評価されます。式の評価の結果は、期待されるタイプと正確に一致しない場合があるため、次のセクションで説明するルールが適用されます。[...]

セクション 1.23.2 - A を文字列に強制する

A が null の場合: "" を返す [...]

したがって、値をパラメーターとしてclientId = null渡してメッセージを要求する方法はないと思います。null唯一の方法は、パラメーターを使用したり、パラメーターが空の文字列に設定されているかどうかをテストしたりせずに、それを行う関数を用意することです。

于 2016-04-11T21:35:42.870 に答える
1

これを試して:

rendered="#{not empty facesContext.getMessageList(null)}

それ以外の:

rendered="#{not empty facesContext.messageList(null)}"

ダニエルの答えで。

またはこれ:

rendered="#{not empty facesContext.getMessageList('inputForm')}

「inputForm」は次のとおりです。

<h:form id="inputForm">
...
</h:form>

ページ上のいくつかのフォームの 1 つだけにアドレス指定する場合。

于 2015-07-31T04:58:49.097 に答える