2011-08-09 46 views
3

我正在重寫最初用Weblogic Beehive寫入JSF 2.0的站點,我遇到了一個問題,我需要將新站點生成的消息轉換爲完全匹配匹配的格式現有網站的輸出。如何編寫和配置自定義facelet以覆蓋h:消息?

我已經嘗試使用很好的標記,但現有消息框架的樣式和邏輯不適合很好地適合此輸出。

在JSF中有沒有選項可以讓我創建一個自定義標籤,它不僅會輸出消息,還會對它們執行條件邏輯?

例如,我一直在創建帶有摘要和細節字符串的FacesMessages,但舊站點的格式只顯示最高的摘要。例如,我添加4條消息,每條消息具有相同的摘要消息以及不同的詳細信息。我只想顯示最高嚴重性的摘要。

此外,我需要顯示的消息和樣式作爲一個框,而不是每個消息和一些細節需要有條件的CSS類。

+0

在未來JSF的問題,請提及和使用標籤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 vars。我在遍歷它們,因爲我需要根據頁面的最嚴重消息的樣式來設置消息的樣式。這是渲染輸出我得到的頁面在瀏覽器:

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

公告沒有風格...

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標記。

如果你仍然對JSF 1.x的缺乏這種方法在FacesContext,那麼你需要收集FacesContext#getMessages()List<FacesMessage>先用一些輔助bean的幫助,甚至EL函數:

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方面遇到了一些麻煩,並且您是SO中JSF的事實信息字體。你能推薦一本好的JSF 2.0書來幫助我嗎?我是一名使用Eclipse的高級開發人員,熟悉JEE,這只是JSF的東西,我在學習/使用時遇到了問題。謝謝,bakoyaro – bakoyaro