Пустой атрибут id не допускается в компоненте JSF Composite - PullRequest
6 голосов
/ 06 марта 2012

Я сталкиваюсь с проблемой "Пустой атрибут id не разрешен в JSF" при использовании упомянутого ниже составного компонента для группы кнопок (количество кнопок может быть от 1 до 3) (я использую Mojarra 2-0-8 на Tomcat-7).

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:composite="http://java.sun.com/jsf/composite">


    <composite:interface>       
        <composite:attribute name="buttonCount" />
        <composite:attribute name="button1Id" />
        <composite:attribute name="button1Style" />
        <composite:attribute name="button1Action" />
        <composite:attribute name="button2Id" />
        <composite:attribute name="button2Style" />
        <composite:attribute name="button2Action" />
        <composite:attribute name="button3Id" />
        <composite:attribute name="button3Style" />
        <composite:attribute name="button3Action" />

    </composite:interface>
    <composite:implementation>       
        <h:commandButton  rendered = "#{cc.attrs.buttonCount ge '1'}" id="#{cc.attrs.button1Id}" styleClass="#{cc.attrs.button1Style}">
            <f:ajax listener="#{cc.attrs.button1Action}" immediate="true"/>                                     
        </h:commandButton>
        <h:panelGroup rendered = "#{cc.attrs.buttonCount ge '2'}">
            <h:commandButton  id="#{cc.attrs.button2Id}" styleClass="#{cc.attrs.button2Style}">
                <f:ajax listener="#{cc.attrs.button2Action}" immediate="true"/>                                     
            </h:commandButton>
        </h:panelGroup> 
        <h:panelGroup rendered = "#{cc.attrs.buttonCount eq '3'}">
            <h:commandButton  id="#{cc.attrs.button3Id}" styleClass="#{cc.attrs.button3Style}">
                <f:ajax listener="#{cc.attrs.button3Action}" immediate="true"/>                                     
            </h:commandButton>
        </h:panelGroup> 
    </composite:implementation>
</html>

Использование вышеуказанного CC.

<Buttons:myButton txtHeader="Title" txtDescription="text1"
                    txtAction="TextAction." button1Style="btnSave" buttonCount ="1" button1Id="btnSaveConf" button1Action="#{MyBean.save()}"></Buttons:myButton>

есть ли лучший способ динамически генерировать кнопки на основе счетчика или любого аналогичного ввода с главной страницы.примечание: - идентификатор, стили и действие должны отличаться по имени.

1 Ответ

6 голосов
/ 06 марта 2012

Нельзя использовать время рендеринга EL в атрибуте id. Вместо этого присвойте ему фиксированный идентификатор и присвойте составному идентификатору. Так, например:

<buttons:myButton id="foo" ... />

с в реализации

<h:commandButton id="button1" ... />
<h:commandButton id="button2" ... />
<h:commandButton id="button3" ... />

Затем они станут foo:button1, foo:button2 и foo:button3, где часть foo таким образом контролируется в клиенте шаблона.

Если вам действительно нужны динамические идентификаторы по какой-то неочевидной причине, вам лучше создать файл тегов, а не составной компонент.

...