Я могу получить доступ к своей переменной, сохраненной в отступающем бобе от моей страницы JSF2, таким образом, вещи как
<h:outputText value="#{myBean.myValue}"/>
работа и значение (который является интервалом btw.) печатает хорошо. Однако, когда попытка использовать это значение в условных выражениях в c:if и/или c:when отмечает его, никогда ничему не равняется... так:
<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;
}
Значение интервала печатается правильно, но 1 == 1 ложь.
Компоненты сущности обрабатываются специальным способом? Я могу использовать их для отображения их значения на UI?
UPDATE2:
<h:outputText value="#{order.adcOrderStatus.orderStatus.class}"/>
печать java.lang. Целое число.
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>
Это работает при вызове с международным значением. Но это не работает:
<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}"/>
Объявили ли вы JSTL core taglib следующим образом?
<html xmlns:c="http://java.sun.com/jsp/jstl/core">
Если нет или неправильно объявили, то он просто не будет разобран и окажется простым ванильным в сгенерированном HTML выводе. Вы можете убедиться в этом, открыв страницу в браузере, щелкнув по ней правой кнопкой мыши и выбрав View Source. Вы не должны увидеть там никакого тега JSTL.
Обновление: согласно вашему обновлению, это связано с тем, что JSTL запускается во время сборки представления, а JSF - во время рендеринга представления. В вашем конкретном случае все это не сработает, если #{cc.attrs.orderStatus}
доступен только во время рендеринга представления. Например, когда он представляет текущий итерируемый элемент итерирующего компонента, такого как
.
Вам лучше переписать составной компонент следующим образом, чтобы использовать атрибут rendered
вместо этого:
<h:panelGroup rendered="#{cc.attrs.orderStatus == 1}">
<h:graphicImage url="#{resource['img/icons/flag_yellow.png']}" /> Created
</h:panelGroup>
<h:panelGroup rendered="#{cc.attrs.orderStatus == 2}">
<h:graphicImage url="#{resource['img/icons/flag_orange.png']}" /> Stopped
</h:panelGroup>
<h:panelGroup rendered="#{cc.attrs.orderStatus == 3}">
<h:graphicImage url="#{resource['img/icons/flag_green.png']}" /> Active
</h:panelGroup>
<h:panelGroup rendered="#{cc.attrs.orderStatus == 99}">
<h:graphicImage url="#{resource['img/icons/flag_red.png']}" /> Failed
</h:panelGroup>
<h:panelGroup rendered="#{cc.attrs.orderStatus != 1 && cc.attrs.orderStatus != 2 && cc.attrs.orderStatus != 3 && cc.attrs.orderStatus != 99}">
<h:graphicImage url="#{resource['img/icons/question_mark.png']}" /> Unknown
</h:panelGroup>
<c:if test="#{myBean.myValue == 1}">
До JSF2 эти JSTL-подобные теги Facelets оценивались только во время создания дерева ( ref ).
Документ JSF2 для c: if не упоминает об этом, и я знаю, что две версии Facelets несовместимы (это определенно в спецификации), и это не ясно для меня, что в данном контексте означает «обработанный». Возможно, стоит просмотреть спецификацию, чтобы увидеть, описывает ли она поведение более подробно, проверьте, что находится в вашем дереве компонентов во время выполнения, и проверьте состояние вашего объекта во время создания представления.