创建参数化多用途自定义facelet标记的最佳方法是什么

时间:2010-09-20 09:34:42

标签: jsf facelets icefaces

我创建了一个Facelet标记,用于渲染带有标签的textinput。 这对于避免一遍又一遍地重复相同的代码非常有帮助。

虽然我正在努力处理这个单一标签中的不同用例(日期与文本,需要与不需要,textarea与普通文本等)。

我最终在我的组件中有多个标签,所有标签都有一个或多或少复杂的渲染属性,如下所示:

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

当然,这不是最佳的,而且写作相当繁琐。 我认为另一个问题是使用这种方法我在组件树中有多个具有相同ID的组件(我不确定这是否是一个问题,因为只有一个具有相同ID的项目一次呈现但我看到一些奇怪的重新创建页面树的问题让我相信这是一个问题)

我正在使用ICEFaces 1.8.2(但问题应该是独立于实现的)。 这是什么解决方案?用?别的什么?谢谢!

1 个答案:

答案 0 :(得分:1)

您可以将<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实现。