2013-11-01 78 views
3

我想創建一個自定義消息渲染器來將h:消息呈現爲'p'html元素,而不是作爲'span'元素。它涉及以下消息標記:渲染JSF h:帶p元素而不是span的消息

<h:message id="firstNameErrorMsg" for="firstname" class="error-msg" /> 

我寫了下面的代碼,但這只是渲染一個空'p'元素。我想我必須複製原始組件中的所有屬性和文本,並將其寫入作者。但是,我不知道在哪裏可以找到所有的東西,而只是替換標籤似乎有很多工作要做。

有沒有更好的方法讓h:message標記呈現爲'p'元素?

代碼:

@FacesRenderer(componentFamily = "javax.faces.Message", rendererType = "javax.faces.Message") 
public class FoutmeldingRenderer extends Renderer { 

    @Override 
    public void encodeEnd(final FacesContext context, final UIComponent component) throws IOException { 

     ResponseWriter writer = context.getResponseWriter(); 
     writer.startElement("p", component); 
     writer.endElement("p"); 

    } 
} 

回答

4

這不正是 「大量的工作」。它基本上是從標準的JSF消息渲染器擴展而來,複製它的encodeEnd()方法,包括大約200行,然後編輯只有2行,以便用"p"代替"span"。不到一分鐘就可以完成。

但是,我同意這是一個簡單的醜陋的方法。

您可以考慮以下的替代品,其並不一定是更容易,但至少更乾淨:

  1. 首先,什麼是在這種特殊情況下使用<p>代替<span>semantic值?說實話,我沒有看到任何語義價值。所以,我建議只保留它<span>。如果唯一的功能要求是讓它出現<p>,那麼只需扔入一些CSS。例如。

    .error-msg { 
        display: block; 
        margin: 1em 0; 
    } 
    

  2. 可以得到用於直接在EL特定客戶端ID的所有消息如下,假定母體形式具有ID formId

    #{facesContext.getMessageList('formId:firstName')} 
    

    所以,打印的摘要和第一條消息的細節,只是做:

    <c:set var="message" value="#{facesContext.getMessageList('formId:firstName')[0]}" /> 
    <p title="#{message.detail}">#{message.summary}</p> 
    

    你可以隨時隱藏它遠成像這樣的自定義標籤文件:

    <my:message id="firstNameErrorMsg" for="firstname" class="error-msg" /> 
    

  3. 使用OmniFaces <o:messages>。當指定var屬性時,則可以使用它,如<ui:repeat>

    <o:messages for="firstNameErrorMsg" var="message"> 
        <p title="#{message.detail}">#{message.summary}</p> 
    </o:messages> 
    
+0

BalusC嗨, 感謝對我的問題的解決你所提供的可能性。我已經使用了第一個你提交的,主要是因爲它是最快的,也是最容易實現的。 我不得不合作的各種樣式表的巨大尺寸,以及業主不願意讓我改變它們的想法也使我無法繼續使用CSS選項。 此外,我已經使用了比OmniFaces更多的其他jsf標籤庫,因此無法真正使用OmniFaces選項。 再次感謝和問候, Kees –

+0

OmniFaces不是一個組件庫,而是一個實用程序庫,實質上與每個組件庫兼容。您可以將它與PrimeFaces,RichFaces,ICEFaces等結合使用。 – BalusC