基于上一个问题How to get ID of calling component in the getter method?,这是我想问您的另一种想法:

跨jsf页面有很多重复的代码,例如跨组件的这些示例(请注意重复的size和maxlength属性):

<h:inputText label="#{msgs.userId}" id="UserId" value="#{userBean.userId}"
   required="true"
   size="#{variableConfigBean.getSize(component.id)}"
   maxlength="#{variableConfigBean.getMaxLength(component.id)}"
/>
<h:inputSecret label="#{msgs.password}" id="Password" value="#{userBean.password}"
   required="true"
   size="#{variableConfigBean.getSize(component.id)}"
   maxlength="#{variableConfigBean.getMaxLength(component.id)}"
/>


我在想:


为此使用复合组件
输入文字标签,
在该复合组件的实现部分中硬编码大小和最大长度,
这样我就不必重复所有
这些东西每次我需要使用时
该组件。
但我得开
界面中的所有属性
该复合组件的部分


这个想法好吗,或者还有其他更好的方法来解决这个问题?

最佳答案

您可以这样做。我还在某些项目中实现了它。它只会增加一些(较小的)开销。为此,您也可以只使用Facelets标记文件而不是JSF复合组件。然后,不必强制定义属性。在您的特殊情况下,如果将bean属性名称重用作为ID和消息束标签的键,则可以重构很多重复项。

例如。

<my:input type="text" bean="#{userBean}" property="userId" required="true" />
<my:input type="secret" bean="#{userBean}" property="password" required="true" />


在Facelets标记文件中包含以下内容:

<c:set var="id" value="#{not empty id ? id : property}" />
<c:set var="required" value="#{not empty required and required}" />

<c:choose>
    <c:when test="#{type == 'text'}">
        <h:inputText id="#{id}"
            label="#{msgs[property]}"
            value="#{bean[property]}"
            size="#{config.size(id)}"
            maxlength="#{config.maxlength(id)}"
            required="#{required}" />
    </c:when>
    <c:when test="#{type == 'secret'}">
        <h:inputSecret id="#{id}"
            label="#{msgs[property]}"
            value="#{bean[property]}"
            size="#{config.size(id)}"
            maxlength="#{config.maxlength(id)}"
            required="#{required}" />
    </c:when>
    <c:otherwise>
        <h:outputText value="Unknown input type: #{type}" />
    </c:otherwise>
</c:choose>


但是,我已经在<h:outputLabel>之前和<h:message>之后实现了它,使得这样的重构更加合理。

09-10 09:37
查看更多