Jsf 有条件地呈现元素';复合组件中的属性

Jsf 有条件地呈现元素';复合组件中的属性,jsf,composite-component,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"

我有以下复合组件:

<?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
的属性具有有效值(例如非空)时才呈现该属性。或者,如果嵌套元素的所有属性没有被显式覆盖,我想公开它们

如何可能?

您可以使用JSTL
有条件地构建视图,并
单独指定属性:

<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" />

巴卢斯克的帖子之外:

你必须使用

cc:attribute标记中的type=“int”:


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

我相信有另一种访问属性的方法。在访问一个名为java保留关键字的属性时,我在JSF2中使用了这一点


{cc.attrs['size']}请小心标记,复合组件不是自定义组件。另请参阅,谢谢您的更正。我知道,但我有点粗心,也许我需要休息几分钟:谢谢!这是可行的,但对我来说很奇怪,如果我直接添加
我会得到
javax.servlet.ServletException:参数类型不匹配
,如果我添加
我会得到属性“value”的
打开引号。它必须是
整数,而不是
字符串
。是的,但是如何在
属性中添加
整数
?有引号时,它被解释为
字符串
,没有引号时,例外情况不同。