Каков наилучший способ создания параметризованных многоцелевых пользовательских тегов лицевой стороны? - PullRequest
1 голос
/ 20 сентября 2010

Я создал тег Facelet для рендеринга текстового ввода с меткой. Это очень полезно, когда вы избегаете повторения одного и того же кода снова и снова.

Хотя я борюсь с различными вариантами использования на этой единственной вкладке (дата против текста, обязательная и не обязательная, текстовая область против обычного текста и т. Д.)

В результате у меня в компоненте было несколько тегов с более или менее сложным отображаемым атрибутом, как показано здесь:

    <h:inputText    
            onblur="makeNotEmpty(this)"
            onfocus="makeNotEmptyFocus(this)"
            id="#{cid}"
            value="#{value}"
            rendered="#{textarea!='true' and type!='email' and notrequired!='true' and nullablenumber!='true'}"
            style="#{style }"   
            required="true"
            disabled="#{disabled }">        
            <f:validator validatorId="notnull"/>    

    </h:inputText> 
    <h:inputText                    
        onblur="    
            makeNotEmpty(this)"
        onfocus="makeNotEmptyFocus(this)"
        id="#{cid}"
        value="#{value}"
        rendered="#{type=='email'}"
        style="#{style }"
        required="true"
        disabled="#{disabled }">            
        <f:validator validatorId="email" />
        <f:validator validatorId="notnull"/>
    </h:inputText> 

Конечно, это не оптимально и довольно утомительно писать. Еще одна проблема, которую я считаю, заключается в том, что при использовании этого подхода у меня есть несколько компонентов с одинаковым идентификатором в дереве компонентов (я не уверен, что это проблема, поскольку только один элемент с одинаковым идентификатором отображается одновременно, но я видел несколько странных проблемы с воссозданием дерева страниц, заставляет меня верить, что это проблема)

Я использую ICEFaces 1.8.2 (но проблема должна быть независимой от реализации). Какое решение для этого? С помощью ? Что-то другое? Спасибо!

1 Ответ

1 голос
/ 20 сентября 2010

Вы можете поместить <f:validator> в JSTL <c:if>.Он будет создан во время сборки тега.

<html xmlns:c="http://java.sun.com/jsp/jstl/core">
...
<c:if test="#{type eq email}"><f:validator validatorId="email" /></c:if>

Кстати, IceFaces не является реализацией JSF, это библиотека компонентов JSF, которая должна работать поверх реализации JSF. Mojarra иMyFaces - это реализации JSF.

...