Условно отображать атрибут элемента в составном компоненте

У меня есть следующий составной компонент:

<?xml version="1.0" encoding="UTF-8"?>
<ui:component xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"
    xmlns:composite="http://java.sun.com/jsf/composite">

    <composite:interface>
        <composite:attribute required="true" name="field" />
        <composite:attribute required="true" name="value" />
        <composite:attribute required="false" name="size"/>
    </composite:interface>

    <composite:implementation>
    ...
            <div class="wrapper">
                <h:inputText value="#{cc.attrs.value}"
                    id="#{field.id}" 
                    rendered="#{field.rendered}" 
                    size="#{cc.attrs.size}">
                </h:inputText>
                <h:messages for="#{field.id}" styleClass="errorMessage"/>
            </div>
    ...
    </composite:implementation>
</ui:component>

Проблема в том, что когда я использую этот компонент без установки его атрибута size, он все равно отображается как size=0 в элементе ввода html.

Я хочу отображать вложенный атрибут h:inputText только в том случае, если он имеет допустимое значение (например, не пустой). В качестве альтернативы я хотел бы открыть все атрибуты вложенного элемента, если они не переопределены явно.

Как это возможно?


person Balázs Németh    schedule 15.10.2012    source источник
comment
Пожалуйста, будьте осторожны с тегами, составной компонент не является пользовательским компонентом. См. также stackoverflow.com/questions/5704620/   -  person BalusC    schedule 15.10.2012
comment
Спасибо за исправление. Я знаю об этом, но я был немного невнимателен, может быть, мне нужно пару минут перерыва :S   -  person Balázs Németh    schedule 15.10.2012


Ответы (3)


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

<h:inputText ...>
    <c:if test="#{not empty cc.attrs.size}">
        <f:attribute name="size" value="#{cc.attrs.size}" />
    </c:if>
</h:inputText>

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

<cc:attribute name="size" required="false" default="10" />
person BalusC    schedule 15.10.2012
comment
Спасибо! Это работает, но для меня странно, что если я добавляю напрямую <f:attribute name="size" value="20"/> или <f:attribute name="size" value='20'/>, я получаю javax.servlet.ServletException: argument type mismatch, а если я добавляю <f:attribute name="size" value=20/>, я получаю Open quote is expected for attribute "value". - person Balázs Németh; 15.10.2012
comment
Это должно быть Integer, а не String. - person BalusC; 15.10.2012
comment
Да, но как добавить Integer в атрибут value? С кавычками интерпретируется как String, без кавычек исключение другое. - person Balázs Németh; 15.10.2012

Дополнительно к сообщению BalusC:

Вы должны использовать

type="int" в cc:attribute-tag :

копия:имя атрибута="maxlength" тип="int"

person Jens Bernert    schedule 01.03.2013

Я считаю, что есть альтернативный метод доступа к атрибутам. Я использовал это с JSF 2 при доступе к атрибуту, названному с помощью зарезервированного ключевого слова java.

{cc.attrs['размер']}

person Revoman    schedule 08.11.2013