我正在尝试根据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元素,如上例所示?
答案 0 :(得分:2)
所以你要使用<ui:repeat>
或<h:dataTable>
或任何其他JSF迭代组件而不是JSTL <c:forEach>
进行迭代?请改为使用<c:forEach>
,或使用rendered
属性代替<c:if>
。