基于dataType呈现UI元素的最佳方法

时间:2011-12-09 14:31:35

标签: jsf enums richfaces jstl facelets

我正在尝试根据dataType值动态渲染richfaces和jsf UI元素。

例如:我有一个枚举如下

public enum DataType {
    DT_LONGLONG(1), DT_STRING(2), DT_LONG(3), DT_DATE(4), DS_EXTERNALREFERENCE(5), 
    DT_BOOLEAN(6), DT_FLOAT(7), DT_SHORT(8);
}

然后在xhtml页面中迭代我的自定义对象列表,我检查dataType并相应地呈现UI元素,如下所示:

<c:if test="#{meaCompPartAttr.dataType.dataType == 2}">
    <h:inputText />
</c:if>
<c:if test="#{(meaCompPartAttr.dataType.dataType == 1) or
        (meaCompPartAttr.dataType.dataType == 3) or
        (meaCompPartAttr.dataType.dataType == 8)}">
    <h:inputText onkeyup="javascript:validateField(this,             '#{tpMsgs.longRegularExpression}');">
    <f:validateLongRange/>
    </h:inputText>
</c:if>
<c:if test="#{meaCompPartAttr.dataType.dataType == 7}">
<h:inputText onkeyup="javascript:validateField(this, '#{tpMsgs.doubleRegularExpression}');">
    <f:validateDoubleRange/>
    </h:inputText>
</c:if>
<c:if test="#{meaCompPartAttr.dataType.dataType == 6}">
    <h:selectBooleanCheckbox />
</c:if>
<c:if test="#{meaCompPartAttr.dataType.dataType == 4}">
    <rich:calendar />
</c:if>

因此我通常会将类转换异常(如String转换为Boolean或Long转换为String等)。我认为这种情况发生在coz jstl和jsf代码不同步运行。

是否还有其他方法可以动态呈现UI元素,如上例所示?

1 个答案:

答案 0 :(得分:2)

所以你要使用<ui:repeat><h:dataTable>或任何其他JSF迭代组件而不是JSTL <c:forEach>进行迭代?请改为使用<c:forEach>,或使用rendered属性代替<c:if>

另见: