с: когда и с: если не работают - PullRequest
11 голосов
/ 29 июля 2010

Я могу получить доступ к своей переменной, хранящейся в бэк-бине, со своей страницы JSF2, поэтому работают такие вещи, как

<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'}

никогда не будет иметь значение true, даже если значение действительно равно 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 ложно.

Обрабатываются ли сущностные бины в специальномпуть?Могу ли я использовать их для отображения их значения в пользовательском интерфейсе?

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 ]

24 голосов
/ 29 июля 2010

Вы объявили основной тег tag JSTL следующим образом?

<html xmlns:c="http://java.sun.com/jsp/jstl/core">

Если не объявлено или неправильно объявлено, они просто не будут анализироваться и в результате будут генерироваться простые ванили в сгенерированном выводе HTML.Вы можете подтвердить это, открыв страницу в браузере, щелкнув ее правой кнопкой мыши и выбрав Просмотр источника .Там не должно быть никаких тегов JSTL.


Обновление : в соответствии с вашим обновлением это связано с тем, что JSTL работает во время сборки представления и JSF во время рендерингавремя просмотра.В вашем конкретном случае все это не будет работать, если #{cc.attrs.orderStatus} доступно только во время визуализации представления.Например, когда он представляет текущий итеративный элемент итерирующего компонента, например <h:dataTable>.

Вам лучше переписать составной компонент следующим образом, чтобы использовать вместо него атрибут 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>

См. Также:

5 голосов
/ 29 июля 2010
<c:if test="#{myBean.myValue == 1}">

До JSF2 эти JSTL-подобные теги Facelets оценивались только во время создания дерева ( ref ).

Документ JSF2 для c: if не упоминает об этом, и я знаю, что две версии Facelets несовместимы (это определенно в спецификации), и мне не ясно, что означает "обработанный" в этом контексте.Возможно, стоит изучить спецификацию, чтобы увидеть, описывает ли она поведение более подробно, проверить, что находится в вашем дереве компонентов во время выполнения, и проверить состояние вашего объекта во время создания представления.

1 голос
/ 27 июля 2013

В большинстве случаев может быть заменено атрибутом рендеринга, в некоторых случаях вы можете добавить какой-либо нейтральный дополнительный компонент, например.

Поскольку есть альтернатива, которая работает более легко и вместе с жизненным циклом JSF:

<e:div>
    <h:selectBooleanCheckbox id="boolean" value="#{bean.value}" rendered="#{bean.type == 'boolean'}"/>
    ...
    <e:otherwise>
        <h:inputText id="text" value="#{bean.value}"/>
    </e:otherwise>
</e:div>

Вы можете настроить от http://www.intersult.com/wiki/page/JSF%20Ext#section-JSF+Ext-OtherwiseTag (используйте перевод страницы).

...