2011-08-09 1 views
3

私は最初にWeblogic BeehiveでJSF 2.0に書かれたサイトを書き直す途中ですが、新しいサイトが生成するメッセージをと一致するようにする必要がある問題に遭遇しています。正確にはが一致します既存のサイトの出力。h:メッセージをオーバーライドするカスタムfaceletを作成して設定するにはどうすればよいですか?

私は素晴らしいタグを使用しようとしましたが、既存のメッセージフレームワークのスタイルとロジックはこの出力にうまく収まりません。

JSFには、メッセージを出力するだけでなく、条件付きロジックも実行するカスタムタグを作成できるオプションがありますか?

たとえば、私はFacesMessagesを要約と詳細文字列で作成していますが、古いサイトの形式では最も高い要約のみが表示されます。たとえば、4つのメッセージを追加し、それぞれに同じサマリーメッセージがあり、異なる詳細が追加されます。重大度が最も高いサマリーを表示したいだけです。

また、各メッセージではなく、メッセージとして表示され、スタイルが設定されている必要があり、詳細の一部には条件付きのCSSクラスが必要です。

+0

、言及タグJSF仕様のバージョンを使用してください:これは私がブラウザでページに取得していますレンダリングされた出力です。回答は通常、それに大きく依存します。 – BalusC

答えて

0

私は私のJSFページ(XHTML)でこれで終わった:私は、私はここにパターンを壊すんだと確信しているが、セクションは、それが解決できる場所動作していないようです

  <c:set var="messageList" value="#{facesContext.messageList}" /> 
      <c:set var="maxSev" value="#{facesContext.maximumSeverity.ordinal}" /> 
      <ui:repeat value="${messageList}" var="fm" > 
       <c:choose> 
        <c:when test="${fm.severity.ordinal eq 0}"> 
         <c:set var="summaryStyleClass" value="outcome"/> 
         <c:set var="detailStyleClass" value="outcome_details"/> 
        </c:when> 
        <c:when test="${fm.severity.ordinal eq 1}"> 
         <c:set var="summaryStyleClass" value="warning_title"/> 
         <c:set var="detailStyleClass" value="warning"/> 
        </c:when> 
        <c:when test="${fm.severity.ordinal eq 2}"> 
         <c:set var="summaryStyleClass" value="error_title"/> 
         <c:set var="detailStyleClass" value="error"/> 
        </c:when> 
        <c:when test="${fm.severity.ordinal eq 3}"> 
         <c:set var="summaryStyleClass" value="fatal"/> 
         <c:set var="detailStyleClass" value="fatal_details"/> 
        </c:when> 
       </c:choose> 
      </ui:repeat> 
      <div class="${detailStyleClass}" > 
       <div class="${summaryStyleClass}"> 
         <ui:repeat value="${messageList}" var="fm" > 
          <c:choose> 
           <c:when test="${fm.severity.ordinal eq maxSev}"> 
            ${fm.summary} 
           </c:when> 
          </c:choose> 
         </ui:repeat> 
       </div> 
        <ul> 
        <ui:repeat value="${messageList}" var="msg"> 
         <li><h:outputText value="${msg.detail}"/></li> 
        </ui:repeat> 
       </ul> 
      </div> 

summaryStyleClassおよびdetailStyleClass変数。最高の重大度メッセージがページにどのようなものであるかに応じてメッセージをスタイルする必要があるため、私はそれらを繰り返しています。

  <div> 
       <div>Warning:</div> 
       <ul> 
         <li>Warning message.</li> 
       </ul> 
      </div> 

お知らせなしのスタイル...将来JSFの質問に

3

JSF 2.xを使用している場合は、ループ内でFacesContext#getMessageList()を反復処理できます。各項目はFacesMessageで、これにはいくつかのゲッタがあります。

<ui:repeat value="#{facesContext.messageList}" var="facesMessage"> 
    Severity: #{facesMessage.severity}<br /> 
    Summary: #{facesMessage.summary}<br /> 
    Detail: #{facesMessage.detail}<br /> 
    <br /> 
</ui:repeat> 

これにより、メッセージの周りのより詳細なHTMLマークアップが可能になります。

あなたはFacesContextでこの方法を欠いJSF 1.xの上ではまだしている場合は、あなたには、いくつかのユーティリティ豆の助けを借り、さらにはELの機能を有する第1 List<FacesMessage>FacesContext#getMessages()を収集する必要があります。

List<FacesMessage> messageList = new ArrayList<FacesMessage>(); 
Iterator<FacesMessage> messages = FacesContext.getCurrentInstance().getMessages(); 

while (messages.hasNext()) { 
    messageList.add(messages.next()); 
} 

その後、同じ方法で<ui:repeat>を使用して、このmessageListを反復することができます。

+0

チップをありがとう。リストを反復することはあまり問題ではありません。私は私の目を閉じてそれを行うことができます;-)私は条件付きで要約を表示し、メッセージが特別なスタイルを持つ場合にエスケープされないHTMLを表示したいと思います。 JSF 2.0を使用しています – bakoyaro

+0

それぞれJSFの 'rendered'属性と' コンポーネントを通常の方法で使います。今のところ、マークアップを自由に制御できます。 – BalusC

+0

コメントをいただき、ありがとうございました。私はJSFの学習と使用にいくつかの問題を抱えています。あなたは、JSFのための情報の難しさのフォントです。私を助けるために良いJSF 2.0の本をお勧めできますか?私はEclipseを使用しているシニア開発者であり、JEEに精通しています.JSFのもので、学習/使用上の問題があります。ありがとう、bakoyaro – bakoyaro

関連する問題