有条件地在复合组件中渲染元素的属性

时间:2012-10-15 13:57:58

标签: jsf composite-component

我有以下复合组件:

<?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属性时,它仍会在html输入元素中呈现为size=0

我想要的是只有在具有有效值(例如,非空)时才呈现嵌套的h:inputText属性。或者,如果未明确覆盖嵌套元素的所有属性,我想公开它们的所有属性。

怎么可能?

3 个答案:

答案 0 :(得分:11)

您可以使用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" />

答案 1 :(得分:2)

除了BalusC的帖子:

您必须使用

cc:attribute-tag中的

type =“int”:

cc:attribute name =“maxlength”type =“int”

答案 2 :(得分:0)

我相信有另一种访问属性的方法。我在访问使用java保留关键字命名的属性时使用了JSF 2。

{cc.attrs [ '尺寸']}