c:when和c:如果不起作用
我可以从我的JSF2页面访问存储在支持bean中的变量,所以类似于
<h:outputText value="#{myBean.myValue}"/>
工作,价值(这是一个int btw。)打印好。
但是,当尝试在c:if和/或c:中的条件表达式中使用此值时,标记它永远不会等于任何东西......所以:
<c:if test="#{myBean.myValue == 1}">
<c:set var="myVar" value="true"/>
</c:if>
<c:choose>
<c:when test="#{myBean.myValue > 1}">
<c:set var="myVar" value="true"/>
</c:when>
</c:choose>
甚至
#{myBean.myValue eq '1'}
要么
#{myBean.myValue == '1'}
永远不会评估为真,即使该值确实为1或> 1。
令人讨厌的是,比较在标签的渲染属性中起作用!所以这:
<h:outputText value="whatever" rendered="#{myBean.myValue == 1}"/>
很好!
到底是怎么回事?
更新:
这有效:
public int getMyValue() {
return 1;
}
但这不是:
@Column(name = "orderstatus")
public int getOrderStatus() {
return orderStatus;
}
int的值打印正确,但1 == 1为false。
实体bean是以特殊方式处理的吗?我可以使用它们在UI上显示它们的价值吗?
UPDATE2:
<h:outputText value="#{order.adcOrderStatus.orderStatus.class}"/>
打印java.lang.Integer。
UPDATE3:
这是完整的代码:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface>
<cc:attribute name="orderStatus" required="true"/>
</cc:interface>
<cc:implementation>
<c:choose>
<c:when test="#{cc.attrs.orderStatus == 1}" >
<c:set var="unknownStatus" value="false"/>
</c:when>
<c:when test="#{cc.attrs.orderStatus == 2}" >
<c:set var="unknownStatus" value="false"/>
</c:when>
<c:when test="#{cc.attrs.orderStatus == 3}" >
<c:set var="unknownStatus" value="false"/>
</c:when>
<c:when test="#{cc.attrs.orderStatus == 99}" >
<c:set var="unknownStatus" value="false"/>
</c:when>
<c:otherwise>
<c:set var="unknownStatus" value="true"/>
</c:otherwise>
</c:choose>
<h:graphicImage url="#{resource['img/icons/flag_yellow.png']}" rendered="#{cc.attrs.orderStatus == 1}"/>
<h:outputText value="Created" rendered="#{cc.attrs.orderStatus == 1}"/>
<h:graphicImage url="#{resource['img/icons/flag_orange.png']}" rendered="#{cc.attrs.orderStatus == 2}"/>
<h:outputText value="Stopped" rendered="#{cc.attrs.orderStatus == 2}"/>
<h:graphicImage url="#{resource['img/icons/flag_green.png']}" rendered="#{cc.attrs.orderStatus == 3}"/>
<h:outputText value="Active" rendered="#{cc.attrs.orderStatus == 3}"/>
<h:graphicImage url="#{resource['img/icons/flag_red.png']}" rendered="#{cc.attrs.orderStatus == 99}"/>
<h:outputText value="Failed" rendered="#{cc.attrs.orderStatus == 99}"/>
<h:graphicImage url="#{resource['img/icons/question_mark.png']}" rendered="#{unknownStatus}"/>
<h:outputText value="Unknown" rendered="#{unknownStatus}"/>
</cc:implementation>
</html>
它在使用int值调用时有效。但这不起作用:
<p:dataTable value="#{cc.attrs.orders}" var="order">
<p:column>
<f:facet name="header">
<h:outputText value="Status"/>
</f:facet>
<mytag:orderStatus orderStatus="#{order.adcOrderStatus.orderStatus}"/>
</p:column>
</p:dataTable>
这会显示正确的值:
<h:outputText value="#{order.adcOrderStatus.orderStatus.class}"/>
没有找到相关结果
已邀请:
3 个回复
淘圃跺枯替
如果没有或错误地声明它们,它们将不会被解析并在生成的HTML输出中结束普通的vanilla。您可以通过在浏览器中打开页面,右键单击并选择“查看源”来确认这一点。你不应该在那里看到任何JSTL标签。 更新:根据您的更新,它与JSTL在视图的构建时间和JSF在视图的渲染时间内运行的事实有关。在您的特定情况下,如果
仅在视图的渲染时间内可用,则所有这些都将失败。例如,当它表示迭代组件的当前迭代项时,例如
。 您最好按如下方式重写复合组件,以使用
属性:
也可以看看: JSF2 Facelets中的JSTL有意义吗?
诞胃
在JSF2之前,这些类似JSTL的Facelets标记仅在树创建时(ref)进行评估。 用于c的JSF2文档:如果没有提到这一点,我知道两个Facelets版本不兼容(这绝对在规范中)并且我不清楚在这种情况下“处理”意味着什么。可能值得仔细阅读规范,看它是否更详细地描述了行为,检查运行时组件树中的内容,并在创建视图时检查对象状态。
穗揣
您可以从http://www.intersult.com/wiki/page/JSF%20Ext#section-JSF+Ext-OtherwiseTag进行配置(请使用页面翻译)。