Jsf 2 使用JSTL的条件图像渲染<;c:选择>;

Jsf 2 使用JSTL的条件图像渲染<;c:选择>;,jsf-2,jstl,facelets,Jsf 2,Jstl,Facelets,我正在开发一个JSF应用程序,我有一个关于使用JSTL的Facelets页面的问题。我想在ui中显示:重复一些问题、一个问题和三个答案(有条件地格式化),如果问题是对的或错的,在答案前面打勾(ticksall.png)或打X(xSmall.png) 答案的格式正确,但勾号/X的位置不正确(我检查了布尔值是否正确,有些是真的,有些是假的)。每次它都放一个X,即使应该有一个勾号 我已经包括了xmlns:c=”http://java.sun.com/jsp/jstl/core 守则: <

我正在开发一个JSF应用程序,我有一个关于使用JSTL的Facelets页面的问题。我想在ui中显示:重复一些问题、一个问题和三个答案(有条件地格式化),如果问题是对的或错的,在答案前面打勾(ticksall.png)或打X(xSmall.png)

答案的格式正确,但勾号/X的位置不正确(我检查了布尔值是否正确,有些是真的,有些是假的)。每次它都放一个X,即使应该有一个勾号

我已经包括了
xmlns:c=”http://java.sun.com/jsp/jstl/core

守则:

     <ui:repeat var="n"
                    value="#{answerResultBean.accessWrongAnswerColumnWrapperList}">
                    <hr />
                    <h:outputText value="#{n.noQuestion}. #{n.question}" />
                    <h:panelGrid columns="2" style="text-align: left;">
                        <c:choose>
                            <c:when test="#{n.rightGridAnswerA}">
                                <h:form>
                                    <img src="/juritest/resources/img/tickSmall.png" alt="tick" />
                                </h:form>
                            </c:when>
                            <c:otherwise>
                                <h:form>
                                    <img src="/juritest/resources/img/xSmall.png" alt="wrong" />
                                </h:form>
                            </c:otherwise>
                        </c:choose>
                        <h:outputText value="a) #{n.a}"
                            style="#{n.userAnswerA ? 'font-weight:bold;' : 'font-weight:normal;'}" />

                        <c:choose>
                            <c:when test="#{n.rightGridAnswerB}">
                                <h:form>
                                    <img src="/juritest/resources/img/tickSmall.png" alt="tick" />
                                </h:form>
                            </c:when>
                            <c:otherwise>
                                <h:form>
                                    <img src="/juritest/resources/img/xSmall.png" alt="wrong" />
                                </h:form>
                            </c:otherwise>
                        </c:choose>
                        <h:outputText value="b) #{n.b}"
                            style="#{n.userAnswerB ? 'font-weight:bold;' : 'font-weight:normal;'}" />

                        <c:choose>
                            <c:when test="#{n.rightGridAnswerC}">
                                <h:form>
                                    <img src="/juritest/resources/img/tickSmall.png" alt="tick" />
                                </h:form>
                            </c:when>
                            <c:otherwise>
                                <h:form>
                                    <img src="/juritest/resources/img/xSmall.png" alt="wrong" />
                                </h:form>
                            </c:otherwise>
                        </c:choose>
                        <h:outputText value="c) #{n.c}"
                            style="#{n.userAnswerC ? 'font-weight:bold;' : 'font-weight:normal;'}" />
                    </h:panelGrid>
                </ui:repeat>



JSTL标记和JSF组件不会像您从编码中期望的那样同步运行。JSTL标记首先在视图构建时运行,生成JSF组件树。JSF组件随后在视图呈现时运行,生成HTML输出。因此,当JSTL运行时,
{n}
在EL范围内不可用,因为
此时尚未运行

您需要JSF组件的
rendered
属性,或者以智能的方式使用三元操作符

以下是一些笨拙的地方

<c:choose>
    <c:when test="#{n.rightGridAnswerA}">
        <h:form>
            <img src="/juritest/resources/img/tickSmall.png" alt="tick" />
        </h:form>
    </c:when>
    <c:otherwise>
        <h:form>
            <img src="/juritest/resources/img/xSmall.png" alt="wrong" />
        </h:form>
    </c:otherwise>
</c:choose>
...
<c:choose>
    <c:when test="#{n.rightGridAnswerB}">
        <h:form>
            <img src="/juritest/resources/img/tickSmall.png" alt="tick" />
        </h:form>
    </c:when>
    <c:otherwise>
        <h:form>
            <img src="/juritest/resources/img/xSmall.png" alt="wrong" />
        </h:form>
    </c:otherwise>
</c:choose>
...
<c:choose>
    <c:when test="#{n.rightGridAnswerC}">
        <h:form>
            <img src="/juritest/resources/img/tickSmall.png" alt="tick" />
        </h:form>
    </c:when>
    <c:otherwise>
        <h:form>
            <img src="/juritest/resources/img/xSmall.png" alt="wrong" />
        </h:form>
    </c:otherwise>
</c:choose>
或使用条件运算符执行以下操作:

<h:form>
    <h:graphicImage name="img/#{n.rightGridAnswerA ? 'tick' : 'x'}Small.png" alt="#{n.rightGridAnswerA ? 'tick' : 'wrong'}" />
</h:form>
...
<h:form>
    <h:graphicImage name="img/#{n.rightGridAnswerB ? 'tick' : 'x'}Small.png" alt="#{n.rightGridAnswerB ? 'tick' : 'wrong'}" />
</h:form>
...
<h:form>
    <h:graphicImage name="img/#{n.rightGridAnswerC ? 'tick' : 'x'}Small.png" alt="#{n.rightGridAnswerC ? 'tick' : 'wrong'}" />
</h:form>

...
...
(这仍然不是,但这是一个不同的问题)

另见:

感谢BalucC的回答;我不知道JSTL和JSF之间的同步问题。我使用了例如c:choose tag成功地与JSF一起使用,我不认为这是一个问题。(也许我很幸运:)。不客气。请注意,这并不完全是“同步问题”:)一个在视图生成时运行,另一个在视图渲染时运行。这就是全部。你只需要为工作选择合适的工具。与此相关的另一个问题是:展示有条件的东西的最佳实践是什么?
<h:form>
    <h:graphicImage name="img/#{n.rightGridAnswerA ? 'tick' : 'x'}Small.png" alt="#{n.rightGridAnswerA ? 'tick' : 'wrong'}" />
</h:form>
...
<h:form>
    <h:graphicImage name="img/#{n.rightGridAnswerB ? 'tick' : 'x'}Small.png" alt="#{n.rightGridAnswerB ? 'tick' : 'wrong'}" />
</h:form>
...
<h:form>
    <h:graphicImage name="img/#{n.rightGridAnswerC ? 'tick' : 'x'}Small.png" alt="#{n.rightGridAnswerC ? 'tick' : 'wrong'}" />
</h:form>