JavaServerFaces if / else image问题

时间:2013-12-26 03:08:03

标签: jsf

我希望我的页面根据LinkedHashMap中的值显示不同的图像。我有这段代码:

<c:if test="#{myMap.get(1) == 1}">
     <h:graphicImage name="images/first.png"/>
</c:if>
<c:otherwise>
     <h:graphicImage name="images/second.png"/>
</c:otherwise> 

现在,在我的Java类中,我检查了myMap.get(1)的值是1,但页面显示了第二个图像。我的错误在哪里?

编辑:我得到异常“EL Expression Unbalanced”。

3 个答案:

答案 0 :(得分:0)

您的问题是<c:if>是一个简单的JSTL标记来处理,如果有的话,将以下组件添加到JSF组件树情况。另一方面,JSTL和f中还有一个if-else标记,它是与<c:when><c:otherwise>一起使用的<c:choose>标记。

因此,正确的条件代码将是

<c:choose>
    <c:when test="#{myMap.get(1) eq 1}">
        <h:graphicImage name="images/first.png"/>
    </c:when>
    <c:otherwise>
        <h:graphicImage name="images/second.png"/>
    </c:otherwise>
</c:choose>

<c:if test="#{myMap.get(1) eq 1}">
    <h:graphicImage name="images/first.png"/>
</c:if>
<c:if test="#{myMap.get(1) ne 1}">
    <h:graphicImage name="images/second.png"/>
</c:if>

如果您的代码配置正确,则需要更改所有内容。关于您可能遇到的其他问题,您需要澄清代码的详细信息,即如果您遇到错误,请将堆栈跟踪与您生成的代码一起发布。

到目前为止,我们还不知道myMap是什么,或者指的是什么。要使其工作,应该 @ManagedBean ... class MyMap implements Map ...,或者通过<c:set>设置,例如myBean.myMap,用于地图类型的bean属性,或者作用域{ {1}}变量。如果它是来自<c:forEach><ui:repeat>等的渲染时变量,那么它确实无法按预期工作。有关概述,请参阅JSTL in JSF2 Facelets... makes sense?

我的回答的最后一点是使用<h:graphicImage>标记的<h:dataTable>属性,这样您的代码就不会混淆JSTL标记和JSF组件,并且有条理地为普通JSF提供了一种更清晰的方法 - 组件:

rendered

如果您了解<h:graphicImage name="images/first.png" rendered="#{myMap.get(1) eq 1}" /> <h:graphicImage name="images/first.png" rendered="#{myMap.get(1) ne 1}" /> 是什么,您就可以获得三个代码段中的任何一个。

答案 1 :(得分:-1)

我猜您使用的键类型是Integer,只需更改为Long,

EL将数字解释为Long not Integer。

test =“#{myMap.get(1)== 1}”//此行不起作用b'coz,EL解释1为Long。

试试以下代码。

@ManagedBean(name = "index")
public class IndexManagedBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private final LinkedHashMap<Long, Long> map = new LinkedHashMap<>();

    public IndexManagedBean() {
        map.put(1L, 1L);
        map.put(2L, 2L);
    }

    public LinkedHashMap<Long, Long> getMap() {
        return map;
    }

}


<h:body>
    <c:if test="#{index.map.get(1) == 1}">
        <h:graphicImage name="images/first.png"/>
    </c:if>
    <c:otherwise>
        <h:graphicImage name="images/second.png"/>
    </c:otherwise>
</h:body>

答案 2 :(得分:-1)

您必须使用$符号代替#

<c:if test="${myMap.get(1) == 1}">
     <h:graphicImage name="images/first.png"/>
</c:if>

而且<c:otherwise>只能与<c:when>一起使用,而不能与<c:if>一起使用。