使用Facelets扩展组件时的属性委派

时间:2011-07-25 16:44:26

标签: java jsf facelets

在实现扩展某些现有组件的自定义facelets组件时,您的自定义组件接受与要扩展的组件相同的属性是很常见的。 例如,扩展h:inputText可以如下:

<ui:composition>
<custom:decorate styleClass="input">
    <h:inputText id="#{id}" value="#{value}" required="#{required}"
                 styleClass="#{styleClass}" disabled="#{disabled}" rendered="#{rendered}"
                 converterMessage="#{converterMessage}"
                 requiredMessage="#{requiredMessage}"
                 validatorMessage="#{validatorMessage}" onchange="#{onchange}"
                 style="#{style}">
        <ui:insert/>
    </h:inputText>
</custom:decorate></ui:composition>

目标是允许组件的客户端以与扩展组件相同的方式使用扩展版本。 上面的例子有以下差距:

  1. id属性是必需的,传递没有值不会强制自动生成id。
  2. converterMessage,requiredMessage,validatorMessage,... - 与'id'属性非常相同,如果客户端未提供这些属性应具有特殊含义
  3. 禁用,呈现和其他布尔属性 - 如果客户端未提供值,则“#{attributeName}”将解析为“false”。
  4. action和actionListener - 对于动作源组件,facelets正在尝试将客户端指定的值评估为“ValueExpression”,而不是“MethodExpression”。
  5. 有一些简单直接的解决方案(例如使用c:if,c:when等来处理1-3;传递bean和actionMethodName或实现动作映射器组件来处理4),但是当属性数量时很大,组件的代码变成了意大利面条代码的地狱。

    也许已经有一些可用于JSF 1.2的可靠解决方案? 对于我来说,如果能够获得有关如何实施此类解决方案或解决方案的一部分的好建议,我将会非常有用。

0 个答案:

没有答案